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.
- package/README.md +531 -0
- package/bin/cli.js +3 -0
- package/dist/adapters/_frontmatter.js +24 -0
- package/dist/adapters/claude-code.js +12 -0
- package/dist/adapters/codechat.js +12 -0
- package/dist/adapters/cursor.js +19 -0
- package/dist/adapters/generic.js +19 -0
- package/dist/adapters/index.js +26 -0
- package/dist/adapters/qoder.js +12 -0
- package/dist/commands/apply.js +272 -0
- package/dist/commands/init.js +420 -0
- package/dist/core/agent-injector.js +192 -0
- package/dist/core/next-steps.js +91 -0
- package/dist/core/render-meta.js +81 -0
- package/dist/core/repomix-pack.js +54 -0
- package/dist/core/scaffold.js +93 -0
- package/dist/core/state.js +80 -0
- package/dist/index.js +239 -0
- package/dist/types.js +5 -0
- package/dist/utils/baseline-copy.js +591 -0
- package/dist/utils/baseline-defaults.js +106 -0
- package/dist/utils/logger.js +56 -0
- package/dist/utils/validate-args.js +132 -0
- package/dist/utils/version.js +23 -0
- package/dist/wiki/abort.js +30 -0
- package/dist/wiki/config.js +79 -0
- package/dist/wiki/defaults.js +16 -0
- package/dist/wiki/envLoader.js +78 -0
- package/dist/wiki/index.js +29 -0
- package/dist/wiki/openaiCompat.js +219 -0
- package/dist/wiki/repowikiCanonicalSections.js +67 -0
- package/dist/wiki/repowikiCheckpoint.js +106 -0
- package/dist/wiki/repowikiConfig.js +9 -0
- package/dist/wiki/repowikiGit.js +73 -0
- package/dist/wiki/repowikiIndexer.js +824 -0
- package/dist/wiki/repowikiMarkdownPost.js +123 -0
- package/dist/wiki/repowikiMetadataContent.js +64 -0
- package/dist/wiki/repowikiMetadataJson.js +15 -0
- package/dist/wiki/repowikiScanner.js +156 -0
- package/dist/wiki/repowikiStructureNav.js +286 -0
- package/dist/wiki/repowikiStructureNormalize.js +218 -0
- package/dist/wiki/wikiStructureXml.js +316 -0
- package/dist/wiki/wikiTasksWriter.js +127 -0
- package/package.json +57 -0
- package/templates/_shared/apply-skills/harness-apply-skills-main.md +91 -0
- package/templates/_shared/build-rules/harness-build-rule-agent-agnostic.md +35 -0
- package/templates/_shared/build-rules/harness-build-rule-chinese-only.md +49 -0
- package/templates/_shared/build-rules/harness-build-rule-memory-write.md +31 -0
- package/templates/_shared/build-rules/harness-build-rule-orchestrator-flow.md +25 -0
- package/templates/_shared/build-rules/harness-build-rule-skills-tasks-output.md +35 -0
- package/templates/_shared/build-rules/harness-build-rule-specs-schema.md +32 -0
- package/templates/_shared/build-rules/harness-build-rule-user-interaction.md +63 -0
- package/templates/_shared/build-skills/harness-build-skill-knowledge-builder.md +120 -0
- package/templates/_shared/build-skills/harness-build-skill-orchestrator.md +87 -0
- package/templates/_shared/build-skills/harness-build-skill-spec-builder.md +85 -0
- package/templates/_shared/build-skills/harness-build-skill-wiki-writer.md +77 -0
- package/templates/_shared/meta/AGENTS.md.ejs +53 -0
- package/templates/_shared/meta/CHANGELOG.md.ejs +15 -0
- package/templates/_shared/meta/README.md.ejs +51 -0
- package/templates/_shared/meta/VERSION.ejs +1 -0
- package/templates/_shared/meta/harness.yaml.ejs +52 -0
- package/templates/_shared/skeleton/agent-env/memory/categories/.gitkeep +1 -0
- package/templates/_shared/skeleton/agent-env/memory/inbox/.gitkeep +1 -0
- package/templates/_shared/skeleton/agent-env/skills/.gitkeep +1 -0
- package/templates/_shared/skeleton/agent-env/tools/.gitkeep +1 -0
- package/templates/_shared/skeleton/assets/baseline/code/.gitkeep +1 -0
- package/templates/_shared/skeleton/assets/baseline/repomix/.gitkeep +1 -0
- package/templates/_shared/skeleton/assets/baseline/wiki/.gitkeep +1 -0
- package/templates/_shared/skeleton/assets/raw/.gitkeep +1 -0
- package/templates/_shared/skeleton/assets/requirements/.gitkeep +1 -0
- package/templates/_shared/skeleton/commands/install/.gitkeep +1 -0
- package/templates/_shared/skeleton/commands/update/.gitkeep +1 -0
- package/templates/_shared/skeleton/specs/behavior/schema.json +39 -0
- package/templates/_shared/skeleton/specs/interfaces/schema.json +38 -0
- package/templates/_shared/skeleton/specs/signals/schema.json +37 -0
- package/templates/_shared/skeleton/specs/ui/schema.json +44 -0
- package/templates/_shared/skeleton/tasks/templates/.gitkeep +0 -0
- package/templates/android-compose/skeleton/agent-env/rules/harness-compose-mandatory.mdc +49 -0
- package/templates/android-compose/skeleton/agent-env/rules/harness-coroutines-scope.mdc +52 -0
- package/templates/android-compose/skeleton/agent-env/rules/harness-hilt-injection.mdc +47 -0
- package/templates/android-compose/skeleton/agent-env/rules/harness-mvi-layering.mdc +58 -0
- package/templates/android-compose/skeleton/agent-env/skills/harness-android-architecture/SKILL.md +260 -0
- package/templates/android-compose/skeleton/agent-env/skills/harness-android-architecture/references/gradle-module-patterns.md +66 -0
- package/templates/android-compose/skeleton/agent-env/skills/harness-android-architecture/references/implementation-checklist.md +45 -0
- package/templates/android-compose/skeleton/agent-env/skills/harness-android-architecture/references/udf-data-flow.md +80 -0
- package/templates/android-compose/skeleton/agent-env/skills/harness-android-cli/SKILL.md +79 -0
- package/templates/android-compose/skeleton/agent-env/skills/harness-android-cli/references/interact.md +83 -0
- package/templates/android-compose/skeleton/agent-env/skills/harness-android-cli/references/journeys.md +97 -0
- package/templates/android-compose/skeleton/agent-env/skills/harness-compose-audit/SKILL.md +162 -0
- package/templates/android-compose/skeleton/agent-env/skills/harness-compose-audit/references/canonical-sources.md +116 -0
- package/templates/android-compose/skeleton/agent-env/skills/harness-compose-audit/references/diagnostics.md +182 -0
- package/templates/android-compose/skeleton/agent-env/skills/harness-compose-audit/references/report-template.md +135 -0
- package/templates/android-compose/skeleton/agent-env/skills/harness-compose-audit/references/scoring.md +277 -0
- package/templates/android-compose/skeleton/agent-env/skills/harness-compose-audit/references/search-playbook.md +303 -0
- package/templates/android-compose/skeleton/agent-env/skills/harness-compose-audit/scripts/compose-reports.init.gradle +58 -0
- package/templates/android-compose/skeleton/agent-env/skills/harness-compose-state/SKILL.md +196 -0
- package/templates/android-compose/skeleton/agent-env/skills/harness-compose-ui/SKILL.md +192 -0
- package/templates/android-compose/skeleton/agent-env/skills/harness-compose-ui/references/composable-api-guide.md +123 -0
- package/templates/android-compose/skeleton/agent-env/skills/harness-compose-ui/references/performance-recipes.md +97 -0
- package/templates/android-compose/skeleton/agent-env/skills/harness-compose-ui/references/state-patterns.md +93 -0
- package/templates/android-compose/skeleton/agent-env/skills/harness-kotlin-coroutines/SKILL.md +167 -0
- package/templates/android-compose/skeleton/agent-env/skills/harness-r8-analyzer/SKILL.md +45 -0
- package/templates/android-compose/skeleton/agent-env/skills/harness-r8-analyzer/references/CONFIGURATION.md +44 -0
- package/templates/android-compose/skeleton/agent-env/skills/harness-r8-analyzer/references/KEEP-RULES-IMPACT-HIERARCHY.md +83 -0
- package/templates/android-compose/skeleton/agent-env/skills/harness-r8-analyzer/references/REDUNDANT-RULES.md +222 -0
- package/templates/android-compose/skeleton/agent-env/skills/harness-r8-analyzer/references/REFLECTION-GUIDE.md +139 -0
- package/templates/android-compose/skeleton/agent-env/skills/harness-r8-analyzer/references/android/topic/performance/app-optimization/enable-app-optimization.md +176 -0
- package/templates/android-compose/skeleton/agent-env/skills/harness-r8-analyzer/references/android/training/testing/other-components/ui-automator.md +312 -0
- package/templates/android-compose/skeleton/agent-env/skills/harness-xml-to-compose/SKILL.md +87 -0
- package/templates/android-compose/skeleton/agent-env/skills/harness-xml-to-compose/references/analysis-of-the-project-and-layout.md +42 -0
- 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
- 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
- package/templates/android-compose/skeleton/agent-env/skills/harness-xml-to-compose/references/identify-optimal-xml-candidate.md +31 -0
- package/templates/android-compose/skeleton/agent-env/skills/harness-xml-to-compose/references/xml-layout-migration.md +86 -0
- package/templates/android-xml/skeleton/agent-env/rules/seed-aidl-thread.md +29 -0
- package/templates/android-xml/skeleton/agent-env/rules/seed-lifecycle-awareness.md +32 -0
- package/templates/android-xml/skeleton/agent-env/rules/seed-mvc-layering.md +32 -0
- package/templates/android-xml/skeleton/agent-env/rules/seed-view-binding.md +33 -0
- package/templates/android-xml/skeleton/agent-env/rules/seed-xml-styling.md +27 -0
- package/templates/cpp/skeleton/agent-env/rules/seed-cmake-explicit-sources.md +31 -0
- package/templates/cpp/skeleton/agent-env/rules/seed-header-guards.md +34 -0
- package/templates/cpp/skeleton/agent-env/rules/seed-include-layering.md +39 -0
- package/templates/cpp/skeleton/agent-env/rules/seed-no-cyclic-deps.md +29 -0
- package/templates/cpp/skeleton/agent-env/rules/seed-raii.md +30 -0
- package/templates/python/skeleton/agent-env/rules/seed-context-managers.md +60 -0
- package/templates/python/skeleton/agent-env/rules/seed-docstrings.md +48 -0
- package/templates/python/skeleton/agent-env/rules/seed-import-order.md +49 -0
- package/templates/python/skeleton/agent-env/rules/seed-pep8-naming.md +45 -0
- package/templates/python/skeleton/agent-env/rules/seed-type-annotations.md +43 -0
- package/templates/web-react/skeleton/agent-env/rules/seed-controlled-component.md +43 -0
- package/templates/web-react/skeleton/agent-env/rules/seed-effect-cleanup.md +43 -0
- package/templates/web-react/skeleton/agent-env/rules/seed-hook-rules.md +42 -0
- package/templates/web-react/skeleton/agent-env/rules/seed-key-stability.md +39 -0
- package/templates/web-react/skeleton/agent-env/rules/seed-no-props-drilling.md +43 -0
package/README.md
ADDED
|
@@ -0,0 +1,531 @@
|
|
|
1
|
+
# svharness
|
|
2
|
+
|
|
3
|
+
> v0.8 重命名说明:CLI 包名由 `svharnessbuild` → `svharness`,子命令 `init` → `build`,参数 `--name` → `--harness-name`。
|
|
4
|
+
> 旧名 `svharnessbuild` / `init` / `--name` 作为兼容别名保留至下一个 minor 版本,使用时会打印 deprecation 提示。
|
|
5
|
+
|
|
6
|
+
**SDD-Driven Agent-Agnostic Coding Framework** 的脚手架命令行工具。
|
|
7
|
+
|
|
8
|
+
为任何 Agent IDE(Qoder / Cursor / Claude Code 等)生成项目本地的 **harness** —— 一个规格驱动的知识层骨架,让 AI 协作开发有章可循。
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 快速开始
|
|
13
|
+
|
|
14
|
+
### 安装
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
# 从 npm 安装(发布后)
|
|
18
|
+
npm install -g svharness
|
|
19
|
+
|
|
20
|
+
# 或从源码安装
|
|
21
|
+
cd svharnessbuild && npm install && npm run build && npm link
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
要求 **Node.js ≥ 18**。
|
|
25
|
+
|
|
26
|
+
### 30 秒上手
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
# 最简 —— 只填名字,其余取默认(arch=android-compose, agent=codechat)
|
|
30
|
+
svharness build --harness-name my-app
|
|
31
|
+
|
|
32
|
+
# 一行式 —— 跳过交互,直接生成
|
|
33
|
+
svharness build --harness-name my-app --arch android-compose --agent qoder --yes
|
|
34
|
+
|
|
35
|
+
# 把构建完成的 harness 应用到其它项目(绑定式,不拷贝)
|
|
36
|
+
svharness apply --harness ./my-app-harness --target ../other-project --yes
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
生成完成后,在你的 Agent IDE 中说:
|
|
40
|
+
- "运行 harness-build-skill-orchestrator"即可开始逐步填充内容;
|
|
41
|
+
- 构建完成后在目标项目中说"应用 harness-apply-skills-main 完成 xxx 功能开发"即可调用 harness。
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## 核心概念
|
|
46
|
+
|
|
47
|
+
### Harness 是什么?
|
|
48
|
+
|
|
49
|
+
Harness 是一个 **项目本地的知识层**,由两大部分组成:
|
|
50
|
+
|
|
51
|
+
| 部分 | 位置 | 生命周期 | 说明 |
|
|
52
|
+
|------|------|----------|------|
|
|
53
|
+
| **Agent 注入目录** | `.qoder/` / `.codechat/` / `.cursor/` 等 | `build` 时创建,Agent 自动加载 | rules + build-skills |
|
|
54
|
+
| **Harness 目录** | `<harness-name>-harness/` | `build` 创建骨架 → Agent 逐步填充 | specs / assets / agent-env / tasks |
|
|
55
|
+
|
|
56
|
+
### 目录结构
|
|
57
|
+
|
|
58
|
+
执行 `svharness build` 后生成:
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
<harness-name>-harness/
|
|
62
|
+
├── harness.yaml # 入口清单(架构 / agent / schema 引用)
|
|
63
|
+
├── AGENTS.md # 面向 Agent 的使用指南
|
|
64
|
+
├── README.md # 面向人的项目概览
|
|
65
|
+
├── VERSION
|
|
66
|
+
├── CHANGELOG.md
|
|
67
|
+
├── .harness-build-state.yaml # 构建进度追踪(P1 … P-Final)
|
|
68
|
+
│
|
|
69
|
+
├── specs/ # 契约层
|
|
70
|
+
│ ├── signals/schema.json
|
|
71
|
+
│ ├── ui/schema.json
|
|
72
|
+
│ ├── behavior/schema.json
|
|
73
|
+
│ └── interfaces/schema.json
|
|
74
|
+
│
|
|
75
|
+
├── assets/ # 支撑素材(非契约)
|
|
76
|
+
│ ├── raw/ # 原始需求文档
|
|
77
|
+
│ ├── requirements/ # 条目化后的需求
|
|
78
|
+
│ └── baseline/
|
|
79
|
+
│ ├── code/ # 参考代码快照
|
|
80
|
+
│ └── wiki/ # 架构 wiki
|
|
81
|
+
│
|
|
82
|
+
├── agent-env/ # Agent 运行期环境
|
|
83
|
+
│ ├── rules/ # 编码规则(.mdc,always_on 加载)
|
|
84
|
+
│ ├── skills/ # 运行期技能(SKILL.md + references/ + scripts/)
|
|
85
|
+
│ ├── tools/ # 项目本地脚本
|
|
86
|
+
│ └── memory/ # Agent 长期记忆
|
|
87
|
+
│
|
|
88
|
+
├── commands/ # 项目安装 / 升级命令
|
|
89
|
+
└── tasks/ # 可复用的开发者工作流
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
同时,CLI 会向 Agent IDE 的 skill 目录注入 **4 个构建辅助 skill**:
|
|
93
|
+
|
|
94
|
+
| Skill | 职责 |
|
|
95
|
+
|-------|------|
|
|
96
|
+
| `harness-build-skill-orchestrator` | 读取构建状态,路由到下一阶段 |
|
|
97
|
+
| `harness-build-skill-spec-builder` | raw → requirements → specs 管线 |
|
|
98
|
+
| `harness-build-skill-knowledge-builder` | baseline 快照 / rules / skills 索引 |
|
|
99
|
+
| `harness-build-skill-wiki-writer` | 按 TASKS.md 逐页撰写 wiki 正文 |
|
|
100
|
+
|
|
101
|
+
`.harness-build-state.yaml` 跟踪进度,任何阶段可中断再续。
|
|
102
|
+
|
|
103
|
+
#### 构建辅助 skill / rule 命名规范
|
|
104
|
+
|
|
105
|
+
注入到 Agent IDE 的构建辅助资源遵循 **三段式** 命名,区别于项目自建的运行期 skill(`harness-<domain>-<topic>`):
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
harness-build-{skill|rule}-<semantic-name>
|
|
109
|
+
└──────┬──────┘ └───┬───┘ └──────┬──────┘
|
|
110
|
+
上下文前缀 资源类型 语义名称
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
| 资源类型 | 目录 | 命名模式 | 现有成员 |
|
|
114
|
+
|----------|------|----------|----------|
|
|
115
|
+
| **Build skill** | `templates/_shared/build-skills/` | `harness-build-skill-<name>.md` | `orchestrator` / `spec-builder` / `knowledge-builder` / `wiki-writer` |
|
|
116
|
+
| **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
|
+
|
|
118
|
+
约束:
|
|
119
|
+
|
|
120
|
+
- 前缀 `harness-build-` 专属于 **构建期**(`build` / orchestrator 驱动 harness 骨架填充),与运行期 skill(`harness-<domain>-<topic>`、如 `harness-compose-ui`)及 `apply` 注入的 `harness-apply-skills-main` dispatcher 明确区分。
|
|
121
|
+
- 文件内部 frontmatter `name`、一级 heading、交叉引用必须与文件名保持一致。
|
|
122
|
+
- 新增同类资源时沿用此三段式,禁止回退到两段式(如旧名 `harness-orchestrator` / `harness-build-orchestrator-flow` 已废弃)。
|
|
123
|
+
|
|
124
|
+
### 构建阶段
|
|
125
|
+
|
|
126
|
+
`build` 只生成骨架。各阶段的**实际内容**由 Agent 借助注入的 skill 逐步填充:
|
|
127
|
+
|
|
128
|
+
| 阶段 | 动作 | 产物 |
|
|
129
|
+
|------|------|------|
|
|
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 + 终审 |
|
|
138
|
+
|
|
139
|
+
> 反复调用 orchestrator 总是从"第一个非 DONE 的阶段"继续。
|
|
140
|
+
> **P1_wiki 仅在有 baseline 时出现;无 baseline 则不构建 wiki,流程从 P2_raw 开始。**
|
|
141
|
+
> **P2_raw 必须等待用户放入需求文档,Agent 不得自行生成占位文件。**
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## 命令参考
|
|
146
|
+
|
|
147
|
+
### `build` —— 构建 harness(v0.8 起的主命令)
|
|
148
|
+
|
|
149
|
+
> 旧名 `svharness init`(以及 `svharnessbuild init`)作为兼容别名保留,调用时会打印 deprecation 警告。
|
|
150
|
+
|
|
151
|
+
#### 交互式
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
svharness build --harness-name my-app
|
|
155
|
+
# 仅 --harness-name 必填;其余参数采用默认值,结束前会有一次确认提示
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
#### 非交互(CI / 脚本)
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
svharness build \
|
|
162
|
+
--harness-name my-app \
|
|
163
|
+
--arch android-compose \
|
|
164
|
+
--agent codechat \
|
|
165
|
+
--baseline ../my-baseline-repo \
|
|
166
|
+
--yes
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
#### 全部参数
|
|
170
|
+
|
|
171
|
+
| 参数 | 是否必填 | 说明 | 默认值 |
|
|
172
|
+
|------|----------|------|--------|
|
|
173
|
+
| `--harness-name <name>` | ✅ 必填 | harness 名称(小写字母、数字、中连线),生成 `<name>-harness/` 目录 | — |
|
|
174
|
+
| `--name <name>` | ⚠️ 已废弃别名 | 等同 `--harness-name`,下个 minor 版本移除 | — |
|
|
175
|
+
| `--arch <arch>` | 可选 | 架构模板:`android-compose` / `android-xml` / `cpp` / `web-react` / `python` | `android-compose` |
|
|
176
|
+
| `--agent <agent>` | 可选 | 目标 Agent IDE:`codechat` / `qoder` / `cursor` / `claude-code` / `generic` | `codechat` |
|
|
177
|
+
| `--baseline <path\|url>` | 可选 | 基线来源:本地目录 **或** git 仓库 URL | — |
|
|
178
|
+
| `--baseline-branch <name>` | 可选 | git 基线的分支名(仅 git 模式有效) | `main` |
|
|
179
|
+
| `--baseline-max-file-kb <kb>` | 可选 | 基线拷贝单文件大小上限(KB) | `1024` |
|
|
180
|
+
| `--force` | 可选 flag | 覆写已存在的 harness 目录 | `false` |
|
|
181
|
+
| `-y, --yes` | 可选 flag | 跳过所有提示,采用默认值 | `false` |
|
|
182
|
+
| `--verbose` | 可选 flag | 打印每个生成文件 | `false` |
|
|
183
|
+
|
|
184
|
+
#### Wiki 参数
|
|
185
|
+
|
|
186
|
+
| 参数 | 说明 | 默认值 |
|
|
187
|
+
|------|------|--------|
|
|
188
|
+
| `--generate-wiki` | build 时直接逐页生成完整 wiki(与 `--wiki-tasks-only` 互斥) | `false` |
|
|
189
|
+
| `--wiki-tasks-only` | 仅生成 wiki outline + TASKS.md(兼容保留) | `false`(但有 `--baseline` 时为**隐式默认行为**) |
|
|
190
|
+
| `--wiki-lang <zh\|en>` | wiki 语言 | `zh` |
|
|
191
|
+
| `--wiki-model <name>` | LLM 模型名 | `Qwen3.6-27B`(来自内置 wiki 配置链) |
|
|
192
|
+
| `--wiki-base-url <url>` | OpenAI 兼容 API 地址 | `http://model-api.desaysv.com/v1` |
|
|
193
|
+
| `--wiki-api-key <key>` | API Key | 环境变量 `OPENAI_API_KEY` → `.env` → 内置默认 |
|
|
194
|
+
| `--wiki-source <path>` | wiki 扫描的仓库根路径 | `<target>/assets/baseline/code/`(无 baseline 时为 cwd) |
|
|
195
|
+
|
|
196
|
+
**Wiki 配置优先级**:CLI 参数 > 环境变量 > `.env` 文件 > 内置默认值
|
|
197
|
+
|
|
198
|
+
**Wiki 模式总览**:
|
|
199
|
+
|
|
200
|
+
| 组合 | 行为 | P1_wiki 状态 |
|
|
201
|
+
|------|------|---------|
|
|
202
|
+
| 无 `--baseline` | 不生成 wiki | phase 不存在 |
|
|
203
|
+
| `--baseline`(默认) | 一次 LLM 拿 outline,写 `TASKS.md` | `PENDING` + `requires_agent: true` |
|
|
204
|
+
| `--baseline` + `--generate-wiki` | 逐页调用 LLM 生成完整 wiki | 初始 `DONE`;失败降级为 `PENDING` |
|
|
205
|
+
|
|
206
|
+
> Wiki 生成失败不会回滚 harness 骨架,仅输出警告。
|
|
207
|
+
|
|
208
|
+
### Agent 适配器
|
|
209
|
+
|
|
210
|
+
| Agent | skill 目录 | 扩展名 | 额外处理 |
|
|
211
|
+
|-------|-----------|--------|----------|
|
|
212
|
+
| `codechat`(默认) | `.codechat/skills/` | `.md` | — |
|
|
213
|
+
| `qoder` | `.qoder/skills/` | `.md` | — |
|
|
214
|
+
| `cursor` | `.cursor/rules/` | `.mdc` | 自动注入 frontmatter |
|
|
215
|
+
| `claude-code` | `.claude/skills/` | `.md` | — |
|
|
216
|
+
| `generic` | `.agent/skills/` | `.md` | 中立回退 |
|
|
217
|
+
|
|
218
|
+
### `apply` —— 把已构建好的 harness 绑定到目标项目
|
|
219
|
+
|
|
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 不读它。
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
# bind-only(默认)—— 仅注入 dispatcher skill,harness 保留在原位置
|
|
224
|
+
svharness apply --harness ../my-app-harness --target ./to-apply-project
|
|
225
|
+
|
|
226
|
+
# clone —— 把整个 harness 完整拷贝到目标项目根下,binding.yaml 指向本地副本
|
|
227
|
+
svharness apply --harness ../my-app-harness --target ./to-apply-project --clone --yes
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
**在 Agent IDE 中触发**:对话框输入 `应用 harness-apply-skills-main 完成 xxx 功能开发`,dispatcher 会自动加载 rules、扫描 skills、路由到合适的子能力。
|
|
231
|
+
|
|
232
|
+
#### 双模式对比
|
|
233
|
+
|
|
234
|
+
| 模式 | 标志 | harness 位置 | binding.yaml `mode` | 适用场景 |
|
|
235
|
+
|------|------|-------------|--------------------|----------|
|
|
236
|
+
| **bind-only** | 默认 | 保持在 `--harness` 原路径 | `bind-only` | harness 与多个目标项目共享、单一知识源 |
|
|
237
|
+
| **clone** | `--clone` | 拷贝到 `<target>/<name>-harness/` | `clone` | 需要自包含交付、离线使用、锁定版本 |
|
|
238
|
+
|
|
239
|
+
#### 全部参数
|
|
240
|
+
|
|
241
|
+
| 参数 | 是否必填 | 说明 | 默认值 |
|
|
242
|
+
|------|----------|------|--------|
|
|
243
|
+
| `--harness <path>` | ✅ 必填 | 已构建好的 harness 目录(形如 `./my-app-harness`) | — |
|
|
244
|
+
| `--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` |
|
|
248
|
+
| `-y, --yes` | 可选 flag | 跳过交互确认 | `false` |
|
|
249
|
+
| `--verbose` | 可选 flag | 显示详细日志 | `false` |
|
|
250
|
+
|
|
251
|
+
#### 产物
|
|
252
|
+
|
|
253
|
+
```
|
|
254
|
+
<target>/
|
|
255
|
+
├── <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 模式
|
|
260
|
+
```
|
|
261
|
+
|
|
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
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
> - clone 模式下 `harness_root` 指向克隆后的本地副本,而非 `--harness` 原路径。
|
|
277
|
+
> - 同路径自拷贝会被自动跳过(防御性校验)。
|
|
278
|
+
> - `--agent` 省略时从 harness 构建状态文件读取,确保与原 IDE 一致;若状态文件缺失则报错。
|
|
279
|
+
|
|
280
|
+
---
|
|
281
|
+
|
|
282
|
+
## 架构模板
|
|
283
|
+
|
|
284
|
+
### 支持的架构
|
|
285
|
+
|
|
286
|
+
| `--arch` | 语言 | 规则 | 说明 |
|
|
287
|
+
|----------|------|------|------|
|
|
288
|
+
| `android-compose`(默认) | Kotlin + Compose | 4 条 `harness-*.mdc` | MVI + UDF + Hilt + 协程 |
|
|
289
|
+
| `android-xml` | Java + XML | 5 条 `seed-*.md` | MVC + ViewBinding |
|
|
290
|
+
| `cpp` | C++17 + CMake | 5 条 `seed-*.md` | 现代 C++ + CMake 规范 |
|
|
291
|
+
| `web-react` | TypeScript + React | 5 条 `seed-*.md` | Hooks + 状态管理规范 |
|
|
292
|
+
| `python` | Python | — | 通用 Python 模板 |
|
|
293
|
+
|
|
294
|
+
> **两层叠拷合并**:`_shared/` 先落盘,`<arch>/` 随后覆盖同名文件。
|
|
295
|
+
> 新增架构只需在 `templates/<new-arch>/skeleton/agent-env/rules/` 下放 3-5 条规则文件,
|
|
296
|
+
> 并在 `types.ts` 与 `validate-args.ts` 各加一处枚举。
|
|
297
|
+
|
|
298
|
+
### android-compose 模板详述
|
|
299
|
+
|
|
300
|
+
此模板自带 4 条刚性规则和 8 个运行时技能。
|
|
301
|
+
|
|
302
|
+
#### Rules —— 刚性约束层
|
|
303
|
+
|
|
304
|
+
位于 `agent-env/rules/`,`.mdc` 格式,`alwaysApply: true`,Agent 会话全程加载。
|
|
305
|
+
|
|
306
|
+
| 规则 | 约束域 | 核心条目 |
|
|
307
|
+
|------|--------|----------|
|
|
308
|
+
| `harness-compose-mandatory` | Compose 铁律 | Composable 无状态、Modifier 首参、禁组合内副作用、LazyColumn key、`remember`+`derivedStateOf`、禁 unstable 参数 |
|
|
309
|
+
| `harness-mvi-layering` | MVI 分层 | 依赖方向向内、Feature 禁直达 Foundation、Reducer 纯函数、State 不可变 data class |
|
|
310
|
+
| `harness-hilt-injection` | Hilt 注入 | `@HiltViewModel`+`@Inject`、`hiltViewModel()`、禁 UseCase 包装接口、Repository 接口在 Domain |
|
|
311
|
+
| `harness-coroutines-scope` | 协程作用域 | 禁 `GlobalScope`、`viewModelScope`、`Dispatchers.IO`、`collectAsStateWithLifecycle`、`SharedFlow replay=0` |
|
|
312
|
+
|
|
313
|
+
每条规则遵循 **"正例 → 反例 → 检测方法"** 三段式,保持 < 30 行。
|
|
314
|
+
|
|
315
|
+
#### Skills —— 知识参考层
|
|
316
|
+
|
|
317
|
+
位于 `agent-env/skills/`,按需触发。每个 skill 是一个目录,至少含 `SKILL.md`,可选 `references/`、`scripts/`。
|
|
318
|
+
|
|
319
|
+
| Skill | 定位 | 覆盖领域 |
|
|
320
|
+
|-------|------|----------|
|
|
321
|
+
| `harness-android-architecture` | 合并 5 层架构 | MVI+UDF 模板、ViewModel/UseCase/Repository、多 UseCase 组合 |
|
|
322
|
+
| `harness-compose-ui` | 合并 2 个 Compose UI | 状态提升、槽 API、性能优化、列表/网格 |
|
|
323
|
+
| `harness-compose-state` | 新拆出 | 侧效 API 选型、StateFlow/SharedFlow 陷阱 |
|
|
324
|
+
| `harness-kotlin-coroutines` | 改名适配 | 结构化并发、Flow 算子、异常处理 |
|
|
325
|
+
| `harness-compose-audit` | 改名自 compose_skill-main | 9 步审计 + 评分 + 编译报告 |
|
|
326
|
+
| `harness-xml-to-compose` | 改名自 migrate-xml-views | XML → Compose 10 步迁移 |
|
|
327
|
+
| `harness-android-cli` | 改名自 android-cli | Android CLI 命令速查 |
|
|
328
|
+
| `harness-r8-analyzer` | 改名自 r8-analyzer | R8 keep 规则冗余分析 |
|
|
329
|
+
|
|
330
|
+
#### Skill 与 Rule 的引用约定
|
|
331
|
+
|
|
332
|
+
每个 `SKILL.md` 末尾必须包含「必须遵守的约束规则」段落:
|
|
333
|
+
|
|
334
|
+
```markdown
|
|
335
|
+
## 必须遵守的约束规则
|
|
336
|
+
|
|
337
|
+
> rules 引用路径:`../rules/<rule-name>.mdc`
|
|
338
|
+
|
|
339
|
+
- harness-compose-mandatory
|
|
340
|
+
- harness-mvi-layering
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
- 代码生成型 skill:只引用相关规则,不硬凑
|
|
344
|
+
- 工具操作型 skill(CLI / R8):写 `无(本技能为 XXX 操作,不涉及代码生成)`
|
|
345
|
+
- 引用使用中立文件名(不带扩展名、不带路径),路径提示单独用 blockquote
|
|
346
|
+
|
|
347
|
+
#### 命名规范
|
|
348
|
+
|
|
349
|
+
| 实体 | 命名模式 | 示例 |
|
|
350
|
+
|------|----------|------|
|
|
351
|
+
| Rule 文件 | `harness-<domain>-<constraint>.mdc` | `harness-compose-mandatory.mdc` |
|
|
352
|
+
| Skill 目录 | `harness-<domain>-<topic>/` | `harness-compose-state/` |
|
|
353
|
+
| Skill 文件 | 固定 `SKILL.md` | — |
|
|
354
|
+
| `harness-` 前缀 | 标识模板提供,与用户自建区分 | — |
|
|
355
|
+
|
|
356
|
+
---
|
|
357
|
+
|
|
358
|
+
## 常用示例
|
|
359
|
+
|
|
360
|
+
```bash
|
|
361
|
+
# 最简 —— 无基线,纯骨架(arch/agent 均使用默认值)
|
|
362
|
+
svharness build --harness-name my-app --yes
|
|
363
|
+
|
|
364
|
+
# 显式指定全部参数
|
|
365
|
+
svharness build --harness-name my-app --arch android-compose --agent qoder --yes
|
|
366
|
+
|
|
367
|
+
# 本地基线 + wiki 生成
|
|
368
|
+
svharness build \
|
|
369
|
+
--harness-name my-app --arch android-compose --agent codechat \
|
|
370
|
+
--baseline . --generate-wiki --verbose --force
|
|
371
|
+
|
|
372
|
+
# Git 远程仓库 + wiki(指定分支和文件大小限制)
|
|
373
|
+
svharness build \
|
|
374
|
+
--harness-name my-app --arch android-compose --agent codechat \
|
|
375
|
+
--baseline git@github.com:user/repo.git --baseline-branch main \
|
|
376
|
+
--baseline-max-file-kb 1024 --generate-wiki --verbose --force
|
|
377
|
+
|
|
378
|
+
# 内部 Git 仓库 + 自定义 API
|
|
379
|
+
svharness build \
|
|
380
|
+
--harness-name my-app --arch android-compose --agent codechat \
|
|
381
|
+
--baseline git@10.133.3.88:org/repo.git --baseline-branch main \
|
|
382
|
+
--generate-wiki --wiki-base-url http://your-api.com/v1 --wiki-api-key sk-xxx \
|
|
383
|
+
--verbose --force
|
|
384
|
+
|
|
385
|
+
# 仅 wiki 任务清单(默认行为,由 agent 后续撰写)
|
|
386
|
+
svharness build \
|
|
387
|
+
--harness-name my-app --arch android-xml --agent qoder \
|
|
388
|
+
--baseline . --wiki-lang zh --yes
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
---
|
|
392
|
+
|
|
393
|
+
## 开发指南(贡献者)
|
|
394
|
+
|
|
395
|
+
### 源码目录
|
|
396
|
+
|
|
397
|
+
```
|
|
398
|
+
svharnessbuild/ # 源码目录名沿用旧名(历史包名),CLI 名称已迁至 svharness
|
|
399
|
+
├── bin/cli.js # npm bin 入口 → dist/index.js
|
|
400
|
+
├── src/
|
|
401
|
+
│ ├── index.ts # CLI 入口(commander)
|
|
402
|
+
│ ├── types.ts # SupportedArch 枚举
|
|
403
|
+
│ ├── commands/init.ts # 4 步主管线(双模板根:_shared + <arch>)
|
|
404
|
+
│ ├── core/
|
|
405
|
+
│ │ ├── scaffold.ts # scaffoldLayered: 先 _shared 再 <arch>
|
|
406
|
+
│ │ ├── render-meta.ts # renderMetaLayered: 同名 .ejs 以 <arch> 为准
|
|
407
|
+
│ │ ├── state.ts # 写 .harness-build-state.yaml
|
|
408
|
+
│ │ ├── agent-injector.ts # injectSkillsLayered
|
|
409
|
+
│ │ └── next-steps.ts # 初始化完成后的引导
|
|
410
|
+
│ ├── wiki/ # repowiki 核心模块(15 个文件)
|
|
411
|
+
│ ├── adapters/ # 各 Agent 的 skill 目录规则
|
|
412
|
+
│ └── utils/ # logger / 参数校验 / 版本读取
|
|
413
|
+
├── templates/
|
|
414
|
+
│ ├── _shared/ # 跨架构公共
|
|
415
|
+
│ ├── android-compose/ # Compose 规则 + 技能
|
|
416
|
+
│ ├── android-xml/ # XML 规则
|
|
417
|
+
│ ├── cpp/ # C++ 规则
|
|
418
|
+
│ └── web-react/ # React 规则
|
|
419
|
+
└── scripts/smoke-test.ps1
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
### 版本升级
|
|
423
|
+
|
|
424
|
+
> ⚠ 不要手改 `package-lock.json` 的 `version`。用 `npm version` 同步更新两个文件:
|
|
425
|
+
|
|
426
|
+
```powershell
|
|
427
|
+
npm version patch # bugfix
|
|
428
|
+
npm version minor # 向后兼容新功能
|
|
429
|
+
npm version 0.9.0 # 显式指定
|
|
430
|
+
npm version 0.9.0 --no-git-tag-version # 不打 git tag
|
|
431
|
+
|
|
432
|
+
# 验证同步
|
|
433
|
+
npm run build # 首行应显示 svharness@<新版本>
|
|
434
|
+
node -p "require('./package.json').version"
|
|
435
|
+
node -p "require('./package-lock.json').version" # 两者必须相等
|
|
436
|
+
|
|
437
|
+
# 不同步时修复
|
|
438
|
+
npm install # 按 package.json 刷新 package-lock.json
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
### 本地验证
|
|
442
|
+
|
|
443
|
+
```bash
|
|
444
|
+
npm run build && npm pack --dry-run # 预览包内文件
|
|
445
|
+
npm pack # 生成 .tgz
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
验证 tgz:
|
|
449
|
+
|
|
450
|
+
```powershell
|
|
451
|
+
# 方式 A:npm link(开发期推荐)
|
|
452
|
+
cd svharnessbuild; npm link; svharness --help
|
|
453
|
+
|
|
454
|
+
# 删除
|
|
455
|
+
npm unlink -g svharness
|
|
456
|
+
# 或等价写法
|
|
457
|
+
npm rm -g svharness
|
|
458
|
+
|
|
459
|
+
# 方式 B:全局安装 tgz
|
|
460
|
+
npm install -g "d:\...\svharness-<version>.tgz"; svharness --help
|
|
461
|
+
|
|
462
|
+
# 方式 C:临时目录模拟
|
|
463
|
+
cd $env:TEMP; mkdir test; cd test; npm init -y
|
|
464
|
+
npm install -g .\svharness-<version>.tgz
|
|
465
|
+
npx svharness --help
|
|
466
|
+
|
|
467
|
+
# 方式 D:直接跑 CLI
|
|
468
|
+
cd svharnessbuild; npm run build
|
|
469
|
+
node bin\cli.js build --harness-name demo --arch android-compose --agent codechat --yes --force --verbose
|
|
470
|
+
```
|
|
471
|
+
|
|
472
|
+
> ⚠ **Windows**:`npx d:\...\xxx.tgz` 会被文件关联拦截,请用上述替代方式。
|
|
473
|
+
|
|
474
|
+
### 发布
|
|
475
|
+
|
|
476
|
+
```bash
|
|
477
|
+
npm login
|
|
478
|
+
npm publish --access public # prepublishOnly 自动执行 build
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
| 分发方式 | 适用场景 | 用法 |
|
|
482
|
+
|----------|----------|------|
|
|
483
|
+
| **npm** | 公开发布 | `npx svharness build` |
|
|
484
|
+
| **Tarball** | 小团队 / 内部试用 | `npx ./svharness-x.y.z.tgz build` |
|
|
485
|
+
| **Git 仓库** | 有内网 Git | `npx github:yourorg/svharness build` |
|
|
486
|
+
| **私有 Registry** | Verdaccio / Nexus | `npm publish --registry=http://内网:4873` |
|
|
487
|
+
|
|
488
|
+
### 冒烟测试
|
|
489
|
+
|
|
490
|
+
```powershell
|
|
491
|
+
pwsh -File .\scripts\smoke-test.ps1
|
|
492
|
+
```
|
|
493
|
+
|
|
494
|
+
构建 TS → 临时目录 `build` → 校验文件 → `--force` 覆写验证。
|
|
495
|
+
|
|
496
|
+
### 注意事项
|
|
497
|
+
|
|
498
|
+
1. **shebang**:`bin/cli.js` 首行必须为 `#!/usr/bin/env node`
|
|
499
|
+
2. **行尾符**:建议 `.gitattributes` 设置 `bin/*.js eol=lf`
|
|
500
|
+
3. **Node 版本**:`engines.node >= 18`,兼容 18 / 20 / 22
|
|
501
|
+
4. **`prepare` 脚本**:已配置,Git 仓库直装时自动编译 `dist/`
|
|
502
|
+
|
|
503
|
+
---
|
|
504
|
+
|
|
505
|
+
## 路线图
|
|
506
|
+
|
|
507
|
+
**v0.8 —— 当前版本**
|
|
508
|
+
|
|
509
|
+
- [x] 包名 `svharnessbuild` → `svharness`(保留旧 bin 别名一版本)
|
|
510
|
+
- [x] 子命令 `init` → `build`(保留 `init` 隐藏别名一版本)
|
|
511
|
+
- [x] 参数 `--name` → `--harness-name`(保留 `--name` 别名一版本)
|
|
512
|
+
- [x] `--arch` 默认 `android-compose`、`--agent` 默认 `codechat`
|
|
513
|
+
- [x] `build` —— 骨架 + 元文件 + 状态文件 + skill 注入
|
|
514
|
+
- [x] 多架构模板(`android-compose` / `android-xml` / `cpp` / `web-react` / `python`)
|
|
515
|
+
- [x] `_shared/` + `<arch>/` 两层叠拷合并
|
|
516
|
+
- [x] 每个架构自带 3-5 条规则文件(`.mdc` 格式,`always_on` 加载)
|
|
517
|
+
- [x] `apply` —— 把已构建好的 harness 绑定到目标项目(支持 `--clone` 双模式)
|
|
518
|
+
- [x] 构建辅助资源统一命名(`build-skills/harness-build-skill-*`、`build-rules/harness-build-rule-*`)
|
|
519
|
+
- [ ] `detach` —— 从目标项目解绑并清理 dispatcher skill
|
|
520
|
+
- [ ] `doctor` —— 检查既有 harness 的健康度
|
|
521
|
+
- [ ] `phase` —— 从 CLI 直接运行某个构建阶段
|
|
522
|
+
- [ ] `--arch auto` —— 根据 `--baseline` 自动推断架构
|
|
523
|
+
- [ ] 更多架构模板(`ios-swiftui` / `service-kotlin` / `python-fastapi` 等)
|
|
524
|
+
|
|
525
|
+
欢迎对适配器与架构模板做贡献。
|
|
526
|
+
|
|
527
|
+
---
|
|
528
|
+
|
|
529
|
+
## License
|
|
530
|
+
|
|
531
|
+
MIT
|
package/bin/cli.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ensureMdcFrontmatter = ensureMdcFrontmatter;
|
|
4
|
+
/**
|
|
5
|
+
* Shared helper: wrap a raw markdown body with a minimal `.mdc`-style YAML
|
|
6
|
+
* frontmatter if it does not already start with `---`.
|
|
7
|
+
*
|
|
8
|
+
* Used by all adapters to keep rule files aligned with the mainstream
|
|
9
|
+
* `.mdc` convention (Cursor/Qoder/Codechat/Claude/generic).
|
|
10
|
+
*/
|
|
11
|
+
function ensureMdcFrontmatter(description) {
|
|
12
|
+
return (content) => {
|
|
13
|
+
if (content.startsWith('---'))
|
|
14
|
+
return content;
|
|
15
|
+
const header = [
|
|
16
|
+
'---',
|
|
17
|
+
`description: ${description}`,
|
|
18
|
+
'alwaysApply: false',
|
|
19
|
+
'---',
|
|
20
|
+
'',
|
|
21
|
+
].join('\n');
|
|
22
|
+
return header + content;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.claudeCodeAdapter = void 0;
|
|
4
|
+
const _frontmatter_1 = require("./_frontmatter");
|
|
5
|
+
exports.claudeCodeAdapter = {
|
|
6
|
+
name: 'claude-code',
|
|
7
|
+
skillsDir: '.claude/skills',
|
|
8
|
+
skillExt: '.md',
|
|
9
|
+
rulesDir: '.claude/rules',
|
|
10
|
+
ruleExt: '.mdc',
|
|
11
|
+
ruleTransform: (0, _frontmatter_1.ensureMdcFrontmatter)('Harness build-time rule'),
|
|
12
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.codechatAdapter = void 0;
|
|
4
|
+
const _frontmatter_1 = require("./_frontmatter");
|
|
5
|
+
exports.codechatAdapter = {
|
|
6
|
+
name: 'codechat',
|
|
7
|
+
skillsDir: '.codechat/skills',
|
|
8
|
+
skillExt: '.md',
|
|
9
|
+
rulesDir: '.codechat/rules',
|
|
10
|
+
ruleExt: '.mdc',
|
|
11
|
+
ruleTransform: (0, _frontmatter_1.ensureMdcFrontmatter)('Harness build-time rule'),
|
|
12
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.cursorAdapter = void 0;
|
|
4
|
+
const _frontmatter_1 = require("./_frontmatter");
|
|
5
|
+
/**
|
|
6
|
+
* Cursor uses .cursor/rules/*.mdc with YAML frontmatter.
|
|
7
|
+
* We map our skills to rules (Cursor does not have first-class "skills" concept yet).
|
|
8
|
+
*/
|
|
9
|
+
exports.cursorAdapter = {
|
|
10
|
+
name: 'cursor',
|
|
11
|
+
skillsDir: '.cursor/rules',
|
|
12
|
+
skillExt: '.mdc',
|
|
13
|
+
transform: (0, _frontmatter_1.ensureMdcFrontmatter)('Harness build helper skill'),
|
|
14
|
+
// Rules go under a dedicated subfolder to avoid colliding with skills that
|
|
15
|
+
// are already written directly under `.cursor/rules/*.mdc`.
|
|
16
|
+
rulesDir: '.cursor/rules/harness-build',
|
|
17
|
+
ruleExt: '.mdc',
|
|
18
|
+
ruleTransform: (0, _frontmatter_1.ensureMdcFrontmatter)('Harness build-time rule'),
|
|
19
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.genericAdapter = void 0;
|
|
4
|
+
const _frontmatter_1 = require("./_frontmatter");
|
|
5
|
+
/**
|
|
6
|
+
* Generic fallback for any non-mainstream / unknown agent.
|
|
7
|
+
* All harness artifacts (skills + rules) live under a single neutral
|
|
8
|
+
* namespace `.harness/` to avoid scattering directories across the project.
|
|
9
|
+
* Rules use `.mdc` with frontmatter to align with mainstream rule-file
|
|
10
|
+
* conventions (Cursor/Qoder/Codechat).
|
|
11
|
+
*/
|
|
12
|
+
exports.genericAdapter = {
|
|
13
|
+
name: 'generic',
|
|
14
|
+
skillsDir: '.harness/skills',
|
|
15
|
+
skillExt: '.md',
|
|
16
|
+
rulesDir: '.harness/rules',
|
|
17
|
+
ruleExt: '.mdc',
|
|
18
|
+
ruleTransform: (0, _frontmatter_1.ensureMdcFrontmatter)('Harness build-time rule'),
|
|
19
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getAdapter = getAdapter;
|
|
4
|
+
exports.listAdapters = listAdapters;
|
|
5
|
+
const codechat_1 = require("./codechat");
|
|
6
|
+
const qoder_1 = require("./qoder");
|
|
7
|
+
const cursor_1 = require("./cursor");
|
|
8
|
+
const claude_code_1 = require("./claude-code");
|
|
9
|
+
const generic_1 = require("./generic");
|
|
10
|
+
const REGISTRY = {
|
|
11
|
+
codechat: codechat_1.codechatAdapter,
|
|
12
|
+
qoder: qoder_1.qoderAdapter,
|
|
13
|
+
cursor: cursor_1.cursorAdapter,
|
|
14
|
+
'claude-code': claude_code_1.claudeCodeAdapter,
|
|
15
|
+
generic: generic_1.genericAdapter,
|
|
16
|
+
};
|
|
17
|
+
function getAdapter(name) {
|
|
18
|
+
const adapter = REGISTRY[name];
|
|
19
|
+
if (!adapter) {
|
|
20
|
+
throw new Error(`No adapter registered for agent "${name}"`);
|
|
21
|
+
}
|
|
22
|
+
return adapter;
|
|
23
|
+
}
|
|
24
|
+
function listAdapters() {
|
|
25
|
+
return Object.values(REGISTRY);
|
|
26
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.qoderAdapter = void 0;
|
|
4
|
+
const _frontmatter_1 = require("./_frontmatter");
|
|
5
|
+
exports.qoderAdapter = {
|
|
6
|
+
name: 'qoder',
|
|
7
|
+
skillsDir: '.qoder/skills',
|
|
8
|
+
skillExt: '.md',
|
|
9
|
+
rulesDir: '.qoder/rules',
|
|
10
|
+
ruleExt: '.mdc',
|
|
11
|
+
ruleTransform: (0, _frontmatter_1.ensureMdcFrontmatter)('Harness build-time rule'),
|
|
12
|
+
};
|