create-yss-spec 2.2.1 → 2.2.3
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/README.md +2 -2
- package/package.json +1 -1
- package/src/cli.js +56 -8
- package/template/.agents/skills/yss-product-lifecycle/SKILL.md +5 -5
- package/template/.agents/skills/yss-product-lifecycle/references/matt-yss-adapter.md +1 -1
- package/template/.agents/skills/yss-product-lifecycle/references/orchestration.md +3 -3
- package/template/.agents/skills/yss-product-lifecycle/references/state-model.md +3 -3
- package/template/.agents/skills/yss-router/SKILL.md +1 -1
- package/template/.agents/skills/yss-router/references/slice-implementation-contract.md +1 -0
- package/template/.claude/skills/yss-product-lifecycle/SKILL.md +5 -5
- package/template/.claude/skills/yss-product-lifecycle/references/matt-yss-adapter.md +1 -1
- package/template/.claude/skills/yss-product-lifecycle/references/orchestration.md +3 -3
- package/template/.claude/skills/yss-product-lifecycle/references/state-model.md +3 -3
- package/template/.claude/skills/yss-router/SKILL.md +1 -1
- package/template/.claude/skills/yss-router/references/slice-implementation-contract.md +1 -0
- package/template/.codex/skills/yss-product-lifecycle/SKILL.md +5 -5
- package/template/.codex/skills/yss-product-lifecycle/references/matt-yss-adapter.md +1 -1
- package/template/.codex/skills/yss-product-lifecycle/references/orchestration.md +3 -3
- package/template/.codex/skills/yss-product-lifecycle/references/state-model.md +3 -3
- package/template/.codex/skills/yss-router/SKILL.md +1 -1
- package/template/.codex/skills/yss-router/references/slice-implementation-contract.md +1 -0
- package/template/.cursor/skills/yss-product-lifecycle/SKILL.md +5 -5
- package/template/.cursor/skills/yss-product-lifecycle/references/matt-yss-adapter.md +1 -1
- package/template/.cursor/skills/yss-product-lifecycle/references/orchestration.md +3 -3
- package/template/.cursor/skills/yss-product-lifecycle/references/state-model.md +3 -3
- package/template/.cursor/skills/yss-router/SKILL.md +1 -1
- package/template/.cursor/skills/yss-router/references/slice-implementation-contract.md +1 -0
- package/template/.hermes/skills/yss-product-lifecycle/SKILL.md +5 -5
- package/template/.hermes/skills/yss-product-lifecycle/references/matt-yss-adapter.md +1 -1
- package/template/.hermes/skills/yss-product-lifecycle/references/orchestration.md +3 -3
- package/template/.hermes/skills/yss-product-lifecycle/references/state-model.md +3 -3
- package/template/.hermes/skills/yss-router/SKILL.md +1 -1
- package/template/.hermes/skills/yss-router/references/slice-implementation-contract.md +1 -0
- package/template/.pi/skills/yss-product-lifecycle/SKILL.md +5 -5
- package/template/.pi/skills/yss-product-lifecycle/references/matt-yss-adapter.md +1 -1
- package/template/.pi/skills/yss-product-lifecycle/references/orchestration.md +3 -3
- package/template/.pi/skills/yss-product-lifecycle/references/state-model.md +3 -3
- package/template/.pi/skills/yss-router/SKILL.md +1 -1
- package/template/.pi/skills/yss-router/references/slice-implementation-contract.md +1 -0
- package/template/.qoder/skills/yss-product-lifecycle/SKILL.md +5 -5
- package/template/.qoder/skills/yss-product-lifecycle/references/matt-yss-adapter.md +1 -1
- package/template/.qoder/skills/yss-product-lifecycle/references/orchestration.md +3 -3
- package/template/.qoder/skills/yss-product-lifecycle/references/state-model.md +3 -3
- package/template/.qoder/skills/yss-router/SKILL.md +1 -1
- package/template/.qoder/skills/yss-router/references/slice-implementation-contract.md +1 -0
- package/template/.trae/skills/yss-product-lifecycle/SKILL.md +5 -5
- package/template/.trae/skills/yss-product-lifecycle/references/matt-yss-adapter.md +1 -1
- package/template/.trae/skills/yss-product-lifecycle/references/orchestration.md +3 -3
- package/template/.trae/skills/yss-product-lifecycle/references/state-model.md +3 -3
- package/template/.trae/skills/yss-router/SKILL.md +1 -1
- package/template/.trae/skills/yss-router/references/slice-implementation-contract.md +1 -0
- package/template/AGENTS.md +7 -16
- package/template/CONTEXT.md +14 -2
- package/template/docs/adr/README.md +7 -0
- package/template/docs/agents/digital-human-roles.md +83 -0
- package/template/docs/agents/digital-human-roles.yaml +253 -0
- package/template/docs/agents/skills-maintenance.md +1 -1
- package/template/docs/agents/triage-labels.md +5 -5
- package/template/docs/process/implementation-repo-integration.md +1 -1
- package/template/docs/process/schemas/lifecycle-checkpoint.schema.json +2 -1
- package/template/docs/process/subagent-collaboration.md +5 -3
- package/template/docs/process/templates/stage-checkpoint-template.md +3 -1
- package/template/docs/templates/approval-record-template.yaml +14 -0
- package/template/docs/templates/digital-human-runtime-profile-template.md +38 -0
- package/template/docs/templates/grok-bot-profile-template.md +24 -0
- package/template/docs/templates/implementation-routing-template.md +3 -3
- package/template/docs/templates/local-parent-ticket-template.md +8 -0
- package/template/docs/templates/subagent-task-package-template.md +4 -0
- package/template/docs/templates/vertical-slice-ticket-template.md +7 -0
- package/template/docs/user-guide//344/272/247/345/223/201/347/240/224/345/217/221/345/205/250/347/224/237/345/221/275/345/221/250/346/234/237/346/234/200/344/275/263/345/256/236/350/267/265.md +2 -0
- package/template/scripts/lib/approval-record.mjs +123 -0
- package/template/scripts/lib/digital-human-roles.mjs +398 -0
- package/template/scripts/verify-approval-record +13 -0
- package/template/scripts/verify-digital-human-roles +10 -0
- package/template/scripts/verify-digital-human-roles-scenarios +147 -0
- package/template/scripts/verify-governance-release +7 -5
- package/template/scripts/verify-lifecycle-checkpoint +2 -0
- package/template/scripts/verify-template +5 -2
- package/template/skills-lock.json +2 -2
- package/template.manifest.json +30 -7
- package/template.snapshot.json +5 -4
- package/template/docs/adr/0001-product-design-prototype-entrypoint.md +0 -54
- package/template/docs/adr/0002-yss-project-repository-mode.md +0 -3
- package/template/docs/adr/0003-machine-readable-lifecycle-registry.md +0 -5
- package/template/docs/adr/0006-stable-lifecycle-ids-and-generated-structure.md +0 -5
- package/template/docs/adr/0007-lifecycle-native-work-units.md +0 -5
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { validateDefaultDigitalHumanRoles, validateDigitalHumanRoles, loadDigitalHumanRoles, skillIdsFromRegistry } from "./lib/digital-human-roles.mjs";
|
|
3
|
+
import { loadRegistry } from "./lib/lifecycle-registry.mjs";
|
|
4
|
+
import { loadSkillRegistry } from "./lib/skill-registry.mjs";
|
|
5
|
+
import { validateApprovalRecord, validateApprovalRecordFile } from "./lib/approval-record.mjs";
|
|
6
|
+
|
|
7
|
+
function clone() {
|
|
8
|
+
return structuredClone(loadDigitalHumanRoles());
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function deps() {
|
|
12
|
+
const lifecycle = loadRegistry();
|
|
13
|
+
const skills = loadSkillRegistry();
|
|
14
|
+
const ids = (records) => new Set(records.map((record) => record.id));
|
|
15
|
+
return {
|
|
16
|
+
skillIds: skillIdsFromRegistry(skills),
|
|
17
|
+
stageIds: ids(lifecycle.stages),
|
|
18
|
+
gateIds: ids(lifecycle.gates),
|
|
19
|
+
artifactIds: ids(lifecycle.artifacts),
|
|
20
|
+
evidenceIds: ids(lifecycle.evidence),
|
|
21
|
+
workUnitIds: ids(lifecycle.work_units),
|
|
22
|
+
skillRegistry: skills
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function mustFail(doc, pattern, label) {
|
|
27
|
+
let failed = false;
|
|
28
|
+
let message = "";
|
|
29
|
+
try {
|
|
30
|
+
validateDigitalHumanRoles(doc, deps());
|
|
31
|
+
} catch (error) {
|
|
32
|
+
failed = true;
|
|
33
|
+
message = error.message;
|
|
34
|
+
}
|
|
35
|
+
if (!failed) throw new TypeError(`错误配置未被拒绝: ${label}`);
|
|
36
|
+
if (!pattern.test(message)) throw new TypeError(`${label} 失败原因不符合预期: ${message}`);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
validateDefaultDigitalHumanRoles();
|
|
40
|
+
|
|
41
|
+
const seven = [
|
|
42
|
+
"role.lifecycle-orchestrator",
|
|
43
|
+
"role.requirements-manager",
|
|
44
|
+
"role.product-manager",
|
|
45
|
+
"role.business",
|
|
46
|
+
"role.frontend-engineer",
|
|
47
|
+
"role.backend-engineer",
|
|
48
|
+
"role.test-engineer"
|
|
49
|
+
];
|
|
50
|
+
|
|
51
|
+
const genericAllowsSeven = clone();
|
|
52
|
+
genericAllowsSeven.stage_groups[0].members = seven;
|
|
53
|
+
validateDigitalHumanRoles(genericAllowsSeven, deps());
|
|
54
|
+
|
|
55
|
+
const grokForbidsSeven = clone();
|
|
56
|
+
grokForbidsSeven.stage_groups[0].members = seven;
|
|
57
|
+
grokForbidsSeven.runtimes.find((runtime) => runtime.id === "runtime.grok").overflow = "forbid";
|
|
58
|
+
mustFail(grokForbidsSeven, /禁止超过 6 人/, "Grok 适配器在 overflow=forbid 时拒绝七人协作组");
|
|
59
|
+
|
|
60
|
+
const coupled = clone();
|
|
61
|
+
coupled.roles[0].grok_title = "legacy";
|
|
62
|
+
mustFail(coupled, /平台耦合字段/, "角色上残留 grok_title");
|
|
63
|
+
|
|
64
|
+
const unknownSkill = clone();
|
|
65
|
+
unknownSkill.roles[0].core_skills = ["not-a-registered-skill"];
|
|
66
|
+
mustFail(unknownSkill, /未登记技能/, "未知技能");
|
|
67
|
+
|
|
68
|
+
const overlap = clone();
|
|
69
|
+
overlap.roles.find((role) => role.id === "role.frontend-engineer").forbidden_skills.push("yss-ui");
|
|
70
|
+
mustFail(overlap, /重叠/, "启用且禁止同一技能");
|
|
71
|
+
|
|
72
|
+
const selfSign = clone();
|
|
73
|
+
selfSign.gate_policy.dual_digital_human[0].countersigners = ["role.requirements-manager"];
|
|
74
|
+
mustFail(selfSign, /起草者不得会签自己/, "起草者自签");
|
|
75
|
+
|
|
76
|
+
const releaseByBot = clone();
|
|
77
|
+
releaseByBot.gate_policy.biological_human = ["gate.architecture-reviewed"];
|
|
78
|
+
releaseByBot.gate_policy.digital_human_review.push({
|
|
79
|
+
gate: "gate.release-ready",
|
|
80
|
+
countersigners: ["role.product-manager"]
|
|
81
|
+
});
|
|
82
|
+
mustFail(releaseByBot, /gate\.release-ready/, "数字人关闭发布门禁");
|
|
83
|
+
|
|
84
|
+
const missingSigners = clone();
|
|
85
|
+
missingSigners.gate_policy.digital_human_review[0].countersigners = [];
|
|
86
|
+
mustFail(missingSigners, /countersigners/, "单审门禁缺 countersigners");
|
|
87
|
+
|
|
88
|
+
const stringReview = clone();
|
|
89
|
+
stringReview.gate_policy.digital_human_review = ["gate.prototype-reviewed"];
|
|
90
|
+
mustFail(stringReview, /必须是含 gate/, "单审门禁仍用字符串名单");
|
|
91
|
+
|
|
92
|
+
const missingGeneric = clone();
|
|
93
|
+
missingGeneric.runtimes = missingGeneric.runtimes.filter((runtime) => runtime.id !== "runtime.generic");
|
|
94
|
+
mustFail(missingGeneric, /缺少运行时绑定: runtime.generic/, "缺少通用运行时");
|
|
95
|
+
|
|
96
|
+
validateApprovalRecordFile("docs/templates/approval-record-template.yaml");
|
|
97
|
+
|
|
98
|
+
const rolesDoc = loadDigitalHumanRoles();
|
|
99
|
+
try {
|
|
100
|
+
validateApprovalRecord({
|
|
101
|
+
schema_version: 1,
|
|
102
|
+
gate_id: "gate.spec-baseline-approved",
|
|
103
|
+
decision: "approved",
|
|
104
|
+
actor_kind: "digital-human",
|
|
105
|
+
role_id: "role.requirements-manager",
|
|
106
|
+
runtime_id: "runtime.generic",
|
|
107
|
+
principal_ref: "instance:wrong"
|
|
108
|
+
}, { rolesDoc });
|
|
109
|
+
throw new TypeError("错误配置未被拒绝: 错误角色会签");
|
|
110
|
+
} catch (error) {
|
|
111
|
+
if (!/会签角色必须是/.test(error.message)) throw new TypeError(`错误角色会签 失败原因不符合预期: ${error.message}`);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
try {
|
|
115
|
+
validateApprovalRecord({
|
|
116
|
+
schema_version: 1,
|
|
117
|
+
gate_id: "gate.spec-baseline-approved",
|
|
118
|
+
decision: "approved",
|
|
119
|
+
actor_kind: "digital-human",
|
|
120
|
+
role_id: "role.requirements-manager",
|
|
121
|
+
runtime_id: "runtime.generic",
|
|
122
|
+
principal_ref: "instance:req",
|
|
123
|
+
drafter_role_id: "role.requirements-manager"
|
|
124
|
+
}, { rolesDoc });
|
|
125
|
+
throw new TypeError("错误配置未被拒绝: 起草者自签会签记录");
|
|
126
|
+
} catch (error) {
|
|
127
|
+
if (!/会签角色必须是|起草者不得会签自己/.test(error.message)) {
|
|
128
|
+
throw new TypeError(`起草者自签会签记录 失败原因不符合预期: ${error.message}`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
try {
|
|
133
|
+
validateApprovalRecord({
|
|
134
|
+
schema_version: 1,
|
|
135
|
+
gate_id: "gate.release-ready",
|
|
136
|
+
decision: "approved",
|
|
137
|
+
actor_kind: "digital-human",
|
|
138
|
+
role_id: "role.product-manager",
|
|
139
|
+
runtime_id: "runtime.generic",
|
|
140
|
+
principal_ref: "instance:pm"
|
|
141
|
+
}, { rolesDoc });
|
|
142
|
+
throw new TypeError("错误配置未被拒绝: 数字人关发布会签记录");
|
|
143
|
+
} catch (error) {
|
|
144
|
+
if (!/必须由生物人会签/.test(error.message)) throw new TypeError(`数字人关发布会签记录 失败原因不符合预期: ${error.message}`);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
process.stdout.write("数字人角色压力场景验证通过\n");
|
|
@@ -25,11 +25,13 @@ if (isTemplateSource(root)) {
|
|
|
25
25
|
if (status === "proposed" && !/尚未|未实现|不构成|不能把/.test(body)) failures.push(`${relativePath} 的 proposed ADR 缺少未实施/非当前门禁说明`);
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
28
|
+
if (isTemplateSource(root)) {
|
|
29
|
+
for (const [relativePath, marker] of Object.entries({
|
|
30
|
+
".template-source/adr/0003-machine-readable-lifecycle-registry.md": "状态:部分实施(Phase 1)",
|
|
31
|
+
".template-source/adr/0006-stable-lifecycle-ids-and-generated-structure.md": "状态:部分实施(Phase 1)"
|
|
32
|
+
})) {
|
|
33
|
+
if (!read(relativePath).includes(marker)) failures.push(`${relativePath} 未声明当前实现状态`);
|
|
34
|
+
}
|
|
33
35
|
}
|
|
34
36
|
if (!read("scripts/verify-lifecycle-scenarios").includes("ROUTE_REGISTRY_IDS")) failures.push("生命周期场景未校验稳定 ID 映射");
|
|
35
37
|
if (failures.length > 0) {
|
|
@@ -5,6 +5,7 @@ import path from "node:path";
|
|
|
5
5
|
import { parseArgs } from "node:util";
|
|
6
6
|
import { fileURLToPath } from "node:url";
|
|
7
7
|
import { parseDocument } from "./vendor/yaml.mjs";
|
|
8
|
+
import { assertCheckpointApprovals } from "./lib/approval-record.mjs";
|
|
8
9
|
|
|
9
10
|
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
|
|
10
11
|
const schemaPath = path.join(root, "docs/process/schemas/lifecycle-checkpoint.schema.json");
|
|
@@ -30,6 +31,7 @@ try {
|
|
|
30
31
|
const value = document.toJS({ maxAliasCount: 0 });
|
|
31
32
|
const result = spawnSync("python3", ["-c", validator, schemaPath], { cwd: root, encoding: "utf8", input: JSON.stringify(value) });
|
|
32
33
|
if (result.status !== 0) throw new TypeError(`${result.stdout}${result.stderr}`.trim());
|
|
34
|
+
assertCheckpointApprovals(value, sourcePath);
|
|
33
35
|
process.stdout.write("生命周期 checkpoint 验证通过\n");
|
|
34
36
|
} catch (error) {
|
|
35
37
|
process.stderr.write(`生命周期 checkpoint 验证失败: ${error.message}\n`);
|
|
@@ -5,7 +5,7 @@ ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
|
5
5
|
cd "$ROOT_DIR"
|
|
6
6
|
node -e 'const [major]=process.versions.node.split(".").map(Number); if (major < 22 || major >= 27) { console.error("模板工具需要 Node >=22 <27"); process.exit(1); }'
|
|
7
7
|
|
|
8
|
-
required_files=(yss-project.yaml AGENTS.md CONTEXT.md skills-lock.json docs/agents/yss-skill-registry.yaml docs/process/lifecycle-registry.yaml docs/process/lifecycle-registry-baseline.json docs/process/maintenance-intensity.yaml docs/process/schemas/lifecycle-checkpoint.schema.json docs/process/schemas/frontend-implementation-evidence.schema.json docs/process/templates/lifecycle-checkpoint-template.yaml docs/process/templates/frontend-implementation-plan-template.yaml docs/process/templates/frontend-implementation-verification-template.yaml scripts/repository-mode scripts/implementation-path-policy scripts/repository-scope-policy scripts/sync-skills scripts/update-skill-lock scripts/generate-lifecycle-artifacts scripts/verify-lifecycle-registry scripts/verify-lifecycle-checkpoint scripts/verify-frontend-implementation-evidence scripts/verify-maintenance-checkpoint scripts/verify-maintenance-intensity-scenarios scripts/verify-skill-registry scripts/verify-skill-governance scripts/verify-yss-dto-openapi-profile scripts/verify-yss-dto-openapi-scenarios scripts/export-yss-skills)
|
|
8
|
+
required_files=(yss-project.yaml AGENTS.md CONTEXT.md skills-lock.json docs/agents/yss-skill-registry.yaml docs/agents/digital-human-roles.yaml docs/process/lifecycle-registry.yaml docs/process/lifecycle-registry-baseline.json docs/process/maintenance-intensity.yaml docs/process/schemas/lifecycle-checkpoint.schema.json docs/process/schemas/frontend-implementation-evidence.schema.json docs/process/templates/lifecycle-checkpoint-template.yaml docs/process/templates/frontend-implementation-plan-template.yaml docs/process/templates/frontend-implementation-verification-template.yaml scripts/repository-mode scripts/implementation-path-policy scripts/repository-scope-policy scripts/sync-skills scripts/update-skill-lock scripts/generate-lifecycle-artifacts scripts/verify-lifecycle-registry scripts/verify-lifecycle-checkpoint scripts/verify-frontend-implementation-evidence scripts/verify-maintenance-checkpoint scripts/verify-maintenance-intensity-scenarios scripts/verify-skill-registry scripts/verify-skill-governance scripts/verify-yss-dto-openapi-profile scripts/verify-yss-dto-openapi-scenarios scripts/verify-digital-human-roles scripts/verify-digital-human-roles-scenarios scripts/verify-approval-record scripts/export-yss-skills)
|
|
9
9
|
for required in "${required_files[@]}"; do test -f "$required" || { echo "缺少模板必需文件: $required" >&2; exit 1; }; done
|
|
10
10
|
|
|
11
11
|
repository_mode="$(scripts/repository-mode)"
|
|
@@ -22,6 +22,9 @@ scripts/verify-skill-registry
|
|
|
22
22
|
scripts/verify-skill-governance
|
|
23
23
|
scripts/verify-yss-dto-openapi-profile
|
|
24
24
|
scripts/verify-yss-dto-openapi-scenarios
|
|
25
|
+
scripts/verify-digital-human-roles
|
|
26
|
+
scripts/verify-digital-human-roles-scenarios
|
|
27
|
+
scripts/verify-approval-record docs/templates/approval-record-template.yaml
|
|
25
28
|
scripts/verify-lifecycle-registry
|
|
26
29
|
scripts/verify-lifecycle-checkpoint docs/process/templates/lifecycle-checkpoint-template.yaml
|
|
27
30
|
scripts/verify-frontend-implementation-evidence --allow-template docs/process/templates/frontend-implementation-plan-template.yaml
|
|
@@ -39,7 +42,7 @@ scripts/verify-yss-ui-scenarios
|
|
|
39
42
|
scripts/verify-openapi-yaml-first-scenarios
|
|
40
43
|
scripts/verify-openapi-json-handoff-scenarios
|
|
41
44
|
|
|
42
|
-
for entry in scripts/sync-skills scripts/update-skill-lock scripts/generate-lifecycle-artifacts scripts/verify-lifecycle-registry scripts/verify-lifecycle-checkpoint scripts/verify-frontend-implementation-evidence scripts/verify-maintenance-checkpoint scripts/verify-maintenance-intensity-scenarios scripts/verify-skill-registry scripts/verify-skill-governance scripts/verify-yss-dto-openapi-profile scripts/verify-yss-dto-openapi-scenarios scripts/verify-lifecycle-scenarios scripts/verify-matt-yss-integration-scenarios scripts/verify-prototype-backend-scaffold-scenarios scripts/verify-yss-router-scenarios scripts/verify-openapi-yaml-first-scenarios scripts/verify-openapi-json-handoff-scenarios scripts/verify-repository-scope-scenarios scripts/export-yss-skills; do node --check "$entry"; done
|
|
45
|
+
for entry in scripts/sync-skills scripts/update-skill-lock scripts/generate-lifecycle-artifacts scripts/verify-lifecycle-registry scripts/verify-lifecycle-checkpoint scripts/verify-frontend-implementation-evidence scripts/verify-maintenance-checkpoint scripts/verify-maintenance-intensity-scenarios scripts/verify-skill-registry scripts/verify-skill-governance scripts/verify-yss-dto-openapi-profile scripts/verify-yss-dto-openapi-scenarios scripts/verify-digital-human-roles scripts/verify-digital-human-roles-scenarios scripts/verify-approval-record scripts/verify-lifecycle-scenarios scripts/verify-matt-yss-integration-scenarios scripts/verify-prototype-backend-scaffold-scenarios scripts/verify-yss-router-scenarios scripts/verify-openapi-yaml-first-scenarios scripts/verify-openapi-json-handoff-scenarios scripts/verify-repository-scope-scenarios scripts/export-yss-skills; do node --check "$entry"; done
|
|
43
46
|
|
|
44
47
|
legacy_runtime="ru""by"
|
|
45
48
|
script_roots=(scripts)
|
|
@@ -1398,7 +1398,7 @@
|
|
|
1398
1398
|
"source": "project",
|
|
1399
1399
|
"sourceType": "local",
|
|
1400
1400
|
"skillPath": ".agents/skills/yss-product-lifecycle/SKILL.md",
|
|
1401
|
-
"effectiveHash": "
|
|
1401
|
+
"effectiveHash": "4c2f7c8d008397e0bfe134461e1e5ea7eadbbe91c18966bce68ae506b7166569",
|
|
1402
1402
|
"targets": [
|
|
1403
1403
|
".agents/skills",
|
|
1404
1404
|
".claude/skills",
|
|
@@ -1462,7 +1462,7 @@
|
|
|
1462
1462
|
"source": "project",
|
|
1463
1463
|
"sourceType": "local",
|
|
1464
1464
|
"skillPath": ".agents/skills/yss-router/SKILL.md",
|
|
1465
|
-
"effectiveHash": "
|
|
1465
|
+
"effectiveHash": "a43355c7d8a1a5016d75af084328a4cfbb758aa5bf022b644d215c0e868b5bfa",
|
|
1466
1466
|
"targets": [
|
|
1467
1467
|
".agents/skills",
|
|
1468
1468
|
".claude/skills",
|
package/template.manifest.json
CHANGED
|
@@ -1,4 +1,31 @@
|
|
|
1
1
|
{
|
|
2
|
+
"allowRootEntries": [
|
|
3
|
+
".agents",
|
|
4
|
+
".claude",
|
|
5
|
+
".codex",
|
|
6
|
+
".cursor",
|
|
7
|
+
".hermes",
|
|
8
|
+
".pi",
|
|
9
|
+
".qoder",
|
|
10
|
+
".trae",
|
|
11
|
+
"docs",
|
|
12
|
+
"scripts"
|
|
13
|
+
],
|
|
14
|
+
"allowRootFiles": [
|
|
15
|
+
".cursorrules",
|
|
16
|
+
".gitignore",
|
|
17
|
+
".nvmrc",
|
|
18
|
+
"AGENTS.md",
|
|
19
|
+
"CLAUDE.md",
|
|
20
|
+
"CONTEXT.md",
|
|
21
|
+
"README.md",
|
|
22
|
+
"skills-lock.json",
|
|
23
|
+
"yss-project.yaml",
|
|
24
|
+
"yss-public-skills.json"
|
|
25
|
+
],
|
|
26
|
+
"allowFiles": [
|
|
27
|
+
"docs/adr/README.md"
|
|
28
|
+
],
|
|
2
29
|
"excludeRootEntries": [
|
|
3
30
|
".git",
|
|
4
31
|
".codegraph",
|
|
@@ -27,7 +54,8 @@
|
|
|
27
54
|
".pi/settings.json",
|
|
28
55
|
".cursor/environment.json",
|
|
29
56
|
"docs/.scratch",
|
|
30
|
-
"docs/reviews"
|
|
57
|
+
"docs/reviews",
|
|
58
|
+
"docs/adr"
|
|
31
59
|
],
|
|
32
60
|
"renderPaths": [
|
|
33
61
|
"AGENTS.md",
|
|
@@ -37,13 +65,8 @@
|
|
|
37
65
|
"exampleDocPaths": [
|
|
38
66
|
"docs/discovery/IDEATION.md"
|
|
39
67
|
],
|
|
40
|
-
"initExcludeRootEntries": [
|
|
41
|
-
"scripts",
|
|
42
|
-
"wiki"
|
|
43
|
-
],
|
|
68
|
+
"initExcludeRootEntries": [],
|
|
44
69
|
"initExcludeRootFiles": [
|
|
45
|
-
".gitignore",
|
|
46
|
-
".nvmrc",
|
|
47
70
|
"yss-public-skills.json"
|
|
48
71
|
],
|
|
49
72
|
"initExcludePaths": []
|
package/template.snapshot.json
CHANGED
|
@@ -3,14 +3,15 @@
|
|
|
3
3
|
"templateName": "yss-spec-project-template",
|
|
4
4
|
"templateSource": "github:iloveZzz/yss-spec-project-template",
|
|
5
5
|
"templateRepository": "https://github.com/iloveZzz/yss-spec-project-template.git",
|
|
6
|
-
"requestedRef": "
|
|
7
|
-
"templateCommit": "
|
|
6
|
+
"requestedRef": "030d8062634018880a3422fd55065d8d8e61e41e",
|
|
7
|
+
"templateCommit": "030d8062634018880a3422fd55065d8d8e61e41e",
|
|
8
|
+
"manifestHash": "10d161eb3f0e426aeefad5d0b9e6c5522d8a4dbacb9edf6ed64285dcb40b1a65",
|
|
8
9
|
"encodedPaths": {
|
|
9
10
|
".codex/skills/data-analytics/.gitignore": ".codex/skills/data-analytics/__yss_dotfile__.gitignore",
|
|
10
11
|
".codex/skills/product-design/.npmignore": ".codex/skills/product-design/__yss_dotfile__.npmignore",
|
|
11
12
|
".codex/skills/product-design/templates/prototype/.npmrc": ".codex/skills/product-design/templates/prototype/__yss_dotfile__.npmrc",
|
|
12
13
|
".gitignore": "__yss_dotfile__.gitignore"
|
|
13
14
|
},
|
|
14
|
-
"snapshotHash": "
|
|
15
|
-
"generatedAt": "2026-08-
|
|
15
|
+
"snapshotHash": "be94c1d18bbfdbf58971964288ecc5ec2fc3607e80537cb46b667d645df74006",
|
|
16
|
+
"generatedAt": "2026-08-26T10:05:21.409Z"
|
|
16
17
|
}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
# ADR-0001: 使用 product-design:index 作为产品原型主入口
|
|
2
|
-
|
|
3
|
-
## 状态
|
|
4
|
-
|
|
5
|
-
已接受
|
|
6
|
-
|
|
7
|
-
## 日期
|
|
8
|
-
|
|
9
|
-
2026-07-06
|
|
10
|
-
|
|
11
|
-
## 背景
|
|
12
|
-
|
|
13
|
-
YSS Harness 需要把有 UI 功能的产品原型产出收敛到一个稳定入口,同时保留需求质询、设计系统、Ant Design v6 事实校验、原型评审和用户确认门禁。原有 `product-design-prototype`、`wireframe-prototype`、`high-fidelity-html-prototype` 容易被理解为并列主入口,导致 Agent 在不同阶段选择不同原型工具,难以保证高保真 HTML 原型、AntD v6 校验证据和用户确认记录一致落地。
|
|
14
|
-
|
|
15
|
-
## 决策
|
|
16
|
-
|
|
17
|
-
产品原型产出统一以 `product-design:index` 为主入口。该 skill 只负责路由,实际按 Product Design plugin 规则进入 `$get-context`、`$ideate`、`$prototype`、`$image-to-code`、`$url-to-code`、`$design-qa` 或 `$share` 等 focused skill。
|
|
18
|
-
|
|
19
|
-
`grill-with-docs` 保留为前置需求质询和领域边界澄清工具,不承担 HTML 原型产出。`antd` skill / `antd` CLI 作为 Ant Design v6 组件、demo、token、semantic 和 design.md 的事实来源。YSS 生命周期继续负责 `prototype-review`、用户确认、Spec 回填和 OpenAPI Draft 门禁。
|
|
20
|
-
|
|
21
|
-
## 考虑的替代方案
|
|
22
|
-
|
|
23
|
-
| 方案 | 优点 | 缺点 | 结论 |
|
|
24
|
-
|------|------|------|------|
|
|
25
|
-
| 继续使用多个原型技能并列入口 | 对旧流程改动少 | Agent 路由不稳定,难以统一 AntD v6 高保真 HTML 原型和确认记录 | 放弃 |
|
|
26
|
-
| 只保留 `high-fidelity-html-prototype` | 产物目标直接 | 缺少 Product Design plugin 的上下文、视觉探索、URL / 图片 / 代码来源路由能力 | 放弃 |
|
|
27
|
-
| 以 `product-design:index` 为主入口,只保留仍有迁移价值的兼容入口 | 路由统一,可复用 focused skills,并允许逐步退休冗余入口 | 需要在文档中明确 legacy 边界 | 采纳 |
|
|
28
|
-
|
|
29
|
-
## 后果
|
|
30
|
-
|
|
31
|
-
### 正面影响
|
|
32
|
-
|
|
33
|
-
- 有 UI 的产品原型产出入口统一。
|
|
34
|
-
- 高保真 HTML 原型、AntD CLI 校验证据和用户确认记录成为固定门禁。
|
|
35
|
-
- Figma / Axure / Excalidraw / 截图 / URL 可作为输入来源,而不是主交付格式。
|
|
36
|
-
|
|
37
|
-
### 负面影响
|
|
38
|
-
|
|
39
|
-
- 需要维护完整 `.codex/skills/product-design/` 插件目录,不能只复制 `index/SKILL.md`。
|
|
40
|
-
- 部分旧原型技能在过渡期仍会存在,需要通过流程文档限制使用语境;无继续维护价值的入口直接退休,不保留空壳目录。
|
|
41
|
-
|
|
42
|
-
### 风险
|
|
43
|
-
|
|
44
|
-
- 如果 Agent 未读取 Product Design focused skill,可能误把 `product-design:index` 当作直接产出技能。
|
|
45
|
-
- 如果跳过 `antd` CLI 查询,原型可能偏离 Ant Design v6 组件 API 或 token。
|
|
46
|
-
- 如果缺少用户确认记录,下游 Spec 校准和 OpenAPI Draft 会失去体验冻结依据。
|
|
47
|
-
|
|
48
|
-
## 相关
|
|
49
|
-
|
|
50
|
-
- `AGENTS.md`
|
|
51
|
-
- `docs/design/README.md`
|
|
52
|
-
- `docs/process/lifecycle-artifact-map.md`
|
|
53
|
-
- `docs/design/README.md`
|
|
54
|
-
- `docs/design/templates/prototype-confirmation-template.md`
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
# ADR-0002: 使用 `yss-project.yaml` 声明仓库身份
|
|
2
|
-
|
|
3
|
-
模板源仓库与模板实例仓库共享大部分目录和流程资产,仅靠目录、Git 远程或占位符推断身份会导致 Agent 选错流程。因此在根目录使用 `yss-project.yaml` 作为 CLI 与 Agent 共享的稳定契约,只声明 `schema_version` 和 `repository_mode`:模板源仓库使用 `template-source`,`create-yss-spec` 生成的仓库使用 `project-instance`。项目名称、团队规模和 Tracker 等易变信息不放入该清单,避免形成新的重复配置源。
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
# ADR-0003: 使用机器可读生命周期注册表作为结构化事实源
|
|
2
|
-
|
|
3
|
-
> 状态:部分实施(Phase 1)。本次发布只接受注册表、稳定 ID、结构表和工作单元表的 shadow 校验;数量、索引、依赖图和测试 fixture 的完整生成属于后续提案,未实现前不得作为模板发布能力宣称。
|
|
4
|
-
|
|
5
|
-
YSS 研发操作系统当前在 Markdown 生命周期地图、主控 skill、机器契约、用户指南和场景测试中重复表达阶段、门禁、产物与工作单元,已经出现门禁数量和工作单元数量漂移。Phase 1 引入生命周期注册表,集中保存这些结构事实及稳定标识,并由它派生当前 Markdown 结构表;Markdown 继续承担人工解释和审查,ADR 继续记录取舍,业务语义不被压缩成难读的配置。数量、索引、依赖图和测试 fixture 的自动生成必须在独立 Phase 中与生成器和校验器一并落地,不能只通过 ADR 宣告完成。
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
# ADR-0006: 使用稳定命名空间 ID 并派生生命周期结构资产
|
|
2
|
-
|
|
3
|
-
> 状态:部分实施(Phase 1)。稳定 ID、发布基线和两份结构视图已受管;索引、依赖图和测试 fixture 的完整生成属于后续提案,未实现前不得把人工维护的场景断言称为派生产物。
|
|
4
|
-
|
|
5
|
-
生命周期对象的中文名称、展示顺序和数量会随流程演进而变化,不能继续用“第几个门禁”或表格行数作为兼容身份。Phase 1 为主阶段、门禁、产物、工作单元和证据分别使用 `stage.*`、`gate.*`、`artifact.*`、`work-unit.*`、`evidence.*` 稳定 ID,并由 `docs/process/lifecycle-registry.yaml` 生成当前结构表;用户指南、ADR 和实践说明继续人工维护并引用稳定 ID。数量、索引、依赖图和测试 fixture 必须在后续 Phase 通过同一生成器和 `--check` 一并交付。已发布 ID 不复用,语义变化通过弃用记录和 schema 迁移表达,以牺牲直接编辑派生表格的便利换取跨版本引用稳定性。
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
# ADR-0007: 生命周期使用原生工作单元并保留 Matt 兼容入口
|
|
2
|
-
|
|
3
|
-
`yss-product-lifecycle` 作为 YSS 研发生命周期的唯一默认入口,持有阶段、产物状态、门禁和正式资产所有权。Spec 综合、Ticket 正式化和切片实现使用生命周期注册表中的原生工作单元;`to-spec`、`to-tickets`、`implement` 保留为用户显式调用的兼容输入,结果必须回交生命周期验收,生命周期不得自动调用这些 user-invoked skills。
|
|
4
|
-
|
|
5
|
-
该选择避免用户手动记忆阶段切换,也避免 Matt 默认的 `ready-for-agent`、commit 等行为越过 YSS 门禁和授权。代价是生命周期需要维护原生工作单元路由和兼容适配,但两者在 `work_unit_routes` 中共享一个稳定工作单元身份、使用互斥的 `native` / `compatibility` 路由,不再形成两套执行定义。
|