svharness 0.8.0

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 (134) hide show
  1. package/README.md +531 -0
  2. package/bin/cli.js +3 -0
  3. package/dist/adapters/_frontmatter.js +24 -0
  4. package/dist/adapters/claude-code.js +12 -0
  5. package/dist/adapters/codechat.js +12 -0
  6. package/dist/adapters/cursor.js +19 -0
  7. package/dist/adapters/generic.js +19 -0
  8. package/dist/adapters/index.js +26 -0
  9. package/dist/adapters/qoder.js +12 -0
  10. package/dist/commands/apply.js +272 -0
  11. package/dist/commands/init.js +420 -0
  12. package/dist/core/agent-injector.js +192 -0
  13. package/dist/core/next-steps.js +91 -0
  14. package/dist/core/render-meta.js +81 -0
  15. package/dist/core/repomix-pack.js +54 -0
  16. package/dist/core/scaffold.js +93 -0
  17. package/dist/core/state.js +80 -0
  18. package/dist/index.js +239 -0
  19. package/dist/types.js +5 -0
  20. package/dist/utils/baseline-copy.js +591 -0
  21. package/dist/utils/baseline-defaults.js +106 -0
  22. package/dist/utils/logger.js +56 -0
  23. package/dist/utils/validate-args.js +132 -0
  24. package/dist/utils/version.js +23 -0
  25. package/dist/wiki/abort.js +30 -0
  26. package/dist/wiki/config.js +79 -0
  27. package/dist/wiki/defaults.js +16 -0
  28. package/dist/wiki/envLoader.js +78 -0
  29. package/dist/wiki/index.js +29 -0
  30. package/dist/wiki/openaiCompat.js +219 -0
  31. package/dist/wiki/repowikiCanonicalSections.js +67 -0
  32. package/dist/wiki/repowikiCheckpoint.js +106 -0
  33. package/dist/wiki/repowikiConfig.js +9 -0
  34. package/dist/wiki/repowikiGit.js +73 -0
  35. package/dist/wiki/repowikiIndexer.js +824 -0
  36. package/dist/wiki/repowikiMarkdownPost.js +123 -0
  37. package/dist/wiki/repowikiMetadataContent.js +64 -0
  38. package/dist/wiki/repowikiMetadataJson.js +15 -0
  39. package/dist/wiki/repowikiScanner.js +156 -0
  40. package/dist/wiki/repowikiStructureNav.js +286 -0
  41. package/dist/wiki/repowikiStructureNormalize.js +218 -0
  42. package/dist/wiki/wikiStructureXml.js +316 -0
  43. package/dist/wiki/wikiTasksWriter.js +127 -0
  44. package/package.json +57 -0
  45. package/templates/_shared/apply-skills/harness-apply-skills-main.md +91 -0
  46. package/templates/_shared/build-rules/harness-build-rule-agent-agnostic.md +35 -0
  47. package/templates/_shared/build-rules/harness-build-rule-chinese-only.md +49 -0
  48. package/templates/_shared/build-rules/harness-build-rule-memory-write.md +31 -0
  49. package/templates/_shared/build-rules/harness-build-rule-orchestrator-flow.md +25 -0
  50. package/templates/_shared/build-rules/harness-build-rule-skills-tasks-output.md +35 -0
  51. package/templates/_shared/build-rules/harness-build-rule-specs-schema.md +32 -0
  52. package/templates/_shared/build-rules/harness-build-rule-user-interaction.md +63 -0
  53. package/templates/_shared/build-skills/harness-build-skill-knowledge-builder.md +120 -0
  54. package/templates/_shared/build-skills/harness-build-skill-orchestrator.md +87 -0
  55. package/templates/_shared/build-skills/harness-build-skill-spec-builder.md +85 -0
  56. package/templates/_shared/build-skills/harness-build-skill-wiki-writer.md +77 -0
  57. package/templates/_shared/meta/AGENTS.md.ejs +53 -0
  58. package/templates/_shared/meta/CHANGELOG.md.ejs +15 -0
  59. package/templates/_shared/meta/README.md.ejs +51 -0
  60. package/templates/_shared/meta/VERSION.ejs +1 -0
  61. package/templates/_shared/meta/harness.yaml.ejs +52 -0
  62. package/templates/_shared/skeleton/agent-env/memory/categories/.gitkeep +1 -0
  63. package/templates/_shared/skeleton/agent-env/memory/inbox/.gitkeep +1 -0
  64. package/templates/_shared/skeleton/agent-env/skills/.gitkeep +1 -0
  65. package/templates/_shared/skeleton/agent-env/tools/.gitkeep +1 -0
  66. package/templates/_shared/skeleton/assets/baseline/code/.gitkeep +1 -0
  67. package/templates/_shared/skeleton/assets/baseline/repomix/.gitkeep +1 -0
  68. package/templates/_shared/skeleton/assets/baseline/wiki/.gitkeep +1 -0
  69. package/templates/_shared/skeleton/assets/raw/.gitkeep +1 -0
  70. package/templates/_shared/skeleton/assets/requirements/.gitkeep +1 -0
  71. package/templates/_shared/skeleton/commands/install/.gitkeep +1 -0
  72. package/templates/_shared/skeleton/commands/update/.gitkeep +1 -0
  73. package/templates/_shared/skeleton/specs/behavior/schema.json +39 -0
  74. package/templates/_shared/skeleton/specs/interfaces/schema.json +38 -0
  75. package/templates/_shared/skeleton/specs/signals/schema.json +37 -0
  76. package/templates/_shared/skeleton/specs/ui/schema.json +44 -0
  77. package/templates/_shared/skeleton/tasks/templates/.gitkeep +0 -0
  78. package/templates/android-compose/skeleton/agent-env/rules/harness-compose-mandatory.mdc +49 -0
  79. package/templates/android-compose/skeleton/agent-env/rules/harness-coroutines-scope.mdc +52 -0
  80. package/templates/android-compose/skeleton/agent-env/rules/harness-hilt-injection.mdc +47 -0
  81. package/templates/android-compose/skeleton/agent-env/rules/harness-mvi-layering.mdc +58 -0
  82. package/templates/android-compose/skeleton/agent-env/skills/harness-android-architecture/SKILL.md +260 -0
  83. package/templates/android-compose/skeleton/agent-env/skills/harness-android-architecture/references/gradle-module-patterns.md +66 -0
  84. package/templates/android-compose/skeleton/agent-env/skills/harness-android-architecture/references/implementation-checklist.md +45 -0
  85. package/templates/android-compose/skeleton/agent-env/skills/harness-android-architecture/references/udf-data-flow.md +80 -0
  86. package/templates/android-compose/skeleton/agent-env/skills/harness-android-cli/SKILL.md +79 -0
  87. package/templates/android-compose/skeleton/agent-env/skills/harness-android-cli/references/interact.md +83 -0
  88. package/templates/android-compose/skeleton/agent-env/skills/harness-android-cli/references/journeys.md +97 -0
  89. package/templates/android-compose/skeleton/agent-env/skills/harness-compose-audit/SKILL.md +162 -0
  90. package/templates/android-compose/skeleton/agent-env/skills/harness-compose-audit/references/canonical-sources.md +116 -0
  91. package/templates/android-compose/skeleton/agent-env/skills/harness-compose-audit/references/diagnostics.md +182 -0
  92. package/templates/android-compose/skeleton/agent-env/skills/harness-compose-audit/references/report-template.md +135 -0
  93. package/templates/android-compose/skeleton/agent-env/skills/harness-compose-audit/references/scoring.md +277 -0
  94. package/templates/android-compose/skeleton/agent-env/skills/harness-compose-audit/references/search-playbook.md +303 -0
  95. package/templates/android-compose/skeleton/agent-env/skills/harness-compose-audit/scripts/compose-reports.init.gradle +58 -0
  96. package/templates/android-compose/skeleton/agent-env/skills/harness-compose-state/SKILL.md +196 -0
  97. package/templates/android-compose/skeleton/agent-env/skills/harness-compose-ui/SKILL.md +192 -0
  98. package/templates/android-compose/skeleton/agent-env/skills/harness-compose-ui/references/composable-api-guide.md +123 -0
  99. package/templates/android-compose/skeleton/agent-env/skills/harness-compose-ui/references/performance-recipes.md +97 -0
  100. package/templates/android-compose/skeleton/agent-env/skills/harness-compose-ui/references/state-patterns.md +93 -0
  101. package/templates/android-compose/skeleton/agent-env/skills/harness-kotlin-coroutines/SKILL.md +167 -0
  102. package/templates/android-compose/skeleton/agent-env/skills/harness-r8-analyzer/SKILL.md +45 -0
  103. package/templates/android-compose/skeleton/agent-env/skills/harness-r8-analyzer/references/CONFIGURATION.md +44 -0
  104. package/templates/android-compose/skeleton/agent-env/skills/harness-r8-analyzer/references/KEEP-RULES-IMPACT-HIERARCHY.md +83 -0
  105. package/templates/android-compose/skeleton/agent-env/skills/harness-r8-analyzer/references/REDUNDANT-RULES.md +222 -0
  106. package/templates/android-compose/skeleton/agent-env/skills/harness-r8-analyzer/references/REFLECTION-GUIDE.md +139 -0
  107. package/templates/android-compose/skeleton/agent-env/skills/harness-r8-analyzer/references/android/topic/performance/app-optimization/enable-app-optimization.md +176 -0
  108. package/templates/android-compose/skeleton/agent-env/skills/harness-r8-analyzer/references/android/training/testing/other-components/ui-automator.md +312 -0
  109. package/templates/android-compose/skeleton/agent-env/skills/harness-xml-to-compose/SKILL.md +87 -0
  110. package/templates/android-compose/skeleton/agent-env/skills/harness-xml-to-compose/references/analysis-of-the-project-and-layout.md +42 -0
  111. package/templates/android-compose/skeleton/agent-env/skills/harness-xml-to-compose/references/android/develop/ui/compose/designsystems/migrate-xml-theme-to-compose.md +168 -0
  112. package/templates/android-compose/skeleton/agent-env/skills/harness-xml-to-compose/references/android/develop/ui/compose/setup-compose-dependencies-and-compiler.md +183 -0
  113. package/templates/android-compose/skeleton/agent-env/skills/harness-xml-to-compose/references/identify-optimal-xml-candidate.md +31 -0
  114. package/templates/android-compose/skeleton/agent-env/skills/harness-xml-to-compose/references/xml-layout-migration.md +86 -0
  115. package/templates/android-xml/skeleton/agent-env/rules/seed-aidl-thread.md +29 -0
  116. package/templates/android-xml/skeleton/agent-env/rules/seed-lifecycle-awareness.md +32 -0
  117. package/templates/android-xml/skeleton/agent-env/rules/seed-mvc-layering.md +32 -0
  118. package/templates/android-xml/skeleton/agent-env/rules/seed-view-binding.md +33 -0
  119. package/templates/android-xml/skeleton/agent-env/rules/seed-xml-styling.md +27 -0
  120. package/templates/cpp/skeleton/agent-env/rules/seed-cmake-explicit-sources.md +31 -0
  121. package/templates/cpp/skeleton/agent-env/rules/seed-header-guards.md +34 -0
  122. package/templates/cpp/skeleton/agent-env/rules/seed-include-layering.md +39 -0
  123. package/templates/cpp/skeleton/agent-env/rules/seed-no-cyclic-deps.md +29 -0
  124. package/templates/cpp/skeleton/agent-env/rules/seed-raii.md +30 -0
  125. package/templates/python/skeleton/agent-env/rules/seed-context-managers.md +60 -0
  126. package/templates/python/skeleton/agent-env/rules/seed-docstrings.md +48 -0
  127. package/templates/python/skeleton/agent-env/rules/seed-import-order.md +49 -0
  128. package/templates/python/skeleton/agent-env/rules/seed-pep8-naming.md +45 -0
  129. package/templates/python/skeleton/agent-env/rules/seed-type-annotations.md +43 -0
  130. package/templates/web-react/skeleton/agent-env/rules/seed-controlled-component.md +43 -0
  131. package/templates/web-react/skeleton/agent-env/rules/seed-effect-cleanup.md +43 -0
  132. package/templates/web-react/skeleton/agent-env/rules/seed-hook-rules.md +42 -0
  133. package/templates/web-react/skeleton/agent-env/rules/seed-key-stability.md +39 -0
  134. package/templates/web-react/skeleton/agent-env/rules/seed-no-props-drilling.md +43 -0
@@ -0,0 +1,85 @@
1
+ ---
2
+ name: harness-build-skill-spec-builder
3
+ description: >
4
+ 将需求文档转化为结构化 specs。驱动 raw → requirements → specs 两阶段管线,
5
+ 并对产物做 specs/*/schema.json 校验。当用户说"条目化需求"、"生成 specs"、"构建 signals/ui/behavior/interfaces specs"、
6
+ "structure requirements"、或由 harness-build-skill-orchestrator 委派给本 skill 时触发。
7
+ ---
8
+
9
+ # harness-build-skill-spec-builder(规格构建器)
10
+
11
+ 你每次只处理一个模块,把原始需求转化为**可被 schema 校验通过**的 specs。
12
+
13
+ ## 输入
14
+
15
+ - `__HARNESS_ROOT__assets/raw/*.{md,xlsx,pdf,txt}` —— 原始需求文档
16
+ - `__HARNESS_ROOT__assets/requirements/*.requirements.yaml` —— 已条目化的结构化需求项(如已存在)
17
+ - `__HARNESS_ROOT__specs/<layer>/schema.json` —— 每一层的校验目标
18
+ - `__HARNESS_ROOT__harness.yaml` —— 确认哪些层当前激活
19
+
20
+ ## 两阶段管线
21
+
22
+ ### 阶段 A:raw → requirements(条目化)
23
+
24
+ 对 `__HARNESS_ROOT__assets/raw/` 下每个文件,产出一个 `__HARNESS_ROOT__assets/requirements/<module>.requirements.yaml`,结构如下:
25
+
26
+ ```yaml
27
+ module: <module>
28
+ source_doc: "assets/raw/<file>"
29
+ extracted_at: <ISO8601 日期>
30
+ items:
31
+ - id: REQ-<MODULE>-001
32
+ category: functional | non-functional | constraint
33
+ priority: must | should | may
34
+ description: "一句话陈述需求"
35
+ acceptance: "如何验证该需求满足"
36
+ traces_to:
37
+ - specs/<layer>/<module>.<layer>.yaml#<anchor>
38
+ ```
39
+
40
+ 规则:
41
+ - 条目 id **稳定**:一旦产出不得改写,新条目追加。
42
+ - 每条 `description` 必须是**一句清晰的陈述**。
43
+ - `traces_to` 初始可为空,阶段 B 生成 specs 后回填。
44
+
45
+ ### 阶段 B:requirements → specs(规格生成)
46
+
47
+ 对每个模块、每个激活层(signals / ui / behavior / interfaces):
48
+
49
+ 1. 读取 `__HARNESS_ROOT__assets/requirements/<module>.requirements.yaml`。
50
+ 2. 读取 `__HARNESS_ROOT__specs/<layer>/schema.json`。
51
+ 3. 生成 `__HARNESS_ROOT__specs/<layer>/<module>.<layer>.yaml`,要求:
52
+ - 满足 schema(所有 `required` 字段完备、`enum` 取值合法)
53
+ - 在本层的语义内回答相关需求条目
54
+ 4. 回填 `traces_to`:在 `requirements` 中把 spec 的路径/锚点记回对应条目。
55
+ 5. 校验 YAML 是否通过 schema(优先使用本地校验器;若无,对照 schema 的 `required` 与 `enum` 手动核对)。
56
+
57
+ ## 状态更新
58
+
59
+ 每完成一个模块后:
60
+ - 更新 `__HARNESS_ROOT__.harness-build-state.yaml`(阶段 P3 或 P4,带每层子状态)。
61
+ - 刷新状态文件与 spec 文件的 `updated_at`。
62
+
63
+ ## 守则(不得违反)
64
+
65
+ - **不得无中生有**:所有需求必须来自 `__HARNESS_ROOT__assets/raw/`。`assets/raw/` 为空或仅含 `.gitkeep` 时,**必须以表单方式提示用户放入需求文档**,禁止自行生成占位内容。
66
+ - **不得修改 `schema.json`**:schema 若有问题,停下来告诉用户,不要自行改写。
67
+ - 单个 spec YAML 文件应保持 **< 300 行**;超过时按子模块拆分。
68
+ - 一个 YAML 文件只承载一个层,**不要混层**。
69
+ - 所有向用户的反馈使用中文;字段名、枚举值、CMD ID 等保留英文。
70
+ - **必须以表单方式**与用户交互确认,禁止仅以纯文本输出后自行继续(见 `harness-build-rule-user-interaction`)。
71
+ - **所有描述性字段必须使用中文**(见 `harness-build-rule-chinese-only`)。
72
+
73
+ ## 必须遵守的构建规则(位于 Agent rules 目录)
74
+
75
+ 本 skill 执行前必须加载并严格遵循(文件位于当前 agent 的 rules 目录,具体路径/扩展名
76
+ 随 agent 可能为 `.md` 或 `.mdc`):
77
+
78
+ - `harness-build-rule-specs-schema` — specs 四域固定、schema.json 必过、字段增减需同步。
79
+ - `harness-build-rule-orchestrator-flow` — 本 skill 仅服务 P3/P4,禁止跨阶段跳步。
80
+ - `harness-build-rule-agent-agnostic` — 生成的 requirements/specs YAML 严禁出现具体 agent 名或私有语法。
81
+ - `harness-build-rule-memory-write` — 条目化/规格化过程中产生的可复用经验按规范写入 memory。
82
+ - `harness-build-rule-chinese-only` — 所有产出内容必须使用中文(字段名、枚举值等保留英文)。
83
+ - `harness-build-rule-user-interaction` — 用户交互铁律:等待 raw 文档、表单确认、禁止擅自修改。
84
+
85
+ 若规则文件缺失,停止工作并提示用户重新运行 `svharnessbuild init`。
@@ -0,0 +1,77 @@
1
+ ---
2
+ name: harness-build-skill-wiki-writer
3
+ description: >
4
+ 逐页撰写 baseline wiki 正文。读取 state 中 `tasks_file` 指向的任务清单与 structure.xml,
5
+ 基于 assets/baseline/code/ 下的源码快照产出每一页 Markdown。当用户说"生成 baseline wiki 正文"、
6
+ "按 TASKS.md 逐页生成 baseline wiki"、"继续写 wiki 下一页",或由 harness-build-skill-orchestrator
7
+ 在阶段 P1_wiki 委派时触发。
8
+ ---
9
+
10
+ # harness-build-skill-wiki-writer(baseline wiki 正文撰写)
11
+
12
+ 你只做一件事:**按 `__HARNESS_ROOT__.harness-build-state.yaml` 中 `P1_wiki.tasks_file` 指向的任务清单,
13
+ 一页一页地,基于 `__HARNESS_ROOT__assets/baseline/code/` 下的真实源码,写成 Markdown**。
14
+ 规则抽取、快照选样、skills/tasks 索引不是你的职责(那是 harness-build-skill-knowledge-builder)。
15
+
16
+ ## 输入
17
+
18
+ - `__HARNESS_ROOT__.harness-build-state.yaml` → `P1_wiki.tasks_file` —— 任务清单路径(通常 `__HARNESS_ROOT__assets/baseline/wiki/TASKS.md`);
19
+ 复选框形态,`[ ]` 待办、`[x]` 已完成
20
+ - `__HARNESS_ROOT__assets/baseline/wiki/structure.xml` —— outline 权威来源;title / sectionFolder / parentSection 以此为准
21
+ - `__HARNESS_ROOT__assets/baseline/code/` —— **唯一允许引用**的源码根;所有链接与行号引用都相对它
22
+
23
+ ## 算法
24
+
25
+ 1. 读取 `TASKS.md`,找到第一条 `[ ]` 任务。若全部 `[x]`:
26
+ - 汇报"P1_wiki 可以标记 DONE",并请 harness-build-skill-orchestrator 以最小补丁更新
27
+ `__HARNESS_ROOT__.harness-build-state.yaml` 中 `P1_wiki.status: DONE`,然后退出。
28
+ 2. 取该任务的 `Output` 路径(相对 `__HARNESS_ROOT__assets/baseline/wiki/`)、`Title`、`Section`、
29
+ `Parent section id`(如有)、`Description`、`Relevant files`。
30
+ 3. 打开每个 Relevant file(位于 `__HARNESS_ROOT__assets/baseline/code/<repo-relative>`),读取真实内容;
31
+ 必要时使用 grep/search_symbol 等工具补足上下文,但**不得离开 `__HARNESS_ROOT__assets/baseline/code/`**。
32
+ 4. 撰写 Markdown,写入 `__HARNESS_ROOT__assets/baseline/wiki/<Output>`。
33
+ 5. 写完后最小补丁式修改 `TASKS.md`,把该任务的 `[ ]` 改为 `[x]`(不得重排任务顺序、不得删除其他行)。
34
+ 6. 默认单步询问是否继续下一页。如果用户说"批量"、"全部继续"、"run through",则连续处理至清单尾。
35
+
36
+ ## 撰写规则(强制,与 --generate-wiki 的产出口径必须一致)
37
+
38
+ - **H1** 必须与 task `Title` 完全一致。
39
+ - **简介段** 后若后续有 2 个及以上的 `##` 章节,插入锚点式 TOC。
40
+ - **Mermaid** 使用 `graph TD` 或 `sequenceDiagram`,不使用 classDef / style / 颜色。
41
+ - **引用源码** 必须指向 `__HARNESS_ROOT__assets/baseline/code/`。允许两种书写方式(可混用):
42
+ - 行内链接:`[Foo.java:10-30](../../../assets/baseline/code/<repo-relative>/Foo.java#L10-L30)`
43
+ - Sources 行:`Sources: <repo-relative>/Foo.java:10-30, <repo-relative>/Bar.kt:5-8`
44
+ `<repo-relative>` 是**相对 `__HARNESS_ROOT__assets/baseline/code/` 的路径**,既不是仓库原始绝对路径,
45
+ 也不是 wiki md 文件的相对路径。行号采用 `start-end`(闭区间)。
46
+ - 禁止粘贴大段代码:单个 code block ≤ 40 行;必要时用省略号 `// ...` 裁剪。
47
+ - 所有中文段落使用中文标点;字段名、类名、路径保留英文不译。
48
+
49
+ ## 产出
50
+
51
+ - `__HARNESS_ROOT__assets/baseline/wiki/<lang>/<section>/<stem>.md` —— 每个 task 一份
52
+ - 更新后的 `TASKS.md` —— 状态位从 `[ ]` 推进为 `[x]`,其他内容不动
53
+
54
+ ## 守则(不得违反)
55
+
56
+ - **不得凭空编造代码或结论**:任何结论都必须可追溯到 `__HARNESS_ROOT__assets/baseline/code/` 下的真实文件。
57
+ - **不得修改 `structure.xml`** 或 `TASKS.md` 中 task 的 `Output / Section / Parent section id / Relevant files` 字段。
58
+ - **不得整文件重写 `TASKS.md`**:只做最小补丁(复选框 `[ ]` → `[x]`)。
59
+ - **不得在本 skill 内执行规则抽取、快照选样、skill/task 索引**(那是 harness-build-skill-knowledge-builder 的 P5/P6)。
60
+ - **不得使用不在 `__HARNESS_ROOT__assets/baseline/code/` 下的源码路径**作为 Sources 引用。
61
+ - 全部 wiki 完成后,由 harness-build-skill-orchestrator(不是本 skill)把 `P1_wiki` 标记 DONE。
62
+ - 所有面向用户的说明使用中文;字段名、路径、类名保留英文。
63
+ - **必须以表单方式**与用户交互确认,禁止仅以纯文本输出后自行继续。
64
+ - **所有 wiki 正文段落必须使用中文**(代码、类名、路径等保留英文)。
65
+
66
+ ## 必须遵守的构建规则(位于 Agent rules 目录)
67
+
68
+ 本 skill 执行前必须加载并严格遵循(文件位于当前 agent 的 rules 目录,具体路径/扩展名
69
+ 随 agent 可能为 `.md` 或 `.mdc`):
70
+
71
+ - `harness-build-rule-orchestrator-flow` — 本 skill 仅服务 P1_wiki,禁止跨阶段工作。
72
+ - `harness-build-rule-agent-agnostic` — wiki 正文严禁硬编码具体 agent 名或其私有指令语法。
73
+ - `harness-build-rule-memory-write` — 撰写中如识别到可复用经验,按 inbox → categories 写入。
74
+ - `harness-build-rule-chinese-only` — 所有产出内容必须使用中文。
75
+ - `harness-build-rule-user-interaction` — 用户交互铁律:表单确认、禁止擅自修改。
76
+
77
+ 若规则文件缺失,停止工作并提示用户重新运行 `svharnessbuild init`。
@@ -0,0 +1,53 @@
1
+ # AGENTS.md
2
+
3
+ > 本文件是任何 AI 编码 Agent 接入 **<%= name %>** 项目的入口。
4
+ > 请**按顺序**完成以下步骤,不要跳步。
5
+
6
+ ## 1. 加载上下文(只读)
7
+
8
+ 在做出任何编辑之前,请先阅读:
9
+
10
+ 1. `harness.yaml` —— 清单:各层路径、版本、当前 agent
11
+ 2. `.harness-build-state.yaml` —— 当前构建阶段与待办动作
12
+ 3. `specs/**/*.yaml` —— 权威的「做什么」(功能契约,唯一事实来源)
13
+ 4. `agent-env/rules/*.mdc` —— 架构层面的「怎么做」(不得违反的约束)
14
+ 5. `assets/baseline/wiki/**/*.md` —— 基线源码知识快照(指引,不是契约)
15
+
16
+ ## 2. 查看状态,选择下一步
17
+
18
+ - 打开 `.harness-build-state.yaml`
19
+ - 识别 `current_phase`
20
+ - 优先调用 `next_action` 中建议的 skill
21
+ - `P1_wiki` 若存在:读其 `mode` / `source` / `tasks_file` 字段判断 wiki 当前形态,
22
+ 详见 harness-build-skill-orchestrator / harness-build-skill-wiki-writer skill
23
+
24
+ 若你所在的 Agent IDE 支持 skill 触发,请使用下列构建辅助 skill:
25
+
26
+ - **harness-build-skill-orchestrator** —— 驱动整体构建流程
27
+ - **harness-build-skill-spec-builder** —— raw → requirements → specs
28
+ - **harness-build-skill-knowledge-builder** —— baseline/code 样本 / rules / skills & tasks
29
+ - **harness-build-skill-wiki-writer** —— 按 TASKS.md 逐页撰写 baseline wiki 正文
30
+
31
+ ## 3. 产出
32
+
33
+ - 所有代码必须同时满足 `specs/`(做什么)与 `agent-env/rules/`(怎么做)。
34
+ - 任何与 specs 的偏离都视为 bug —— 先提 spec 变更,再写代码。
35
+ - 新沉淀的经验知识放入 `agent-env/memory/inbox/`,待人工审核后转入 `agent-env/memory/categories/`。
36
+
37
+ ## 4. 更新状态
38
+
39
+ 每完成一个有意义的步骤后:
40
+
41
+ - 更新 `.harness-build-state.yaml`(阶段状态与 `updated_at`)
42
+ - 对被修改的 spec 提升模块级 `version`
43
+ - 在 `CHANGELOG.md` 追加记录
44
+
45
+ ## 5. 交付前的校验
46
+
47
+ - 任何涉及 specs 的任务,产物必须通过 `specs/*/schema.json` 的校验
48
+ - 代码改动不得违反 `agent-env/rules/` 中的规则
49
+ - 在 PR 描述中记录每一条外部假设
50
+
51
+ ---
52
+
53
+ 架构: **<%= arch %>**  Agent: **<%= agent %>**  脚手架生成时间: <%= createdAt %>
@@ -0,0 +1,15 @@
1
+ # Changelog
2
+
3
+ 本 harness 的所有重要变更记录在此,遵循语义化版本(SemVer)。
4
+
5
+ ## [0.1.0] - <%= createdAt.substring(0, 10) %>
6
+
7
+ ### Added
8
+ - 由 svharnessbuild v<%= version %> 初次生成骨架(架构:<%= arch %>,Agent:<%= agent %>)。
9
+ - 建立分层目录结构:`specs/` / `assets/` / `agent-env/` / `tasks/` / `commands/`。
10
+ - 建立四层 spec 的 JSON Schema(signals / ui / behavior / interfaces)。
11
+ - 在 Agent 工作目录中注入构建辅助 skill:harness-build-skill-orchestrator、harness-build-skill-spec-builder、harness-build-skill-knowledge-builder。
12
+ - 初始化 `.harness-build-state.yaml`,除 `P-1_skeleton` 为 DONE 外,其余阶段均为 PENDING。
13
+ <% if (sourcePath) { -%>
14
+ - 已登记基线源码路径:`<%= sourcePath %>`。
15
+ <% } -%>
@@ -0,0 +1,51 @@
1
+ # <%= name %> harness
2
+
3
+ 面向 **<%= name %>** 项目的 SDD-Driven Agent-Agnostic Coding Framework(架构:`<%= arch %>`)。
4
+
5
+ 由 **svharnessbuild v<%= version %>** 于 <%= createdAt %> 生成。
6
+
7
+ ## 这是什么?
8
+
9
+ 一个**分层 harness**,为本项目提供可靠的 AI Agent 协作底座:
10
+
11
+ | 层 | 职责 |
12
+ |----|------|
13
+ | `specs/` | 权威的「做什么」 —— signals / UI / behavior / interfaces(通过 schema 校验的 YAML) |
14
+ | `assets/` | 输入与基线 —— `raw/`、`requirements/`、`baseline/{code,wiki}/` |
15
+ | `agent-env/` | Agent 运行时环境 —— `rules/`、`skills/`、`tools/`、`memory/{categories,inbox}/` |
16
+ | `tasks/` | 声明式 task 模板(`templates/`),通过路径引用 specs / rules / skills |
17
+ | `commands/` | 命令式工作流 —— `install/`(一次性初始化)、`update/`(日常治理) |
18
+
19
+ ## 如何构建
20
+
21
+ 除骨架外的一切,均由 **Agent 驱动** 生成。在你的 AI 会话中说:
22
+
23
+ > **开始构建 harness**(或 `begin harness build`)
24
+
25
+ 注入的 **harness-build-skill-orchestrator** skill 会读取 `.harness-build-state.yaml`,并逐步引导你走完下列流程:
26
+
27
+ 1. **P1 raw** —— 把原始需求文档放入 `assets/raw/`
28
+ 2. **P2 requirements** —— Agent 将其结构化为 `assets/requirements/*.yaml`
29
+ 3. **P3 specs** —— Agent 在 `specs/*/` 下生成 YAML 并通过 schema 校验
30
+ 4. **P4 baseline_wiki** —— Agent 汇总代码知识到 `assets/baseline/wiki/` 并拷贝 ~20 个关键参考文件到 `assets/baseline/code/`
31
+ 5. **P5 rules** —— 人工填充架构约束到 `agent-env/rules/`(Agent 起草,人工审核)
32
+ 6. **P6 skills_tasks** —— 项目专属的运行期 skill 与 task 模板
33
+ 7. **P7 memory** —— Agent 播种初始 memory 分类
34
+ 8. **P-Final** —— `svharnessbuild seal` 将 `bootstrap_mode` 翻转为 false
35
+
36
+ ## 常用命令
37
+
38
+ ```bash
39
+ cat .harness-build-state.yaml # 查看当前进度
40
+ ls specs/*/ # 按层查看 specs
41
+ ls .<agent>/skills/ # 查看构建辅助 skill
42
+ ```
43
+
44
+ <% if (sourcePath) { -%>
45
+ ## Baseline 模式(反向提取)
46
+
47
+ 基线源码:`<%= sourcePath %>`
48
+
49
+ 本次使用既有代码反向提取 specs:orchestrator 会先从源码抽取规格草稿,
50
+ 待你人工审核完成后再将 `bootstrap_mode` 翻转为 false。
51
+ <% } -%>
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1,52 @@
1
+ # Harness 清单文件 —— 由 svharnessbuild 初次生成,后续由 Agent 按需增量更新。
2
+ schema_version: "1.0"
3
+ name: "<%= name %>"
4
+ arch: "<%= arch %>"
5
+ agent: "<%= agent %>"
6
+ version: "0.1.0"
7
+ created_at: "<%= createdAt %>"
8
+ scaffolder:
9
+ tool: svharnessbuild
10
+ version: "<%= version %>"
11
+
12
+ # SDD 规格层(均带 schema 校验)。
13
+ specs:
14
+ bootstrap_mode: true # 所有 specs 通过人工审核后置为 false
15
+ layers:
16
+ - { name: signals, schema: specs/signals/schema.json }
17
+ - { name: ui, schema: specs/ui/schema.json }
18
+ - { name: behavior, schema: specs/behavior/schema.json }
19
+ - { name: interfaces, schema: specs/interfaces/schema.json }
20
+
21
+ # 输入与基线素材。
22
+ assets:
23
+ raw: assets/raw/ # 原始未加工需求文档
24
+ requirements: assets/requirements/ # 条目化后的结构化需求
25
+ baseline:
26
+ code: assets/baseline/code/ # 基线代码快照(参考样本)
27
+ wiki: assets/baseline/wiki/ # 基线工程 wiki
28
+
29
+ # Agent 运行时环境(规则、技能、工具、记忆)。
30
+ agent_env:
31
+ rules: agent-env/rules/
32
+ skills: agent-env/skills/
33
+ tools: agent-env/tools/
34
+ memory:
35
+ categories_dir: agent-env/memory/categories/
36
+ inbox_dir: agent-env/memory/inbox/ # 待审核的新沉淀记忆
37
+
38
+ # Task 模板(通过路径引用 specs / rules / skills)。
39
+ tasks:
40
+ templates_dir: tasks/templates/
41
+
42
+ # 命令式工作流(Agent 按需触发)。
43
+ commands:
44
+ install_dir: commands/install/ # 一次性初始化/安装类命令
45
+ update_dir: commands/update/ # 日常治理/更新类命令
46
+
47
+ # baseline 源码路径(可选):存在时启用反向提取模式。
48
+ <% if (sourcePath) { -%>
49
+ source: "<%= sourcePath %>"
50
+ <% } else { -%>
51
+ source: null
52
+ <% } -%>
@@ -0,0 +1 @@
1
+ # placeholder — memory categories (long-lived knowledge)
@@ -0,0 +1 @@
1
+ # placeholder — pending memory candidates awaiting review
@@ -0,0 +1 @@
1
+ # placeholder — project-specific skills injected here
@@ -0,0 +1 @@
1
+ # placeholder — harness build/parse tools (python/ps1)
@@ -0,0 +1 @@
1
+ # placeholder — reference code snapshots (~20 key files), NOT full src copy
@@ -0,0 +1 @@
1
+ # placeholder — repowiki pages rendered by harness-knowledge-builder skill
@@ -0,0 +1 @@
1
+ # placeholder — populated during harness build (manual requirement docs)
@@ -0,0 +1 @@
1
+ # placeholder — populated during harness build (parsed/structured requirements)
@@ -0,0 +1 @@
1
+ # placeholder — agent bootstrap adapters (PS1 / shell)
@@ -0,0 +1 @@
1
+ # placeholder — maintainer scripts (drift check, memory audit, asset sync)
@@ -0,0 +1,39 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "harness://specs/behavior/schema.json",
4
+ "title": "行为规格 Schema",
5
+ "description": "描述模块的状态、守卫条件与转移。",
6
+ "type": "object",
7
+ "required": ["module", "version", "states", "transitions"],
8
+ "properties": {
9
+ "module": { "type": "string" },
10
+ "version": { "type": "string", "pattern": "^\\d+\\.\\d+\\.\\d+$" },
11
+ "initial_state": { "type": "string" },
12
+ "states": {
13
+ "type": "array",
14
+ "items": {
15
+ "type": "object",
16
+ "required": ["name"],
17
+ "properties": {
18
+ "name": { "type": "string" },
19
+ "description": { "type": "string" }
20
+ }
21
+ }
22
+ },
23
+ "transitions": {
24
+ "type": "array",
25
+ "items": {
26
+ "type": "object",
27
+ "required": ["from", "to", "trigger"],
28
+ "properties": {
29
+ "from": { "type": "string" },
30
+ "to": { "type": "string" },
31
+ "trigger": { "type": "string" },
32
+ "guard": { "type": "string" },
33
+ "action": { "type": "string" }
34
+ }
35
+ }
36
+ }
37
+ },
38
+ "additionalProperties": true
39
+ }
@@ -0,0 +1,38 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "harness://specs/interfaces/schema.json",
4
+ "title": "接口规格 Schema",
5
+ "description": "描述模块对外暴露或对外依赖的 AIDL / HTTP / IPC 契约。",
6
+ "type": "object",
7
+ "required": ["module", "version", "interfaces"],
8
+ "properties": {
9
+ "module": { "type": "string" },
10
+ "version": { "type": "string", "pattern": "^\\d+\\.\\d+\\.\\d+$" },
11
+ "interfaces": {
12
+ "type": "array",
13
+ "items": {
14
+ "type": "object",
15
+ "required": ["name", "kind"],
16
+ "properties": {
17
+ "name": { "type": "string" },
18
+ "kind": { "type": "string", "enum": ["aidl", "http", "ipc", "binder", "custom"] },
19
+ "methods": {
20
+ "type": "array",
21
+ "items": {
22
+ "type": "object",
23
+ "required": ["name"],
24
+ "properties": {
25
+ "name": { "type": "string" },
26
+ "params": { "type": "array", "items": { "type": "object" } },
27
+ "returns": { "type": "string" },
28
+ "description": { "type": "string" }
29
+ }
30
+ }
31
+ }
32
+ },
33
+ "additionalProperties": true
34
+ }
35
+ }
36
+ },
37
+ "additionalProperties": true
38
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "harness://specs/signals/schema.json",
4
+ "title": "信号规格 Schema",
5
+ "description": "描述一组在 ECU 与本应用之间流转的 MCU/HMI 信号。",
6
+ "type": "object",
7
+ "required": ["module", "version", "signals"],
8
+ "properties": {
9
+ "module": { "type": "string", "minLength": 1 },
10
+ "version": { "type": "string", "pattern": "^\\d+\\.\\d+\\.\\d+$" },
11
+ "signals": {
12
+ "type": "array",
13
+ "items": {
14
+ "type": "object",
15
+ "required": ["id", "name", "direction", "type"],
16
+ "properties": {
17
+ "id": { "type": "string", "pattern": "^CMDID_[A-Z0-9_]+$" },
18
+ "name": { "type": "string" },
19
+ "direction": { "type": "string", "enum": ["car2hmi", "hmi2car", "bidirectional"] },
20
+ "type": { "type": "string", "enum": ["int", "bool", "enum", "byte-array", "float"] },
21
+ "length_bytes": { "type": "integer", "minimum": 1 },
22
+ "default": {},
23
+ "enum_values": {
24
+ "type": "array",
25
+ "items": { "type": "object", "required": ["value", "meaning"] }
26
+ },
27
+ "traces_to": {
28
+ "type": "array",
29
+ "items": { "type": "string" }
30
+ }
31
+ },
32
+ "additionalProperties": true
33
+ }
34
+ }
35
+ },
36
+ "additionalProperties": true
37
+ }
@@ -0,0 +1,44 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "harness://specs/ui/schema.json",
4
+ "title": "UI 规格 Schema",
5
+ "description": "描述一个 Compose 界面或组件树及其交互契约。",
6
+ "type": "object",
7
+ "required": ["module", "version", "components"],
8
+ "properties": {
9
+ "module": { "type": "string" },
10
+ "version": { "type": "string", "pattern": "^\\d+\\.\\d+\\.\\d+$" },
11
+ "figma_source": { "type": "string", "format": "uri" },
12
+ "ue_spec_ref": { "type": "string" },
13
+ "components": {
14
+ "type": "array",
15
+ "items": {
16
+ "type": "object",
17
+ "required": ["id", "type"],
18
+ "properties": {
19
+ "id": { "type": "string" },
20
+ "type": {
21
+ "type": "string",
22
+ "enum": ["Switch", "Slider", "Button", "Tab", "Checkbox", "RadioButton", "Text", "Image", "Custom"]
23
+ },
24
+ "figma_node_id": { "type": "string" },
25
+ "bound_signal": { "type": "string" },
26
+ "states": {
27
+ "type": "array",
28
+ "items": {
29
+ "type": "object",
30
+ "required": ["name"],
31
+ "properties": {
32
+ "name": { "type": "string" },
33
+ "visual": { "type": "string" },
34
+ "condition": { "type": "string" }
35
+ }
36
+ }
37
+ }
38
+ },
39
+ "additionalProperties": true
40
+ }
41
+ }
42
+ },
43
+ "additionalProperties": true
44
+ }
@@ -0,0 +1,49 @@
1
+ ---
2
+ description: Jetpack Compose 编码铁律,所有 Compose 代码必须遵守
3
+ alwaysApply: true
4
+ ---
5
+
6
+ # Compose 编码铁律
7
+
8
+ ## 状态管理
9
+
10
+ ### Composable 必须无状态
11
+ - 正例:`fun MyComponent(value: String, onValueChange: (String) -> Unit, modifier: Modifier = Modifier)`
12
+ - 反例:`fun MyComponent()` 内部 `remember { mutableStateOf(...) }` 且不向上暴露
13
+ - 检测:grep `@Composable` 函数内出现 `= mutableStateOf` 且非状态提升模式
14
+
15
+ ### Modifier 必须作为第一个可选参数
16
+ - 正例:`fun Card(title: String, modifier: Modifier = Modifier)`
17
+ - 反例:`fun Card(modifier: Modifier, title: String)` — modifier 不在第一个可选位置
18
+ - 检测:grep `@Composable` 函数签名中 `modifier` 参数位置不在默认参数首位
19
+
20
+ ## 副作用
21
+
22
+ ### 禁止在组合体内直接执行副作用
23
+ - 正例:`LaunchedEffect(userId) { viewModel.loadUser(userId) }`
24
+ - 反例:`fun MyScreen() { viewModel.loadData() }` — 每次重组都会调用
25
+ - 检测:grep `@Composable` 函数体内直接调用 ViewModel 方法且未包裹在 LaunchedEffect/DisposableEffect 中
26
+
27
+ ## 性能
28
+
29
+ ### LazyColumn/LazyRow 的 items 必须提供 key
30
+ - 正例:`items(users, key = { it.id }) { user -> UserItem(user) }`
31
+ - 反例:`items(users) { user -> UserItem(user) }` — 无 key,列表更新效率低
32
+ - 检测:grep `items(` 后无 `key =` → 违规
33
+
34
+ ### 昂贵计算必须用 remember + derivedStateOf 包裹
35
+ - 正例:`val filtered by remember(items) { derivedStateOf { items.filter { ... } } }`
36
+ - 反例:`val filtered = items.filter { ... }` — 每次重组都重新计算
37
+ - 检测:grep `@Composable` 函数体内 `.filter` / `.sortedBy` / `.map` 且未包裹在 remember 中
38
+
39
+ ### 禁止使用不稳定类型作为 Composable 参数
40
+ - 正例:`fun ItemList(items: List<Item>)` — `List` 是稳定接口
41
+ - 反例:`fun ItemList(items: MutableList<Item>)` — `MutableList` 不稳定,阻止跳过
42
+ - 检测:grep `@Composable` 函数参数中出现 `MutableList` / `MutableMap` / `SparseArray`
43
+
44
+ ## 主题
45
+
46
+ ### 使用 MaterialTheme 而非硬编码颜色/字体
47
+ - 正例:`MaterialTheme.colorScheme.primary`、`MaterialTheme.typography.bodyLarge`
48
+ - 反例:`Color(0xFF6200EE)`、`TextStyle(fontSize = 16.sp)` — 硬编码无法适配暗色模式
49
+ - 检测:grep `@Composable` 函数内出现 `Color(0x` 或 `TextStyle(fontSize` 且未引用 `MaterialTheme`
@@ -0,0 +1,52 @@
1
+ ---
2
+ description: Kotlin 协程作用域与生命周期约束,防止泄漏与错误并发
3
+ alwaysApply: true
4
+ ---
5
+
6
+ # 协程作用域约束
7
+
8
+ ## 作用域选择
9
+
10
+ ### 禁止使用 GlobalScope
11
+ - 正例:`viewModelScope.launch { ... }`、`lifecycleScope.launch { ... }`
12
+ - 反例:`GlobalScope.launch { ... }` — 永远不取消,内存泄漏
13
+ - 检测:grep `GlobalScope` 出现于生产代码
14
+
15
+ ### ViewModel 中使用 viewModelScope
16
+ - 正例:`viewModelScope.launch { repository.fetch() }` — ViewModel 清除时自动取消
17
+ - 反例:`CoroutineScope(Dispatchers.IO).launch { ... }` — 手动创建作用域,不跟随生命周期
18
+ - 检测:grep ViewModel 类内 `CoroutineScope(` 手动创建
19
+
20
+ ### 禁止在主线程使用 runBlocking
21
+ - 正例:`viewModelScope.launch { withContext(Dispatchers.IO) { api.fetch() } }`
22
+ - 反例:`fun loadData() { runBlocking { api.fetch() } }` — 阻塞主线程
23
+ - 检测:grep `runBlocking` 出现于非测试代码
24
+
25
+ ## 调度器
26
+
27
+ ### IO 操作必须切换到 Dispatchers.IO
28
+ - 正例:`withContext(Dispatchers.IO) { database.query() }`
29
+ - 反例:在 `Dispatchers.Main` 上执行网络/数据库操作
30
+ - 检测:grep Room `@Dao` 方法在 Main 调度器上调用
31
+
32
+ ### 注入调度器而非硬编码
33
+ - 正例:`@Inject constructor(@DispatcherIO private val ioDispatcher: CoroutineDispatcher)`
34
+ - 反例:硬编码 `Dispatchers.IO` 散落在业务代码各处
35
+ - 检测:grep UseCase/Repository 中硬编码 `Dispatchers.IO` 且未通过构造函数注入
36
+
37
+ ## Flow 收集
38
+
39
+ ### Compose 中必须使用 collectAsStateWithLifecycle
40
+ - 正例:`val state by viewModel.uiState.collectAsStateWithLifecycle()`
41
+ - 反例:`val state by viewModel.uiState.collectAsState()` — 不感知生命周期,后台仍在收集
42
+ - 检测:grep `collectAsState()` 且无 `WithLifecycle` 后缀
43
+
44
+ ### Fragment/Activity 中必须使用 repeatOnLifecycle
45
+ - 正例:`viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { viewModel.uiState.collect { ... } }`
46
+ - 反例:`lifecycleScope.launch { viewModel.uiState.collect { ... } }` — 不感知生命周期
47
+ - 检测:grep `lifecycleScope.launch` 后直接 `.collect` 且无 `repeatOnLifecycle`
48
+
49
+ ### SharedFlow 必须使用 replay=0
50
+ - 正例:`MutableSharedFlow<Effect>(replay = 0)` — 一次性消费
51
+ - 反例:`MutableSharedFlow<Effect>(replay = 1)` — 新订阅者收到旧事件
52
+ - 检测:grep `MutableSharedFlow` 构造参数 `replay` 值大于 0