create-yss-spec 2.2.2 → 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.
Files changed (75) hide show
  1. package/README.md +1 -1
  2. package/package.json +1 -1
  3. package/template/.agents/skills/yss-product-lifecycle/SKILL.md +5 -5
  4. package/template/.agents/skills/yss-product-lifecycle/references/matt-yss-adapter.md +1 -1
  5. package/template/.agents/skills/yss-product-lifecycle/references/orchestration.md +3 -3
  6. package/template/.agents/skills/yss-product-lifecycle/references/state-model.md +3 -3
  7. package/template/.agents/skills/yss-router/SKILL.md +1 -1
  8. package/template/.agents/skills/yss-router/references/slice-implementation-contract.md +1 -0
  9. package/template/.claude/skills/yss-product-lifecycle/SKILL.md +5 -5
  10. package/template/.claude/skills/yss-product-lifecycle/references/matt-yss-adapter.md +1 -1
  11. package/template/.claude/skills/yss-product-lifecycle/references/orchestration.md +3 -3
  12. package/template/.claude/skills/yss-product-lifecycle/references/state-model.md +3 -3
  13. package/template/.claude/skills/yss-router/SKILL.md +1 -1
  14. package/template/.claude/skills/yss-router/references/slice-implementation-contract.md +1 -0
  15. package/template/.codex/skills/yss-product-lifecycle/SKILL.md +5 -5
  16. package/template/.codex/skills/yss-product-lifecycle/references/matt-yss-adapter.md +1 -1
  17. package/template/.codex/skills/yss-product-lifecycle/references/orchestration.md +3 -3
  18. package/template/.codex/skills/yss-product-lifecycle/references/state-model.md +3 -3
  19. package/template/.codex/skills/yss-router/SKILL.md +1 -1
  20. package/template/.codex/skills/yss-router/references/slice-implementation-contract.md +1 -0
  21. package/template/.cursor/skills/yss-product-lifecycle/SKILL.md +5 -5
  22. package/template/.cursor/skills/yss-product-lifecycle/references/matt-yss-adapter.md +1 -1
  23. package/template/.cursor/skills/yss-product-lifecycle/references/orchestration.md +3 -3
  24. package/template/.cursor/skills/yss-product-lifecycle/references/state-model.md +3 -3
  25. package/template/.cursor/skills/yss-router/SKILL.md +1 -1
  26. package/template/.cursor/skills/yss-router/references/slice-implementation-contract.md +1 -0
  27. package/template/.hermes/skills/yss-product-lifecycle/SKILL.md +5 -5
  28. package/template/.hermes/skills/yss-product-lifecycle/references/matt-yss-adapter.md +1 -1
  29. package/template/.hermes/skills/yss-product-lifecycle/references/orchestration.md +3 -3
  30. package/template/.hermes/skills/yss-product-lifecycle/references/state-model.md +3 -3
  31. package/template/.hermes/skills/yss-router/SKILL.md +1 -1
  32. package/template/.hermes/skills/yss-router/references/slice-implementation-contract.md +1 -0
  33. package/template/.pi/skills/yss-product-lifecycle/SKILL.md +5 -5
  34. package/template/.pi/skills/yss-product-lifecycle/references/matt-yss-adapter.md +1 -1
  35. package/template/.pi/skills/yss-product-lifecycle/references/orchestration.md +3 -3
  36. package/template/.pi/skills/yss-product-lifecycle/references/state-model.md +3 -3
  37. package/template/.pi/skills/yss-router/SKILL.md +1 -1
  38. package/template/.pi/skills/yss-router/references/slice-implementation-contract.md +1 -0
  39. package/template/.qoder/skills/yss-product-lifecycle/SKILL.md +5 -5
  40. package/template/.qoder/skills/yss-product-lifecycle/references/matt-yss-adapter.md +1 -1
  41. package/template/.qoder/skills/yss-product-lifecycle/references/orchestration.md +3 -3
  42. package/template/.qoder/skills/yss-product-lifecycle/references/state-model.md +3 -3
  43. package/template/.qoder/skills/yss-router/SKILL.md +1 -1
  44. package/template/.qoder/skills/yss-router/references/slice-implementation-contract.md +1 -0
  45. package/template/.trae/skills/yss-product-lifecycle/SKILL.md +5 -5
  46. package/template/.trae/skills/yss-product-lifecycle/references/matt-yss-adapter.md +1 -1
  47. package/template/.trae/skills/yss-product-lifecycle/references/orchestration.md +3 -3
  48. package/template/.trae/skills/yss-product-lifecycle/references/state-model.md +3 -3
  49. package/template/.trae/skills/yss-router/SKILL.md +1 -1
  50. package/template/.trae/skills/yss-router/references/slice-implementation-contract.md +1 -0
  51. package/template/AGENTS.md +6 -3
  52. package/template/CONTEXT.md +14 -2
  53. package/template/docs/agents/digital-human-roles.md +83 -0
  54. package/template/docs/agents/digital-human-roles.yaml +253 -0
  55. package/template/docs/agents/triage-labels.md +5 -5
  56. package/template/docs/process/schemas/lifecycle-checkpoint.schema.json +2 -1
  57. package/template/docs/process/subagent-collaboration.md +5 -3
  58. package/template/docs/process/templates/stage-checkpoint-template.md +3 -1
  59. package/template/docs/templates/approval-record-template.yaml +14 -0
  60. package/template/docs/templates/digital-human-runtime-profile-template.md +38 -0
  61. package/template/docs/templates/grok-bot-profile-template.md +24 -0
  62. package/template/docs/templates/implementation-routing-template.md +3 -3
  63. package/template/docs/templates/local-parent-ticket-template.md +8 -0
  64. package/template/docs/templates/subagent-task-package-template.md +4 -0
  65. package/template/docs/templates/vertical-slice-ticket-template.md +7 -0
  66. 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
  67. package/template/scripts/lib/approval-record.mjs +123 -0
  68. package/template/scripts/lib/digital-human-roles.mjs +398 -0
  69. package/template/scripts/verify-approval-record +13 -0
  70. package/template/scripts/verify-digital-human-roles +10 -0
  71. package/template/scripts/verify-digital-human-roles-scenarios +147 -0
  72. package/template/scripts/verify-lifecycle-checkpoint +2 -0
  73. package/template/scripts/verify-template +5 -2
  74. package/template/skills-lock.json +2 -2
  75. package/template.snapshot.json +4 -4
@@ -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");
@@ -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": "6b5ca6ad3453abf2b4794569853ffc4a1c5a625adee4428373fc690c729fee20",
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": "f78b0264ff4e381fa5ca64b65a08de501e6f3580f00d186e7dd28d3da252769f",
1465
+ "effectiveHash": "a43355c7d8a1a5016d75af084328a4cfbb758aa5bf022b644d215c0e868b5bfa",
1466
1466
  "targets": [
1467
1467
  ".agents/skills",
1468
1468
  ".claude/skills",
@@ -3,8 +3,8 @@
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": "51189cae987209ff9076a3336269318f47615d5a",
7
- "templateCommit": "51189cae987209ff9076a3336269318f47615d5a",
6
+ "requestedRef": "030d8062634018880a3422fd55065d8d8e61e41e",
7
+ "templateCommit": "030d8062634018880a3422fd55065d8d8e61e41e",
8
8
  "manifestHash": "10d161eb3f0e426aeefad5d0b9e6c5522d8a4dbacb9edf6ed64285dcb40b1a65",
9
9
  "encodedPaths": {
10
10
  ".codex/skills/data-analytics/.gitignore": ".codex/skills/data-analytics/__yss_dotfile__.gitignore",
@@ -12,6 +12,6 @@
12
12
  ".codex/skills/product-design/templates/prototype/.npmrc": ".codex/skills/product-design/templates/prototype/__yss_dotfile__.npmrc",
13
13
  ".gitignore": "__yss_dotfile__.gitignore"
14
14
  },
15
- "snapshotHash": "f3ae9ea041af1b2c07c60e3d9794f22dc20f7c7cd655e95fba442344f124a8b2",
16
- "generatedAt": "2026-08-25T05:55:41.500Z"
15
+ "snapshotHash": "be94c1d18bbfdbf58971964288ecc5ec2fc3607e80537cb46b667d645df74006",
16
+ "generatedAt": "2026-08-26T10:05:21.409Z"
17
17
  }