@captain_z/zsk 1.8.2 → 1.8.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.
Files changed (57) hide show
  1. package/dist/bin.js +4 -0
  2. package/dist/bin.js.map +1 -1
  3. package/dist/commands/add-flow.d.ts +3 -7
  4. package/dist/commands/add-flow.js +7 -59
  5. package/dist/commands/add-flow.js.map +1 -1
  6. package/dist/commands/add.js +25 -104
  7. package/dist/commands/add.js.map +1 -1
  8. package/dist/commands/check.js +184 -8
  9. package/dist/commands/check.js.map +1 -1
  10. package/dist/commands/gate.d.ts +2 -0
  11. package/dist/commands/gate.js +2 -0
  12. package/dist/commands/gate.js.map +1 -1
  13. package/dist/core/prepare-sync.d.ts +2 -31
  14. package/dist/core/prepare-sync.js +119 -136
  15. package/dist/core/prepare-sync.js.map +1 -1
  16. package/dist/core/profile-bundle-installation.d.ts +55 -0
  17. package/dist/core/profile-bundle-installation.js +170 -0
  18. package/dist/core/profile-bundle-installation.js.map +1 -0
  19. package/dist/core/source-snapshot-adapters.d.ts +59 -0
  20. package/dist/core/source-snapshot-adapters.js +82 -0
  21. package/dist/core/source-snapshot-adapters.js.map +1 -0
  22. package/dist/core/staffing-plan.d.ts +7 -1
  23. package/dist/core/staffing-plan.js +186 -29
  24. package/dist/core/staffing-plan.js.map +1 -1
  25. package/dist/core/stage-clarity-verification.d.ts +31 -0
  26. package/dist/core/stage-clarity-verification.js +313 -0
  27. package/dist/core/stage-clarity-verification.js.map +1 -0
  28. package/dist/core/stage-quality-artifacts.d.ts +15 -0
  29. package/dist/core/stage-quality-artifacts.js +421 -0
  30. package/dist/core/stage-quality-artifacts.js.map +1 -0
  31. package/dist/core/stage-quality-contracts.d.ts +86 -0
  32. package/dist/core/stage-quality-contracts.js +2 -0
  33. package/dist/core/stage-quality-contracts.js.map +1 -0
  34. package/dist/core/stage-quality-criteria.d.ts +9 -0
  35. package/dist/core/stage-quality-criteria.js +323 -0
  36. package/dist/core/stage-quality-criteria.js.map +1 -0
  37. package/dist/core/stage-quality-rendering.d.ts +13 -0
  38. package/dist/core/stage-quality-rendering.js +122 -0
  39. package/dist/core/stage-quality-rendering.js.map +1 -0
  40. package/dist/core/stage-quality.d.ts +5 -52
  41. package/dist/core/stage-quality.js +40 -432
  42. package/dist/core/stage-quality.js.map +1 -1
  43. package/dist/core/template-registry.js +6 -0
  44. package/dist/core/template-registry.js.map +1 -1
  45. package/package.json +2 -2
  46. package/templates/module/frontend-module/design.md +25 -3
  47. package/templates/module/frontend-module/proposal.md +8 -0
  48. package/templates/module/frontend-module/spec.md +16 -0
  49. package/templates/module/frontend-module/tasks.md +23 -7
  50. package/templates/project-init/.zsk/config.yaml +33 -0
  51. package/templates/project-init/.zsk/docs/PROJECT-CONFIG.md +43 -0
  52. package/templates/project-init/.zsk/docs/SYSTEM-SPEC.md +23 -1
  53. package/templates/project-init/.zsk/raws/index.md +19 -0
  54. package/templates/project-init/.zsk/raws/prepare/design/index.md +18 -0
  55. package/templates/project-init/.zsk/raws/prepare/index.md +33 -0
  56. package/templates/project-init/.zsk/raws/prepare/ux/index.md +19 -0
  57. package/templates/project-init/.zsk/roles.yaml +11 -11
@@ -0,0 +1,323 @@
1
+ const COMMON_CRITERIA = [
2
+ {
3
+ id: "GATE-INPUT-01",
4
+ label: "Required upstream artifacts exist and are non-empty.",
5
+ weight: 2,
6
+ required: true,
7
+ test: (ctx) => ctx.artifacts.every((artifact) => artifact.exists && artifact.bytes > 0),
8
+ evidence: (ctx) => ctx.artifacts.map((artifact) => `${artifact.key}: ${artifact.exists ? `${artifact.bytes} bytes` : "missing"} (${artifact.path})`),
9
+ gap: "One or more required upstream artifacts are missing or empty.",
10
+ },
11
+ {
12
+ id: "GATE-RULES-01",
13
+ label: "PROJECT-CONFIG.md and SYSTEM-SPEC.md constraints are available or explicitly not required for this stage.",
14
+ weight: 1,
15
+ required: true,
16
+ test: (ctx) => {
17
+ if (["preproposal", "coding", "fix", "smoke", "review", "ready", "verify", "acceptance", "archive"].includes(ctx.stage))
18
+ return true;
19
+ return hasContent(ctx, "project-config") && hasContent(ctx, "system-spec");
20
+ },
21
+ evidence: (ctx) => ["project-config", "system-spec"].map((key) => `${key}: ${hasContent(ctx, key) ? "present" : "missing"}`),
22
+ gap: "Project/system rules are not available for a stage that must obey them before handoff.",
23
+ },
24
+ {
25
+ id: "GATE-TEMPLATE-01",
26
+ label: "Upstream content is not placeholder-only or template filler.",
27
+ weight: 1,
28
+ required: true,
29
+ test: (ctx) => allPrimaryContent(ctx, (content) => {
30
+ const text = content.toLowerCase();
31
+ const placeholders = ["<fill-me>", "<project", "<module", "todo:", "tbd", "lorem ipsum"];
32
+ return !placeholders.some((placeholder) => text.includes(placeholder));
33
+ }),
34
+ evidence: (ctx) => primaryArtifacts(ctx).map((artifact) => `${artifact.key}: ${artifact.bytes} bytes`),
35
+ gap: "At least one upstream artifact still looks like a placeholder or template filler.",
36
+ },
37
+ {
38
+ id: "GATE-CONTENT-01",
39
+ label: "Upstream content has enough detail for reliable handoff.",
40
+ weight: 1,
41
+ test: (ctx) => {
42
+ const artifacts = primaryArtifacts(ctx);
43
+ if (artifacts.length === 0)
44
+ return true;
45
+ return artifacts.every((artifact) => wordCount(ctx.contentByKey.get(artifact.key) ?? "") >= 40);
46
+ },
47
+ evidence: (ctx) => primaryArtifacts(ctx).map((artifact) => `${artifact.key}: ${wordCount(ctx.contentByKey.get(artifact.key) ?? "")} words`),
48
+ gap: "At least one upstream artifact is very short; treat this as a quality gap unless the project explicitly accepts the risk.",
49
+ },
50
+ {
51
+ id: "GATE-TRACE-01",
52
+ label: "Claims trace to source, requirement, acceptance, design, task, issue, or evidence identifiers.",
53
+ weight: 1,
54
+ test: (ctx) => combinedContent(ctx).match(/\b(FR|NFR|AC|SPEC|DES|TASK|ISSUE|EVIDENCE|ADR|REQ)-?\d+\b/i) !== null ||
55
+ (ctx.stage === "preproposal" && ctx.artifacts.length === 0) ||
56
+ /traceability|source|evidence|acceptance|scenario/i.test(combinedContent(ctx)),
57
+ evidence: (ctx) => [`trace terms found: ${/traceability|source|evidence|acceptance|scenario/i.test(combinedContent(ctx)) ? "yes" : "no"}`],
58
+ gap: "Traceability is weak; the next stage may rely on chat memory instead of source-backed IDs or evidence.",
59
+ },
60
+ {
61
+ id: "GATE-UNCERTAINTY-01",
62
+ label: "Open questions, assumptions, risks, or blockers are explicit instead of silently resolved.",
63
+ weight: 1,
64
+ test: (ctx) => (ctx.stage === "preproposal" && ctx.artifacts.length === 0) ||
65
+ /open questions?|assumptions?|risks?|blockers?|constraints?|unknowns?|n\/a|none/i.test(combinedContent(ctx)),
66
+ evidence: (ctx) => [`uncertainty section marker found: ${/open questions?|assumptions?|risks?|blockers?|constraints?|unknowns?/i.test(combinedContent(ctx)) ? "yes" : "n/a or none marker required"}`],
67
+ gap: "Uncertainty handling is not explicit enough for a downstream stage to decide whether to continue or ask.",
68
+ },
69
+ {
70
+ id: "GATE-STAGE-CHALLENGE-01",
71
+ label: "Existing current-stage artifacts expose a skill-local Stage Challenge Gate summary.",
72
+ weight: 2,
73
+ required: true,
74
+ test: (ctx) => {
75
+ const artifacts = currentStageArtifacts(ctx);
76
+ if (artifacts.length === 0)
77
+ return true;
78
+ return artifacts.every((artifact) => {
79
+ const content = ctx.contentByKey.get(artifact.key) ?? "";
80
+ return hasStageChallengeGateMarker(content) && hasStageChallengeGateStatus(content);
81
+ });
82
+ },
83
+ evidence: (ctx) => {
84
+ const artifacts = currentStageArtifacts(ctx);
85
+ if (artifacts.length === 0)
86
+ return ["current stage artifact: not present"];
87
+ return artifacts.map((artifact) => {
88
+ const content = ctx.contentByKey.get(artifact.key) ?? "";
89
+ const hasGate = hasStageChallengeGateMarker(content);
90
+ const hasStatus = hasStageChallengeGateStatus(content);
91
+ return `${artifact.key}: gate=${hasGate ? "yes" : "no"}, status=${hasStatus ? "yes" : "no"} (${artifact.path})`;
92
+ });
93
+ },
94
+ gap: "An existing current-stage artifact must show the skill-local Stage Challenge Gate focus and PASS/NEEDS_REPAIR/BLOCKED/WAIVED status before downstream handoff.",
95
+ },
96
+ ];
97
+ const STAGE_CRITERIA = {
98
+ design: [
99
+ {
100
+ id: "DESIGN-ENTRY-SPEC-01",
101
+ label: "Spec contains observable acceptance criteria.",
102
+ weight: 1,
103
+ required: true,
104
+ artifactKeys: ["spec"],
105
+ test: (ctx) => hasPattern(ctx, ["spec"], /acceptance criteria|验收|given\s+.*when\s+.*then|AC-?\d+/is),
106
+ evidence: () => ["spec acceptance marker required"],
107
+ gap: "Design cannot safely start until the spec exposes observable acceptance criteria.",
108
+ },
109
+ {
110
+ id: "DESIGN-ENTRY-SPEC-02",
111
+ label: "Spec covers edge, negative, boundary, or error scenarios.",
112
+ weight: 1,
113
+ artifactKeys: ["spec"],
114
+ test: (ctx) => hasPattern(ctx, ["spec"], /edge cases?|negative|boundary|error|failure|异常|边界/is),
115
+ evidence: () => ["spec edge/negative/boundary marker required"],
116
+ gap: "Spec lacks explicit non-happy-path coverage.",
117
+ },
118
+ {
119
+ id: "DESIGN-ENTRY-SPEC-03",
120
+ label: "Spec names NFR or quality attributes, with missing thresholds marked as 未指定 when needed.",
121
+ weight: 1,
122
+ artifactKeys: ["spec"],
123
+ test: (ctx) => hasPattern(ctx, ["spec"], /NFR|non-functional|performance|security|reliability|accessibility|observability|未指定|质量/is),
124
+ evidence: () => ["spec NFR/quality marker required"],
125
+ gap: "Spec does not expose quality attributes enough for design tradeoffs.",
126
+ },
127
+ {
128
+ id: "DESIGN-ENTRY-CONTROL-01",
129
+ label: "Permission/auth/privacy/data-access behavior has a behavior-level control matrix before design starts.",
130
+ weight: 2,
131
+ required: true,
132
+ artifactKeys: ["spec"],
133
+ test: (ctx) => !touchesControlConcern(ctx, ["spec"]) || hasControlMatrix(ctx, ["spec"]),
134
+ evidence: (ctx) => [`control concern: ${touchesControlConcern(ctx, ["spec"]) ? "triggered" : "not triggered"}`],
135
+ gap: "Spec touches a control concern but lacks a behavior-level control matrix.",
136
+ },
137
+ ],
138
+ task: [
139
+ {
140
+ id: "TASK-ENTRY-DES-01",
141
+ label: "Design includes useful diagrams or explicitly states why diagrams are N/A.",
142
+ weight: 1,
143
+ artifactKeys: ["design"],
144
+ test: (ctx) => hasPattern(ctx, ["design"], /```mermaid|diagram|C4|sequence|state|data flow|flowchart|图|N\/A/is),
145
+ evidence: () => ["design diagram or N/A rationale marker required"],
146
+ gap: "Task breakdown needs a reviewable design view or explicit diagram N/A rationale.",
147
+ },
148
+ {
149
+ id: "TASK-ENTRY-DES-02",
150
+ label: "Design records ADR/decision-record entries for task planning.",
151
+ weight: 1,
152
+ required: true,
153
+ artifactKeys: ["design"],
154
+ test: (ctx) => hasPattern(ctx, ["design"], /ADR-?\d+|Architecture Decision Record|Decision Record|ADR\s*\/|##\s*ADR|决策记录/is),
155
+ evidence: () => ["design ADR/decision-record marker required"],
156
+ gap: "Design lacks ADR/decision-record entries required for task planning.",
157
+ },
158
+ {
159
+ id: "TASK-ENTRY-CONTROL-01",
160
+ label: "Triggered permission/auth/privacy/data-access behavior has a design control traceability matrix.",
161
+ weight: 2,
162
+ required: true,
163
+ artifactKeys: ["spec", "design"],
164
+ test: (ctx) => !touchesControlConcern(ctx, ["spec", "design"]) || hasControlMatrix(ctx, ["design"]),
165
+ evidence: (ctx) => [`control concern: ${touchesControlConcern(ctx, ["spec", "design"]) ? "triggered" : "not triggered"}`],
166
+ gap: "Spec or design touches a control concern but design lacks a control traceability matrix.",
167
+ },
168
+ ],
169
+ coding: [
170
+ {
171
+ id: "CODING-ENTRY-TASK-01",
172
+ label: "Tasks use Kiro-style nested checkbox groups and subtasks.",
173
+ weight: 2,
174
+ required: true,
175
+ artifactKeys: ["tasks"],
176
+ test: (ctx) => hasPattern(ctx, ["tasks"], /^- \[ \] \d+\. .+$/m) && hasPattern(ctx, ["tasks"], /^\s+- \[ \] \d+\.\d+ .+$/m),
177
+ evidence: () => ["task list must contain '- [ ] 1.' and indented '- [ ] 1.1' items"],
178
+ gap: "Coding should not start from flat or vague tasks; use Kiro-style groups and subtasks.",
179
+ },
180
+ {
181
+ id: "CODING-ENTRY-TASK-02",
182
+ label: "Each implementation slice has verification or evidence hooks.",
183
+ weight: 1,
184
+ required: true,
185
+ artifactKeys: ["tasks"],
186
+ test: (ctx) => hasPattern(ctx, ["tasks"], /verification|evidence|test command|pnpm|npm|pytest|vitest|playwright|验证|证据/is),
187
+ evidence: () => ["task verification/evidence marker required"],
188
+ gap: "Tasks do not define how each slice proves completion.",
189
+ },
190
+ ],
191
+ fix: [
192
+ {
193
+ id: "FIX-ENTRY-ISSUE-01",
194
+ label: "Issue anchor exposes expected behavior, actual behavior, and evidence.",
195
+ weight: 2,
196
+ required: true,
197
+ artifactKeys: ["issue-record"],
198
+ test: (ctx) => hasPattern(ctx, ["issue-record"], /expected|actual|evidence|repro|steps|root cause|fix route|预期|实际|证据|复现/is),
199
+ evidence: () => ["issue record must expose expected/actual/evidence markers"],
200
+ gap: "Fix should not start without an issue anchor that records expected/actual behavior and evidence.",
201
+ },
202
+ ],
203
+ smoke: [
204
+ {
205
+ id: "SMOKE-ENTRY-TEST-01",
206
+ label: "Test basis is traceable before local smoke claims pass.",
207
+ weight: 2,
208
+ required: true,
209
+ artifactKeys: ["tasks"],
210
+ test: (ctx) => hasPattern(ctx, ["tasks"], /test basis|acceptance|AC-?\d+|FR-?\d+|scenario|regression|验收|回归/is),
211
+ evidence: () => ["tasks must link tests to acceptance/scenario/regression basis"],
212
+ gap: "Smoke cannot treat passing commands as meaningful without a traceable test basis.",
213
+ },
214
+ ],
215
+ review: [
216
+ {
217
+ id: "REVIEW-TARGET-01",
218
+ label: "Explicit review target exists and is treated as the review contract when supplied.",
219
+ weight: 2,
220
+ required: true,
221
+ artifactKeys: ["review-target"],
222
+ test: (ctx) => !ctx.reviewTarget || hasContent(ctx, "review-target"),
223
+ evidence: (ctx) => [
224
+ `review target: ${ctx.reviewTarget ?? "module implementation review"}`,
225
+ `review mode: ${ctx.reviewMode ?? "implementation"}`,
226
+ ],
227
+ gap: "The explicit review target is missing or has no reviewable content.",
228
+ },
229
+ {
230
+ id: "REVIEW-ENTRY-TEST-01",
231
+ label: "Smoke evidence distinguishes passed, failed, skipped, and unrun checks.",
232
+ weight: 1,
233
+ required: true,
234
+ artifactKeys: ["smoke"],
235
+ test: (ctx) => ctx.reviewMode !== "implementation" || hasPattern(ctx, ["smoke"], /passed|failed|skipped|unrun|exit status|command|evidence|通过|失败|跳过/is),
236
+ evidence: (ctx) => [ctx.reviewMode === "implementation" ? "smoke pass/fail/skipped/unrun markers required" : "explicit target review does not require module smoke input"],
237
+ gap: "Review needs precise test result status, not only a generic all-passed claim.",
238
+ },
239
+ {
240
+ id: "REVIEW-PREPROPOSAL-01",
241
+ label: "Preproposal/raw-source reviews check product, roadmap, UX, assumptions, or readiness evidence instead of module spec artifacts.",
242
+ weight: 1,
243
+ artifactKeys: ["review-target"],
244
+ test: (ctx) => !["preproposal", "raw-source"].includes(ctx.reviewMode ?? "implementation") ||
245
+ hasPattern(ctx, ["review-target"], /product|problem|user|persona|journey|roadmap|mvp|phase|ux|flow|assumption|risk|blocker|source|evidence|产品|用户|路线图|阶段|流程|假设|风险|证据/is),
246
+ evidence: (ctx) => [`target-aware raw review: ${["preproposal", "raw-source"].includes(ctx.reviewMode ?? "implementation") ? "required" : "n/a"}`],
247
+ gap: "Raw/preproposal review target lacks product, roadmap, UX, assumption, risk, source, or evidence markers.",
248
+ },
249
+ ],
250
+ };
251
+ export function evaluateStageQualityCriteria(input) {
252
+ const { stage, reviewTarget, reviewMode, artifacts, contentByKey, knownStages } = input;
253
+ const ctx = { stage, ...(reviewTarget ? { reviewTarget, reviewMode } : {}), artifacts, contentByKey };
254
+ const specs = [
255
+ ...(!knownStages.includes(stage) ? [unknownStageCriterion(stage, knownStages)] : []),
256
+ ...COMMON_CRITERIA,
257
+ ...(STAGE_CRITERIA[stage] ?? []),
258
+ ];
259
+ return specs.map((spec) => {
260
+ const passed = spec.test(ctx);
261
+ return {
262
+ id: spec.id,
263
+ label: spec.label,
264
+ weight: spec.weight,
265
+ passed,
266
+ required: spec.required === true,
267
+ evidence: spec.evidence(ctx),
268
+ ...(passed ? {} : { gap: spec.gap }),
269
+ };
270
+ });
271
+ }
272
+ function unknownStageCriterion(stage, knownStages) {
273
+ return {
274
+ id: "GATE-STAGE-00",
275
+ label: `Stage '${stage}' is known to the gate assessment contract.`,
276
+ weight: 2,
277
+ required: true,
278
+ test: () => false,
279
+ evidence: () => [`known stages: ${knownStages.join(", ")}`],
280
+ gap: "Unknown stage; define its required inputs before using gate assessment.",
281
+ };
282
+ }
283
+ function hasContent(ctx, key) {
284
+ return (ctx.contentByKey.get(key)?.trim().length ?? 0) > 0;
285
+ }
286
+ function primaryArtifacts(ctx) {
287
+ return ctx.artifacts.filter((artifact) => !["project-config", "system-spec", "raw-manifest"].includes(artifact.key));
288
+ }
289
+ function currentStageArtifacts(ctx) {
290
+ return ctx.artifacts.filter((artifact) => artifact.key === `current-${ctx.stage}`);
291
+ }
292
+ function hasStageChallengeGateMarker(content) {
293
+ return /(^|\n)#{2,6}\s+Stage Challenge Gate\b/i.test(content) ||
294
+ /(^|\n)\s*[-*]?\s*Stage artifact clarity\s*:/i.test(content);
295
+ }
296
+ function hasStageChallengeGateStatus(content) {
297
+ return /(^|\n)\s*[-*]?\s*Stage artifact clarity\s*:\s*(PASS|NEEDS_REPAIR|BLOCKED|WAIVED)\b/i.test(content);
298
+ }
299
+ function allPrimaryContent(ctx, test) {
300
+ const artifacts = primaryArtifacts(ctx);
301
+ if (artifacts.length === 0)
302
+ return ctx.artifacts.every((artifact) => artifact.exists && artifact.bytes > 0);
303
+ return artifacts.every((artifact) => {
304
+ const content = ctx.contentByKey.get(artifact.key);
305
+ return typeof content === "string" && test(content);
306
+ });
307
+ }
308
+ function combinedContent(ctx) {
309
+ return [...ctx.contentByKey.values()].join("\n\n");
310
+ }
311
+ function hasPattern(ctx, keys, pattern) {
312
+ return keys.some((key) => pattern.test(ctx.contentByKey.get(key) ?? ""));
313
+ }
314
+ function touchesControlConcern(ctx, keys) {
315
+ return hasPattern(ctx, keys, /auth(?:entication|orization)?|permission|access control|role|tenant|privacy|data access|compliance|audit|credential|PII|RBAC|ABAC|权限|认证|授权|角色|租户|隐私|审计|合规|凭证/is);
316
+ }
317
+ function hasControlMatrix(ctx, keys) {
318
+ return hasPattern(ctx, keys, /control (?:traceability )?matrix|control matrix|permission matrix|access control matrix|权限(?:追踪|控制)?矩阵|Source Rule|Subject \/ Actor|Action \/ Capability|Resource \/ Data|Enforcement Point/is);
319
+ }
320
+ function wordCount(content) {
321
+ return content.split(/\s+/).filter(Boolean).length;
322
+ }
323
+ //# sourceMappingURL=stage-quality-criteria.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stage-quality-criteria.js","sourceRoot":"","sources":["../../src/core/stage-quality-criteria.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { GateAssessment, GateCriterion, GateStatus } from "./stage-quality-contracts.js";
2
+ export type StageQualityDecisionSummary = {
3
+ score: number;
4
+ status: GateStatus;
5
+ decision: GateAssessment["decision"];
6
+ blockers: string[];
7
+ gaps: string[];
8
+ waiver?: GateAssessment["waiver"];
9
+ nextAction: string;
10
+ };
11
+ export declare function summarizeStageQualityDecision(criteria: GateCriterion[], threshold: number, acceptRisk: string | undefined): StageQualityDecisionSummary;
12
+ export declare function renderGateAssessmentMarkdown(assessment: GateAssessment): string;
13
+ export declare function renderWaiverMarkdown(assessment: GateAssessment): string;
@@ -0,0 +1,122 @@
1
+ export function summarizeStageQualityDecision(criteria, threshold, acceptRisk) {
2
+ const total = criteria.reduce((sum, criterion) => sum + criterion.weight, 0);
3
+ const earned = criteria.filter((criterion) => criterion.passed).reduce((sum, criterion) => sum + criterion.weight, 0);
4
+ const score = total === 0 ? 10 : roundScore((earned / total) * 10);
5
+ const blockers = criteria
6
+ .filter((criterion) => criterion.required && !criterion.passed)
7
+ .map((criterion) => `${criterion.id}: ${criterion.gap ?? criterion.label}`);
8
+ const gaps = criteria.filter((criterion) => !criterion.passed).map((criterion) => `${criterion.id}: ${criterion.gap ?? criterion.label}`);
9
+ const belowThreshold = score < threshold;
10
+ const waiverAllowed = blockers.length === 0 && belowThreshold && Boolean(acceptRisk);
11
+ const status = blockers.length > 0
12
+ ? "BLOCKED"
13
+ : waiverAllowed
14
+ ? "WAIVED"
15
+ : belowThreshold
16
+ ? "NEEDS_CONFIRMATION"
17
+ : "READY";
18
+ const decision = status === "READY" || status === "WAIVED"
19
+ ? "proceed"
20
+ : status === "NEEDS_CONFIRMATION"
21
+ ? "human-confirmation-required"
22
+ : "blocked";
23
+ const waiver = waiverAllowed ? { reason: acceptRisk, appliedAt: new Date().toISOString() } : undefined;
24
+ return {
25
+ score,
26
+ status,
27
+ decision,
28
+ blockers,
29
+ gaps,
30
+ ...(waiver ? { waiver } : {}),
31
+ nextAction: nextActionFor(status),
32
+ };
33
+ }
34
+ export function renderGateAssessmentMarkdown(assessment) {
35
+ return [
36
+ "# Stage Gate Assessment",
37
+ "",
38
+ `- Stage: \`${assessment.stage}\``,
39
+ ...(assessment.module ? [`- Module: \`${assessment.module}\``] : []),
40
+ ...(assessment.reviewTarget ? [`- Review target: \`${assessment.reviewTarget}\``] : []),
41
+ ...(assessment.reviewMode ? [`- Review mode: \`${assessment.reviewMode}\``] : []),
42
+ `- Score: ${assessment.score}/10`,
43
+ `- Threshold: ${assessment.threshold}/10`,
44
+ `- Status: \`${assessment.status}\``,
45
+ `- Decision: \`${assessment.decision}\``,
46
+ `- Next action: ${assessment.nextAction}`,
47
+ "",
48
+ "## Artifacts",
49
+ "",
50
+ "| Key | Path | Status | Bytes |",
51
+ "| --- | --- | --- | --- |",
52
+ ...assessment.artifacts.map((artifact) => `| ${artifact.key} | \`${artifact.path}\` | ${artifact.exists ? "present" : "missing"} | ${artifact.bytes} |`),
53
+ ...renderArtifactChildren(assessment),
54
+ "",
55
+ "## Criteria",
56
+ "",
57
+ "| ID | Result | Required | Weight | Gap | Evidence |",
58
+ "| --- | --- | --- | --- | --- | --- |",
59
+ ...assessment.criteria.map((criterion) => `| ${criterion.id} | ${criterion.passed ? "PASS" : "FAIL"} | ${criterion.required ? "yes" : "no"} | ${criterion.weight} | ${criterion.gap ?? ""} | ${criterion.evidence.join("<br>")} |`),
60
+ "",
61
+ "## Blockers",
62
+ "",
63
+ ...(assessment.blockers.length > 0 ? assessment.blockers.map((blocker) => `- ${blocker}`) : ["- none"]),
64
+ "",
65
+ "## Gaps",
66
+ "",
67
+ ...(assessment.gaps.length > 0 ? assessment.gaps.map((gap) => `- ${gap}`) : ["- none"]),
68
+ ...(assessment.waiver ? [
69
+ "",
70
+ "## Risk Acceptance",
71
+ "",
72
+ `- Reason: ${assessment.waiver.reason}`,
73
+ `- Applied at: ${assessment.waiver.appliedAt}`,
74
+ ] : []),
75
+ "",
76
+ ].join("\n");
77
+ }
78
+ export function renderWaiverMarkdown(assessment) {
79
+ return [
80
+ "# Risk Acceptance",
81
+ "",
82
+ `- Stage: \`${assessment.stage}\``,
83
+ ...(assessment.module ? [`- Module: \`${assessment.module}\``] : []),
84
+ `- Score: ${assessment.score}/10`,
85
+ `- Threshold: ${assessment.threshold}/10`,
86
+ `- Reason: ${assessment.waiver?.reason ?? ""}`,
87
+ `- Applied at: ${assessment.waiver?.appliedAt ?? ""}`,
88
+ "",
89
+ "## Accepted Gaps",
90
+ "",
91
+ ...(assessment.gaps.length > 0 ? assessment.gaps.map((gap) => `- ${gap}`) : ["- none"]),
92
+ "",
93
+ "This waiver does not convert missing required artifacts into PASS. It only records an explicit human risk decision for quality gaps that are below the configured threshold.",
94
+ "",
95
+ ].join("\n");
96
+ }
97
+ function roundScore(value) {
98
+ return Math.round(value * 10) / 10;
99
+ }
100
+ function renderArtifactChildren(assessment) {
101
+ const rows = assessment.artifacts.flatMap((artifact) => (artifact.children ?? []).map((child) => `| ${artifact.key} | \`${child.path}\` | ${child.status} | ${child.bytes} |`));
102
+ if (rows.length === 0)
103
+ return [];
104
+ return [
105
+ "",
106
+ "## Artifact Children",
107
+ "",
108
+ "| Parent | Path | Status | Bytes |",
109
+ "| --- | --- | --- | --- |",
110
+ ...rows,
111
+ ];
112
+ }
113
+ function nextActionFor(status) {
114
+ if (status === "READY")
115
+ return "Proceed to the requested stage with the recorded assessment evidence.";
116
+ if (status === "WAIVED")
117
+ return "Proceed with the accepted risk and carry the gaps into the next stage output.";
118
+ if (status === "NEEDS_CONFIRMATION")
119
+ return "Ask for human confirmation, improve upstream artifacts, or rerun with --accept-risk and a concrete reason.";
120
+ return "Do not start the stage; fix missing required artifacts or required criteria first.";
121
+ }
122
+ //# sourceMappingURL=stage-quality-rendering.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stage-quality-rendering.js","sourceRoot":"","sources":["../../src/core/stage-quality-rendering.ts"],"names":[],"mappings":"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"}
@@ -1,56 +1,9 @@
1
1
  import type { ProjectConfig } from "./config.js";
2
- export type GateAssessmentOptions = {
3
- stage: string;
4
- module?: string;
5
- threshold?: number;
6
- acceptRisk?: string;
7
- };
8
- export type GateStatus = "READY" | "NEEDS_CONFIRMATION" | "BLOCKED" | "WAIVED";
9
- export type GateCriterion = {
10
- id: string;
11
- label: string;
12
- weight: number;
13
- passed: boolean;
14
- required: boolean;
15
- evidence: string[];
16
- gap?: string;
17
- };
18
- export type GateArtifact = {
19
- key: string;
20
- path: string;
21
- exists: boolean;
22
- bytes: number;
23
- };
24
- export type GateAssessment = {
25
- version: 1;
26
- runId: string;
27
- stage: string;
28
- module?: string;
29
- threshold: number;
30
- score: number;
31
- status: GateStatus;
32
- decision: "proceed" | "human-confirmation-required" | "blocked";
33
- artifacts: GateArtifact[];
34
- criteria: GateCriterion[];
35
- blockers: string[];
36
- gaps: string[];
37
- waiver?: {
38
- reason: string;
39
- appliedAt: string;
40
- };
41
- nextAction: string;
42
- };
43
- export type GateAssessmentBundle = {
44
- assessment: GateAssessment;
45
- artifacts: {
46
- dir: string;
47
- jsonPath: string;
48
- markdownPath: string;
49
- waiverPath?: string;
50
- };
51
- markdown: string;
52
- waiverMarkdown?: string;
53
- };
2
+ import { normalizeReviewTargetPath, reviewModeForReviewTarget } from "./stage-quality-artifacts.js";
3
+ import type { GateAssessment, GateAssessmentBundle, GateAssessmentOptions, GateArtifact, GateCriterion, GateStatus, ReviewGateMode } from "./stage-quality-contracts.js";
4
+ export type { GateAssessment, GateAssessmentBundle, GateAssessmentOptions, GateArtifact, GateCriterion, GateStatus, ReviewGateMode, };
5
+ export { normalizeReviewTargetPath, reviewModeForReviewTarget };
54
6
  export declare function writeGateAssessment(target: string, config: ProjectConfig, opts: GateAssessmentOptions): Promise<GateAssessmentBundle>;
55
7
  export declare function gateThresholdForStage(config: ProjectConfig, stage: string): number | undefined;
56
8
  export declare function buildGateAssessment(target: string, config: ProjectConfig, opts: GateAssessmentOptions): Promise<GateAssessmentBundle>;
9
+ export declare function createGateRunId(now?: Date): string;