svharness 0.8.0 → 0.13.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/README.md +290 -61
  2. package/dist/adapters/claude-code.js +1 -0
  3. package/dist/adapters/codechat.js +1 -0
  4. package/dist/adapters/cursor.js +1 -0
  5. package/dist/adapters/generic.js +1 -0
  6. package/dist/adapters/index.js +2 -0
  7. package/dist/adapters/opencode.js +17 -0
  8. package/dist/adapters/qoder.js +1 -0
  9. package/dist/commands/apply.js +456 -71
  10. package/dist/commands/convert.js +371 -0
  11. package/dist/commands/init.js +156 -11
  12. package/dist/commands/references-apply-skills.js +47 -0
  13. package/dist/commands/wizard.js +442 -0
  14. package/dist/config/constants.js +7 -0
  15. package/dist/config/index.js +18 -0
  16. package/dist/config/load-config.js +54 -0
  17. package/dist/config/merge-options.js +115 -0
  18. package/dist/config/normalize.js +165 -0
  19. package/dist/config/save-config.js +40 -0
  20. package/dist/config/types.js +2 -0
  21. package/dist/core/agent-injector.js +58 -9
  22. package/dist/core/apply-project-entry.js +66 -0
  23. package/dist/core/build-project-entry.js +98 -0
  24. package/dist/core/doc-intake-paths.js +155 -0
  25. package/dist/core/extra-assets-intake.js +254 -0
  26. package/dist/core/markitdown-client.js +156 -0
  27. package/dist/core/next-steps.js +33 -22
  28. package/dist/core/project-ignore.js +53 -0
  29. package/dist/core/reference-apply-skills.js +35 -0
  30. package/dist/core/render-meta.js +2 -1
  31. package/dist/core/repomix-pack.js +3 -3
  32. package/dist/core/state.js +44 -24
  33. package/dist/index.js +211 -140
  34. package/dist/utils/harness-name.js +41 -0
  35. package/dist/utils/validate-args.js +147 -6
  36. package/dist/wiki/wikiTasksWriter.js +5 -6
  37. package/package.json +2 -1
  38. package/templates/_shared/apply-skills/harness-apply-skills-main.md +19 -78
  39. package/templates/_shared/build-rules/harness-build-rule-agent-agnostic.md +5 -5
  40. package/templates/_shared/build-rules/harness-build-rule-chinese-only.md +5 -5
  41. package/templates/_shared/build-rules/harness-build-rule-convert-check.md +46 -0
  42. package/templates/_shared/build-rules/harness-build-rule-memory-write.md +1 -1
  43. package/templates/_shared/build-rules/harness-build-rule-orchestrator-flow.md +36 -10
  44. package/templates/_shared/build-rules/harness-build-rule-skills-tasks-output.md +3 -2
  45. package/templates/_shared/build-rules/harness-build-rule-specs-schema.md +3 -3
  46. package/templates/_shared/build-rules/harness-build-rule-user-interaction.md +36 -16
  47. package/templates/_shared/build-skills/harness-build-skill-agent-env-merge.md +75 -0
  48. package/templates/_shared/build-skills/harness-build-skill-knowledge-builder.md +49 -85
  49. package/templates/_shared/build-skills/harness-build-skill-orchestrator.md +35 -18
  50. package/templates/_shared/build-skills/harness-build-skill-references-intake.md +91 -0
  51. package/templates/_shared/build-skills/harness-build-skill-spec-builder.md +19 -9
  52. package/templates/_shared/build-skills/harness-build-skill-wiki-writer.md +24 -24
  53. package/templates/_shared/build-skills/harness-build-skills-main.md +83 -0
  54. package/templates/_shared/meta/AGENTS_APPLY.md.ejs +139 -0
  55. package/templates/_shared/meta/{AGENTS.md.ejs → AGENTS_BUILD.md.ejs} +7 -5
  56. package/templates/_shared/meta/CHANGELOG.md.ejs +3 -3
  57. package/templates/_shared/meta/README.md.ejs +11 -9
  58. package/templates/_shared/meta/harness.yaml.ejs +28 -7
  59. package/templates/_shared/skeleton/baseline/code/.gitkeep +1 -0
  60. package/templates/_shared/skeleton/baseline/wiki/.gitkeep +1 -0
  61. package/templates/_shared/skeleton/references/apply-skills-registry.example.yaml +11 -0
  62. package/templates/_shared/skeleton/references/md/.gitkeep +1 -0
  63. package/templates/_shared/skeleton/references/raw/.gitkeep +1 -0
  64. package/templates/_shared/skeleton/references/yaml/.gitkeep +1 -0
  65. package/templates/_shared/skeleton/requirements/md/.gitkeep +1 -0
  66. package/templates/_shared/skeleton/requirements/raw/.gitkeep +1 -0
  67. package/templates/_shared/skeleton/requirements/yaml/.gitkeep +1 -0
  68. package/templates/android-xml/skeleton/agent-env/skills/harness-android-cli/SKILL.md +88 -0
  69. package/templates/android-xml/skeleton/agent-env/skills/harness-android-service-patterns/SKILL.md +205 -0
  70. package/templates/android-xml/skeleton/agent-env/skills/harness-android-xml-architecture/SKILL.md +138 -0
  71. package/templates/android-xml/skeleton/agent-env/skills/harness-lifecycle-management/SKILL.md +158 -0
  72. package/templates/android-xml/skeleton/agent-env/skills/harness-xml-ui/SKILL.md +112 -0
  73. package/templates/cpp/skeleton/agent-env/skills/harness-cmake-build/SKILL.md +163 -0
  74. package/templates/cpp/skeleton/agent-env/skills/harness-cpp-architecture/SKILL.md +157 -0
  75. package/templates/cpp/skeleton/agent-env/skills/harness-cpp-concurrency/SKILL.md +180 -0
  76. package/templates/cpp/skeleton/agent-env/skills/harness-memory-safety/SKILL.md +163 -0
  77. package/templates/cpp/skeleton/agent-env/skills/harness-modern-cpp/SKILL.md +149 -0
  78. package/templates/python/skeleton/agent-env/skills/harness-async-patterns/SKILL.md +162 -0
  79. package/templates/python/skeleton/agent-env/skills/harness-python-architecture/SKILL.md +160 -0
  80. package/templates/python/skeleton/agent-env/skills/harness-python-package-structure/SKILL.md +210 -0
  81. package/templates/python/skeleton/agent-env/skills/harness-python-performance/SKILL.md +207 -0
  82. package/templates/python/skeleton/agent-env/skills/harness-python-testing/SKILL.md +198 -0
  83. package/templates/svharness.config.example.yaml +40 -0
  84. package/templates/web-react/skeleton/agent-env/skills/harness-react-architecture/SKILL.md +177 -0
  85. package/templates/web-react/skeleton/agent-env/skills/harness-react-performance/SKILL.md +177 -0
  86. package/templates/web-react/skeleton/agent-env/skills/harness-react-testing/SKILL.md +193 -0
  87. package/templates/web-react/skeleton/agent-env/skills/harness-react-ui-patterns/SKILL.md +257 -0
  88. package/templates/web-react/skeleton/agent-env/skills/harness-state-management/SKILL.md +189 -0
  89. package/templates/_shared/skeleton/assets/baseline/code/.gitkeep +0 -1
  90. package/templates/_shared/skeleton/assets/baseline/wiki/.gitkeep +0 -1
  91. package/templates/_shared/skeleton/assets/raw/.gitkeep +0 -1
  92. package/templates/_shared/skeleton/assets/requirements/.gitkeep +0 -1
  93. /package/templates/_shared/skeleton/{assets/baseline/repomix → agent-env/_incoming/skills}/.gitkeep +0 -0
package/README.md CHANGED
@@ -29,6 +29,12 @@ cd svharnessbuild && npm install && npm run build && npm link
29
29
  # 最简 —— 只填名字,其余取默认(arch=android-compose, agent=codechat)
30
30
  svharness build --harness-name my-app
31
31
 
32
+ # 交互式向导(推荐新手)—— 可填路径 + 文字说明,保存配置或立即执行
33
+ svharness wizard
34
+
35
+ # 配置文件驱动(团队模板 / CI)
36
+ svharness build --config svharness.config.yaml --yes
37
+
32
38
  # 一行式 —— 跳过交互,直接生成
33
39
  svharness build --harness-name my-app --arch android-compose --agent qoder --yes
34
40
 
@@ -36,10 +42,38 @@ svharness build --harness-name my-app --arch android-compose --agent qoder --yes
36
42
  svharness apply --harness ./my-app-harness --target ../other-project --yes
37
43
  ```
38
44
 
45
+ ### 配置文件与向导(v0.10+)
46
+
47
+ **优先级**:`CLI 参数 > svharness.config.yaml > 代码默认值`
48
+
49
+ 1. 复制示例配置:`templates/svharness.config.example.yaml` → 项目根 `svharness.config.yaml`
50
+ 2. 编辑 `build` / `apply` / `convert` 各节参数
51
+ 3. 执行:`svharness build --yes`(自动读取当前目录下的 `svharness.config.yaml`)
52
+
53
+ 也可显式指定:`svharness build --config ./team/android-compose.yaml --yes`
54
+
55
+ `build` 成功后落盘当前参数:`svharness build --harness-name my-app --save-config`
56
+
57
+ **`svharness wizard`**:分步 TUI,支持同时填写**文件路径**与**说明文字**(如 `requirementsNote`),结束时可选「立即执行 / 仅保存配置 / 保存并执行」。
58
+
39
59
  生成完成后,在你的 Agent IDE 中说:
40
- - "运行 harness-build-skill-orchestrator"即可开始逐步填充内容;
60
+ - "运行 harness-build-skills-main"或"harness-build-skill-orchestrator"即可开始逐步填充内容;
41
61
  - 构建完成后在目标项目中说"应用 harness-apply-skills-main 完成 xxx 功能开发"即可调用 harness。
42
62
 
63
+ ### 演示数据集(demo_project)
64
+
65
+ 仓库自带 **[`demo_project/`](./demo_project/)**(Python 计算器主题),可一次性验证 `--baseline` / `--requirements` / `--references` / `--extra-skills` 四类输入及 intake 分类。详见 [`demo_project/README.md`](./demo_project/README.md)。
66
+
67
+ ```powershell
68
+ cd svharnessbuild
69
+ svharness build --harness-name demo-py --arch python --agent codechat `
70
+ --baseline ./demo_project/baseline `
71
+ --requirements ./demo_project/requirements `
72
+ --references ./demo_project/references `
73
+ --extra-skills ./demo_project/extra-skills `
74
+ --yes --force
75
+ ```
76
+
43
77
  ---
44
78
 
45
79
  ## 核心概念
@@ -51,7 +85,7 @@ Harness 是一个 **项目本地的知识层**,由两大部分组成:
51
85
  | 部分 | 位置 | 生命周期 | 说明 |
52
86
  |------|------|----------|------|
53
87
  | **Agent 注入目录** | `.qoder/` / `.codechat/` / `.cursor/` 等 | `build` 时创建,Agent 自动加载 | rules + build-skills |
54
- | **Harness 目录** | `<harness-name>-harness/` | `build` 创建骨架 → Agent 逐步填充 | specs / assets / agent-env / tasks |
88
+ | **Harness 目录** | `<harness-name>-harness/` | `build` 创建骨架 → Agent 逐步填充 | specs / requirements / references / baseline / agent-env / tasks |
55
89
 
56
90
  ### 目录结构
57
91
 
@@ -60,11 +94,11 @@ Harness 是一个 **项目本地的知识层**,由两大部分组成:
60
94
  ```
61
95
  <harness-name>-harness/
62
96
  ├── harness.yaml # 入口清单(架构 / agent / schema 引用)
63
- ├── AGENTS.md # 面向 Agent 的使用指南
97
+ ├── AGENTS_BUILD.md # 面向 Agent 的使用指南
64
98
  ├── README.md # 面向人的项目概览
65
99
  ├── VERSION
66
100
  ├── CHANGELOG.md
67
- ├── .harness-build-state.yaml # 构建进度追踪(P1P-Final
101
+ ├── .harness-build-state.yaml # 构建进度追踪(S10S90
68
102
 
69
103
  ├── specs/ # 契约层
70
104
  │ ├── signals/schema.json
@@ -72,12 +106,17 @@ Harness 是一个 **项目本地的知识层**,由两大部分组成:
72
106
  │ ├── behavior/schema.json
73
107
  │ └── interfaces/schema.json
74
108
 
75
- ├── assets/ # 支撑素材(非契约)
76
- │ ├── raw/ # 原始需求文档
77
- │ ├── requirements/ # 条目化后的需求
78
- │ └── baseline/
79
- ├── code/ # 参考代码快照
80
- └── wiki/ # 架构 wiki
109
+ ├── requirements/ # 正式需求(参与条目化)
110
+ │ ├── raw/ # S20_collect_inputs 用户入口
111
+ │ ├── md/ # convert 产物
112
+ │ └── yaml/ # S40 条目化产出
113
+ ├── references/ # 参考资料(不参与条目化)
114
+ ├── raw/
115
+ │ ├── md/
116
+ │ └── yaml/
117
+ └── baseline/
118
+ ├── code/ # 参考代码快照
119
+ └── wiki/ # 架构 wiki
81
120
 
82
121
  ├── agent-env/ # Agent 运行期环境
83
122
  │ ├── rules/ # 编码规则(.mdc,always_on 加载)
@@ -89,15 +128,31 @@ Harness 是一个 **项目本地的知识层**,由两大部分组成:
89
128
  └── tasks/ # 可复用的开发者工作流
90
129
  ```
91
130
 
92
- 同时,CLI 会向 Agent IDE 的 skill 目录注入 **4 个构建辅助 skill**:
131
+ 同时,CLI 会在**项目根**写入 `CLAUDE.md`(`--agent codechat` 或 `claude-code`)或 `AGENTS.md`(`qoder` / `cursor` / `opencode` / `generic`),并向 Agent IDE 的 skill 目录注入 **7 个构建辅助 skill**:
93
132
 
94
133
  | Skill | 职责 |
95
134
  |-------|------|
135
+ | `harness-build-skills-main` | **总清单**:解析内联绑定元数据 → 装载构建规则 → 路由到各子 skill |
96
136
  | `harness-build-skill-orchestrator` | 读取构建状态,路由到下一阶段 |
97
137
  | `harness-build-skill-spec-builder` | raw → requirements → specs 管线 |
98
- | `harness-build-skill-knowledge-builder` | baseline 快照 / rules / skills 索引 |
138
+ | `harness-build-skill-references-intake` | S60 references 转换 + 结构化索引 |
139
+ | `harness-build-skill-agent-env-merge` | S61 baseline 自动提取确认 + S65 合并写入 |
140
+ | `harness-build-skill-knowledge-builder` | S10 baseline 样本 + S70 skills/tasks 索引 |
99
141
  | `harness-build-skill-wiki-writer` | 按 TASKS.md 逐页撰写 wiki 正文 |
100
142
 
143
+ 简短阶段对照(阶段 → skill):
144
+
145
+ ```text
146
+ S10_wiki -> harness-build-skill-wiki-writer(正文)/ harness-build-skill-knowledge-builder(样本子任务)
147
+ S20_collect_inputs -> harness-build-skill-orchestrator
148
+ S30_convert_docs -> harness-build-skill-orchestrator
149
+ S40/S50 -> harness-build-skill-spec-builder
150
+ S60 -> harness-build-skill-references-intake
151
+ S61/S65 -> harness-build-skill-agent-env-merge
152
+ S70 -> harness-build-skill-knowledge-builder
153
+ S80/S90 -> harness-build-skill-orchestrator
154
+ ```
155
+
101
156
  `.harness-build-state.yaml` 跟踪进度,任何阶段可中断再续。
102
157
 
103
158
  #### 构建辅助 skill / rule 命名规范
@@ -112,7 +167,7 @@ harness-build-{skill|rule}-<semantic-name>
112
167
 
113
168
  | 资源类型 | 目录 | 命名模式 | 现有成员 |
114
169
  |----------|------|----------|----------|
115
- | **Build skill** | `templates/_shared/build-skills/` | `harness-build-skill-<name>.md` | `orchestrator` / `spec-builder` / `knowledge-builder` / `wiki-writer` |
170
+ | **Build skill** | `templates/_shared/build-skills/` | `harness-build-skill-<name>.md` | `skills-main` / `orchestrator` / `spec-builder` / `references-intake` / `agent-env-merge` / `knowledge-builder` / `wiki-writer` |
116
171
  | **Build rule** | `templates/_shared/build-rules/` | `harness-build-rule-<name>.md` | `agent-agnostic` / `chinese-only` / `memory-write` / `orchestrator-flow` / `skills-tasks-output` / `specs-schema` / `user-interaction` |
117
172
 
118
173
  约束:
@@ -127,26 +182,60 @@ harness-build-{skill|rule}-<semantic-name>
127
182
 
128
183
  | 阶段 | 动作 | 产物 |
129
184
  |------|------|------|
130
- | **P1_wiki** | 构建 baseline wiki(仅当有 baseline 时出现,项目经验底座) | `assets/baseline/wiki/` |
131
- | **P2_raw** | 用户放入需求文档(可参考 wiki) | `assets/raw/` |
132
- | **P3** | 条目化需求 | `assets/requirements/*.requirements.yaml` |
133
- | **P4** | 生成规格 | `specs/<layer>/<module>.<layer>.yaml` + schema 校验 |
134
- | **P5** | 规则 + 知识提取 | `agent-env/rules/` + `baseline/code/SAMPLES.md` |
135
- | **P6** | Skills & tasks 索引 | `agent-env/skills/` + `tasks/templates/` |
136
- | **P7** | Memory 初始化 | `agent-env/memory/categories/` |
137
- | **P-Final** | 封板 | 版本 bump + CHANGELOG + 终审 |
185
+ | **S10_wiki** | 构建 baseline wiki(仅当有 baseline 时出现,项目经验底座) | `baseline/wiki/` |
186
+ | **S20_collect_inputs** | 添加相关文件:需求/参考文档 + 额外运行期资源征询(`--extra-skills` 单入口,可混放 skills/rules) | `requirements/raw/` + `references/raw/` + `agent-env/_incoming/skills/` |
187
+ | **S30_convert_docs** | Markdown 原始文档转 Markdown | `requirements/md/` + `references/md/` |
188
+ | **S40_extract_requirements** | 条目化需求 | `requirements/yaml/*.yaml` |
189
+ | **S50_generate_specs** | 生成规格 | `specs/<layer>/<module>.<layer>.yaml` + schema 校验 |
190
+ | **S60_process_references** | references 处理(`svharness convert` + 结构化索引 + 用户确认落地) | `references/md/` |
191
+ | **S61_confirm_baseline_extraction** | 确认是否自动从 baseline 提取 skills/rules(表单确认) | `.harness-build-state.yaml`(`phases.S61_confirm_baseline_extraction.baseline_auto_extract`) |
192
+ | **S65_customize_agent_env** | agent-env 定制(extra-skills/extra-rules 冲突建议与重命名建议 用户确认 写入) | `agent-env/rules/` + `agent-env/skills/` |
193
+ | **S70_runtime_assets** | 运行期 Skills & tasks 索引(skill 执行 task) | `agent-env/skills/` + `tasks/templates/` |
194
+ | **S80_seed_memory** | Memory 初始化 | `agent-env/memory/categories/` |
195
+ | **S90_finalize** | 封板 | 版本 bump + CHANGELOG + 终审 |
138
196
 
139
197
  > 反复调用 orchestrator 总是从"第一个非 DONE 的阶段"继续。
140
- > **P1_wiki 仅在有 baseline 时出现;无 baseline 则不构建 wiki,流程从 P2_raw 开始。**
141
- > **P2_raw 必须等待用户放入需求文档,Agent 不得自行生成占位文件。**
198
+ > **S10_wiki 仅在有 baseline 时出现;无 baseline 则不构建 wiki,流程从 S20_collect_inputs 开始。**
199
+ > **S20_collect_inputs 必须等待用户放入需求文档,且需显式征询 references 与额外运行期资源输入(`--extra-skills`,可混放 skills/rules);Agent 不得自行生成占位文件。若 build 传入了 `--requirements/--references`,CLI 会在拷贝到 raw 后自动尝试 convert 到 md。**
200
+ > **S60_process_references 专注 references:必须执行 `svharness convert`,并产出结构化索引(规制约束 / skills 候选 / signals / manuals),经表单确认后再进入后续阶段。**
201
+ > **S61_confirm_baseline_extraction 必须显式确认是否启用 baseline 自动提取 skills/rules;未经确认不得在 S65 自动提取。**
202
+ > **S65_customize_agent_env 专注 extra-skills/extra-rules:来源可来自 `--extra-skills` 导入后的 `_incoming/manifest.yaml`,先冲突识别与重命名建议,再表单确认写入;推荐命名:`harness-apply-skills-<topic>` 与 `harness-apply-rules-<topic>.md/.mdc`。**
142
203
 
143
204
  ---
144
205
 
145
206
  ## 命令参考
146
207
 
208
+ ### `wizard` —— 交互式向导(v0.10+)
209
+
210
+ ```bash
211
+ svharness wizard
212
+ ```
213
+
214
+ 分步选择 `build` / `apply` / `convert`,填写路径与可选说明,最后保存到 `svharness.config.yaml` 和/或立即执行对应命令。
215
+
216
+ ### 配置文件 `svharness.config.yaml`(v0.10+)
217
+
218
+ | 顶层字段 | 说明 |
219
+ |----------|------|
220
+ | `version` | 固定为 `1` |
221
+ | `defaults` | 各命令共享默认(`arch` / `agent` / `yes` 等) |
222
+ | `build` | 对应 `svharness build` |
223
+ | `apply` | 对应 `svharness apply` |
224
+ | `convert` | 对应 `svharness convert` |
225
+
226
+ `build` 节除路径外,可写人类可读说明(仅写入配置文件,供团队阅读):
227
+
228
+ | 字段 | 说明 |
229
+ |------|------|
230
+ | `requirementsNote` | 需求文档业务说明 |
231
+ | `referencesNote` | 参考资料说明 |
232
+ | `extraSkillsNote` | 额外 skills/rules 说明 |
233
+
234
+ 完整示例见 [`templates/svharness.config.example.yaml`](templates/svharness.config.example.yaml)。
235
+
147
236
  ### `build` —— 构建 harness(v0.8 起的主命令)
148
237
 
149
- > 旧名 `svharness init`(以及 `svharnessbuild init`)作为兼容别名保留,调用时会打印 deprecation 警告。
238
+ > 旧名 `svharness init`(以及 `svharness build`)作为兼容别名保留,调用时会打印 deprecation 警告。
150
239
 
151
240
  #### 交互式
152
241
 
@@ -170,14 +259,24 @@ svharness build \
170
259
 
171
260
  | 参数 | 是否必填 | 说明 | 默认值 |
172
261
  |------|----------|------|--------|
173
- | `--harness-name <name>` | 必填 | harness 名称(小写字母、数字、中连线),生成 `<name>-harness/` 目录 | — |
262
+ | `--config <path>` | 可选 | 读取 YAML/JSON 配置;省略时在 cwd 查找 `svharness.config.yaml` | — |
263
+ | `--save-config [path]` | 可选 | build 成功后把参数写入配置文件 | — |
264
+ | `--harness-name <name>` | ✅ 必填* | harness 名称;可在 `build.harnessName` 中提供 | — |
174
265
  | `--name <name>` | ⚠️ 已废弃别名 | 等同 `--harness-name`,下个 minor 版本移除 | — |
175
266
  | `--arch <arch>` | 可选 | 架构模板:`android-compose` / `android-xml` / `cpp` / `web-react` / `python` | `android-compose` |
176
- | `--agent <agent>` | 可选 | 目标 Agent IDE:`codechat` / `qoder` / `cursor` / `claude-code` / `generic` | `codechat` |
267
+ | `--agent <agent>` | 可选 | 目标 Agent IDE:`codechat` / `qoder` / `cursor` / `claude-code` / `opencode` / `generic` | `codechat` |
177
268
  | `--baseline <path\|url>` | 可选 | 基线来源:本地目录 **或** git 仓库 URL | — |
269
+ | `--requirements <path>` | 可选 | 需求输入路径(文件或目录);build 阶段**扁平**拷贝到 `requirements/raw/`(不保留源目录里的 `assets/raw/converted_md` 等嵌套),随后自动 convert 到 `requirements/md/`(失败仅告警,不中断 build) | — |
270
+ | `--references <path>` | 可选 | 参考资料输入路径(文件或目录);build 阶段**扁平**拷贝到 `references/raw/`,随后自动 convert 到 `references/md/`(失败仅告警,不中断 build) | — |
271
+ | `--extra-skills <path...>` | 可选 | 额外运行期资源输入(文件/目录/glob,可混放 skills/rules);build 阶段先拷贝到 `agent-env/_incoming/skills/` 并生成 `agent-env/_incoming/manifest.yaml`,S65 再分流写入 `skills/` 与 `rules/` | — |
178
272
  | `--baseline-branch <name>` | 可选 | git 基线的分支名(仅 git 模式有效) | `main` |
179
273
  | `--baseline-max-file-kb <kb>` | 可选 | 基线拷贝单文件大小上限(KB) | `1024` |
180
- | `--force` | 可选 flag | 覆写已存在的 harness 目录 | `false` |
274
+ | `--convert-endpoint <url>` | 可选 | build 自动 convert 使用的 markitdown 服务基址;省略时读环境变量 `SVHARNESS_MARKITDOWN_ENDPOINT` | `http://markitdown.desaysz.site` |
275
+ | `--convert-concurrency <n>` | 可选 | build 自动 convert 并发上传数 | `3` |
276
+ | `--convert-max-file-mb <n>` | 可选 | build 自动 convert 单文件大小上限(MB) | `50` |
277
+ | `--convert-timeout-sec <n>` | 可选 | build 自动 convert 请求超时秒数 | `120` |
278
+ | `--convert-force` | 可选 flag | build 自动 convert 覆盖同名 `.md`(否则按 `-1/-2` 追加) | `false` |
279
+ | `--force` | 可选 flag | 覆写已存在的 harness 目录;同时覆写项目根 `AGENTS.md` / `CLAUDE.md`(若存在) | `false` |
181
280
  | `-y, --yes` | 可选 flag | 跳过所有提示,采用默认值 | `false` |
182
281
  | `--verbose` | 可选 flag | 打印每个生成文件 | `false` |
183
282
 
@@ -191,13 +290,13 @@ svharness build \
191
290
  | `--wiki-model <name>` | LLM 模型名 | `Qwen3.6-27B`(来自内置 wiki 配置链) |
192
291
  | `--wiki-base-url <url>` | OpenAI 兼容 API 地址 | `http://model-api.desaysv.com/v1` |
193
292
  | `--wiki-api-key <key>` | API Key | 环境变量 `OPENAI_API_KEY` → `.env` → 内置默认 |
194
- | `--wiki-source <path>` | wiki 扫描的仓库根路径 | `<target>/assets/baseline/code/`(无 baseline 时为 cwd) |
293
+ | `--wiki-source <path>` | wiki 扫描的仓库根路径 | `<target>/baseline/code/`(无 baseline 时为 cwd) |
195
294
 
196
295
  **Wiki 配置优先级**:CLI 参数 > 环境变量 > `.env` 文件 > 内置默认值
197
296
 
198
297
  **Wiki 模式总览**:
199
298
 
200
- | 组合 | 行为 | P1_wiki 状态 |
299
+ | 组合 | 行为 | S10_wiki 状态 |
201
300
  |------|------|---------|
202
301
  | 无 `--baseline` | 不生成 wiki | phase 不存在 |
203
302
  | `--baseline`(默认) | 一次 LLM 拿 outline,写 `TASKS.md` | `PENDING` + `requires_agent: true` |
@@ -217,24 +316,39 @@ svharness build \
217
316
 
218
317
  ### `apply` —— 把已构建好的 harness 绑定到目标项目
219
318
 
220
- 把 `<name>-harness/`(通过 `build` + orchestrator 构建完成的知识层)**以最小侵入方式**应用到任意目标项目:向该项目的 Agent IDE skill 目录注入一个 **dispatcher skill**(`harness-apply-skills-main`),由它在运行期**从 skill 正文内嵌的 `## 绑定元数据` 块**定位 harness 并路由到具体能力。`references/binding.yaml` 作为冗余副本同时写入,仅供 `svharness` 自身工具链(status / detach / re-apply 检测)解析,运行时 dispatcher 不读它。
319
+ 把 `<name>-harness/`(通过 `build` 完成的知识层)应用到目标项目时,`apply` 现采用**默认复制模式**:始终把 harness 拷贝到 `<target>/<name>-harness/`,然后注入 runtime skills/rules,并生成项目根 AI 入口。
221
320
 
222
321
  ```bash
223
- # bind-only(默认)—— 仅注入 dispatcher skill,harness 保留在原位置
322
+ # 默认复制模式(无需 --clone)
224
323
  svharness apply --harness ../my-app-harness --target ./to-apply-project
225
324
 
226
- # clone —— 把整个 harness 完整拷贝到目标项目根下,binding.yaml 指向本地副本
325
+ # --clone 仍可传入,但仅兼容:行为与默认一致(都会拷贝)
227
326
  svharness apply --harness ../my-app-harness --target ./to-apply-project --clone --yes
228
327
  ```
229
328
 
230
- **在 Agent IDE 中触发**:对话框输入 `应用 harness-apply-skills-main 完成 xxx 功能开发`,dispatcher 会自动加载 rules、扫描 skills、路由到合适的子能力。
329
+ **在 Agent IDE 中触发**:对话框输入 `应用 harness-apply-skills-main 完成 xxx 功能开发`,薄入口会提示并优先使用已注入的 `harness-apply-skills-*` skill。
330
+
331
+ 同时,CLI 会在**目标项目根**写入 `CLAUDE.md`(`--agent codechat` 或 `claude-code`)或 `AGENTS.md`(`qoder` / `cursor` / `opencode` / `generic`)。该入口由 `<harness>/AGENTS_APPLY.md` 拷贝并重命名生成(与 `build` 写入项目根入口的规则一致,不再单独落地 `AGENTS_APPLY.md`)。
332
+
333
+ 此外,`apply` 会同步注入运行期资产:
231
334
 
232
- #### 双模式对比
335
+ - `<harness>/agent-env/rules/` → `<target>/<adapter.rulesDir>/`(若该 agent 声明了 `rulesDir`)
336
+ - `<harness>/agent-env/skills/` → `<target>/<adapter.skillsDir>/`(全量注入;`harness-apply-skills-main` 由模板写入为薄入口)
337
+ - 目标 `.gitignore` 会追加注入路径(幂等去重)
233
338
 
234
- | 模式 | 标志 | harness 位置 | binding.yaml `mode` | 适用场景 |
235
- |------|------|-------------|--------------------|----------|
236
- | **bind-only** | 默认 | 保持在 `--harness` 原路径 | `bind-only` | harness 与多个目标项目共享、单一知识源 |
237
- | **clone** | `--clone` | 拷贝到 `<target>/<name>-harness/` | `clone` | 需要自包含交付、离线使用、锁定版本 |
339
+ #### references 内容引用 apply_skill_registry(S60,由 Agent 写入)
340
+
341
+ S60(`harness-build-skill-references-intake`)属于 **build 阶段**。若某份 references 属于**内容引用**(apply 时要按 `references/md/` 原文指导开发),Agent 应:
342
+
343
+ 1. 登记 `references/apply-skills-registry.yaml`(`skill_name`、`reference_md`、`description`,可选 `entry` / `source_id`)
344
+ 2. 执行 `svharness apply` 时,运行期 skill 将按引用原文执行,且相关路径会改写到 `<target>/<name>-harness/` 下可达位置
345
+
346
+ 无单独 CLI;规制约束、纯手册类 references **不**登记 registry。
347
+
348
+ #### build / apply 分工
349
+
350
+ - **build 阶段**:生成 harness 本体资产(`AGENTS_APPLY.md`、`agent-env/skills`、`agent-env/rules`、`specs`、`baseline` 等)
351
+ - **apply 阶段**:复制 harness 到目标项目、注入 skills/rules、生成入口文件、写 `.gitignore`、校验注入文件引用关系
238
352
 
239
353
  #### 全部参数
240
354
 
@@ -242,9 +356,9 @@ svharness apply --harness ../my-app-harness --target ./to-apply-project --clone
242
356
  |------|----------|------|--------|
243
357
  | `--harness <path>` | ✅ 必填 | 已构建好的 harness 目录(形如 `./my-app-harness`) | — |
244
358
  | `--target <path>` | 可选 | 目标项目根目录 | **当前工作目录(cwd)** |
245
- | `--agent <agent>` | 可选 | 目标 Agent:`codechat` / `qoder` / `cursor` / `claude-code` / `generic` | **从 `<harness>/.harness-build-state.yaml` 读取**;缺失则报错 |
246
- | `--clone` | 可选 flag | 完整拷贝 harness 到目标项目根下 | `false`(即 bind-only) |
247
- | `--force` | 可选 flag | 覆盖已存在的 dispatcher skill 目录(clone 模式下同时覆盖克隆目标) | `false` |
359
+ | `--agent <agent>` | 可选 | 目标 Agent:`codechat` / `qoder` / `cursor` / `claude-code` / `opencode` / `generic` | **从 `<harness>/.harness-build-state.yaml` 读取**;缺失则报错 |
360
+ | `--clone` | 可选 flag | 兼容参数;当前实现下行为与默认一致(都会拷贝 harness | `false` |
361
+ | `--force` | 可选 flag | 覆盖已存在注入目录与入口文件;同时允许重拷贝 harness | `false` |
248
362
  | `-y, --yes` | 可选 flag | 跳过交互确认 | `false` |
249
363
  | `--verbose` | 可选 flag | 显示详细日志 | `false` |
250
364
 
@@ -252,30 +366,85 @@ svharness apply --harness ../my-app-harness --target ./to-apply-project --clone
252
366
 
253
367
  ```
254
368
  <target>/
369
+ ├── CLAUDE.md | AGENTS.md # apply 工作流入口(由 harness/AGENTS_APPLY.md 重命名)
370
+ ├── <adapter.rulesDir>/... # 运行期 rules 注入(若 adapter 声明 rulesDir)
371
+ ├── <adapter.skillsDir>/<runtime-skill>/SKILL.{md|mdc} # 运行期 skills 注入
255
372
  ├── <adapter.skillsDir>/harness-apply-skills-main/
256
- ├── SKILL.{md|mdc} # dispatcher skill 本体(含 frontmatter 触发词
257
- │ │ # + 末尾 ## 绑定元数据 内嵌 YAML 块,权威来源)
258
- │ └── references/binding.yaml # 冗余副本(权威源在 SKILL.md 内),供工具链解析
259
- └── <name>-harness/ # 仅 --clone 模式
373
+ └── SKILL.{md|mdc} # 薄入口 skill(仅提示/索引,不做二级调度)
374
+ └── <name>-harness/ # apply 默认复制后的 harness
260
375
  ```
261
376
 
262
- dispatcher skill 末尾内嵌的 `## 绑定元数据` YAML 块即权威来源,`references/binding.yaml` 只是同字段的冗余副本。字段示例:
263
-
264
- ```yaml
265
- harness_name: my-app
266
- harness_root: D:\abs\path\to\my-app-harness # 运行时定位 harness 的绝对路径
267
- harness_root_rel: ../my-app-harness # 相对 target 的路径(可读)
268
- harness_version: 0.1.0
269
- target_project: D:\abs\path\to\to-apply-project
270
- agent: codechat
271
- mode: bind-only # clone
272
- applied_at: '2026-05-12T13:34:54.184Z'
273
- applied_by: svharness@0.8.0
377
+ > 注入完成后,CLI 会校验入口文件、薄入口 skill、注入 skills/rules 内的路径引用是否可达;失败会报错中止。
378
+
379
+ ### `convert` —— 文档 → Markdown 预处理(对接 S20_collect_inputs)
380
+
381
+ 把本地原始需求文档(`.pdf / .docx / .pptx / .xlsx / .html / .epub / .txt / .csv / .json / ...`)通过**云端部署**的 `markitdown_serve`(FastAPI + Microsoft MarkItDown)批量转为 Markdown,产物统一落到 `<harness>/<type>/md/`(`type` 为 `requirements` 或 `references`),直接喂给下游 `S40_extract_requirements` 条目化流程,显著提升 specs 生成质量的稳定性。
382
+
383
+ > **架构约束**:CLI 只是 HTTP 客户端,**不 spawn / 不装 Python / 不管进程**。服务端代码集中在 `svharnessbuild/markitdown_serve/` 便于仓内维护,但**不随 npm 包分发**,部署方式详见 [markitdown_serve/README.md](./markitdown_serve/README.md)。
384
+
385
+ ```bash
386
+ # 最简 —— 所有参数均可省略,默认扫描当前目录
387
+ svharness convert
388
+
389
+ # 独立模式:md 直接写入 ./docs/md
390
+ svharness convert --input ./docs/*.pdf --output ./docs/md --yes
391
+
392
+ # harness 模式:md 写入 ./my-app-harness/requirements/md/
393
+ svharness convert --input ./my-app-harness/requirements/raw --output ./my-app-harness --yes
394
+
395
+ # 显示处理日志
396
+ svharness convert --verbose
274
397
  ```
275
398
 
276
- > - clone 模式下 `harness_root` 指向克隆后的本地副本,而非 `--harness` 原路径。
277
- > - 同路径自拷贝会被自动跳过(防御性校验)。
278
- > - `--agent` 省略时从 harness 构建状态文件读取,确保与原 IDE 一致;若状态文件缺失则报错。
399
+ #### 全部参数
400
+
401
+ | 参数 | 说明 | 默认值 |
402
+ |------|------|--------|
403
+ | `--input <path...>` | 一个或多个源文件 / 目录 / glob,支持 `./a/*.pdf`、`./docs/**/*.docx`、`./{a,b}/*.md` | `.`(当前目录) |
404
+ | `--harness <path>` | harness 根目录(需 `harness.yaml`);单独使用时写入 `<harness>/<type>/md/`;与 `--output` 同用时 `--output` 为最终 md 目录 | — |
405
+ | `--output <path>` | **独立模式**:最终 md 输出目录;**harness 模式**:`path` 含 `harness.yaml` 时写入 `<path>/<type>/md/` | `.`(当前目录) |
406
+ | `--endpoint <url>` | 云端 `markitdown_serve` 基址,省略时读环境变量 `SVHARNESS_MARKITDOWN_ENDPOINT` | `http://markitdown.desaysz.site` |
407
+ | `--concurrency <n>` | 并发上传数 | `3` |
408
+ | `--max-file-mb <n>` | 单文件大小上限(MB),本地 + 服务端双重限流 | `50` |
409
+ | `--timeout-sec <n>` | 单请求超时秒数 | `120`(2 分钟) |
410
+ | `--type <type>` | 目标子目录:`requirements`(正式需求)\| `references`(参考资料) | `requirements` |
411
+ | `--force` | flag,覆盖已存在同名 `.md`(默认自动追加 `-1`、`-2` 后缀) | `false` |
412
+ | `-y, --yes` | flag,跳过交互确认 | `false` |
413
+ | `--verbose` | flag,显示详细日志 | `false` |
414
+
415
+ #### 行为要点
416
+
417
+ - **健康探针前置**:上传前先 `GET /healthz`,不通直接退出并打印清晰定位指引(endpoint / 环境变量 / 服务端目录三条线索)。
418
+ - **单文件失败不中断**:失败单文件计入汇总,其它文件照常完成。结束时打印 `ok / skipped / failed` 计数。
419
+ - **本地白名单预过滤**:客户端与服务端的扩展名白名单保持一致,非白名单文件本地直接跳过,避免无意义往返。
420
+ - **两种输出模式**:
421
+ - **独立**:`--output` 即最终 md 目录(路径下无 `harness.yaml`),例如 `--output ./docs/md`。
422
+ - **harness**:`--output` 或 `--harness` 指向含 `harness.yaml` 的目录时,写入 `<harness>/<type>/md/`(build / Agent 模板沿用此约定)。
423
+ - **harness 模式收尾**:扫描 `raw/` 时跳过 `converted_md/`、`md/` 等;结束后将误落在 `raw/**/converted_md/` 下的 `.md` 迁回 `<type>/md/`。
424
+ - **源文件不改动**:只生成 md,不移动或删除原始文档。
425
+
426
+ #### 产物
427
+
428
+ ```
429
+ <harness>/
430
+ └── requirements/ # --type requirements(默认)
431
+ │ └── md/
432
+ │ ├── 需求.md
433
+ │ └── ...
434
+ └── references/ # --type references
435
+ └── md/
436
+ ├── 参考文档.md
437
+ └── ...
438
+ ```
439
+
440
+ #### 接口契约(CLI ⇄ markitdown_serve)
441
+
442
+ | 端点 | 方法 | 约定 |
443
+ |---|---|---|
444
+ | `/healthz` | GET | 200 `{status, markitdown_version}` |
445
+ | `/convert` | POST | multipart/form-data,字段 `file`;200 返回 `{markdown, source_name, mime}`;413/415/500 带结构化 `error` 字段 |
446
+
447
+ 完整契约与部署说明见 [markitdown_serve/README.md](./markitdown_serve/README.md)。
279
448
 
280
449
  ---
281
450
 
@@ -364,6 +533,11 @@ svharness build --harness-name my-app --yes
364
533
  # 显式指定全部参数
365
534
  svharness build --harness-name my-app --arch android-compose --agent qoder --yes
366
535
 
536
+ # 额外运行期资源(单入口,可混放 skills/rules,先入 _incoming)
537
+ svharness build \
538
+ --harness-name my-app --arch android-compose --agent codechat \
539
+ --extra-skills ./extras ./rules/*.mdc --yes
540
+
367
541
  # 本地基线 + wiki 生成
368
542
  svharness build \
369
543
  --harness-name my-app --arch android-compose --agent codechat \
@@ -493,6 +667,61 @@ pwsh -File .\scripts\smoke-test.ps1
493
667
 
494
668
  构建 TS → 临时目录 `build` → 校验文件 → `--force` 覆写验证。
495
669
 
670
+ ### 演示与 `--extra-skills` 验收
671
+
672
+ 端到端演示(requirements + references + baseline + extra-skills 混放)见 **[`demo_project/README.md`](./demo_project/README.md)**。在 `svharnessbuild/` 下:
673
+
674
+ ```powershell
675
+ svharness build --harness-name demo-py --arch python --agent codechat `
676
+ --baseline ./demo_project/baseline `
677
+ --requirements ./demo_project/requirements `
678
+ --references ./demo_project/references `
679
+ --extra-skills ./demo_project/extra-skills `
680
+ --yes --force
681
+ ```
682
+
683
+ `demo_project/extra-skills/` 布局:
684
+
685
+ | 路径 | intake `detected_type` |
686
+ |------|------------------------|
687
+ | `harness-apply-skills-test-generator/SKILL.md` | `skill` |
688
+ | `harness-apply-skills-python-code-review/SKILL.md` | `skill` |
689
+ | `harness-apply-rules-demo-calculator.mdc` | `rule` |
690
+ | `unknown-sample/readme.txt` | `unknown`(S65 需人工确认) |
691
+
692
+ **分项验收**(仅测 extra-skills 某一类时):
693
+
694
+ ```powershell
695
+ # 1) 纯 skills(两个目录,可重复 --extra-skills)
696
+ svharness build --harness-name demo-skills --arch python --agent codechat `
697
+ --extra-skills ./demo_project/extra-skills/harness-apply-skills-test-generator `
698
+ --extra-skills ./demo_project/extra-skills/harness-apply-skills-python-code-review `
699
+ --yes --force
700
+
701
+ # 2) 纯 rule
702
+ svharness build --harness-name demo-rules --arch python --agent codechat `
703
+ --extra-skills ./demo_project/extra-skills/harness-apply-rules-demo-calculator.mdc `
704
+ --yes --force
705
+
706
+ # 3) skills + rules 混放(与端到端相同目录)
707
+ svharness build --harness-name demo-mixed --arch python --agent codechat `
708
+ --extra-skills ./demo_project/extra-skills --yes --force
709
+
710
+ # 4) unknown 资源(需 S65 人工确认类型)
711
+ svharness build --harness-name demo-unknown --arch python --agent codechat `
712
+ --extra-skills ./demo_project/extra-skills/unknown-sample/readme.txt `
713
+ --yes --force
714
+ ```
715
+
716
+ 验收观察点:
717
+
718
+ - `agent-env/_incoming/skills/` 已导入输入资源;
719
+ - `agent-env/_incoming/manifest.yaml` 包含 `detected_type` 与 `suggested_name`;
720
+ - `.harness-build-state.yaml` 的 `S65_customize_agent_env` 已回填 `incoming_total/skills_count/rules_count/unknown_count`;
721
+ - unknown 或冲突资源仅在 S65 表单确认后落入 `agent-env/skills/` 或 `agent-env/rules/`。
722
+
723
+ > 历史 `fixtures/` 目录已移除,统一由 `demo_project/` 承担演示与 intake 验收。
724
+
496
725
  ### 注意事项
497
726
 
498
727
  1. **shebang**:`bin/cli.js` 首行必须为 `#!/usr/bin/env node`
@@ -514,7 +743,7 @@ pwsh -File .\scripts\smoke-test.ps1
514
743
  - [x] 多架构模板(`android-compose` / `android-xml` / `cpp` / `web-react` / `python`)
515
744
  - [x] `_shared/` + `<arch>/` 两层叠拷合并
516
745
  - [x] 每个架构自带 3-5 条规则文件(`.mdc` 格式,`always_on` 加载)
517
- - [x] `apply` —— 把已构建好的 harness 绑定到目标项目(支持 `--clone` 双模式)
746
+ - [x] `apply` —— 把已构建好的 harness 绑定到目标项目(默认复制模式,`--clone` 兼容保留)
518
747
  - [x] 构建辅助资源统一命名(`build-skills/harness-build-skill-*`、`build-rules/harness-build-rule-*`)
519
748
  - [ ] `detach` —— 从目标项目解绑并清理 dispatcher skill
520
749
  - [ ] `doctor` —— 检查既有 harness 的健康度
@@ -4,6 +4,7 @@ exports.claudeCodeAdapter = void 0;
4
4
  const _frontmatter_1 = require("./_frontmatter");
5
5
  exports.claudeCodeAdapter = {
6
6
  name: 'claude-code',
7
+ projectEntryFile: 'CLAUDE.md',
7
8
  skillsDir: '.claude/skills',
8
9
  skillExt: '.md',
9
10
  rulesDir: '.claude/rules',
@@ -4,6 +4,7 @@ exports.codechatAdapter = void 0;
4
4
  const _frontmatter_1 = require("./_frontmatter");
5
5
  exports.codechatAdapter = {
6
6
  name: 'codechat',
7
+ projectEntryFile: 'CLAUDE.md',
7
8
  skillsDir: '.codechat/skills',
8
9
  skillExt: '.md',
9
10
  rulesDir: '.codechat/rules',
@@ -8,6 +8,7 @@ const _frontmatter_1 = require("./_frontmatter");
8
8
  */
9
9
  exports.cursorAdapter = {
10
10
  name: 'cursor',
11
+ projectEntryFile: 'AGENTS.md',
11
12
  skillsDir: '.cursor/rules',
12
13
  skillExt: '.mdc',
13
14
  transform: (0, _frontmatter_1.ensureMdcFrontmatter)('Harness build helper skill'),
@@ -11,6 +11,7 @@ const _frontmatter_1 = require("./_frontmatter");
11
11
  */
12
12
  exports.genericAdapter = {
13
13
  name: 'generic',
14
+ projectEntryFile: 'AGENTS.md',
14
15
  skillsDir: '.harness/skills',
15
16
  skillExt: '.md',
16
17
  rulesDir: '.harness/rules',
@@ -7,11 +7,13 @@ const qoder_1 = require("./qoder");
7
7
  const cursor_1 = require("./cursor");
8
8
  const claude_code_1 = require("./claude-code");
9
9
  const generic_1 = require("./generic");
10
+ const opencode_1 = require("./opencode");
10
11
  const REGISTRY = {
11
12
  codechat: codechat_1.codechatAdapter,
12
13
  qoder: qoder_1.qoderAdapter,
13
14
  cursor: cursor_1.cursorAdapter,
14
15
  'claude-code': claude_code_1.claudeCodeAdapter,
16
+ opencode: opencode_1.opencodeAdapter,
15
17
  generic: generic_1.genericAdapter,
16
18
  };
17
19
  function getAdapter(name) {
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.opencodeAdapter = void 0;
4
+ const _frontmatter_1 = require("./_frontmatter");
5
+ /**
6
+ * OpenCode (opencode.ai): project skills under `.opencode/skills/<name>/SKILL.md`.
7
+ * @see https://opencode.ai/docs/skills
8
+ */
9
+ exports.opencodeAdapter = {
10
+ name: 'opencode',
11
+ projectEntryFile: 'AGENTS.md',
12
+ skillsDir: '.opencode/skills',
13
+ skillExt: '.md',
14
+ rulesDir: '.opencode/rules',
15
+ ruleExt: '.mdc',
16
+ ruleTransform: (0, _frontmatter_1.ensureMdcFrontmatter)('Harness build-time rule'),
17
+ };
@@ -4,6 +4,7 @@ exports.qoderAdapter = void 0;
4
4
  const _frontmatter_1 = require("./_frontmatter");
5
5
  exports.qoderAdapter = {
6
6
  name: 'qoder',
7
+ projectEntryFile: 'AGENTS.md',
7
8
  skillsDir: '.qoder/skills',
8
9
  skillExt: '.md',
9
10
  rulesDir: '.qoder/rules',