@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
|
@@ -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"
|