@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.
Files changed (125) hide show
  1. package/AGENTS.md +20 -0
  2. package/CHANGELOG.md +127 -0
  3. package/README.md +133 -0
  4. package/bin/harness.js +7 -0
  5. package/ci/samples/README.md +42 -0
  6. package/ci/samples/pytest.yml.example +49 -0
  7. package/ci/samples/quality.yml.example +56 -0
  8. package/coding_wiki/templates/README.md +11 -0
  9. package/coding_wiki/templates/context.md +11 -0
  10. package/coding_wiki/templates/stable.md +19 -0
  11. package/coding_wiki/templates/volatile.md +15 -0
  12. package/docs/ARCHITECTURE.md +71 -0
  13. package/docs/DESIGN_ONTOLOGY_v1_zh.md +9 -0
  14. package/docs/HARNESS_GRAPH_MODEL_design_v0_zh.md +6 -0
  15. package/docs/HARNESS_GRAPH_MODEL_dialogue_archive_v1_zh.md +8 -0
  16. package/docs/ONBOARDING.md +126 -0
  17. package/docs/P0_V0.2_GAP.md +6 -0
  18. package/docs/README.md +38 -0
  19. package/docs/methodology/AUDIT_doc_consistency_2026-06-15_zh.md +69 -0
  20. package/docs/methodology/DOCUMENT_MAP_v1_zh.md +122 -0
  21. package/docs/methodology/README.md +147 -0
  22. package/docs/methodology/ROADMAP_v1_zh.md +136 -0
  23. package/docs/methodology/execution/P0_V0.2_GAP.md +93 -0
  24. package/docs/methodology/execution/PILOT_EVIDENCE_B2_v1_zh.md +132 -0
  25. package/docs/methodology/execution/README.md +12 -0
  26. package/docs/methodology/graph/HARNESS_GRAPH_MODEL_design_v0_zh.md +258 -0
  27. package/docs/methodology/graph/HARNESS_GRAPH_MODEL_dialogue_archive_v1_zh.md +132 -0
  28. package/docs/methodology/graph/README.md +22 -0
  29. package/docs/methodology/pointers/ADOPTION_METHODOLOGY_v1_zh.md +8 -0
  30. package/docs/methodology/pointers/ADOPTION_TARGET_STATE_v1_zh.md +6 -0
  31. package/docs/methodology/pointers/ASSESSMENT_etclovg_v1_zh.md +5 -0
  32. package/docs/methodology/pointers/ASSESSMENT_ink_v1_zh.md +5 -0
  33. package/docs/methodology/pointers/GUIDANCE_distribution_v1_zh.md +6 -0
  34. package/docs/methodology/pointers/HARNESS_V2_PLAN_v1_zh.md +8 -0
  35. package/docs/methodology/pointers/PILOT_kimi_code_fork_v1_zh.md +6 -0
  36. package/docs/methodology/pointers/POINTER_cyning_harness_repo_v1_zh.md +6 -0
  37. package/docs/methodology/pointers/README.md +40 -0
  38. package/docs/methodology/pointers/SDD_HAT_FLOW_v1_zh.md +8 -0
  39. package/docs/methodology/pointers/STRATEGY_MASTER_v1_zh.md +8 -0
  40. package/docs/methodology/pointers/STRATEGY_ONTOLOGY_v1_zh.md +9 -0
  41. package/docs/methodology/product/DESIGN_ONTOLOGY_v1_zh.md +719 -0
  42. package/docs/methodology/product/README.md +25 -0
  43. package/docs/methodology/prompts/PROMPT_article_theory_roundtable_v1_zh.md +127 -0
  44. package/docs/methodology/prompts/PROMPT_doc_consistency_audit_v1_zh.md +131 -0
  45. package/docs/methodology/prompts/PROMPT_feasibility_review_b_evidence_v1_zh.md +86 -0
  46. package/docs/methodology/prompts/README.md +10 -0
  47. package/docs/methodology/reviews/PROCESS_track_b_evidence_audit_2026-06-15_v1_zh.md +101 -0
  48. package/docs/methodology/reviews/README.md +9 -0
  49. package/docs/methodology/reviews/REVIEW_B3_pilot_evidence_and_sdd_compliance_bench_v1_zh.md +154 -0
  50. package/docs/methodology/reviews/REVIEW_B9_agent_shell_parallel_v1_zh.md +158 -0
  51. package/examples/demo_checkout/ACCEPTANCE.md +80 -0
  52. package/examples/demo_checkout/README.md +41 -0
  53. package/examples/demo_checkout/task_demo_p0_golden_v1.md +101 -0
  54. package/examples/oss-fork/README.md +139 -0
  55. package/examples/oss-fork/kimi-code/00_main.ai.md +23 -0
  56. package/examples/oss-fork/kimi-code/00_main.md +38 -0
  57. package/examples/oss-fork/kimi-code/01_struct.md +39 -0
  58. package/examples/oss-fork/kimi-code/02_version.md +6 -0
  59. package/examples/oss-fork/kimi-code/10_flow_cli_session.md +22 -0
  60. package/examples/oss-fork/kimi-code/README.md +15 -0
  61. package/golden/POINTER_gold_epic_serial.md +93 -0
  62. package/golden/README.md +30 -0
  63. package/graph/stubs/README.md +6 -0
  64. package/graph/templates/00_main.ai.md +28 -0
  65. package/graph/templates/00_main.md +52 -0
  66. package/graph/templates/01_struct.md +38 -0
  67. package/graph/templates/10_flow_MAIN.ai.md +43 -0
  68. package/graph/templates/10_flow_MAIN.md +47 -0
  69. package/graph/templates/99_mermaid_protocol.md +100 -0
  70. package/graph/templates/README.md +34 -0
  71. package/harness/README.md +18 -0
  72. package/harness/invokes/README.md +22 -0
  73. package/harness/invokes/TEMPLATE_invoke.md +59 -0
  74. package/harness/prompts/10-requirements.md +42 -0
  75. package/harness/prompts/22-task-audit.md +67 -0
  76. package/harness/prompts/30-execute-code.md +50 -0
  77. package/harness/prompts/FRAGMENT_30_gate_verify_v1_zh.md +30 -0
  78. package/harness/prompts/FRAGMENT_30_invoke_block_v1_zh.md +27 -0
  79. package/harness/prompts/README.md +28 -0
  80. package/harness/prompts/TEMPLATE_30_gate_stop.md +34 -0
  81. package/harness/templates/FRAGMENT_task_domain_infer_v1_zh.md +16 -0
  82. package/harness/templates/README.md +48 -0
  83. package/harness/templates/TASK_TEMPLATE.md +111 -0
  84. package/harness/templates/TASK_done_README.md +75 -0
  85. package/harness/templates/TASK_epic.md +101 -0
  86. package/harness/templates/TASK_graph_bootstrap.md +113 -0
  87. package/harness/templates/VIEW_done_by_domain.md +66 -0
  88. package/harness/templates/VIEW_done_thin_pointer.md +16 -0
  89. package/ide/adapters/AGENTS.md.fragment.example +31 -0
  90. package/ide/adapters/CLAUDE.md.fragment.example +30 -0
  91. package/ide/adapters/README.md +46 -0
  92. package/ide/adapters/cursor-harness-starter.mdc.example +37 -0
  93. package/lib/cli.js +180 -0
  94. package/lib/manifest.js +38 -0
  95. package/lib/paths.js +36 -0
  96. package/lib/run.js +33 -0
  97. package/package.json +37 -0
  98. package/schema/manifest.v1.schema.json +37 -0
  99. package/standards/POINTER_workspace_truth_v1_zh.md +57 -0
  100. package/standards/README.md +35 -0
  101. package/standards/SOURCES_v1_zh.md +49 -0
  102. package/standards/TEMPLATE_CODING_BASELINE_L1_v1_zh.md +88 -0
  103. package/standards/TEMPLATE_CODING_BASELINE_L2_backend_v1_zh.md +75 -0
  104. package/standards/TEMPLATE_CODING_BASELINE_L2_frontend_v1_zh.md +76 -0
  105. package/wizard/ONBOARDING_wizard_v1_zh.md +112 -0
  106. package/wizard/README.md +213 -0
  107. package/wizard/adopt-existing.sh +37 -0
  108. package/wizard/bootstrap-oss-fork-meta.sh +177 -0
  109. package/wizard/gate-check.sh +118 -0
  110. package/wizard/harness-sync.sh +237 -0
  111. package/wizard/install.sh +206 -0
  112. package/wizard/lib/common.sh +247 -0
  113. package/wizard/lib/manifest.sh +110 -0
  114. package/wizard/profiles/fullstack-node-py.json +21 -0
  115. package/wizard/profiles/harness-only.json +19 -0
  116. package/wizard/profiles/ios-cursor.json +19 -0
  117. package/wizard/profiles/issue-scan-presets.json +51 -0
  118. package/wizard/profiles/oss-fork-meta.json +17 -0
  119. package/wizard/scan-upstream-issues.sh +287 -0
  120. package/wizard/templates/FRAGMENT_rethink_backfill_task_v1_zh.md +44 -0
  121. package/wizard/templates/POINTER_PILOT_adoption_workspace.md +23 -0
  122. package/wizard/templates/TASK_TEMPLATE_upstream_pr_v1.md +164 -0
  123. package/wizard/templates/task_graph_bootstrap_v1.md +53 -0
  124. package/wizard/uninstall.sh +218 -0
  125. package/wizard/upgrade.sh +164 -0
@@ -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