@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,164 @@
1
+ # Task:<动词 + 范围> · #<issue>(阶段 C · OSS fork)
2
+
3
+ > **状态**:`draft`
4
+ > **上游 Issue**:`<UPSTREAM>/issues/xxx`
5
+ > **关联图谱**:`docs/_tech_graph/01_struct.md` · **增量** `graph_delta` 见下表
6
+
7
+ ---
8
+
9
+ ## Harness 元信息
10
+
11
+ | 字段 | 值 |
12
+ |------|-----|
13
+ | **task_slug** | `<slug>` |
14
+ | **test_strategy** | `required` / `recommended` / `not_applicable` |
15
+ | **orchestration** | Kimi Code Agent · **R0+R1–R5 思考** → 22 → 30 |
16
+ | **git_branch** | `feature/fix-<issue>-<short>` |
17
+ | **worktree_root** | 产品仓 Open Folder |
18
+ | **meta_worktree** | 过程轨 worktree(`cyning/meta`) |
19
+ | **module_id** | 来自 `01_struct` |
20
+ | **graph_delta** | `10_flow_*.md` 或 `none` |
21
+ | **graph_delta_note** | `none` 时必填 |
22
+ | **graph_gate** | `skeleton_before_30` · `close_partial_or_final` |
23
+
24
+ ### 人工闸
25
+
26
+ | human_gate_id | status | blocks_hats | 说明 |
27
+ |---------------|--------|-------------|------|
28
+ | HG-TASK-DRAFT | pending | 22-R1, 30 | task + skeleton + **§4 思考轮闭合** |
29
+ | HG-AUDIT-R1 | pending | 30 | 22 思考审查通过 + skeleton commit 后人签 |
30
+
31
+ ---
32
+
33
+ ## 1. 需求摘要
34
+
35
+ (来自 Issue)
36
+
37
+ ---
38
+
39
+ ## 2. 非范围
40
+
41
+ - harness / task / invoke 进上游 PR
42
+
43
+ ---
44
+
45
+ ## 3. 失败路径
46
+
47
+ | 触发条件 | 系统行为 |
48
+ |----------|----------|
49
+ | `graph_delta≠none` 且无 skeleton commit | 30 拒开工 |
50
+ | §4 R1–R5 仍有 `(待填)` 且无合法 **思考轮控制** | 22 退回 10 · 30 拒开工 |
51
+ | `early_stop=yes` 但缺 reason / residual_risks | 22 退回 10 |
52
+ | `HG-AUDIT-R1` pending | 30 拒开工 |
53
+ | PR 已开但 meta 无图谱关账 | 不得 `done/` |
54
+
55
+ ---
56
+
57
+ ## 4. 思考轮次(改码前 · 默认 R0 + R1–R5)
58
+
59
+ > **10 帽义务**:预置 **五槽思考轮**(C1–C3 实证);见 [`docs/harness/prompts/10-requirements.md`](../../harness/prompts/10-requirements.md) OSS 阶段 C 节。
60
+ > **回填**:[`docs/harness/FRAGMENT_rethink_backfill_task_v1_zh.md`](../harness/FRAGMENT_rethink_backfill_task_v1_zh.md) — Agent **必须**写回 §4,禁止仅聊天输出。
61
+
62
+ ### 思考轮控制(Agent 填 · 22 审)
63
+
64
+ | 字段 | 值 |
65
+ |------|-----|
66
+ | **actual_last_round** | `R5` / `R3` / …(最后实质完成轮) |
67
+ | **early_stop** | `no` / `yes` |
68
+ | **early_stop_reason** | (`early_stop=yes` **必填**) |
69
+ | **residual_risks** | `none` 或逐条(**必填**;未增轮风险须写清) |
70
+
71
+ ### R0 · 读 task / Issue / graph_delta
72
+
73
+ **回填区:**
74
+
75
+ ```text
76
+ (待填)
77
+ ```
78
+
79
+ ### R1 · 代码事实
80
+
81
+ **回填区:**
82
+
83
+ ```text
84
+ (待填)
85
+ ```
86
+
87
+ ### R2 · 方案对比
88
+
89
+ **回填区:**
90
+
91
+ ```text
92
+ (待填)
93
+ ```
94
+
95
+ ### R3 · 边界 / 测试
96
+
97
+ **回填区:**
98
+
99
+ ```text
100
+ (待填)
101
+ ```
102
+
103
+ ### R4 · 测试与 PR 策略
104
+
105
+ **回填区:**
106
+
107
+ ```text
108
+ (待填)
109
+ ```
110
+
111
+ ### R5 · 图谱增量 + 关账判断
112
+
113
+ **回填区:**
114
+
115
+ ```text
116
+ (待填)
117
+ ```
118
+
119
+ ### R6+ · 扩展轮(仅当 Agent 增轮时追加)
120
+
121
+ **扩展理由:**
122
+
123
+ ```text
124
+ (无则删除本节)
125
+ ```
126
+
127
+ **回填区:**
128
+
129
+ ```text
130
+ (待填)
131
+ ```
132
+
133
+ ---
134
+
135
+ ## 5. 验收标准
136
+
137
+ - [ ] §4 思考轮闭合 · **思考轮控制** 已填 · 22 思考审查通过
138
+ - [ ] `HG-AUDIT-R1` → `approved`
139
+ - [ ] 测试 / lint 通过
140
+ - [ ] 上游 PR · `Fixes #<issue>`
141
+ - [ ] invoke 落盘
142
+ - [ ] **图谱**(触模块时必勾):30 前 skeleton · 关账 partial + `02_version`
143
+
144
+ ---
145
+
146
+ ## 6. 验证命令
147
+
148
+ ```bash
149
+ cd <worktree_root>
150
+ git checkout main && git fetch upstream && git reset --hard upstream/main
151
+ git checkout -b feature/fix-<issue>-<short>
152
+ # 项目测试命令
153
+ git diff upstream/main --name-only
154
+ ```
155
+
156
+ ---
157
+
158
+ ## 实现备忘(30 后回填)
159
+
160
+ | 项 | 状态 |
161
+ |----|------|
162
+ | 图谱 | ⏳ |
163
+ | 测试 | ⏳ |
164
+ | 上游 PR | ⏳ |
@@ -0,0 +1,53 @@
1
+ # Task:图谱 bootstrap · __REPO_SLUG__ fork(阶段 B)
2
+
3
+ > **状态**:in_progress
4
+ > **关联图谱**:`docs/_tech_graph/00_main.md` · `01_struct.md`
5
+ > **试点 POINTER**:[`docs/harness/POINTER_PILOT_adoption_workspace_v1_zh.md`](../../harness/POINTER_PILOT_adoption_workspace_v1_zh.md)
6
+
7
+ ---
8
+
9
+ ## Harness 元信息
10
+
11
+ | 字段 | 值 |
12
+ |------|-----|
13
+ | **test_strategy** | `not_applicable` |
14
+ | **test_strategy_note** | bootstrap 无业务 30;文档与人签关账 |
15
+ | **orchestration** | Cursor Task 链 |
16
+ | **audit_profile** | `human_only` |
17
+
18
+ ### 人工闸
19
+
20
+ | human_gate_id | status | blocks_hats | 说明 |
21
+ |---------------|--------|-------------|------|
22
+ | HG-TASK-DRAFT | pending | 22-R1 | task 初稿人扫 |
23
+ | HG-GRAPH-MODULES | pending | **30** | `01_struct` 模块表维护者人签 |
24
+
25
+ ---
26
+
27
+ ## 背景与目标
28
+
29
+ 个人 fork 上建立图谱最低交付:模块表 + 顶层图 + 待补 flow 清单(**不**一次画完全仓 flow)。
30
+
31
+ ---
32
+
33
+ ## 范围
34
+
35
+ - [ ] `docs/_tech_graph/` 模板落盘
36
+ - [ ] `01_struct` 一级模块表(对照仓内 `AGENTS.md` 或 README)
37
+ - [ ] `00_main` 待补 flow 清单
38
+ - [ ] 维护者签 `HG-GRAPH-MODULES` → `approved`
39
+
40
+ ## 非范围
41
+
42
+ - 向上游 PR harness / 图谱过程文件
43
+ - 本 task 内 30 改产品代码
44
+
45
+ ---
46
+
47
+ ## 分步图谱
48
+
49
+ | 子步 | 阶段 |
50
+ |------|------|
51
+ | B1 模块表 + 00_main 清单 | **阶段 B(本 task)** |
52
+ | B2 单条 flow 骨架 | B 可选 |
53
+ | flow 终稿 | **阶段 C** 业务 task 增量 |
@@ -0,0 +1,218 @@
1
+ #!/usr/bin/env bash
2
+ # cyning-harness · 清空已接入纪律层(便于删除后重新 install / upgrade)
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
+ CYNING_HARNESS="${CYNING_HARNESS:-$HARNESS_ROOT}"
10
+
11
+ TARGET=""
12
+ ASSUME_YES=0
13
+ WITH_CI=0
14
+ WITH_INSTALL_ARTIFACTS=0
15
+ DRY_RUN=0
16
+
17
+ usage() {
18
+ cat <<'EOF'
19
+ 用法(推荐在 cyning-harness 产品包目录执行):
20
+
21
+ cd /path/to/cyning-harness
22
+ ./wizard/uninstall.sh
23
+
24
+ 非交互:
25
+
26
+ ./wizard/uninstall.sh --target /path/to/project --yes
27
+ ./wizard/uninstall.sh --target /path/to/project --yes --with-ci --with-install-artifacts
28
+
29
+ 选项:
30
+ --target PATH 业务仓根(交互时可省略)
31
+ --yes 预览后不再确认,直接清空
32
+ --with-ci 额外删除与产品样例一致的 CI workflow(install preset 写入的)
33
+ --with-install-artifacts 额外删除 install 时写入的图谱/wiki/standards 模板副本
34
+ --dry-run 仅预览,不删除
35
+ -h, --help 显示本帮助
36
+
37
+ 默认保留(不删):
38
+ docs/tasks/ · docs/harness/reviews/ · docs/harness/invokes/by-task/
39
+ docs/harness/FRAGMENT* · 业务自定义图谱正文
40
+
41
+ 清空后重新安装:
42
+ ./wizard/install.sh --target <业务仓> --preset harness-only --ide cursor,claude,agents
43
+ 或 ./wizard/upgrade.sh --target <业务仓>
44
+ EOF
45
+ }
46
+
47
+ while [[ $# -gt 0 ]]; do
48
+ case "$1" in
49
+ --target) TARGET="$2"; shift 2 ;;
50
+ --yes) ASSUME_YES=1; shift ;;
51
+ --with-ci) WITH_CI=1; shift ;;
52
+ --with-install-artifacts) WITH_INSTALL_ARTIFACTS=1; shift ;;
53
+ --dry-run) DRY_RUN=1; shift ;;
54
+ -h|--help) usage; exit 0 ;;
55
+ *) echo "未知参数: $1" >&2; usage; exit 1 ;;
56
+ esac
57
+ done
58
+
59
+ echo "=== cyning-harness 清空向导 ==="
60
+ echo "产品包: $HARNESS_ROOT"
61
+ echo ""
62
+
63
+ if [[ -z "$TARGET" ]]; then
64
+ echo "请输入要清空 Harness 纪律层的业务仓路径"
65
+ read -r -p "业务仓路径: " TARGET_INPUT
66
+ [[ -n "$TARGET_INPUT" ]] || { echo "未输入路径,已取消。" >&2; exit 1; }
67
+ TARGET="$TARGET_INPUT"
68
+ fi
69
+
70
+ [[ -d "$TARGET" ]] || { echo "错误: 目录不存在: $TARGET" >&2; exit 1; }
71
+ TARGET="$(abs_path "$TARGET")"
72
+ refuse_if_product_root "$TARGET" "$HARNESS_ROOT"
73
+
74
+ PROFILE_FILE="$TARGET/.cyning-harness/profile.json"
75
+ if [[ ! -f "$PROFILE_FILE" ]]; then
76
+ echo "未找到 $PROFILE_FILE — 该仓似乎未接入 Harness,无需清空。" >&2
77
+ exit 0
78
+ fi
79
+
80
+ PRESET_NAME="$(profile_preset_name "$PROFILE_FILE")"
81
+ echo "目标仓: $TARGET"
82
+ echo "preset: $PRESET_NAME"
83
+ echo ""
84
+
85
+ PLAN_LINES=()
86
+
87
+ plan_remove_file() {
88
+ local path="$1" note="${2:-}"
89
+ if [[ -f "$path" ]]; then
90
+ PLAN_LINES+=("rm|$path|$note")
91
+ fi
92
+ }
93
+
94
+ plan_remove_marker() {
95
+ local path="$1" note="${2:-}"
96
+ if [[ -f "$path" ]] && grep -qF "$MARKER_BEGIN" "$path"; then
97
+ PLAN_LINES+=("marker|$path|$note")
98
+ fi
99
+ }
100
+
101
+ # harness-sync 同步项
102
+ if profile_track_enabled "$PROFILE_FILE" harness_prompts false; then
103
+ for f in "$CYNING_HARNESS/harness/prompts/"*.md; do
104
+ [[ -f "$f" ]] || continue
105
+ plan_remove_file "$TARGET/docs/harness/prompts/$(basename "$f")" "harness prompts"
106
+ done
107
+ fi
108
+
109
+ if profile_track_enabled "$PROFILE_FILE" harness_invoke_template false; then
110
+ plan_remove_file "$TARGET/docs/harness/invokes/TEMPLATE_invoke.md" "invoke 模板"
111
+ fi
112
+
113
+ if profile_track_enabled "$PROFILE_FILE" ide_cursor true; then
114
+ plan_remove_file "$TARGET/$(profile_ide_cursor_rel "$PROFILE_FILE")" "Cursor 规则"
115
+ fi
116
+
117
+ if profile_track_enabled "$PROFILE_FILE" ide_claude false; then
118
+ plan_remove_marker "$TARGET/CLAUDE.md" "Claude IDE marker"
119
+ fi
120
+
121
+ if profile_track_enabled "$PROFILE_FILE" ide_agents false; then
122
+ plan_remove_marker "$TARGET/AGENTS.md" "Agents IDE marker"
123
+ fi
124
+
125
+ # install 可选轨(须显式 flag)
126
+ if [[ "$WITH_INSTALL_ARTIFACTS" -eq 1 ]]; then
127
+ if profile_json_bool "$PROFILE_FILE" graph || grep -q '"graph"[[:space:]]*:[[:space:]]*true' "$PROFILE_FILE"; then
128
+ for f in "$CYNING_HARNESS/graph/templates/"*; do
129
+ [[ -f "$f" ]] || continue
130
+ plan_remove_file "$TARGET/docs/_tech_graph/$(basename "$f")" "graph 模板"
131
+ done
132
+ fi
133
+ if profile_json_bool "$PROFILE_FILE" wiki || grep -q '"wiki"[[:space:]]*:[[:space:]]*true' "$PROFILE_FILE"; then
134
+ for f in "$CYNING_HARNESS/coding_wiki/templates/"*; do
135
+ [[ -f "$f" ]] || continue
136
+ plan_remove_file "$TARGET/docs/coding_wiki/$(basename "$f")" "wiki 模板"
137
+ done
138
+ fi
139
+ for f in "$CYNING_HARNESS/standards/"TEMPLATE_CODING_BASELINE_L1*.md; do
140
+ [[ -f "$f" ]] || continue
141
+ plan_remove_file "$TARGET/docs/standards/$(basename "$f")" "standards L1"
142
+ done
143
+ for f in "$CYNING_HARNESS/standards/"TEMPLATE_CODING_BASELINE_L2*.md; do
144
+ [[ -f "$f" ]] || continue
145
+ plan_remove_file "$TARGET/docs/standards/$(basename "$f")" "standards L2"
146
+ done
147
+ for f in "$CYNING_HARNESS/standards/"TEMPLATE_SOURCES*.md; do
148
+ [[ -f "$f" ]] || continue
149
+ plan_remove_file "$TARGET/docs/standards/$(basename "$f")" "standards sources"
150
+ done
151
+ plan_remove_file "$TARGET/docs/tasks/active/task_graph_bootstrap.md" "bootstrap task"
152
+ fi
153
+
154
+ if [[ "$WITH_CI" -eq 1 ]]; then
155
+ plan_remove_file "$TARGET/.github/workflows/quality.yml" "CI quality(若存在)"
156
+ plan_remove_file "$TARGET/.github/workflows/pytest.yml" "CI pytest(若存在)"
157
+ fi
158
+
159
+ # profile 元数据(最后删)
160
+ PLAN_LINES+=("rm_dir|$TARGET/.cyning-harness|接入配置")
161
+
162
+ if [[ ${#PLAN_LINES[@]} -eq 0 ]]; then
163
+ echo "无待清空项。" >&2
164
+ exit 0
165
+ fi
166
+
167
+ echo ">>> 将清空以下项(业务 task / reviews / by-task invoke 默认保留)"
168
+ echo ""
169
+ for line in "${PLAN_LINES[@]}"; do
170
+ IFS='|' read -r kind path note <<<"$line"
171
+ case "$kind" in
172
+ rm) echo " [删除文件 · $note] $path" ;;
173
+ marker) echo " [剥离 marker · $note] $path" ;;
174
+ rm_dir) echo " [删除目录 · $note] $path" ;;
175
+ esac
176
+ done
177
+ echo ""
178
+
179
+ if [[ "$DRY_RUN" -eq 1 ]]; then
180
+ echo "dry-run:未执行删除。"
181
+ exit 0
182
+ fi
183
+
184
+ DO_UNINSTALL=0
185
+ if [[ "$ASSUME_YES" -eq 1 ]]; then
186
+ DO_UNINSTALL=1
187
+ elif prompt_yes_no "确认清空以上 Harness 纪律层?" "n"; then
188
+ DO_UNINSTALL=1
189
+ fi
190
+
191
+ if [[ "$DO_UNINSTALL" -eq 0 ]]; then
192
+ echo "已取消。"
193
+ exit 0
194
+ fi
195
+
196
+ echo ""
197
+ echo ">>> 执行清空"
198
+ for line in "${PLAN_LINES[@]}"; do
199
+ IFS='|' read -r kind path note <<<"$line"
200
+ case "$kind" in
201
+ rm)
202
+ rm -f "$path"
203
+ echo " 已删除: $path"
204
+ ;;
205
+ marker)
206
+ remove_harness_marker_file "$path"
207
+ ;;
208
+ rm_dir)
209
+ rm -rf "$path"
210
+ echo " 已删除目录: $path"
211
+ ;;
212
+ esac
213
+ done
214
+
215
+ echo ""
216
+ echo "清空完成。"
217
+ echo "重新安装: $SCRIPT_DIR/install.sh --target $TARGET --preset $PRESET_NAME"
218
+ echo "或升级向导: $SCRIPT_DIR/upgrade.sh --target $TARGET"
@@ -0,0 +1,164 @@
1
+ #!/usr/bin/env bash
2
+ # cyning-harness · 交互式升级向导(在产品包目录运行,引导输入业务仓路径)
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
+ # shellcheck source=lib/manifest.sh
9
+ source "$SCRIPT_DIR/lib/manifest.sh"
10
+ HARNESS_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
11
+ CYNING_HARNESS="${CYNING_HARNESS:-$HARNESS_ROOT}"
12
+
13
+ TARGET=""
14
+ IDE_LIST=""
15
+ ASSUME_YES=0
16
+ RUN_GATE=0
17
+ SYNC_FORCE=0
18
+
19
+ usage() {
20
+ cat <<'EOF'
21
+ 用法(推荐在 cyning-harness 产品包根目录执行):
22
+
23
+ cd /path/to/cyning-harness
24
+ ./wizard/upgrade.sh
25
+
26
+ 非交互(脚本 / CI):
27
+
28
+ ./wizard/upgrade.sh --target /path/to/project
29
+ ./wizard/upgrade.sh --target /path/to/project --ide cursor,claude,agents --yes
30
+ ./wizard/upgrade.sh --target /path/to/project --yes --gate-check
31
+ ./wizard/upgrade.sh --target /path/to/project --yes --force # 跳过 S5 git-clean
32
+
33
+ 选项:
34
+ --target PATH 业务仓根(交互模式下可省略,运行时会提示输入)
35
+ --ide LIST 更新 IDE 勾选:cursor,claude,agents
36
+ --yes 预览 plan 后不再确认,直接 apply
37
+ --force sync apply 跳过 S5 git-clean 检查
38
+ --gate-check 同步后运行 gate-check.sh
39
+ -h, --help 显示本帮助
40
+ EOF
41
+ }
42
+
43
+ while [[ $# -gt 0 ]]; do
44
+ case "$1" in
45
+ --target) TARGET="$2"; shift 2 ;;
46
+ --ide) IDE_LIST="$2"; shift 2 ;;
47
+ --yes) ASSUME_YES=1; shift ;;
48
+ --force) SYNC_FORCE=1; shift ;;
49
+ --gate-check) RUN_GATE=1; shift ;;
50
+ -h|--help) usage; exit 0 ;;
51
+ *) echo "未知参数: $1" >&2; usage; exit 1 ;;
52
+ esac
53
+ done
54
+
55
+ VERSION="${HARNESS_VERSION:-$(git -C "$HARNESS_ROOT" describe --tags --always 2>/dev/null || echo unknown)}"
56
+
57
+ echo "=== cyning-harness 升级向导 ==="
58
+ echo "产品包: $HARNESS_ROOT"
59
+ echo "版本: $VERSION"
60
+ echo ""
61
+
62
+ if [[ -z "$TARGET" ]]; then
63
+ echo "请输入已接入 Harness 的业务仓路径(绝对路径,例: /Users/you/Projects/kimi-code-meta)"
64
+ read -r -p "业务仓路径: " TARGET_INPUT
65
+ [[ -n "$TARGET_INPUT" ]] || { echo "未输入路径,已取消。" >&2; exit 1; }
66
+ TARGET="$TARGET_INPUT"
67
+ fi
68
+
69
+ [[ -d "$TARGET" ]] || { echo "错误: 目录不存在: $TARGET" >&2; exit 1; }
70
+ TARGET="$(abs_path "$TARGET")"
71
+ refuse_if_product_root "$TARGET" "$HARNESS_ROOT"
72
+
73
+ PROFILE_FILE="$TARGET/.cyning-harness/profile.json"
74
+
75
+ if [[ ! -f "$PROFILE_FILE" ]]; then
76
+ echo ""
77
+ echo "未找到 $PROFILE_FILE — 该仓似乎尚未接入 Harness。"
78
+ if prompt_yes_no "是否改为首次安装(install.sh)?" "y"; then
79
+ PRESET="harness-only"
80
+ if [[ -z "$IDE_LIST" ]]; then
81
+ print_preset_menu
82
+ read -r -p "preset [1]: " PRESET_INPUT
83
+ PRESET="$(resolve_preset_choice "$PRESET_INPUT" "$SCRIPT_DIR/profiles")"
84
+ print_ide_menu
85
+ read -r -p "IDE [1]: " IDE_INPUT
86
+ IDE_LIST="$(resolve_ide_choice "${IDE_INPUT:-1}")"
87
+ fi
88
+ INSTALL_ARGS=(--target "$TARGET" --preset "$PRESET")
89
+ [[ -n "$IDE_LIST" ]] && INSTALL_ARGS+=(--ide "$IDE_LIST")
90
+ echo ""
91
+ echo ">>> install.sh ${INSTALL_ARGS[*]}"
92
+ "$SCRIPT_DIR/install.sh" "${INSTALL_ARGS[@]}"
93
+ exit 0
94
+ fi
95
+ echo "已取消。请先: $SCRIPT_DIR/install.sh --target $TARGET --preset harness-only" >&2
96
+ exit 1
97
+ fi
98
+
99
+ echo "目标仓: $TARGET"
100
+ echo "preset: $(profile_preset_name "$PROFILE_FILE")"
101
+ echo "当前 IDE: $(profile_ide_summary "$PROFILE_FILE")"
102
+ echo ""
103
+
104
+ # 始终刷新 local.json,避免路径漂移(如 Desktop → Projects)
105
+ printf '%s\n' "{\"cyning_harness_root\":\"$CYNING_HARNESS\"}" > "$TARGET/.cyning-harness/local.json"
106
+ echo "已更新 local.json → cyning_harness_root=$CYNING_HARNESS"
107
+ echo ""
108
+
109
+ if [[ -z "$IDE_LIST" ]] && [[ "$ASSUME_YES" -eq 0 ]]; then
110
+ if prompt_yes_no "是否更新 IDE 勾选(cursor / claude / agents)?" "n"; then
111
+ read -r -p "IDE 列表 [$(profile_ide_summary "$PROFILE_FILE")]: " IDE_INPUT
112
+ [[ -n "$IDE_INPUT" ]] && IDE_LIST="$IDE_INPUT"
113
+ fi
114
+ fi
115
+
116
+ if [[ -n "$IDE_LIST" ]]; then
117
+ patch_profile_ide "$PROFILE_FILE" "$IDE_LIST"
118
+ echo "已更新 IDE 勾选: $IDE_LIST"
119
+ echo ""
120
+ fi
121
+
122
+ export CYNING_HARNESS TARGET
123
+ [[ "$SYNC_FORCE" -eq 1 ]] && export HARNESS_SYNC_FORCE=1
124
+
125
+ echo ">>> 预览同步计划(plan)"
126
+ echo ""
127
+ "$SCRIPT_DIR/harness-sync.sh" plan --target "$TARGET"
128
+ echo ""
129
+
130
+ DO_APPLY=0
131
+ if [[ "$ASSUME_YES" -eq 1 ]]; then
132
+ DO_APPLY=1
133
+ elif prompt_yes_no "确认执行同步(apply)?" "y"; then
134
+ DO_APPLY=1
135
+ fi
136
+
137
+ if [[ "$DO_APPLY" -eq 1 ]]; then
138
+ echo ""
139
+ echo ">>> 执行同步(apply)"
140
+ SYNC_ARGS=(apply --target "$TARGET")
141
+ [[ "$SYNC_FORCE" -eq 1 ]] && SYNC_ARGS+=(--force)
142
+ "$SCRIPT_DIR/harness-sync.sh" "${SYNC_ARGS[@]}"
143
+ write_manifest_upgrade "$TARGET" "$VERSION"
144
+ echo ""
145
+ echo "升级完成。"
146
+ else
147
+ echo "已取消 apply(仅预览)。"
148
+ exit 0
149
+ fi
150
+
151
+ if [[ "$RUN_GATE" -eq 1 ]]; then
152
+ echo ""
153
+ echo ">>> gate-check"
154
+ "$SCRIPT_DIR/gate-check.sh" --target "$TARGET"
155
+ elif [[ "$ASSUME_YES" -eq 0 ]] && prompt_yes_no "是否运行 gate-check(30 前人工闸)?" "n"; then
156
+ echo ""
157
+ echo ">>> gate-check"
158
+ "$SCRIPT_DIR/gate-check.sh" --target "$TARGET"
159
+ fi
160
+
161
+ echo ""
162
+ echo "日后可运行: npx @cyning/harness upgrade --target $TARGET"
163
+ echo "或维护者: $SCRIPT_DIR/upgrade.sh --target $TARGET"
164
+ echo "清空重装: $SCRIPT_DIR/uninstall.sh --target $TARGET"