@namewta/speculo 0.7.3 → 0.7.4
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/dist/src/migrations.js +190 -39
- package/dist/src/migrations.js.map +1 -1
- package/package.json +1 -1
- package/template/canonical/canonical-specdev-engineering-cognitive-mentor.md +51 -15
- package/template/canonical/canonical-specdev-goal-plan.md +183 -116
- package/template/canonical/canonical-specdev-grill-with-docs.md +51 -15
- package/template/canonical/canonical-specdev-spec.md +61 -21
- package/template/canonical/canonical-specdev-tickets.md +83 -43
- package/template/canonical/canonical-specdev-wayfinder.md +51 -15
- package/template/skills/migrate-runtime-state/references/migration-contract.md +3 -3
- package/template/skills/migrate-runtime-state/scripts/migrate-runtime-state.mjs +94 -12
- package/template/workflows/specdev/I-implement/I-implement.md +27 -26
- package/template/workflows/specdev/I-implement/evidence-template.md +18 -12
- package/template/workflows/specdev/I-implement/execution-preflight.md +11 -9
- package/template/workflows/specdev/I-init-setup/I-init-setup.md +2 -2
- package/template/workflows/specdev/I-init-setup/change-status-template.json +3 -3
- package/template/workflows/specdev/I-init-setup/config-template.json +5 -2
- package/template/workflows/specdev/INDEX.md +6 -6
- package/template/workflows/specdev/P-goal-plan/P-goal-plan.md +16 -16
- package/template/workflows/specdev/P-goal-plan/completion-control.md +8 -8
- package/template/workflows/specdev/P-goal-plan/goal-plan-template.md +20 -14
- package/template/workflows/specdev/P-goal-plan/lead-orchestration.md +5 -5
- package/template/workflows/specdev/P-goal-plan/orchestration-protocol.md +13 -13
- package/template/workflows/specdev/P-goal-plan/planning-modes.md +27 -15
- package/template/workflows/specdev/P-prototype/ui-prototype.md +1 -1
- package/template/workflows/specdev/T-tickets/T-tickets.md +4 -4
- package/template/workflows/specdev/T-tickets/ticket-readiness.md +3 -3
- package/template/workflows/specdev/T-tickets/ticket-template.md +6 -6
- package/template/workflows/specdev/T-tickets/tickets-map-template.md +2 -2
- package/template/workflows/specdev/common/README.md +1 -1
- package/template/workflows/specdev/common/rules/change-completion.md +2 -2
- package/template/workflows/specdev/common/rules/evidence-and-verification.md +10 -6
- package/template/workflows/specdev/common/rules/path-ownership.md +4 -4
- package/template/workflows/specdev/common/schemas/change-status.schema.json +31 -4
- package/template/workflows/specdev/common/schemas/config.schema.json +12 -6
- package/template/workflows/specdev/common/schemas/goal-plan.schema.json +15 -6
- package/template/workflows/specdev/common/skills/dev-worktree/SKILL.md +3 -3
- package/template/workflows/specdev/common/skills/dev-worktree/references/finalize.md +1 -1
- package/template/workflows/specdev/common/skills/subagent-delivery/SKILL.md +4 -4
- package/template/workflows/specdev/common/skills/subagent-delivery/references/external-web-subagent.md +1 -1
- package/template/workflows/specdev/common/skills/subagent-delivery/references/native-subagent.md +4 -4
- package/template/workflows/specdev/common/tools/README.md +2 -1
- package/template/workflows/specdev/common/tools/validate-specdev.mjs +261 -66
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
-
"$id": "urn:speculo:specdev:change-status:
|
|
3
|
+
"$id": "urn:speculo:specdev:change-status:v6",
|
|
4
4
|
"title": "SpecDev Change Status",
|
|
5
5
|
"type": "object",
|
|
6
6
|
"required": [
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"completed_at", "archived", "archive_path", "blockers", "deviations", "worktrees"
|
|
10
10
|
],
|
|
11
11
|
"properties": {
|
|
12
|
-
"schema_version": {"const":
|
|
12
|
+
"schema_version": {"const": 6},
|
|
13
13
|
"artifact": {"const": "change-status"},
|
|
14
14
|
"change": {"type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}-[a-z0-9]+(?:-[a-z0-9]+)*$"},
|
|
15
15
|
"change_status": {"enum": ["active", "blocked", "completed", "archived"]},
|
|
@@ -113,12 +113,39 @@
|
|
|
113
113
|
"base_sha": {"type": "string", "minLength": 1},
|
|
114
114
|
"parent_branch": {"type": "string", "minLength": 1},
|
|
115
115
|
"branch": {"type": "string", "minLength": 1},
|
|
116
|
-
"workspace_ref": {"type": "string", "pattern": "^specdev-worktree/[0-9]{4}-[0-9]{2}-[0-9]{2}-[a-z0-9]+(?:-[a-z0-9]+)*/T-[0-9]{2,}$"},
|
|
116
|
+
"workspace_ref": {"type": "string", "pattern": "^(?:current|specdev-worktree/[0-9]{4}-[0-9]{2}-[0-9]{2}-[a-z0-9]+(?:-[a-z0-9]+)*/T-[0-9]{2,})$"},
|
|
117
117
|
"source_checkpoint": {"type": ["string", "null"]},
|
|
118
118
|
"integration": {"$ref": "#/$defs/integration"},
|
|
119
119
|
"status": {"enum": ["planned", "active", "review", "integrating", "integrated", "removed", "blocked"]},
|
|
120
120
|
"updated_at": {"type": "string", "minLength": 1}
|
|
121
121
|
},
|
|
122
|
+
"allOf": [
|
|
123
|
+
{
|
|
124
|
+
"if": {"properties": {"workspace_ref": {"const": "current"}}, "required": ["workspace_ref"]},
|
|
125
|
+
"then": {
|
|
126
|
+
"properties": {
|
|
127
|
+
"integration": {
|
|
128
|
+
"allOf": [{
|
|
129
|
+
"properties": {
|
|
130
|
+
"candidate_sha": {"const": null},
|
|
131
|
+
"candidate_tree_sha": {"const": null},
|
|
132
|
+
"candidate_branch": {"const": null},
|
|
133
|
+
"candidate_workspace_ref": {"const": null},
|
|
134
|
+
"method": {"enum": [null, "direct-parent"]}
|
|
135
|
+
}
|
|
136
|
+
}]
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
"else": {
|
|
141
|
+
"properties": {
|
|
142
|
+
"integration": {
|
|
143
|
+
"allOf": [{"properties": {"method": {"enum": [null, "fast-forward", "merge-commit"]}}}]
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
],
|
|
122
149
|
"additionalProperties": false
|
|
123
150
|
},
|
|
124
151
|
"integration": {
|
|
@@ -134,7 +161,7 @@
|
|
|
134
161
|
"candidate_branch": {"type": ["string", "null"]},
|
|
135
162
|
"candidate_workspace_ref": {"anyOf": [{"type": "null"}, {"type": "string", "pattern": "^specdev-worktree/\\.integration/[0-9]{4}-[0-9]{2}-[0-9]{2}-[a-z0-9]+(?:-[a-z0-9]+)*/T-[0-9]{2,}$"}]},
|
|
136
163
|
"result_sha": {"type": ["string", "null"]},
|
|
137
|
-
"method": {"enum": [null, "fast-forward", "merge-commit"]},
|
|
164
|
+
"method": {"enum": [null, "direct-parent", "fast-forward", "merge-commit"]},
|
|
138
165
|
"conflict_paths": {"type": "array", "items": {"type": "string"}},
|
|
139
166
|
"verification": {"enum": ["pending", "passed", "failed"]},
|
|
140
167
|
"full_suite": {"$ref": "#/$defs/full-suite"},
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
-
"$id": "urn:speculo:specdev:config:
|
|
3
|
+
"$id": "urn:speculo:specdev:config:v5",
|
|
4
4
|
"title": "SpecDev Configuration",
|
|
5
5
|
"type": "object",
|
|
6
6
|
"required": ["schema_version", "interaction_language", "artifact_language", "git", "execution", "verification", "planning"],
|
|
7
7
|
"properties": {
|
|
8
|
-
"schema_version": {"const":
|
|
8
|
+
"schema_version": {"const": 5},
|
|
9
9
|
"interaction_language": {"type": "string", "minLength": 1},
|
|
10
10
|
"artifact_language": {"type": "string", "minLength": 1},
|
|
11
11
|
"git": {
|
|
@@ -18,9 +18,10 @@
|
|
|
18
18
|
},
|
|
19
19
|
"execution": {
|
|
20
20
|
"type": "object",
|
|
21
|
-
"required": ["max_implementation_agents", "deep_ticket_human_approval", "shared_path_owner"],
|
|
21
|
+
"required": ["max_implementation_agents", "max_integration_attempts", "deep_ticket_human_approval", "shared_path_owner"],
|
|
22
22
|
"properties": {
|
|
23
|
-
"max_implementation_agents": {"type": "integer", "minimum": 1
|
|
23
|
+
"max_implementation_agents": {"type": "integer", "minimum": 1},
|
|
24
|
+
"max_integration_attempts": {"type": "integer", "minimum": 1},
|
|
24
25
|
"deep_ticket_human_approval": {"type": "boolean"},
|
|
25
26
|
"shared_path_owner": {"type": "string", "minLength": 1}
|
|
26
27
|
},
|
|
@@ -39,14 +40,19 @@
|
|
|
39
40
|
},
|
|
40
41
|
"planning": {
|
|
41
42
|
"type": "object",
|
|
42
|
-
"required": ["default_depth", "require_ready_gate", "require_evidence"],
|
|
43
|
+
"required": ["default_depth", "require_ready_gate", "require_evidence", "ui_prototype_default_variants", "ui_prototype_max_variants"],
|
|
43
44
|
"properties": {
|
|
44
45
|
"default_depth": {"enum": ["lite", "standard", "deep"]},
|
|
45
46
|
"require_ready_gate": {"type": "boolean"},
|
|
46
|
-
"require_evidence": {"type": "boolean"}
|
|
47
|
+
"require_evidence": {"type": "boolean"},
|
|
48
|
+
"ui_prototype_default_variants": {"type": "integer", "minimum": 1},
|
|
49
|
+
"ui_prototype_max_variants": {"type": "integer", "minimum": 1}
|
|
47
50
|
},
|
|
48
51
|
"additionalProperties": true
|
|
49
52
|
}
|
|
50
53
|
},
|
|
54
|
+
"allOf": [{
|
|
55
|
+
"$comment": "ui_prototype_default_variants <= ui_prototype_max_variants is enforced by validate-specdev.mjs because JSON Schema cannot compare sibling numeric values."
|
|
56
|
+
}],
|
|
51
57
|
"additionalProperties": false
|
|
52
58
|
}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
-
"$id": "urn:speculo:specdev:goal-plan:
|
|
3
|
+
"$id": "urn:speculo:specdev:goal-plan:v6",
|
|
4
4
|
"title": "SpecDev Goal Plan Frontmatter",
|
|
5
5
|
"type": "object",
|
|
6
6
|
"required": [
|
|
7
7
|
"schema_version", "artifact", "change", "status", "modes", "orchestration",
|
|
8
|
-
"lead", "implementation_agent_limit", "ticket_workspace_policy", "integration_gate",
|
|
8
|
+
"lead", "implementation_agent_limit", "integration_attempt_limit", "ticket_workspace_policy", "integration_gate",
|
|
9
9
|
"ready_for_execution"
|
|
10
10
|
],
|
|
11
11
|
"properties": {
|
|
12
|
-
"schema_version": {"const":
|
|
12
|
+
"schema_version": {"const": 6},
|
|
13
13
|
"artifact": {"const": "goal-plan"},
|
|
14
14
|
"change": {"type": "string", "minLength": 1},
|
|
15
15
|
"status": {"enum": ["draft", "ready", "in_progress", "completed", "blocked"]},
|
|
@@ -20,12 +20,21 @@
|
|
|
20
20
|
},
|
|
21
21
|
"orchestration": {"const": "lead-directed"},
|
|
22
22
|
"lead": {"type": "string", "minLength": 1},
|
|
23
|
-
"implementation_agent_limit": {"type": "integer", "minimum": 1
|
|
24
|
-
"
|
|
25
|
-
"
|
|
23
|
+
"implementation_agent_limit": {"type": "integer", "minimum": 1},
|
|
24
|
+
"integration_attempt_limit": {"type": "integer", "minimum": 1},
|
|
25
|
+
"ticket_workspace_policy": {"enum": ["current", "required"]},
|
|
26
|
+
"integration_gate": {"enum": ["direct-parent", "candidate-merge"]},
|
|
26
27
|
"ready_for_execution": {"type": "boolean"}
|
|
27
28
|
},
|
|
28
29
|
"allOf": [
|
|
30
|
+
{
|
|
31
|
+
"if": {"properties": {"ticket_workspace_policy": {"const": "current"}}, "required": ["ticket_workspace_policy"]},
|
|
32
|
+
"then": {"properties": {"integration_gate": {"const": "direct-parent"}}}
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"if": {"properties": {"ticket_workspace_policy": {"const": "required"}}, "required": ["ticket_workspace_policy"]},
|
|
36
|
+
"then": {"properties": {"integration_gate": {"const": "candidate-merge"}}}
|
|
37
|
+
},
|
|
29
38
|
{
|
|
30
39
|
"if": {"properties": {"status": {"enum": ["draft", "blocked", "completed"]}}, "required": ["status"]},
|
|
31
40
|
"then": {"properties": {"ready_for_execution": {"const": false}}}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: dev-worktree
|
|
3
|
-
description: 管理 SpecDev Ticket 或原型的 Git worktree;为 Ticket 创建隔离来源 workspace、固定实现 commit,并由 Lead 在 parent-candidate checkout 验证后推进父分支。
|
|
3
|
+
description: 管理 SpecDev required Ticket 或原型的 Git worktree;为 required Ticket 创建隔离来源 workspace、固定实现 commit,并由 Lead 在 parent-candidate checkout 验证后推进父分支。
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Dev Worktree
|
|
7
7
|
|
|
8
|
-
本 Skill 由 T-tickets/P-goal-plan/I-implement 和 P-prototype 复用。`purpose=ticket`
|
|
8
|
+
本 Skill 由 T-tickets/P-goal-plan/I-implement 和 P-prototype 复用。`purpose=ticket` 仅在 Goal Plan 选择 `required` 时使用完整 source → candidate → parent 状态机;`current` Ticket 不调用本 Skill。`purpose=prototype` 只使用调用方批准的临时生命周期。
|
|
9
9
|
|
|
10
10
|
## 输入
|
|
11
11
|
|
|
@@ -15,7 +15,7 @@ description: 管理 SpecDev Ticket 或原型的 Git worktree;为 Ticket 创建
|
|
|
15
15
|
- workspace、implementation 和 integration owner;
|
|
16
16
|
- 允许动作、路径合同、验证合同、调用方状态记录位置。
|
|
17
17
|
|
|
18
|
-
Ticket 还必须提供 Ready Ticket、Goal Plan(若存在)、Evidence 路径、implementation commit 与本地 candidate integration/父分支更新授权。缺失时返回 blocked
|
|
18
|
+
required Ticket 还必须提供 Ready Ticket、Goal Plan(若存在)、Evidence 路径、implementation commit 与本地 candidate integration/父分支更新授权。缺失时返回 blocked;current Ticket 应按 I-implement 的 direct-parent 规则执行。
|
|
19
19
|
|
|
20
20
|
## 1. 创建或恢复
|
|
21
21
|
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
- 项目要求的 typecheck/lint/build 或其他父状态检查;
|
|
32
32
|
- 仅当 Ticket/Goal Plan `e2e.required=true` 时运行对应 E2E。
|
|
33
33
|
|
|
34
|
-
每条命令记录运行环境 `parent-candidate`、退出码与摘要。E2E required 未运行或失败时 integration `verification=failed`、`status=failed`;父分支保持 `parent_before_sha
|
|
34
|
+
每条命令记录运行环境 `parent-candidate`、退出码与摘要。E2E required 未运行或失败时 integration `verification=failed`、`status=failed`;父分支保持 `parent_before_sha`。机械修正次数不得超过 Goal Plan 快照的 `integration_attempt_limit`;不得放宽断言、删除检查或发明行为。
|
|
35
35
|
|
|
36
36
|
## 4. 推进父分支
|
|
37
37
|
|
|
@@ -15,15 +15,15 @@ description: 动态派单合同:为 Lead 生成受限的 implementation/review
|
|
|
15
15
|
- `operation=dispatch`:提供 `task_kind=implementation | review | research | test-observation`、已存在 Goal Plan(若有)、Ticket/固定审查目标、依赖 Evidence、适用合同、repository、不可变 checkpoint、项目 Agent 指令、workspace/session locator、provider、允许动作、路径边界、检查、停止条件与返回格式;
|
|
16
16
|
- `operation=accept`:提供原 Dispatch Packet、subagent 返回、当前 repository/workspace、预期与实际 checkpoint,以及 Lead 可用于独立核对的 Git/命令事实。
|
|
17
17
|
|
|
18
|
-
`operation=dispatch` 且 `task_kind=implementation`
|
|
18
|
+
`operation=dispatch` 且 `task_kind=implementation` 时,必须提供 Goal Plan 的 workspace strategy、branch、`base_sha`、writable/shared owner、implementation commit 授权与对应检查。`required` 必须提供独立 Ticket worktree 和 source-worktree 非 E2E 检查;`current` 必须提供 `workspace_ref=current`、parent branch 和 current-workspace 串行锁。缺失时返回 blocked,不推断策略或并发权限。
|
|
19
19
|
|
|
20
20
|
## 1. 固定 Lead 与任务类型
|
|
21
21
|
|
|
22
22
|
Lead 保留需求解释、DAG/Wave/Gate、shared owner、权限、SpecDev 工件、Evidence、candidate-merge、父分支和最终回复。subagent 不写 Ticket、Map、Goal Plan、Evidence、change status 或父分支。
|
|
23
23
|
|
|
24
|
-
- implementation
|
|
24
|
+
- implementation 可以在 required 模式写唯一 Ticket worktree,或在 current 模式按串行锁写当前 workspace,并在授权时创建实现 commit;
|
|
25
25
|
- review/research/test-observation 只读,返回 findings、来源或命令观察;
|
|
26
|
-
- E2E Gate 永远由 Lead 拥有,不能派给 implementation 或只读 agent;Ticket E2E 在 parent-candidate 状态执行,Direct Spec E2E 在 Lead-owned current workspace 执行。
|
|
26
|
+
- E2E Gate 永远由 Lead 拥有,不能派给 implementation 或只读 agent;required Ticket E2E 在 parent-candidate 状态执行,current Ticket 和 Direct Spec E2E 在 Lead-owned current workspace 执行。
|
|
27
27
|
|
|
28
28
|
**完成标准**:Lead、task kind、写入边界和 E2E owner 唯一。
|
|
29
29
|
|
|
@@ -44,7 +44,7 @@ Lead 保留需求解释、DAG/Wave/Gate、shared owner、权限、SpecDev 工件
|
|
|
44
44
|
- 原生 Agent:加载 `<Path>{roots.workflows}/specdev/common/skills/subagent-delivery/references/native-subagent.md</Path>`;
|
|
45
45
|
- 外部网页 Agent:加载 `<Path>{roots.workflows}/specdev/common/skills/subagent-delivery/references/external-web-subagent.md</Path>`。
|
|
46
46
|
|
|
47
|
-
implementation Packet
|
|
47
|
+
implementation Packet 必须适合一个上下文独立完成;required 模式多个 implementation subagent 由 Lead 控制在 Goal Plan、config 与平台能力共同上限内,current 模式保持单 writer 串行。只读 agent 不设置 SpecDev 数字上限,但不得争用可变环境。
|
|
48
48
|
|
|
49
49
|
**完成标准**:Packet 可独立投递;目标、checkpoint、路径、权限、检查和返回均可判定。
|
|
50
50
|
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
Packet 固定目标、范围、合同、checkpoint、路径边界、非 E2E 验证要求和停止条件。外部 provider 返回 patch/文件、修改清单、推理摘要、模拟或自报测试、未验证项和会话 locator。
|
|
12
12
|
|
|
13
|
-
Lead 在 Ticket worktree 中核对附件 hash、应用候选、检查 diff、依赖与锁文件、运行本地非 E2E 检查并创建 implementation commit。外部自报结果、截图或模拟保持 `unverified`;适用 E2E
|
|
13
|
+
Lead 在 Goal Plan 指定的 current workspace 或 Ticket worktree 中核对附件 hash、应用候选、检查 diff、依赖与锁文件、运行本地非 E2E 检查并创建 implementation commit。外部自报结果、截图或模拟保持 `unverified`;适用 E2E 由 Lead 在 current workspace 或 parent-candidate 状态运行。
|
|
14
14
|
|
|
15
15
|
## 修正与恢复
|
|
16
16
|
|
package/template/workflows/specdev/common/skills/subagent-delivery/references/native-subagent.md
CHANGED
|
@@ -4,21 +4,21 @@ Lead 可以直接创建和管理隔离 Agent 时加载。
|
|
|
4
4
|
|
|
5
5
|
## 派单
|
|
6
6
|
|
|
7
|
-
Lead 为每个 Agent 发送一个完整 Dispatch Packet。implementation Agent
|
|
7
|
+
Lead 为每个 Agent 发送一个完整 Dispatch Packet。implementation Agent 只进入 Goal Plan 指定的 current workspace 或 Ticket worktree;review/research/test-observation Agent 只读取固定输入。并行前核对 Ticket 依赖与 writable/shared path,不以“不同 Agent”代替路径隔离。
|
|
8
8
|
|
|
9
9
|
Packet 对 implementation 明确:
|
|
10
10
|
|
|
11
11
|
- Ticket、Goal Plan、依赖 Evidence 与 `base_sha`;
|
|
12
12
|
- branch、portable `workspace_ref`、writable/read-only/shared paths;
|
|
13
|
-
-
|
|
13
|
+
- 允许当前策略下的 workspace changes 与 implementation commit;
|
|
14
14
|
- 单元、组件、静态、类型、lint/build 等适用非 E2E 检查;
|
|
15
|
-
- E2E 由 Lead 在 parent-candidate 状态执行;
|
|
15
|
+
- E2E 由 Lead 在 current workspace 或 parent-candidate 状态执行;
|
|
16
16
|
- 越界、合同冲突、基线漂移和无法提交时立即停止。
|
|
17
17
|
|
|
18
18
|
## 返回
|
|
19
19
|
|
|
20
20
|
implementation Agent 返回 Ticket ID、workspace locator、最终 commit、`git status`、修改路径、命令/结果、未运行项、冲突和恢复条件,不写 SpecDev Evidence。只读 Agent 返回固定 checkpoint、findings、来源、命令观察和未验证项。
|
|
21
21
|
|
|
22
|
-
Lead 重读
|
|
22
|
+
Lead 重读 workspace、验证 commit 可达且 tip 一致、检查实际 diff 与路径合同,再决定接受、修正或 blocked。接受的 implementation 结果按 Goal Plan 进入 direct-parent 或 candidate-merge;只读结论由 Lead 写入对应权威工件。
|
|
23
23
|
|
|
24
24
|
**完成标准**:原生 Agent 的写入与返回均绑定一个 Packet;Lead 可以独立复现其事实声明。
|
|
@@ -5,10 +5,11 @@
|
|
|
5
5
|
```bash
|
|
6
6
|
node <Path>{roots.workflows}/specdev/common/tools/validate-specdev.mjs</Path> \
|
|
7
7
|
--stage <triage|diagnosis|grill|spec|tickets|goal-plan|implement|review|prototype|wayfinder|complete> \
|
|
8
|
+
--repo <project-root> \
|
|
8
9
|
<Path>{roots.state}/specdev/changes/{change}</Path>
|
|
9
10
|
```
|
|
10
11
|
|
|
11
|
-
`--stage` 只要求该阶段已经拥有的工件;所有已经存在的工件仍会验证。省略 stage 时验证当前存在的工件,不会因未来 Work
|
|
12
|
+
`--stage` 只要求该阶段已经拥有的工件;所有已经存在的工件仍会验证。省略 stage 时验证当前存在的工件,不会因未来 Work 尚未运行而报错。`--repo` 可选;提供后会把状态中的 SHA、祖先关系、当前分支和完成时 clean 状态与真实 Git 仓库交叉验证。
|
|
12
13
|
|
|
13
14
|
## 校验 SpecDev 工作流包
|
|
14
15
|
|