@cyning/harness 0.3.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/AGENTS.md +20 -0
- package/CHANGELOG.md +127 -0
- package/README.md +133 -0
- package/bin/harness.js +7 -0
- package/ci/samples/README.md +42 -0
- package/ci/samples/pytest.yml.example +49 -0
- package/ci/samples/quality.yml.example +56 -0
- package/coding_wiki/templates/README.md +11 -0
- package/coding_wiki/templates/context.md +11 -0
- package/coding_wiki/templates/stable.md +19 -0
- package/coding_wiki/templates/volatile.md +15 -0
- package/docs/ARCHITECTURE.md +71 -0
- package/docs/DESIGN_ONTOLOGY_v1_zh.md +9 -0
- package/docs/HARNESS_GRAPH_MODEL_design_v0_zh.md +6 -0
- package/docs/HARNESS_GRAPH_MODEL_dialogue_archive_v1_zh.md +8 -0
- package/docs/ONBOARDING.md +126 -0
- package/docs/P0_V0.2_GAP.md +6 -0
- package/docs/README.md +38 -0
- package/docs/methodology/AUDIT_doc_consistency_2026-06-15_zh.md +69 -0
- package/docs/methodology/DOCUMENT_MAP_v1_zh.md +122 -0
- package/docs/methodology/README.md +147 -0
- package/docs/methodology/ROADMAP_v1_zh.md +136 -0
- package/docs/methodology/execution/P0_V0.2_GAP.md +93 -0
- package/docs/methodology/execution/PILOT_EVIDENCE_B2_v1_zh.md +132 -0
- package/docs/methodology/execution/README.md +12 -0
- package/docs/methodology/graph/HARNESS_GRAPH_MODEL_design_v0_zh.md +258 -0
- package/docs/methodology/graph/HARNESS_GRAPH_MODEL_dialogue_archive_v1_zh.md +132 -0
- package/docs/methodology/graph/README.md +22 -0
- package/docs/methodology/pointers/ADOPTION_METHODOLOGY_v1_zh.md +8 -0
- package/docs/methodology/pointers/ADOPTION_TARGET_STATE_v1_zh.md +6 -0
- package/docs/methodology/pointers/ASSESSMENT_etclovg_v1_zh.md +5 -0
- package/docs/methodology/pointers/ASSESSMENT_ink_v1_zh.md +5 -0
- package/docs/methodology/pointers/GUIDANCE_distribution_v1_zh.md +6 -0
- package/docs/methodology/pointers/HARNESS_V2_PLAN_v1_zh.md +8 -0
- package/docs/methodology/pointers/PILOT_kimi_code_fork_v1_zh.md +6 -0
- package/docs/methodology/pointers/POINTER_cyning_harness_repo_v1_zh.md +6 -0
- package/docs/methodology/pointers/README.md +40 -0
- package/docs/methodology/pointers/SDD_HAT_FLOW_v1_zh.md +8 -0
- package/docs/methodology/pointers/STRATEGY_MASTER_v1_zh.md +8 -0
- package/docs/methodology/pointers/STRATEGY_ONTOLOGY_v1_zh.md +9 -0
- package/docs/methodology/product/DESIGN_ONTOLOGY_v1_zh.md +719 -0
- package/docs/methodology/product/README.md +25 -0
- package/docs/methodology/prompts/PROMPT_article_theory_roundtable_v1_zh.md +127 -0
- package/docs/methodology/prompts/PROMPT_doc_consistency_audit_v1_zh.md +131 -0
- package/docs/methodology/prompts/PROMPT_feasibility_review_b_evidence_v1_zh.md +86 -0
- package/docs/methodology/prompts/README.md +10 -0
- package/docs/methodology/reviews/PROCESS_track_b_evidence_audit_2026-06-15_v1_zh.md +101 -0
- package/docs/methodology/reviews/README.md +9 -0
- package/docs/methodology/reviews/REVIEW_B3_pilot_evidence_and_sdd_compliance_bench_v1_zh.md +154 -0
- package/docs/methodology/reviews/REVIEW_B9_agent_shell_parallel_v1_zh.md +158 -0
- package/examples/demo_checkout/ACCEPTANCE.md +80 -0
- package/examples/demo_checkout/README.md +41 -0
- package/examples/demo_checkout/task_demo_p0_golden_v1.md +101 -0
- package/examples/oss-fork/README.md +139 -0
- package/examples/oss-fork/kimi-code/00_main.ai.md +23 -0
- package/examples/oss-fork/kimi-code/00_main.md +38 -0
- package/examples/oss-fork/kimi-code/01_struct.md +39 -0
- package/examples/oss-fork/kimi-code/02_version.md +6 -0
- package/examples/oss-fork/kimi-code/10_flow_cli_session.md +22 -0
- package/examples/oss-fork/kimi-code/README.md +15 -0
- package/golden/POINTER_gold_epic_serial.md +93 -0
- package/golden/README.md +30 -0
- package/graph/stubs/README.md +6 -0
- package/graph/templates/00_main.ai.md +28 -0
- package/graph/templates/00_main.md +52 -0
- package/graph/templates/01_struct.md +38 -0
- package/graph/templates/10_flow_MAIN.ai.md +43 -0
- package/graph/templates/10_flow_MAIN.md +47 -0
- package/graph/templates/99_mermaid_protocol.md +100 -0
- package/graph/templates/README.md +34 -0
- package/harness/README.md +18 -0
- package/harness/invokes/README.md +22 -0
- package/harness/invokes/TEMPLATE_invoke.md +59 -0
- package/harness/prompts/10-requirements.md +42 -0
- package/harness/prompts/22-task-audit.md +67 -0
- package/harness/prompts/30-execute-code.md +50 -0
- package/harness/prompts/FRAGMENT_30_gate_verify_v1_zh.md +30 -0
- package/harness/prompts/FRAGMENT_30_invoke_block_v1_zh.md +27 -0
- package/harness/prompts/README.md +28 -0
- package/harness/prompts/TEMPLATE_30_gate_stop.md +34 -0
- package/harness/templates/FRAGMENT_task_domain_infer_v1_zh.md +16 -0
- package/harness/templates/README.md +48 -0
- package/harness/templates/TASK_TEMPLATE.md +111 -0
- package/harness/templates/TASK_done_README.md +75 -0
- package/harness/templates/TASK_epic.md +101 -0
- package/harness/templates/TASK_graph_bootstrap.md +113 -0
- package/harness/templates/VIEW_done_by_domain.md +66 -0
- package/harness/templates/VIEW_done_thin_pointer.md +16 -0
- package/ide/adapters/AGENTS.md.fragment.example +31 -0
- package/ide/adapters/CLAUDE.md.fragment.example +30 -0
- package/ide/adapters/README.md +46 -0
- package/ide/adapters/cursor-harness-starter.mdc.example +37 -0
- package/lib/cli.js +180 -0
- package/lib/manifest.js +38 -0
- package/lib/paths.js +36 -0
- package/lib/run.js +33 -0
- package/package.json +37 -0
- package/schema/manifest.v1.schema.json +37 -0
- package/standards/POINTER_workspace_truth_v1_zh.md +57 -0
- package/standards/README.md +35 -0
- package/standards/SOURCES_v1_zh.md +49 -0
- package/standards/TEMPLATE_CODING_BASELINE_L1_v1_zh.md +88 -0
- package/standards/TEMPLATE_CODING_BASELINE_L2_backend_v1_zh.md +75 -0
- package/standards/TEMPLATE_CODING_BASELINE_L2_frontend_v1_zh.md +76 -0
- package/wizard/ONBOARDING_wizard_v1_zh.md +112 -0
- package/wizard/README.md +213 -0
- package/wizard/adopt-existing.sh +37 -0
- package/wizard/bootstrap-oss-fork-meta.sh +177 -0
- package/wizard/gate-check.sh +118 -0
- package/wizard/harness-sync.sh +237 -0
- package/wizard/install.sh +206 -0
- package/wizard/lib/common.sh +247 -0
- package/wizard/lib/manifest.sh +110 -0
- package/wizard/profiles/fullstack-node-py.json +21 -0
- package/wizard/profiles/harness-only.json +19 -0
- package/wizard/profiles/ios-cursor.json +19 -0
- package/wizard/profiles/issue-scan-presets.json +51 -0
- package/wizard/profiles/oss-fork-meta.json +17 -0
- package/wizard/scan-upstream-issues.sh +287 -0
- package/wizard/templates/FRAGMENT_rethink_backfill_task_v1_zh.md +44 -0
- package/wizard/templates/POINTER_PILOT_adoption_workspace.md +23 -0
- package/wizard/templates/TASK_TEMPLATE_upstream_pr_v1.md +164 -0
- package/wizard/templates/task_graph_bootstrap_v1.md +53 -0
- package/wizard/uninstall.sh +218 -0
- package/wizard/upgrade.sh +164 -0
package/wizard/README.md
ADDED
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
# wizard · 安装与同步
|
|
2
|
+
|
|
3
|
+
> **v0.3.0+**:**npx 优先** · `npx @cyning/harness init|upgrade|check` · manifest.json
|
|
4
|
+
> **v0.2.0+**:脚本化接入 · `--ide cursor,claude,agents` · OSS fork worktree · 上游 issue 扫描
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 0. npx CLI(v0.3+ · 推荐)
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
# 首次(业务仓根)
|
|
12
|
+
npx @cyning/harness@latest init --preset harness-only --ide cursor,agents
|
|
13
|
+
|
|
14
|
+
# 升级(等价 ./wizard/upgrade.sh --yes)
|
|
15
|
+
npx @cyning/harness upgrade
|
|
16
|
+
npx @cyning/harness upgrade --target /path/to/project --yes --force
|
|
17
|
+
|
|
18
|
+
# 仅检查版本
|
|
19
|
+
npx @cyning/harness check
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
- 内部单源:`wizard/install.sh` → `harness-sync.sh apply`(S2 写路径不变)
|
|
23
|
+
- manifest schema:[`schema/manifest.v1.schema.json`](../schema/manifest.v1.schema.json)
|
|
24
|
+
- 本地开发:`node bin/harness.js init --target /path/to/project --preset harness-only --ide cursor,agents --yes`
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## 1. 首次接入
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
cd /path/to/your-project
|
|
32
|
+
/path/to/cyning-harness/wizard/install.sh --preset ios-cursor
|
|
33
|
+
|
|
34
|
+
# D3 IDE 勾选(v0.2+)
|
|
35
|
+
/path/to/cyning-harness/wizard/install.sh --preset harness-only --ide cursor,claude,agents
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
| preset | 用途 |
|
|
39
|
+
|--------|------|
|
|
40
|
+
| `harness-only` | **交互默认 1** · 仅过程轨 + IDE(kimi-code-meta 等) |
|
|
41
|
+
| `fullstack-node-py` | **交互 2** · Ink 类全栈五轨 + quality + pytest |
|
|
42
|
+
| `ios-cursor` | 遗留 · ios_buy;**不在 install 交互菜单** |
|
|
43
|
+
| `oss-fork-meta` | OSS fork `cyning/meta`;用 `bootstrap-oss-fork-meta.sh` 或 `--preset` |
|
|
44
|
+
|
|
45
|
+
### 1.1 OSS 个人 fork 一键初始化(阶段 A+B 骨架)
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
git clone git@github.com:YOU/some-oss-fork.git
|
|
49
|
+
cd some-oss-fork
|
|
50
|
+
git remote add upstream git@github.com:ORG/original.git # 若无
|
|
51
|
+
|
|
52
|
+
CYNING_HARNESS=/path/to/cyning-harness \
|
|
53
|
+
"$CYNING_HARNESS/wizard/bootstrap-oss-fork-meta.sh"
|
|
54
|
+
|
|
55
|
+
# 可选:复用某次试点快照(见 examples/oss-fork/README.md)
|
|
56
|
+
# --stub-dir "$CYNING_HARNESS/examples/oss-fork/kimi-code"
|
|
57
|
+
|
|
58
|
+
git add -A && git commit -m "chore(harness): cyning/meta bootstrap"
|
|
59
|
+
git push -u origin cyning/meta
|
|
60
|
+
|
|
61
|
+
# 推荐:过程轨只读 worktree(与 feature 产品分支并行)
|
|
62
|
+
git worktree add ../some-oss-fork-meta cyning/meta
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**默认**:仅通用 `graph/templates` + 删 `10_flow_MAIN*`;**不**内置任何上游项目图谱。
|
|
66
|
+
**脚本不做**:`01_struct` 核对、`HG-GRAPH-MODULES` 人签、向上游 PR harness 文件。
|
|
67
|
+
|
|
68
|
+
**双分支纪律**:见 [`examples/oss-fork/README.md`](../examples/oss-fork/README.md)(勿 merge `cyning/meta` → `main`)。
|
|
69
|
+
|
|
70
|
+
生成:
|
|
71
|
+
|
|
72
|
+
- `.cyning-harness/profile.json` — 同步轨道配置
|
|
73
|
+
- `.cyning-harness/local.json` — 产品包路径
|
|
74
|
+
- `docs/tasks/active/` + `docs/tasks/done/`(**v0.2.1+** 含 `done/<domain>/` · Hub · `_views` 薄指针,见 `install.sh`)
|
|
75
|
+
- `docs/harness/FRAGMENT_rethink_backfill_task_v1_zh.md`
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## 2. 拉取产品包后 · 升级到已用项目(常用)
|
|
80
|
+
|
|
81
|
+
**推荐 · 交互向导**(在产品包目录运行,按提示输入业务仓路径):
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
cd /path/to/cyning-harness && git pull
|
|
85
|
+
./wizard/upgrade.sh
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
非交互:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
./wizard/upgrade.sh --target /path/to/kimi-code-meta --yes
|
|
92
|
+
./wizard/upgrade.sh --target /path/to/ios_buy --ide cursor,claude,agents --yes --gate-check
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
**禁止**对产品包自身 `apply`(误操作会被 `refuse_if_product_root` 拦截)。
|
|
96
|
+
|
|
97
|
+
### 2.1 清空纪律层 · 重新安装
|
|
98
|
+
|
|
99
|
+
交互清空(保留业务 `docs/tasks` · `reviews` · `invokes/by-task`):
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
cd /path/to/cyning-harness
|
|
103
|
+
./wizard/uninstall.sh
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
非交互:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
./wizard/uninstall.sh --target /path/to/kimi-code-meta --yes
|
|
110
|
+
./wizard/uninstall.sh --target /path/to/project --yes --with-ci --with-install-artifacts
|
|
111
|
+
./wizard/uninstall.sh --target /path/to/project --dry-run # 仅预览
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
清空后:
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
./wizard/install.sh --target /path/to/project --preset harness-only --ide cursor,claude,agents
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
手动分步(与向导等价):
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
cd /path/to/cyning-harness && git pull
|
|
124
|
+
|
|
125
|
+
cd /path/to/ios_buy # 业务仓
|
|
126
|
+
CYNING_HARNESS=/path/to/cyning-harness \
|
|
127
|
+
"$CYNING_HARNESS/wizard/harness-sync.sh" plan
|
|
128
|
+
|
|
129
|
+
CYNING_HARNESS=/path/to/cyning-harness \
|
|
130
|
+
"$CYNING_HARNESS/wizard/harness-sync.sh" apply
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
**默认同步**(不洗业务数据):
|
|
134
|
+
|
|
135
|
+
- `docs/harness/prompts/*.md`
|
|
136
|
+
- `docs/harness/invokes/TEMPLATE_invoke.md`
|
|
137
|
+
- `.cursor/rules/06-harness-pointer.mdc`(路径见 profile)
|
|
138
|
+
- `CLAUDE.md` / `AGENTS.md`(`ide_claude` / `ide_agents` 启用时 · marker merge)
|
|
139
|
+
|
|
140
|
+
**不覆盖**:`docs/tasks/`、`docs/harness/reviews/`、`invokes/by-task/*`、已填 `01_struct.md`。
|
|
141
|
+
|
|
142
|
+
强制重拷图谱/wiki(慎用):
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
FORCE_TRACKS=1 "$CYNING_HARNESS/wizard/harness-sync.sh" apply --target /path/to/project
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## 3. 人工闸检查(30 前)
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
"$CYNING_HARNESS/wizard/gate-check.sh" --target /path/to/project
|
|
154
|
+
# OSS fork meta worktree 时:--target /path/to/fork-meta
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
- `HG-AUDIT-R1` 非 `approved` → 退出码 2 · **30 不可开工**
|
|
158
|
+
- 辅助维护者,**不替代** Agent 闸扫描表
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## 4. 上游 Issue 扫描(无 Agent · v0.1.2+)
|
|
163
|
+
|
|
164
|
+
依赖:`gh`(已登录)· `jq` · **任意** `OWNER/REPO`
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
"$CYNING_HARNESS/wizard/scan-upstream-issues.sh" --help
|
|
168
|
+
|
|
169
|
+
# C2 候选(排除已占坑 #565/#566)
|
|
170
|
+
"$CYNING_HARNESS/wizard/scan-upstream-issues.sh" --preset kimi-c2-candidate
|
|
171
|
+
|
|
172
|
+
# C3 候选(再排除 #583 · v0.1.3)
|
|
173
|
+
"$CYNING_HARNESS/wizard/scan-upstream-issues.sh" --preset kimi-c3-candidate
|
|
174
|
+
|
|
175
|
+
# 任意上游仓
|
|
176
|
+
"$CYNING_HARNESS/wizard/scan-upstream-issues.sh" \
|
|
177
|
+
--repo OWNER/REPO --state open --label bug --check-pr --limit 20
|
|
178
|
+
|
|
179
|
+
# 落盘 Markdown
|
|
180
|
+
"$CYNING_HARNESS/wizard/scan-upstream-issues.sh" --preset kimi-c3-candidate \
|
|
181
|
+
--format markdown --output /tmp/issue-scan.md
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
| 参数 | 说明 |
|
|
185
|
+
|------|------|
|
|
186
|
+
| `--preset` | `profiles/issue-scan-presets.json` |
|
|
187
|
+
| `--repo` | `OWNER/NAME` |
|
|
188
|
+
| `--label` | 可重复 |
|
|
189
|
+
| `--check-pr` / `--no-check-pr` | PR 占坑(逐条 gh,较慢) |
|
|
190
|
+
| `--only-no-pr` | 仅无 **open** PR 的 issue |
|
|
191
|
+
| `--exclude-issues` | `565,566` |
|
|
192
|
+
| `--format` | `table` · **`text`**(同 table)· `markdown` · `json` |
|
|
193
|
+
|
|
194
|
+
自定义 preset:编辑 `wizard/profiles/issue-scan-presets.json`。
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## 5. 与 ECC install-manifest(B2)的关系
|
|
199
|
+
|
|
200
|
+
| ECC | cyning-harness |
|
|
201
|
+
|-----|----------------|
|
|
202
|
+
| `install-plan.js` | `harness-sync.sh plan` |
|
|
203
|
+
| `install-apply.js` | `harness-sync.sh apply` |
|
|
204
|
+
| npm 全局包 | 本地 clone + profile.json |
|
|
205
|
+
| 261 skills 选择性装 | **五轨勾选** + 默认只升 harness 纪律层 |
|
|
206
|
+
|
|
207
|
+
脚本解决 **「产品包更新 → 已接入仓同步」**;**不解决**人签 `HG-AUDIT-R1`(须维护者改 task 表)。
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## 6. 文档问卷
|
|
212
|
+
|
|
213
|
+
交互问卷仍见 [`ONBOARDING_wizard_v1_zh.md`](./ONBOARDING_wizard_v1_zh.md);**推荐以本目录脚本为准**。
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# 已为手工接入的五轨仓 · 仅写入 profile 并 sync(不重复 bootstrap task)
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
|
|
5
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
+
# shellcheck source=lib/common.sh
|
|
7
|
+
source "$SCRIPT_DIR/lib/common.sh"
|
|
8
|
+
HARNESS_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
9
|
+
TARGET="$(pwd)"
|
|
10
|
+
PRESET="ios-cursor"
|
|
11
|
+
|
|
12
|
+
while [[ $# -gt 0 ]]; do
|
|
13
|
+
case "$1" in
|
|
14
|
+
--target) TARGET="$2"; shift 2 ;;
|
|
15
|
+
--preset) PRESET="$2"; shift 2 ;;
|
|
16
|
+
-h|--help)
|
|
17
|
+
echo "用法: adopt-existing.sh --target /path/to/project --preset ios-cursor|harness-only"
|
|
18
|
+
exit 0
|
|
19
|
+
;;
|
|
20
|
+
*) echo "未知: $1" >&2; exit 1 ;;
|
|
21
|
+
esac
|
|
22
|
+
done
|
|
23
|
+
|
|
24
|
+
CYNING_HARNESS="${CYNING_HARNESS:-$HARNESS_ROOT}"
|
|
25
|
+
PRESET_FILE="$SCRIPT_DIR/profiles/${PRESET}.json"
|
|
26
|
+
[[ -f "$PRESET_FILE" ]] || { echo "未知 preset: $PRESET" >&2; exit 1; }
|
|
27
|
+
refuse_if_product_root "$TARGET" "$HARNESS_ROOT"
|
|
28
|
+
|
|
29
|
+
mkdir -p "$TARGET/.cyning-harness"
|
|
30
|
+
cp "$PRESET_FILE" "$TARGET/.cyning-harness/profile.json"
|
|
31
|
+
printf '%s\n' "{\"cyning_harness_root\":\"$CYNING_HARNESS\"}" > "$TARGET/.cyning-harness/local.json"
|
|
32
|
+
|
|
33
|
+
export CYNING_HARNESS TARGET
|
|
34
|
+
"$SCRIPT_DIR/harness-sync.sh" apply --target "$TARGET"
|
|
35
|
+
|
|
36
|
+
echo "已为存量仓写入 profile 并同步 harness 纪律层。"
|
|
37
|
+
echo "检查闸: $CYNING_HARNESS/wizard/gate-check.sh --target $TARGET"
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# OSS 个人 fork · cyning/meta 一键初始化(阶段 A+B 骨架)
|
|
3
|
+
# 不替代:01_struct 核对、HG-GRAPH-MODULES 人签、上游 PR 纪律
|
|
4
|
+
set -euo pipefail
|
|
5
|
+
|
|
6
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
7
|
+
HARNESS_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
8
|
+
TARGET="$(pwd)"
|
|
9
|
+
BRANCH="cyning/meta"
|
|
10
|
+
STUB_DIR=""
|
|
11
|
+
DRY_RUN=0
|
|
12
|
+
SKIP_BRANCH=0
|
|
13
|
+
|
|
14
|
+
usage() {
|
|
15
|
+
cat <<'EOF'
|
|
16
|
+
用法:
|
|
17
|
+
|
|
18
|
+
cd /path/to/your-fork
|
|
19
|
+
CYNING_HARNESS=/path/to/cyning-harness \
|
|
20
|
+
"$CYNING_HARNESS/wizard/bootstrap-oss-fork-meta.sh"
|
|
21
|
+
|
|
22
|
+
"$CYNING_HARNESS/wizard/bootstrap-oss-fork-meta.sh" \
|
|
23
|
+
--target /path/to/fork \
|
|
24
|
+
--branch cyning/meta \
|
|
25
|
+
--stub-dir /path/to/custom/graph-stubs \
|
|
26
|
+
--skip-branch \
|
|
27
|
+
--dry-run
|
|
28
|
+
|
|
29
|
+
默认(无 --stub-dir):
|
|
30
|
+
- harness 通用 graph/templates(01_struct 等待填)
|
|
31
|
+
- 删除无用 10_flow_MAIN* HTTP 模板
|
|
32
|
+
- 不加载任何上游项目专用图谱
|
|
33
|
+
|
|
34
|
+
可选 --stub-dir:
|
|
35
|
+
- 覆盖 docs/_tech_graph/ 下同名文件(试点快照或自建目录)
|
|
36
|
+
- 示例(非默认): $CYNING_HARNESS/examples/oss-fork/kimi-code
|
|
37
|
+
|
|
38
|
+
仍需人工:
|
|
39
|
+
- 核对并签 HG-GRAPH-MODULES
|
|
40
|
+
- cyning/meta 仅 push 到你的 fork;上游 PR 仅 feature/* 产品 diff
|
|
41
|
+
EOF
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
while [[ $# -gt 0 ]]; do
|
|
45
|
+
case "$1" in
|
|
46
|
+
--target) TARGET="$2"; shift 2 ;;
|
|
47
|
+
--branch) BRANCH="$2"; shift 2 ;;
|
|
48
|
+
--stub-dir) STUB_DIR="$2"; shift 2 ;;
|
|
49
|
+
--skip-branch) SKIP_BRANCH=1; shift ;;
|
|
50
|
+
--dry-run) DRY_RUN=1; shift ;;
|
|
51
|
+
-h|--help) usage; exit 0 ;;
|
|
52
|
+
*) echo "未知参数: $1" >&2; usage; exit 1 ;;
|
|
53
|
+
esac
|
|
54
|
+
done
|
|
55
|
+
|
|
56
|
+
CYNING_HARNESS="${CYNING_HARNESS:-$HARNESS_ROOT}"
|
|
57
|
+
PRESET_FILE="$SCRIPT_DIR/profiles/oss-fork-meta.json"
|
|
58
|
+
|
|
59
|
+
[[ -d "$TARGET/.git" ]] || { echo "错误: $TARGET 不是 git 仓根" >&2; exit 1; }
|
|
60
|
+
[[ -f "$PRESET_FILE" ]] || { echo "错误: 缺少 preset $PRESET_FILE" >&2; exit 1; }
|
|
61
|
+
|
|
62
|
+
run() {
|
|
63
|
+
if [[ "$DRY_RUN" == "1" ]]; then echo "[dry-run] $*"; else eval "$@"; fi
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
slug_from_path() {
|
|
67
|
+
basename "$TARGET" | tr '[:upper:]' '[:lower:]' | tr '-' '_'
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
echo "=== bootstrap-oss-fork-meta ==="
|
|
71
|
+
echo "目标: $TARGET"
|
|
72
|
+
echo "分支: $BRANCH (skip=$SKIP_BRANCH)"
|
|
73
|
+
echo "stub-dir: ${STUB_DIR:-(无 · 通用模板)}"
|
|
74
|
+
echo ""
|
|
75
|
+
|
|
76
|
+
if [[ "$SKIP_BRANCH" == "0" ]]; then
|
|
77
|
+
if [[ "$DRY_RUN" == "1" ]]; then
|
|
78
|
+
echo "[dry-run] git checkout $BRANCH || git checkout -b $BRANCH"
|
|
79
|
+
else
|
|
80
|
+
cd "$TARGET"
|
|
81
|
+
git checkout "$BRANCH" 2>/dev/null || git checkout -b "$BRANCH"
|
|
82
|
+
fi
|
|
83
|
+
fi
|
|
84
|
+
|
|
85
|
+
run mkdir -p "$TARGET/.cyning-harness"
|
|
86
|
+
run mkdir -p "$TARGET/docs/tasks/active" "$TARGET/docs/tasks/done"
|
|
87
|
+
run mkdir -p "$TARGET/docs/harness/reviews" "$TARGET/docs/harness/invokes/by-task"
|
|
88
|
+
run mkdir -p "$TARGET/docs/_tech_graph"
|
|
89
|
+
|
|
90
|
+
if [[ "$DRY_RUN" == "1" ]]; then
|
|
91
|
+
echo "[dry-run] cp preset + local.json"
|
|
92
|
+
else
|
|
93
|
+
cp "$PRESET_FILE" "$TARGET/.cyning-harness/profile.json"
|
|
94
|
+
printf '%s\n' "{\"cyning_harness_root\":\"$CYNING_HARNESS\"}" > "$TARGET/.cyning-harness/local.json"
|
|
95
|
+
fi
|
|
96
|
+
|
|
97
|
+
export CYNING_HARNESS TARGET FORCE_TRACKS=1
|
|
98
|
+
if [[ "$DRY_RUN" == "1" ]]; then
|
|
99
|
+
"$SCRIPT_DIR/harness-sync.sh" plan --target "$TARGET"
|
|
100
|
+
else
|
|
101
|
+
"$SCRIPT_DIR/harness-sync.sh" apply --target "$TARGET"
|
|
102
|
+
fi
|
|
103
|
+
|
|
104
|
+
# POINTER
|
|
105
|
+
if [[ "$DRY_RUN" == "1" ]]; then
|
|
106
|
+
echo "[dry-run] cp POINTER -> docs/harness/"
|
|
107
|
+
else
|
|
108
|
+
cp "$SCRIPT_DIR/templates/POINTER_PILOT_adoption_workspace.md" \
|
|
109
|
+
"$TARGET/docs/harness/POINTER_PILOT_adoption_workspace_v1_zh.md"
|
|
110
|
+
fi
|
|
111
|
+
|
|
112
|
+
# harness README
|
|
113
|
+
if [[ "$DRY_RUN" != "1" ]]; then
|
|
114
|
+
cat >"$TARGET/docs/harness/README.md" <<'EOF'
|
|
115
|
+
# docs/harness(个人 fork · 过程轨)
|
|
116
|
+
|
|
117
|
+
勿 PR 上游。由 `bootstrap-oss-fork-meta.sh` 初始化。
|
|
118
|
+
|
|
119
|
+
- `FRAGMENT_rethink_backfill_task_v1_zh.md` — 思考轮结论须写回 task §4
|
|
120
|
+
- `invokes/by-task/<slug>/` — 按 task 落盘 invoke
|
|
121
|
+
EOF
|
|
122
|
+
cat >"$TARGET/docs/tasks/README.md" <<'EOF'
|
|
123
|
+
# docs/tasks
|
|
124
|
+
|
|
125
|
+
Harness task · `active/` 进行中 · `done/` 关账。
|
|
126
|
+
|
|
127
|
+
上游 PR 选题后复制:`TASK_TEMPLATE_upstream_pr_v1.md`(产品包 `wizard/templates/`)→ `active/task_<slug>_v1.md`。
|
|
128
|
+
EOF
|
|
129
|
+
cp "$SCRIPT_DIR/templates/FRAGMENT_rethink_backfill_task_v1_zh.md" \
|
|
130
|
+
"$TARGET/docs/harness/FRAGMENT_rethink_backfill_task_v1_zh.md"
|
|
131
|
+
cp "$SCRIPT_DIR/templates/TASK_TEMPLATE_upstream_pr_v1.md" \
|
|
132
|
+
"$TARGET/docs/tasks/TASK_TEMPLATE_upstream_pr_v1.md"
|
|
133
|
+
fi
|
|
134
|
+
|
|
135
|
+
# bootstrap task
|
|
136
|
+
SLUG="$(slug_from_path)"
|
|
137
|
+
TASK_FILE="$TARGET/docs/tasks/active/task_graph_bootstrap_${SLUG}_v1.md"
|
|
138
|
+
if [[ "$DRY_RUN" == "1" ]]; then
|
|
139
|
+
echo "[dry-run] task -> $TASK_FILE"
|
|
140
|
+
else
|
|
141
|
+
sed "s/__REPO_SLUG__/${SLUG}/g" "$SCRIPT_DIR/templates/task_graph_bootstrap_v1.md" >"$TASK_FILE"
|
|
142
|
+
fi
|
|
143
|
+
|
|
144
|
+
# 可选:项目专用 stub 目录(非产品默认)
|
|
145
|
+
if [[ -n "$STUB_DIR" ]]; then
|
|
146
|
+
[[ -d "$STUB_DIR" ]] || { echo "错误: --stub-dir 不存在: $STUB_DIR" >&2; exit 1; }
|
|
147
|
+
echo "应用 stub-dir: $STUB_DIR"
|
|
148
|
+
for f in "$STUB_DIR"/*; do
|
|
149
|
+
[[ -f "$f" ]] || continue
|
|
150
|
+
base="$(basename "$f")"
|
|
151
|
+
[[ "$base" == "README.md" ]] && continue
|
|
152
|
+
dst="$TARGET/docs/_tech_graph/$base"
|
|
153
|
+
if [[ "$DRY_RUN" == "1" ]]; then
|
|
154
|
+
echo "[dry-run] cp $f -> $dst"
|
|
155
|
+
else
|
|
156
|
+
cp "$f" "$dst"
|
|
157
|
+
fi
|
|
158
|
+
done
|
|
159
|
+
fi
|
|
160
|
+
|
|
161
|
+
# harness 通用 HTTP 示例 flow · 非 OSS fork 主路径
|
|
162
|
+
if [[ "$DRY_RUN" == "1" ]]; then
|
|
163
|
+
echo "[dry-run] rm -f docs/_tech_graph/10_flow_MAIN.md docs/_tech_graph/10_flow_MAIN.ai.md"
|
|
164
|
+
else
|
|
165
|
+
rm -f "$TARGET/docs/_tech_graph/10_flow_MAIN.md" "$TARGET/docs/_tech_graph/10_flow_MAIN.ai.md"
|
|
166
|
+
fi
|
|
167
|
+
|
|
168
|
+
echo ""
|
|
169
|
+
echo "=== 完成(骨架)==="
|
|
170
|
+
echo "1. 编辑 docs/_tech_graph/01_struct.md(对照仓内 AGENTS.md / README)"
|
|
171
|
+
echo "2. 签 task: docs/tasks/active/task_graph_bootstrap_${SLUG}_v1.md → HG-GRAPH-MODULES approved"
|
|
172
|
+
echo "3. 检查: $CYNING_HARNESS/wizard/gate-check.sh --target $TARGET"
|
|
173
|
+
echo "4. git add + commit + git push -u origin $BRANCH # 仅你的 fork"
|
|
174
|
+
echo "5. 推荐 worktree: git worktree add ../$(basename "$TARGET")-meta $BRANCH"
|
|
175
|
+
echo "6. 选题: $CYNING_HARNESS/wizard/scan-upstream-issues.sh --repo <upstream> ..."
|
|
176
|
+
echo " 复制 docs/tasks/TASK_TEMPLATE_upstream_pr_v1.md → active/task_<slug>_v1.md"
|
|
177
|
+
echo "7. 上游 PR:仅从 main 拉 feature/*,不含 docs/harness(见 examples/oss-fork/README.md)"
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# 读取 task 人工闸 · 判断 30 是否可开工(机械辅助,真值仍在 task 表)
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
|
|
5
|
+
TARGET="${TARGET:-$(pwd)}"
|
|
6
|
+
TASK_FILE=""
|
|
7
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
8
|
+
|
|
9
|
+
while [[ $# -gt 0 ]]; do
|
|
10
|
+
case "$1" in
|
|
11
|
+
--target) TARGET="$2"; shift 2 ;;
|
|
12
|
+
--task)
|
|
13
|
+
TASK_FILE="$2"
|
|
14
|
+
shift 2
|
|
15
|
+
;;
|
|
16
|
+
-h|--help)
|
|
17
|
+
echo "用法: gate-check.sh [--target /path/to/repo] [--task docs/tasks/active/task_*.md]"
|
|
18
|
+
exit 0
|
|
19
|
+
;;
|
|
20
|
+
*) echo "未知参数: $1" >&2; exit 1 ;;
|
|
21
|
+
esac
|
|
22
|
+
done
|
|
23
|
+
|
|
24
|
+
gate_status() {
|
|
25
|
+
local file="$1" gate="$2"
|
|
26
|
+
awk -F'|' -v g="$gate" '
|
|
27
|
+
index($0, g) > 0 {
|
|
28
|
+
gsub(/^[[:space:]]+|[[:space:]]+$/, "", $3)
|
|
29
|
+
gsub(/\*/, "", $3)
|
|
30
|
+
print $3
|
|
31
|
+
exit
|
|
32
|
+
}
|
|
33
|
+
' "$file"
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
gate_blocks() {
|
|
37
|
+
local file="$1" gate="$2"
|
|
38
|
+
awk -F'|' -v g="$gate" '
|
|
39
|
+
index($0, g) > 0 {
|
|
40
|
+
gsub(/^[[:space:]]+|[[:space:]]+$/, "", $4)
|
|
41
|
+
gsub(/\*/, "", $4)
|
|
42
|
+
print $4
|
|
43
|
+
exit
|
|
44
|
+
}
|
|
45
|
+
' "$file"
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
check_one_task() {
|
|
49
|
+
local tf="$1"
|
|
50
|
+
echo "task: $(basename "$tf")"
|
|
51
|
+
draft="$(gate_status "$tf" HG-TASK-DRAFT)"
|
|
52
|
+
audit="$(gate_status "$tf" HG-AUDIT-R1)"
|
|
53
|
+
graph="$(gate_status "$tf" HG-GRAPH-MODULES)"
|
|
54
|
+
draft_blocks="$(gate_blocks "$tf" HG-TASK-DRAFT)"
|
|
55
|
+
|
|
56
|
+
printf "| gate | status | blocks_30 | 30 影响 |\n"
|
|
57
|
+
printf "|------|--------|-----------|--------|\n"
|
|
58
|
+
printf "| HG-TASK-DRAFT | %s | %s | %s |\n" "${draft:-?}" "${draft_blocks:-?}" \
|
|
59
|
+
"$( [[ "$draft" == "approved" ]] && echo "—" || { [[ "$draft_blocks" == *30* ]] && echo "❌ 拒 30" || echo "—"; } )"
|
|
60
|
+
printf "| HG-AUDIT-R1 | %s | 30 | %s |\n" "${audit:-?}" \
|
|
61
|
+
"$( [[ "$audit" == "approved" ]] && echo "✅ 可 30" || echo "❌ 拒 30" )"
|
|
62
|
+
if [[ -n "$graph" && "$graph" != "—" && "$graph" != "?" ]]; then
|
|
63
|
+
printf "| HG-GRAPH-MODULES | %s | — | %s |\n" "$graph" \
|
|
64
|
+
"$( [[ "$graph" == "approved" ]] && echo "✅" || echo "❌ 若 pending 拒 30" )"
|
|
65
|
+
fi
|
|
66
|
+
echo ""
|
|
67
|
+
|
|
68
|
+
local blocked=0
|
|
69
|
+
if [[ "$audit" != "approved" ]]; then
|
|
70
|
+
blocked=1
|
|
71
|
+
echo "→ 30 不可开工: HG-AUDIT-R1 非 approved(须维护者签 task 表)"
|
|
72
|
+
fi
|
|
73
|
+
if [[ "$draft" != "approved" && "$draft_blocks" == *30* ]]; then
|
|
74
|
+
blocked=1
|
|
75
|
+
echo "→ 30 不可开工: HG-TASK-DRAFT pending 且 blocks 30"
|
|
76
|
+
fi
|
|
77
|
+
if [[ -n "$graph" && "$graph" == "pending" ]]; then
|
|
78
|
+
blocked=1
|
|
79
|
+
echo "→ 30 不可开工: HG-GRAPH-MODULES pending"
|
|
80
|
+
fi
|
|
81
|
+
echo ""
|
|
82
|
+
return "$blocked"
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
echo "=== Harness gate-check ==="
|
|
86
|
+
echo "目标: $TARGET"
|
|
87
|
+
echo ""
|
|
88
|
+
|
|
89
|
+
BLOCKED=0
|
|
90
|
+
|
|
91
|
+
if [[ -n "$TASK_FILE" ]]; then
|
|
92
|
+
if [[ "$TASK_FILE" != /* ]]; then
|
|
93
|
+
TASK_FILE="$TARGET/$TASK_FILE"
|
|
94
|
+
fi
|
|
95
|
+
if [[ ! -f "$TASK_FILE" ]]; then
|
|
96
|
+
echo "错误: 未找到 --task 文件 $TASK_FILE" >&2
|
|
97
|
+
exit 1
|
|
98
|
+
fi
|
|
99
|
+
check_one_task "$TASK_FILE" || BLOCKED=1
|
|
100
|
+
else
|
|
101
|
+
ACTIVE_DIR="$TARGET/docs/tasks/active"
|
|
102
|
+
[[ -d "$ACTIVE_DIR" ]] || { echo "无 $ACTIVE_DIR" >&2; exit 1; }
|
|
103
|
+
TASK_FILES=("$ACTIVE_DIR"/task_*.md)
|
|
104
|
+
if [[ ! -e "${TASK_FILES[0]}" ]]; then
|
|
105
|
+
echo "无 active task_*.md"
|
|
106
|
+
exit 0
|
|
107
|
+
fi
|
|
108
|
+
for tf in "$ACTIVE_DIR"/task_*.md; do
|
|
109
|
+
[[ -f "$tf" ]] || continue
|
|
110
|
+
check_one_task "$tf" || BLOCKED=1
|
|
111
|
+
done
|
|
112
|
+
fi
|
|
113
|
+
|
|
114
|
+
if [[ "$BLOCKED" == "1" ]]; then
|
|
115
|
+
exit 2
|
|
116
|
+
fi
|
|
117
|
+
echo "闸检查: 未发现阻塞(仍须 Agent 首输出 GATE_VERIFY · 不得采信 invoke 字面 approved)"
|
|
118
|
+
exit 0
|