Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
bd0b899
docs(evidence): start S1-02-E boundary audit | 启动 S1-02-E 边界审计
yuanchenglu Jul 28, 2026
ce79c6c
docs(evidence): define S1-02-E acceptance | 定义 S1-02-E 验收矩阵
yuanchenglu Jul 28, 2026
a9b671a
test(config): add coexistence boundary contracts | 新增共存边界契约
yuanchenglu Jul 28, 2026
d12806e
test(tui): prove OpenCode tree isolation | 证明 OpenCode 目录树隔离
yuanchenglu Jul 28, 2026
69ed787
test(ci): gate S1-02-E coexistence boundaries | 门禁 S1-02-E 共存边界
yuanchenglu Jul 28, 2026
d84e8fd
docs(evidence): record S1-02-E failing baseline | 记录 S1-02-E 失败基线
yuanchenglu Jul 28, 2026
91ac435
fix(config): isolate TUI migration to DeepCode files | 将 TUI 迁移限制为 De…
yuanchenglu Jul 28, 2026
3afef36
fix(ci): make boundary inventory deterministic | 使边界字符串清单稳定可用
yuanchenglu Jul 28, 2026
5901375
fix(flags): read only DeepCode runtime variables | 运行时仅读取 DeepCode 环境变量
yuanchenglu Jul 28, 2026
4dc57f8
test(flags): enforce DeepCode runtime namespace | 强制运行时使用 DeepCode 命名空间
yuanchenglu Jul 28, 2026
8445c5e
test(ci): include RuntimeFlags namespace gate | 接入运行时环境变量命名空间门禁
yuanchenglu Jul 28, 2026
40a23e8
feat(skill): add DeepCode configuration skill | 新增 DeepCode 配置技能
yuanchenglu Jul 28, 2026
f96c48a
fix(skill): register DeepCode configuration skill | 注册 DeepCode 配置技能
yuanchenglu Jul 28, 2026
768905c
fix(agent): keep plan edits in .deepcode | 将计划编辑限制在 .deepcode
yuanchenglu Jul 28, 2026
5190ef1
test(skill): assert DeepCode built-in skill identity | 验证 DeepCode 内置…
yuanchenglu Jul 28, 2026
4051d75
fix(skill): expose only DeepCode configuration skill | CLI 技能服务仅暴露 De…
yuanchenglu Jul 28, 2026
f95bffe
refactor(skill): remove obsolete OpenCode configuration skill | 删除废弃 …
yuanchenglu Jul 28, 2026
6027590
fix(cli): create project agents under .deepcode | 项目 Agent 写入 .deepcode
yuanchenglu Jul 28, 2026
7f75521
fix(logging): use DeepCode log identity | 日志使用 DeepCode 身份
yuanchenglu Jul 28, 2026
ee89db7
fix(cli): use DeepCode temporary CLI identity | 临时 CLI 使用 DeepCode 身份
yuanchenglu Jul 28, 2026
7aa4f4b
chore(ci): upload temporary S1-02-E source snapshot | 上传临时源码审计快照
yuanchenglu Jul 28, 2026
b9c3ac4
docs(command): use DeepCode config identity | 初始化命令使用 DeepCode 配置身份
yuanchenglu Jul 28, 2026
7ff370e
docs(command): align CLI initialize prompt with DeepCode | CLI 初始化提示统…
yuanchenglu Jul 28, 2026
bb71cde
chore(ci): stage S1-02-E identity transform | 暂存 S1-02-E 身份转换脚本
yuanchenglu Jul 28, 2026
eb9ef54
chore(ci): stage S1-02-E cleanup transform | 暂存 S1-02-E 清理脚本
yuanchenglu Jul 28, 2026
0233cae
chore(ci): stage S1-02-E path cleanup | 暂存 S1-02-E 路径清理脚本
yuanchenglu Jul 28, 2026
9bc8807
chore(ci): stage S1-02-E final cleanup | 暂存 S1-02-E 最终清理脚本
yuanchenglu Jul 28, 2026
69645f1
chore(ci): stage S1-02-E final namespace transform | 暂存最终命名空间转换
yuanchenglu Jul 28, 2026
f136427
chore(ci): apply S1-02-E boundary migration atomically | 原子应用 S1-02-E…
yuanchenglu Jul 28, 2026
c0d2c12
chore(ci): trigger staged S1-02-E migration | 触发已暂存的 S1-02-E 迁移
yuanchenglu Jul 28, 2026
3e0bae0
chore(ci): run one-shot S1-02-E atomic migration | 运行一次性 S1-02-E 原子迁移
yuanchenglu Jul 28, 2026
9d70c15
chore(ci): capture S1-02-E migration traceback | 捕获 S1-02-E 迁移完整错误
yuanchenglu Jul 28, 2026
781ef15
chore(ci): capture S1-02-E commit failure | 捕获 S1-02-E 提交阶段错误
yuanchenglu Jul 28, 2026
e134214
chore(ci): let final migration script publish atomically | 由最终迁移脚本原子发布
yuanchenglu Jul 28, 2026
7787375
chore(ci): persist atomic migration traceback | 持久化原子迁移错误堆栈
yuanchenglu Jul 28, 2026
1c37992
fix(ci): keep workflow cleanup outside Actions push | 工作流清理由 GitHub C…
yuanchenglu Jul 28, 2026
df1a30f
fix(identity): close DeepCode coexistence boundaries
Jul 28, 2026
6a02172
test(identity): finalize S1-02-E package gates | 完成 S1-02-E 包级门禁
yuanchenglu Jul 28, 2026
baf3fcd
chore(ci): remove one-shot S1-02-E migration workflow | 删除一次性 S1-02-E…
yuanchenglu Jul 28, 2026
7cbe48e
test(core): restore internal Flag compatibility names | 恢复内部 Flag 兼容属性名
yuanchenglu Jul 28, 2026
3b57a5b
test(core): restore models-dev Flag compatibility names | 恢复 models-d…
yuanchenglu Jul 28, 2026
da44f62
chore(readiness): stage S1-02-E regression repair | 准备 S1-02-E 回归修复
yuanchenglu Jul 28, 2026
1b14616
ci(readiness): apply S1-02-E regression repair | 执行 S1-02-E 回归修复
yuanchenglu Jul 28, 2026
c644604
fix(identity): repair S1-02-E regression contracts
Jul 28, 2026
1e97e02
ci(readiness): remove temporary S1-02-E repair job | 清理 S1-02-E 临时修复任务
yuanchenglu Jul 28, 2026
cee1f41
chore(readiness): stage S1-02-E config fixes | 准备 S1-02-E 配置修复
yuanchenglu Jul 28, 2026
84871c6
ci(readiness): apply S1-02-E config fixes | 执行 S1-02-E 配置修复
yuanchenglu Jul 28, 2026
87c03b0
fix(config): evaluate DeepCode config content at access time
Jul 28, 2026
2442d6b
ci(readiness): remove temporary S1-02-E config job | 清理 S1-02-E 临时配置任务
yuanchenglu Jul 28, 2026
b5c0462
chore(readiness): stage S1-02-E documentation closeout | 准备 S1-02-E 文档收口
yuanchenglu Jul 28, 2026
76e1436
ci(readiness): finalize S1-02-E documentation | 收口 S1-02-E 文档
yuanchenglu Jul 28, 2026
9037642
docs(readiness): complete S1-02 coexistence isolation
Jul 28, 2026
ebc6365
ci(readiness): remove temporary S1-02-E finalizer | 清理 S1-02-E 临时收口任务
yuanchenglu Jul 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 29 additions & 5 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,8 @@ jobs:

- name: Configure git identity
run: |
git config --global user.email "bot@opencode.ai"
git config --global user.name "opencode"
git config --global user.email "bot@deepcode.local"
git config --global user.name "deepcode"

- name: Cache Turbo
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
Expand Down Expand Up @@ -91,7 +91,29 @@ jobs:
set -o pipefail
bun test test/installation --timeout 30000 2>&1 | tee installation-${{ matrix.settings.name }}.log

- name: Upload unit test log
- name: Run S1-02-E Core isolation tests
working-directory: packages/core
run: |
set -o pipefail
bun test test/global.test.ts test/config.test.ts --timeout 30000 2>&1 | tee boundary-core-${{ matrix.settings.name }}.log

- name: Run S1-02-E full config and permission regression
working-directory: packages/opencode
run: |
set -o pipefail
bun test test/config test/effect/runtime-flags-deepcode.test.ts test/permission --timeout 30000 2>&1 | tee boundary-opencode-${{ matrix.settings.name }}.log

- name: Capture S1-02-E OpenCode string inventory
if: runner.os == 'Linux' && always()
run: |
status=0
git grep -n -I -E 'opencode|OPENCODE' -- packages/core packages/opencode > opencode-boundary-audit.log || status=$?
if [ "$status" -gt 1 ]; then
exit "$status"
fi
cat opencode-boundary-audit.log

- name: Upload unit and boundary logs
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
Expand All @@ -101,6 +123,9 @@ jobs:
path: |
unit-${{ matrix.settings.name }}.log
packages/opencode/installation-${{ matrix.settings.name }}.log
packages/core/boundary-core-${{ matrix.settings.name }}.log
packages/opencode/boundary-opencode-${{ matrix.settings.name }}.log
opencode-boundary-audit.log

- name: Check generated client
if: runner.os == 'Linux'
Expand All @@ -116,7 +141,7 @@ jobs:
bun run test:httpapi 2>&1 | tee httpapi.log

- name: Upload HttpApi log
if: runner.os == 'Linux' && always()
if: runner.os == 'Linux' && always() && hashFiles('packages/opencode/httpapi.log') != ''
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: httpapi-${{ github.run_attempt }}
Expand Down Expand Up @@ -149,7 +174,6 @@ jobs:
- name: Setup Node
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
# Playwright 1.59 hangs while extracting Chromium with Node 24.16.
node-version: "24.15"

- name: Setup Bun
Expand Down
192 changes: 78 additions & 114 deletions docs/open-source-readiness/HANDOFF_2026-07-28.md
Original file line number Diff line number Diff line change
@@ -1,141 +1,105 @@
# DeepCode 实施交接提示词(2026-07-28)

> 用途:在新的 ChatGPT / Codex 会话中直接粘贴本文件的“可复制提示词”,从远程仓库继续实施,不依赖旧容器或旧聊天上下文。
> 用途:在新会话中从 GitHub 远程继续实施,不依赖旧容器、旧工作区或未推送文件。
>
> 远程仓库:`https://github.com/yuanchenglu/deepcode.git`

## 当前远程状态

- 开发分支:`develop`
- 发布分支:`master`
- 已合入 `develop`:PR #2,S1-02-C,squash commit `babc3080f9d5c5c90dcf4abb16a0149e6dbc1eb8`
- 当前实施分支:`agent/s1-02-d-install-uninstall-guard`
- 当前 PR:#6 `fix(lifecycle): fail closed DeepCode install and uninstall boundaries`
- PR #6 当前基线:`develop@babc3080f9d5c5c90dcf4abb16a0149e6dbc1eb8`
- 已验证实现 head:`874dc9c959ccd91320e46d3bf3675c2b30ee861e`
- 已验证 CI:typecheck run #65、test run #67 全部 SUCCESS。
- 当前代码、测试、CI lifecycle gate 和证据均已写入远程分支,不存在只留在旧容器内的必要修改。

## 整体计划进度

- 三阶段总计划:实施中;产品仍为 `NO-GO`。
- 第一阶段:进行中。
- 发布/默认分支:`master`
- S1-02-C:PR #2,已合入 `develop@babc3080f9d5c5c90dcf4abb16a0149e6dbc1eb8`
- S1-02-D:PR #6,已合入 `develop@c848bc537e8c5677c36a360dd00122745a2f5b2e`
- S1-02-E:分支 `coexistence-boundary-audit`,PR #7
- S1-02-E 已验证代码 head:`2442d6b11b7eb7add9ff6685af04e81c3615c657`
- 已验证 CI:typecheck #116 / id `30354218370` SUCCESS;test #118 / id `30354218292` SUCCESS
- 当前代码、测试、CI、inventory 与 evidence 均在远程;不存在必须依赖旧容器的修改。

## 计划进度

- 产品发布判断:`NO-GO`
- 第一阶段:`IN_PROGRESS`
- S1-01A:`DONE`
- S1-01B:`NOT_STARTED`(官网源码/部署入口和错误安装信息止损)
- S1-02:`IN_PROGRESS`
- A:`DONE`
- B:`DONE`
- C:`DONE`,已合入 `develop`
- D:evidence `DONE`,PR #6 待 squash 合入
- E:`NOT_STARTED`
- S1-03 及后续第一阶段任务:`NOT_STARTED`
- 第二阶段:全部 `NOT_STARTED`,受 Gate 1 阻塞。
- 第三阶段:全部 `NOT_STARTED`,受 Gate 2 和设计门禁阻塞。

## S1-02-D 已实施内容

- 安装检测只认可直接位于 `.deepcode/bin` 的原生 DeepCode 二进制。
- Unix/Windows 使用原生路径大小写和 `.exe` 语义;嵌套目录、相似目录、OpenCode 和 `.local/bin` 全部 fail-closed。
- 删除 OpenCode/anomalyco/npm/brew/choco/scoop 等上游版本查询和升级执行路径。
- S1-03 建立可信 DeepCode Release 渠道前,`latest()` 安全返回当前安装版本。
- 所有 upgrade method 返回类型化禁用错误,不下载、不执行包管理器或安装脚本。
- 卸载只处理 DeepCode 自有目录、二进制和精确 shell PATH 分量。
- 明确保留 `.opencode`、`# opencode`、OpenCode PATH、`.deepcode/bin-backup` 和 `.deepcode/bin-old`。
- Linux/Windows lifecycle suite 各 17 pass / 0 fail / 93 assertions。
- typecheck、Linux/Windows unit、generated client、HttpApi 和 Linux/Windows E2E 全部通过。
- S1-01B:`NOT_STARTED`
- S1-02-A/B/C/D/E 与父任务:`DONE`
- S1-03:下一唯一代码任务
- S1-04、S1-05:按 PLAN 可并行,但不得与 S1-03 重叠修改
- S1-06~S1-08:受前置任务阻塞
- 第二阶段:`NOT_STARTED`,受 Gate 1 阻塞
- 第三阶段:`NOT_STARTED`,受 Gate 2 与 Design Gate 阻塞

## S1-02 最终结论

- DeepCode 只默认读取/写入 `deepcode.json(c)`、`.deepcode`、DeepCode Global Path、数据库、日志、项目缓存与环境变量。
- OpenCode-only 和双配置并存测试证明 `.opencode` / `opencode.json(c)` 不被默认加载或修改。
- TUI、插件、MCP、ACP、OAuth、Provider headers、Agent/Plan/Session 和 shell 生命周期均已隔离。
- 安装、upgrade fail-closed、卸载前后 OpenCode shell/目录保持不变。
- 最终 inventory 4,168 行全部分类,未分类用户边界为 0。
- launcher、bin、publish、归档、checksum、rollback、purge 和 Release channel 明确属于 S1-03。

## 开发流程规范

第一优先:功能分支 → PR → CI → squash 合入 `develop`。
第一优先:功能分支 → PR → 完整 CI → squash 合入 `develop`。

只有 PR/CI 持续异常且完成根因分析、尝试修复后仍无法解决,才允许直推 `develop`。直推 commit 必须使用:

```text
<type>(<scope>): <变更说明>

## 问题原因
<说明 PR/CI 无法通过的根因和已尝试的修复>

## 技术债务
- <遗留事项;无则明确写“无”>
```

DeepCode 技术债务也可记录于 `docs/BUG_LIST.md`,格式:

```text
[日期] 描述 | 遗留原因 | 状态
```
只有 PR/CI 持续异常且完成根因分析、最小修复后仍不可解决,才允许直推 `develop`。不得关闭检查、删除失败测试、恢复 OpenCode fallback 或跳过 Windows/Linux unit、E2E、typecheck、HttpApi、lifecycle/config/permission 门禁。

## 可复制到新会话的提示词

```text
@GitHub yuanchenglu/deepcode

请从远程仓库继续实施 DeepCode 三阶段交付计划。不要依赖任何旧容器或未推送本地文件,远程仓库是唯一事实源。
请从 GitHub 远程仓库继续实施 DeepCode 三阶段交付计划。不要依赖任何旧容器、旧工作区或未推送本地文件;GitHub 远程仓库是唯一事实源。

一、先读取并遵守
一、首先完整读取并遵守
1. 仓库根 AGENTS.md
2. docs/open-source-readiness/PLAN.md
2. docs/open-source-readiness/PLAN.md(应为 v1.3 或更新)
3. docs/open-source-readiness/HANDOFF_2026-07-28.md
4. docs/open-source-readiness/evidence/S1-02/README.md
5. docs/open-source-readiness/evidence/S1-02/test-results/S1-02-D-install-uninstall.md
6. docs/open-source-readiness/evidence/S1-02/test-results/S1-02-D-remote-handoff.md
7. PR #6:fix(lifecycle): fail closed DeepCode install and uninstall boundaries

二、先核验远程事实
- develop 当前 HEAD
- PR #6 当前 head、状态、mergeability、changed files
- typecheck/test workflow 的最终结果和失败日志(如有)
- PR #6 是否已经合入 develop
- agent/s1-02-d-install-uninstall-guard 是否仍存在

已知基线:
- PR #2 / S1-02-C 已 squash 合入 develop
- merge commit:babc3080f9d5c5c90dcf4abb16a0149e6dbc1eb8
- S1-02-D 当前 PR:#6
- 已验证实现 head:874dc9c959ccd91320e46d3bf3675c2b30ee861e
- typecheck run #65 / test run #67:SUCCESS

三、执行规则
- develop 是开发分支,master 是发布分支。
- 第一优先走:功能分支 → PR → CI → squash 合入 develop。
- 不要因为 develop 可直推就默认直推。
- 只有 PR/CI 持续异常、已完成根因分析并尝试修复仍无法解决时,才直推 develop。
- 直推 commit 必须包含“## 问题原因”和“## 技术债务”。
- 每次只领取一个 PLAN 任务或明确子任务,不跨门禁。
- 不从仓库根目录运行测试;按 PLAN 在对应 package 目录运行。
- 不关闭检查、不删除失败测试、不通过 fallback 恢复 OpenCode 用户边界。

四、当前任务处理
A. 如果 PR #6 仍开放且最终文档 head CI 全绿:
1. 核验代码和 evidence 与 PLAN 的 S1-02-D 验收条件一致。
2. squash 合入 develop。
3. 从最新 develop 创建独立分支,开始 S1-02-E 全链共存回归和字符串分类。

B. 如果 PR #6 有失败:
1. 获取失败 job 和完整日志/Artifact。
2. 分类为 PRODUCT_DEFECT、TEST_DEFECT、ENV_BLOCKED 或 FLAKY。
3. 做最小根因修复,推回现有 PR 分支。
4. 重新运行完整门禁,不得跳过 Windows/Linux unit、E2E、typecheck、HttpApi 或双平台 lifecycle suite。

C. 如果 PR #6 已合入:
1. 从最新 develop 核验 S1-02-D evidence 是否完整。
2. 直接创建 S1-02-E 独立分支并实施。

五、S1-02-E 的目标
- 对 packages/core、packages/opencode 中 opencode/OPENCODE 字符串逐条分类:内部命名、上游协议/Schema/Package 兼容、用户边界遗漏。
- 运行 DeepCode-only、OpenCode-only、双配置并存和生命周期隔离回归。
- 验证 DeepCode 默认不加载 `.opencode`、`opencode.json(c)`。
- 验证安装、升级拒绝、卸载前后 OpenCode 目录树和 shell 配置不变。
- 首先修复整包测试中的历史 OpenCode 断言;不得通过恢复 OpenCode fallback 换取通过。
- 只修复明确遗漏;构建制品、Release installer、checksum、rollback、purge 属于 S1-03,不提前实现。
- 全部子任务和整链回归完成后,才能把 S1-02 父任务标记 DONE。

请自主执行,不要只做状态汇报。完成当前可完成工作后,明确列出:已合入 develop 的内容、当前分支/PR/commit、CI 结果、下一唯一执行点、仍存在的外部阻塞。
5. docs/open-source-readiness/evidence/S1-02/test-results/S1-02-E-boundary-audit.md
6. PR #7:test(identity): close S1-02-E coexistence boundary gaps

二、重新核验远程实时状态
- develop、master 当前 HEAD
- PR #7 当前 head、状态、mergeability、changed files、reviews/comments
- PR #7 最新 typecheck/test workflow 和所有 job
- PR #7 是否已 squash 合入 develop
- coexistence-boundary-audit 是否仍存在

已知验证基线:
- S1-02-D 已合入 develop@c848bc537e8c5677c36a360dd00122745a2f5b2e
- S1-02-E 已验证代码 head:2442d6b11b7eb7add9ff6685af04e81c3615c657
- typecheck #116 / 30354218370:SUCCESS
- test #118 / 30354218292:SUCCESS
- Linux/Windows unit、lifecycle、完整 config/permission、E2E、generated client、HttpApi 全绿

三、执行逻辑
A. PR #7 仍开放且最终文档 head CI 全绿:
1. 核验 evidence、PLAN 与代码一致。
2. 核验没有未解决 review thread。
3. squash 合入 develop。
4. 从最新 develop 创建独立功能分支,领取 PLAN 的下一唯一代码任务 S1-03。

B. PR #7 有失败:
1. 获取失败 job 的完整日志和 artifact。
2. 分类 PRODUCT_DEFECT、TEST_DEFECT、ENV_BLOCKED 或 FLAKY。
3. 做最小根因修复并重跑完整 CI,不得放宽门禁。

C. PR #7 已合入:
1. 核验 develop 上 S1-02 evidence 完整。
2. 直接开始 S1-03,不重做 S1-02,不提前实施 S1-04/Release 后续门禁。

四、S1-03 目标
- 建立 DeepCode-owned launcher、二进制/归档命名和跨平台构建矩阵。
- 建立可信 GitHub Release/manifest/checksum/SBOM 路径。
- upgrade 只读取 DeepCode-owned channel;支持失败回滚。
- uninstall 与 --purge 只删除 DeepCode,自始至终保持 OpenCode/Oh-my-OpenAgent 不变。
- 不宣称官网可安装,除非 S1-01B/S1-07 的真实官网与部署证据已完成。

请自主执行,不要只做状态汇报。完成当前可完成工作后,明确列出:已合入 develop 的内容、当前分支/PR/commit、完整 CI、修改文件、证据、下一唯一执行点和外部阻塞。
```

## 交接边界

- 本文件是远程恢复入口,不替代 `PLAN.md`。
- 新会话必须重新读取 GitHub 当前状态;本文件中的 CI 状态可能在写入后变化。
- 不得依据本文件直接宣称 PR #6 已合并,必须以 GitHub 实时状态为准。
- 本文件不替代 PLAN;新会话必须重新读取 GitHub 实时状态。
- 写入时 PR #7 尚未宣称已合并;是否合并必须以 GitHub 当前状态为准。
- 产品继续为 NO-GO,直到 Gate 1 全部通过。
Loading
Loading