@devtrack-solution/codesdd 1.2.3 → 1.2.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 (213) hide show
  1. package/.sdd/skills/curated/devtrack-api/SKILL.md +98 -12
  2. package/.sdd/skills/curated/devtrack-api/agents/claude-code.yaml +10 -0
  3. package/.sdd/skills/curated/devtrack-api/agents/codex.yaml +10 -0
  4. package/.sdd/skills/curated/devtrack-api/agents/cursor.yaml +10 -0
  5. package/.sdd/skills/curated/devtrack-api/agents/gemini.yaml +10 -0
  6. package/.sdd/skills/curated/devtrack-api/agents/kimi.yaml +10 -0
  7. package/.sdd/skills/curated/devtrack-api/agents/openai.yaml +5 -3
  8. package/.sdd/skills/curated/devtrack-api/agents/opencode.yaml +12 -0
  9. package/.sdd/skills/curated/devtrack-api/references/application-presentation.md +61 -5
  10. package/.sdd/skills/curated/devtrack-api/references/consumer-sync-policy.md +15 -3
  11. package/.sdd/skills/curated/devtrack-api/references/contract-pack.yaml +1951 -0
  12. package/.sdd/skills/curated/devtrack-api/references/domain-modeling.md +16 -14
  13. package/.sdd/skills/curated/devtrack-api/references/field-validation-protocol.md +40 -0
  14. package/.sdd/skills/curated/devtrack-api/references/foundation-layout.md +19 -2
  15. package/.sdd/skills/curated/devtrack-api/references/generated-artifact-invalidation.md +97 -0
  16. package/.sdd/skills/curated/devtrack-api/references/implementation-checklist.md +30 -1
  17. package/.sdd/skills/curated/devtrack-api/references/portable-agent-contract.md +42 -0
  18. package/.sdd/skills/curated/devtrack-api/references/testing-validation.md +22 -1
  19. package/.sdd/skills/curated/devtrack-api/references/typeorm-infrastructure.md +9 -7
  20. package/README.md +280 -29
  21. package/dist/applications/sdd/index.d.ts +16 -0
  22. package/dist/applications/sdd/index.js +16 -0
  23. package/dist/cli/program.js +180 -11
  24. package/dist/commands/config.js +197 -10
  25. package/dist/commands/sdd/execution.js +408 -16
  26. package/dist/commands/sdd/plugin.js +5 -0
  27. package/dist/commands/sdd/shared.d.ts +1 -0
  28. package/dist/commands/sdd/shared.js +10 -0
  29. package/dist/commands/sdd.js +157 -7
  30. package/dist/core/cli/command-matrix.d.ts +18 -0
  31. package/dist/core/cli/command-matrix.js +157 -0
  32. package/dist/core/cli-command-quality.js +11 -0
  33. package/dist/core/completions/command-registry.js +45 -0
  34. package/dist/core/config-schema.d.ts +31 -1
  35. package/dist/core/config-schema.js +79 -5
  36. package/dist/core/config.d.ts +1 -0
  37. package/dist/core/config.js +11 -0
  38. package/dist/core/global-config.d.ts +29 -0
  39. package/dist/core/init.d.ts +2 -2
  40. package/dist/core/init.js +13 -14
  41. package/dist/core/sdd/agent-binding.d.ts +19 -19
  42. package/dist/core/sdd/agent-runtime-contract.d.ts +204 -0
  43. package/dist/core/sdd/agent-runtime-contract.js +200 -0
  44. package/dist/core/sdd/allocator-recovery.d.ts +14 -0
  45. package/dist/core/sdd/allocator-recovery.js +30 -0
  46. package/dist/core/sdd/allocator-security.d.ts +18 -0
  47. package/dist/core/sdd/allocator-security.js +36 -0
  48. package/dist/core/sdd/api-foundation-baseline.d.ts +111 -0
  49. package/dist/core/sdd/api-foundation-baseline.js +151 -0
  50. package/dist/core/sdd/api-foundation-parity.d.ts +114 -0
  51. package/dist/core/sdd/api-foundation-parity.js +131 -0
  52. package/dist/core/sdd/api-profile-catalog.d.ts +36 -0
  53. package/dist/core/sdd/api-profile-catalog.js +132 -0
  54. package/dist/core/sdd/api-profile-dry-run-projection.d.ts +93 -0
  55. package/dist/core/sdd/api-profile-dry-run-projection.js +370 -0
  56. package/dist/core/sdd/api-profile-recipes.d.ts +82 -0
  57. package/dist/core/sdd/api-profile-recipes.js +484 -0
  58. package/dist/core/sdd/artifact-id-allocator.d.ts +368 -0
  59. package/dist/core/sdd/artifact-id-allocator.js +510 -0
  60. package/dist/core/sdd/check.d.ts +52 -1
  61. package/dist/core/sdd/check.js +326 -11
  62. package/dist/core/sdd/coordination/coordination-adapters.d.ts +15 -8
  63. package/dist/core/sdd/coordination/coordination-adapters.js +43 -15
  64. package/dist/core/sdd/coordination/index.d.ts +1 -0
  65. package/dist/core/sdd/coordination/index.js +1 -0
  66. package/dist/core/sdd/coordination/redis-runtime.d.ts +131 -0
  67. package/dist/core/sdd/coordination/redis-runtime.js +698 -0
  68. package/dist/core/sdd/deepagent-contracts.d.ts +99 -5
  69. package/dist/core/sdd/deepagent-contracts.js +62 -0
  70. package/dist/core/sdd/deepagents/reversa-subagents.d.ts +3 -3
  71. package/dist/core/sdd/default-bootstrap-files.d.ts +2 -2
  72. package/dist/core/sdd/default-bootstrap-files.js +14 -10
  73. package/dist/core/sdd/default-skills.js +115 -9
  74. package/dist/core/sdd/devtrack-api-appliance.d.ts +42 -1
  75. package/dist/core/sdd/devtrack-api-appliance.js +159 -32
  76. package/dist/core/sdd/devtrack-api-architecture.d.ts +16 -0
  77. package/dist/core/sdd/devtrack-api-architecture.js +86 -0
  78. package/dist/core/sdd/docs-sync.js +24 -18
  79. package/dist/core/sdd/domain/capability-diff.d.ts +63 -0
  80. package/dist/core/sdd/domain/capability-diff.js +200 -0
  81. package/dist/core/sdd/domain/change-safety-guardrails.d.ts +74 -0
  82. package/dist/core/sdd/domain/change-safety-guardrails.js +333 -0
  83. package/dist/core/sdd/domain/semantic-intent-classifier.d.ts +29 -0
  84. package/dist/core/sdd/domain/semantic-intent-classifier.js +117 -0
  85. package/dist/core/sdd/enterprise-mutating-command-gate.d.ts +27 -0
  86. package/dist/core/sdd/enterprise-mutating-command-gate.js +104 -0
  87. package/dist/core/sdd/enterprise-provenance-gates.d.ts +20 -0
  88. package/dist/core/sdd/enterprise-provenance-gates.js +63 -0
  89. package/dist/core/sdd/enterprise-provisioning-policy.d.ts +26 -0
  90. package/dist/core/sdd/enterprise-provisioning-policy.js +104 -0
  91. package/dist/core/sdd/foundation-artifact-map-validator.d.ts +16 -0
  92. package/dist/core/sdd/foundation-artifact-map-validator.js +71 -0
  93. package/dist/core/sdd/foundation-layer-manifest.d.ts +24 -0
  94. package/dist/core/sdd/foundation-layer-manifest.js +117 -0
  95. package/dist/core/sdd/governance-schemas.d.ts +2 -2
  96. package/dist/core/sdd/governance-schemas.js +11 -2
  97. package/dist/core/sdd/intent-guard.d.ts +22 -0
  98. package/dist/core/sdd/intent-guard.js +67 -0
  99. package/dist/core/sdd/json-schema.js +13 -1
  100. package/dist/core/sdd/legacy-operations.js +169 -5
  101. package/dist/core/sdd/migrate-workspace.js +39 -0
  102. package/dist/core/sdd/package-security-gates.d.ts +21 -0
  103. package/dist/core/sdd/package-security-gates.js +121 -0
  104. package/dist/core/sdd/package-structure-gate.d.ts +85 -3
  105. package/dist/core/sdd/package-structure-gate.js +384 -11
  106. package/dist/core/sdd/parallel-feat-automation.d.ts +185 -7
  107. package/dist/core/sdd/parallel-feat-automation.js +212 -0
  108. package/dist/core/sdd/plugin-broker.d.ts +223 -4
  109. package/dist/core/sdd/plugin-broker.js +10 -0
  110. package/dist/core/sdd/plugin-cli.d.ts +30 -0
  111. package/dist/core/sdd/plugin-cli.js +70 -3
  112. package/dist/core/sdd/plugin-evidence.d.ts +73 -0
  113. package/dist/core/sdd/plugin-manifest.d.ts +69 -1
  114. package/dist/core/sdd/plugin-manifest.js +10 -0
  115. package/dist/core/sdd/plugin-policy-pack.d.ts +1 -1
  116. package/dist/core/sdd/plugin-policy.js +6 -1
  117. package/dist/core/sdd/plugin-registry.d.ts +138 -2
  118. package/dist/core/sdd/plugin-sdk-contract.d.ts +363 -0
  119. package/dist/core/sdd/plugin-sdk-contract.js +268 -0
  120. package/dist/core/sdd/plugin-skill-binding.d.ts +1 -1
  121. package/dist/core/sdd/quality-validation.d.ts +89 -16
  122. package/dist/core/sdd/release-readiness.d.ts +68 -0
  123. package/dist/core/sdd/release-readiness.js +767 -0
  124. package/dist/core/sdd/reversa-architecture-extractor.d.ts +13 -0
  125. package/dist/core/sdd/reversa-architecture-extractor.js +89 -0
  126. package/dist/core/sdd/reversa-artifact-writer.d.ts +18 -0
  127. package/dist/core/sdd/reversa-artifact-writer.js +40 -0
  128. package/dist/core/sdd/reversa-command-policy.d.ts +136 -0
  129. package/dist/core/sdd/reversa-command-policy.js +361 -0
  130. package/dist/core/sdd/reversa-data-extractor.d.ts +11 -0
  131. package/dist/core/sdd/reversa-data-extractor.js +73 -0
  132. package/dist/core/sdd/reversa-equivalence.d.ts +20 -0
  133. package/dist/core/sdd/reversa-equivalence.js +34 -0
  134. package/dist/core/sdd/reversa-evidence.d.ts +298 -0
  135. package/dist/core/sdd/reversa-evidence.js +118 -0
  136. package/dist/core/sdd/reversa-reconstruction.d.ts +29 -0
  137. package/dist/core/sdd/reversa-reconstruction.js +32 -0
  138. package/dist/core/sdd/reversa-rules-extractor.d.ts +12 -0
  139. package/dist/core/sdd/reversa-rules-extractor.js +86 -0
  140. package/dist/core/sdd/reversa-source-safety.d.ts +19 -0
  141. package/dist/core/sdd/reversa-source-safety.js +105 -0
  142. package/dist/core/sdd/reversa-surface-scout.d.ts +13 -0
  143. package/dist/core/sdd/reversa-surface-scout.js +85 -0
  144. package/dist/core/sdd/reversa-ux-mapper.d.ts +11 -0
  145. package/dist/core/sdd/reversa-ux-mapper.js +73 -0
  146. package/dist/core/sdd/runtime-boundary-contract.d.ts +45 -0
  147. package/dist/core/sdd/runtime-boundary-contract.js +90 -0
  148. package/dist/core/sdd/sdk-agent-plugin-quality-gates.d.ts +150 -0
  149. package/dist/core/sdd/sdk-agent-plugin-quality-gates.js +258 -0
  150. package/dist/core/sdd/services/agent-run.service.d.ts +38 -6
  151. package/dist/core/sdd/services/agent-run.service.js +73 -1
  152. package/dist/core/sdd/services/archive-quality-coherence.service.d.ts +17 -0
  153. package/dist/core/sdd/services/archive-quality-coherence.service.js +141 -0
  154. package/dist/core/sdd/services/capability-diff.service.d.ts +18 -0
  155. package/dist/core/sdd/services/capability-diff.service.js +26 -0
  156. package/dist/core/sdd/services/change-safety-preflight.service.d.ts +17 -0
  157. package/dist/core/sdd/services/change-safety-preflight.service.js +17 -0
  158. package/dist/core/sdd/services/context.service.d.ts +43 -340
  159. package/dist/core/sdd/services/context.service.js +323 -9
  160. package/dist/core/sdd/services/decide.service.js +1 -1
  161. package/dist/core/sdd/services/finalize.service.d.ts +27 -0
  162. package/dist/core/sdd/services/finalize.service.js +226 -18
  163. package/dist/core/sdd/services/frontend-impact.service.d.ts +1 -1
  164. package/dist/core/sdd/services/historical-quality-regression.service.d.ts +35 -0
  165. package/dist/core/sdd/services/historical-quality-regression.service.js +228 -0
  166. package/dist/core/sdd/services/ingest-deposito.service.js +1 -1
  167. package/dist/core/sdd/services/planning-execution-coherence.service.d.ts +45 -0
  168. package/dist/core/sdd/services/planning-execution-coherence.service.js +225 -0
  169. package/dist/core/sdd/services/semantic-intent-classifier.service.d.ts +6 -0
  170. package/dist/core/sdd/services/semantic-intent-classifier.service.js +7 -0
  171. package/dist/core/sdd/state.d.ts +1 -0
  172. package/dist/core/sdd/state.js +266 -34
  173. package/dist/core/sdd/store/sdd-stores.js +2 -2
  174. package/dist/core/sdd/structural-health.d.ts +13 -13
  175. package/dist/core/sdd/types.d.ts +30 -15
  176. package/dist/core/sdd/types.js +4 -0
  177. package/dist/core/sdd/views.js +17 -0
  178. package/dist/core/sdd/workspace-schemas.d.ts +428 -7
  179. package/dist/core/sdd/workspace-schemas.js +223 -70
  180. package/dist/core/shared/skill-generation.d.ts +2 -0
  181. package/dist/core/shared/skill-generation.js +19 -2
  182. package/dist/core/shared/tool-detection.d.ts +19 -0
  183. package/dist/core/shared/tool-detection.js +89 -0
  184. package/dist/domains/sdd/index.d.ts +6 -0
  185. package/dist/domains/sdd/index.js +6 -0
  186. package/dist/infrastructures/sdd/index.d.ts +7 -0
  187. package/dist/infrastructures/sdd/index.js +6 -0
  188. package/dist/presentations/cli/sdd/index.d.ts +3 -0
  189. package/dist/presentations/cli/sdd/index.js +3 -0
  190. package/dist/shared/sdd/index.d.ts +3 -0
  191. package/dist/shared/sdd/index.js +2 -0
  192. package/package.json +14 -10
  193. package/schemas/sdd/2-plan.schema.json +207 -2
  194. package/schemas/sdd/5-quality.schema.json +324 -25
  195. package/schemas/sdd/agent-runtime-command-plan.schema.json +212 -0
  196. package/schemas/sdd/agent-runtime-opencode-run-evidence.schema.json +270 -0
  197. package/schemas/sdd/codesdd-plugin.schema.json +171 -0
  198. package/schemas/sdd/deepagent-run-request.schema.json +316 -0
  199. package/schemas/sdd/parallel-feat-automation-plan.schema.json +89 -0
  200. package/schemas/sdd/parallel-feat-scheduler-request.schema.json +116 -0
  201. package/schemas/sdd/parallel-feat-scheduler-result.schema.json +404 -0
  202. package/schemas/sdd/plugin-artifact-manifest.schema.json +109 -0
  203. package/schemas/sdd/plugin-artifact-map.schema.json +223 -0
  204. package/schemas/sdd/plugin-evidence-manifest.schema.json +109 -0
  205. package/schemas/sdd/plugin-language-runtime.schema.json +103 -0
  206. package/schemas/sdd/plugin-package-governance.schema.json +74 -0
  207. package/schemas/sdd/plugin-registry.schema.json +171 -0
  208. package/schemas/sdd/plugin-runtime-invocation-plan.schema.json +109 -0
  209. package/schemas/sdd/quality-evidence-bundle.schema.json +109 -0
  210. package/schemas/sdd/reversa-evidence-bundle.schema.json +466 -0
  211. package/schemas/sdd/sdk-agent-plugin-quality-gate-input.schema.json +168 -0
  212. package/schemas/sdd/sdk-agent-plugin-quality-gate-report.schema.json +160 -0
  213. package/schemas/sdd/workspace-catalog.schema.json +5298 -1409
@@ -20,6 +20,65 @@ export const workspacePolicyInjectionSchema = z.object({
20
20
  generated_from: z.literal('recommended_skills'),
21
21
  required_policies: z.array(workspacePolicyRequirementSchema).default([]),
22
22
  });
23
+ const workspacePercentSchema = z.number().min(0).max(100);
24
+ export const workspaceValidationGateSchema = z.object({
25
+ name: z.string().min(1),
26
+ command: z.string().min(1),
27
+ expected: z.string().min(1),
28
+ });
29
+ export const workspaceExecutionStepSchema = z.object({
30
+ name: z.string().min(1),
31
+ command: z.string().min(1),
32
+ writes_state: z.boolean().default(false),
33
+ expected_state_writes: z.array(z.string().min(1)).default([]),
34
+ });
35
+ export const workspacePlanExecutionSchema = z
36
+ .object({
37
+ mode: z.enum(['single-feature', 'parallel-wave', 'chained-features']).default('single-feature'),
38
+ state_boundary_ref: z.literal('codesdd-canonical-sdd-state').default('codesdd-canonical-sdd-state'),
39
+ command_sequence: z.array(workspaceExecutionStepSchema).min(1),
40
+ allowed_state_writes: z.array(z.string().min(1)).default([]),
41
+ forbidden_state_writes: z.array(z.string().min(1)).default(['.codesdd/**', 'external-context/**']),
42
+ handoff_artifacts: z.array(z.string().min(1)).default([]),
43
+ })
44
+ .default({
45
+ mode: 'single-feature',
46
+ state_boundary_ref: 'codesdd-canonical-sdd-state',
47
+ command_sequence: [
48
+ {
49
+ name: 'SDD check',
50
+ command: 'codesdd sdd check --render',
51
+ writes_state: false,
52
+ expected_state_writes: [],
53
+ },
54
+ ],
55
+ allowed_state_writes: [],
56
+ forbidden_state_writes: ['.codesdd/**', 'external-context/**'],
57
+ handoff_artifacts: [],
58
+ });
59
+ export const workspacePlanGovernanceSchema = z
60
+ .object({
61
+ state_boundary: z.literal('codesdd-canonical-sdd-state').default('codesdd-canonical-sdd-state'),
62
+ planning_artifacts: z.array(z.string().min(1)).min(1),
63
+ decision_refs: z.array(z.string().min(1)).default([]),
64
+ planned_state_writes: z.array(z.string().min(1)).default([]),
65
+ rollback_plan: z.string().min(20),
66
+ validation_gates: z.array(workspaceValidationGateSchema).min(1),
67
+ })
68
+ .default({
69
+ state_boundary: 'codesdd-canonical-sdd-state',
70
+ planning_artifacts: ['.sdd/state/backlog.yaml'],
71
+ decision_refs: [],
72
+ planned_state_writes: [],
73
+ rollback_plan: 'Review and revert only the scoped CodeSDD feature workspace and state changes if validation fails.',
74
+ validation_gates: [
75
+ {
76
+ name: 'SDD check',
77
+ command: 'codesdd sdd check --render',
78
+ expected: 'CodeSDD state and generated views remain valid.',
79
+ },
80
+ ],
81
+ });
23
82
  export const workspaceSpecSchema = z.object({
24
83
  schema_version: z.literal(1),
25
84
  feature_id: workspaceFeatureIdSchema,
@@ -52,6 +111,8 @@ export const workspaceSpecSchema = z.object({
52
111
  export const workspacePlanSchema = z.object({
53
112
  schema_version: z.literal(1),
54
113
  feature_id: workspaceFeatureIdSchema,
114
+ governance: workspacePlanGovernanceSchema,
115
+ execution_plan: workspacePlanExecutionSchema,
55
116
  architectural_impact: z.object({
56
117
  description: z.string(),
57
118
  affected_modules: z.array(z.string()),
@@ -65,8 +126,8 @@ export const workspacePlanSchema = z.object({
65
126
  change_type: z.string(),
66
127
  })),
67
128
  quality_strategy: z.object({
68
- unit_target: z.number(),
69
- integration_target: z.number(),
129
+ unit_target: workspacePercentSchema,
130
+ integration_target: workspacePercentSchema,
70
131
  approach: z.string(),
71
132
  }),
72
133
  suggested_skills: z.array(z.string()),
@@ -156,25 +217,165 @@ export const workspaceTraceabilitySchema = z.object({
156
217
  }),
157
218
  requirements: z.array(workspaceTraceabilityRequirementSchema).default([]),
158
219
  });
220
+ export const workspaceQualityLedgerAxisSchema = z.object({
221
+ raw_score: workspacePercentSchema,
222
+ weighted_score: workspacePercentSchema,
223
+ rationale: z.string().min(1),
224
+ });
225
+ export const workspaceQualityLedgerWeightsSchema = z
226
+ .object({
227
+ coverage: workspacePercentSchema.default(30),
228
+ traceability: workspacePercentSchema.default(20),
229
+ integrity: workspacePercentSchema.default(20),
230
+ naming: workspacePercentSchema.default(10),
231
+ token: workspacePercentSchema.default(20),
232
+ })
233
+ .superRefine((weights, ctx) => {
234
+ const total = weights.coverage + weights.traceability + weights.integrity + weights.naming + weights.token;
235
+ if (total !== 100) {
236
+ ctx.addIssue({
237
+ code: z.ZodIssueCode.custom,
238
+ message: `q95_ledger.weights must total 100, got ${total}.`,
239
+ });
240
+ }
241
+ });
242
+ export const workspaceQualityLedgerSchema = z
243
+ .object({
244
+ threshold: workspacePercentSchema.default(95),
245
+ score: workspacePercentSchema.default(0),
246
+ status: z.enum(['pass', 'fail', 'pending']).default('pending'),
247
+ computed_at: z.string().default(''),
248
+ weights: workspaceQualityLedgerWeightsSchema.default({
249
+ coverage: 30,
250
+ traceability: 20,
251
+ integrity: 20,
252
+ naming: 10,
253
+ token: 20,
254
+ }),
255
+ axes: z
256
+ .object({
257
+ coverage: workspaceQualityLedgerAxisSchema,
258
+ traceability: workspaceQualityLedgerAxisSchema,
259
+ integrity: workspaceQualityLedgerAxisSchema,
260
+ naming: workspaceQualityLedgerAxisSchema,
261
+ token: workspaceQualityLedgerAxisSchema,
262
+ })
263
+ .default({
264
+ coverage: {
265
+ raw_score: 0,
266
+ weighted_score: 0,
267
+ rationale: 'Computed during finalize.'
268
+ },
269
+ traceability: {
270
+ raw_score: 0,
271
+ weighted_score: 0,
272
+ rationale: 'Computed during finalize.'
273
+ },
274
+ integrity: {
275
+ raw_score: 0,
276
+ weighted_score: 0,
277
+ rationale: 'Computed during finalize.'
278
+ },
279
+ naming: {
280
+ raw_score: 0,
281
+ weighted_score: 0,
282
+ rationale: 'Computed during finalize.'
283
+ },
284
+ token: {
285
+ raw_score: 0,
286
+ weighted_score: 0,
287
+ rationale: 'Computed during finalize.'
288
+ },
289
+ }),
290
+ next_best_action: z.string().default('Record missing evidence to raise the lowest weighted axis.'),
291
+ })
292
+ .superRefine((ledger, ctx) => {
293
+ if (ledger.status === 'pass' && ledger.score < ledger.threshold) {
294
+ ctx.addIssue({
295
+ code: z.ZodIssueCode.custom,
296
+ path: ['status'],
297
+ message: 'q95_ledger.status cannot be pass when score is below threshold.',
298
+ });
299
+ }
300
+ });
301
+ export const workspaceTokenTelemetrySchema = z.object({
302
+ mode: z.enum(['compact', 'standard', 'full']).optional(),
303
+ budget_chars: z.number().int().positive().optional(),
304
+ actual_chars: z.number().int().nonnegative().optional(),
305
+ efficiency_percent: workspacePercentSchema.optional(),
306
+ gate: z.enum(['pass', 'warn', 'fail']).default('pass'),
307
+ evidence_ref: z.string().min(1).optional(),
308
+ notes: z.string().optional(),
309
+ });
310
+ export const workspaceTokenBudgetGatesSchema = z.object({
311
+ max_context_chars: z.number().int().positive().optional(),
312
+ require_numeric_efficiency: z.boolean().default(true),
313
+ fail_below_percent: workspacePercentSchema.default(95),
314
+ telemetry: z.array(workspaceTokenTelemetrySchema).default([]),
315
+ });
316
+ export const workspaceRuntimePerformanceTelemetrySchema = z.object({
317
+ command: z.string().min(1),
318
+ metric: z.enum(['duration_ms', 'p95_ms', 'memory_mb', 'cpu_percent']).default('duration_ms'),
319
+ threshold: z.number().nonnegative().optional(),
320
+ actual: z.number().nonnegative().optional(),
321
+ gate: z.enum(['pass', 'warn', 'fail']).default('pass'),
322
+ evidence_ref: z.string().min(1).optional(),
323
+ notes: z.string().optional(),
324
+ });
325
+ export const workspaceFlakinessTelemetrySchema = z.object({
326
+ command: z.string().min(1),
327
+ attempts: z.number().int().positive().optional(),
328
+ failures: z.number().int().nonnegative().optional(),
329
+ failure_rate_percent: workspacePercentSchema.optional(),
330
+ gate: z.enum(['pass', 'warn', 'fail']).default('pass'),
331
+ evidence_ref: z.string().min(1).optional(),
332
+ notes: z.string().optional(),
333
+ });
334
+ export const workspaceRuntimeQualityGatesSchema = z.object({
335
+ mode: z.enum(['observe', 'enforce']).default('observe'),
336
+ performance: z.array(workspaceRuntimePerformanceTelemetrySchema).default([]),
337
+ flakiness: z.array(workspaceFlakinessTelemetrySchema).default([]),
338
+ });
339
+ export const workspaceCriticalEvidenceProvenanceSchema = z.object({
340
+ command: z.string().min(1),
341
+ exit_code: z.number().int(),
342
+ timestamp_iso: z.string().datetime(),
343
+ commit_sha: z.string().regex(/^[0-9a-f]{7,40}$/i),
344
+ artifact_path: z.string().min(1),
345
+ artifact_hash: z.string().min(1),
346
+ });
347
+ export const workspaceEvidenceLogEntrySchema = z
348
+ .object({
349
+ timestamp: z.string(),
350
+ kind: z.string(),
351
+ result: z.string(),
352
+ artifact: z.string().optional(),
353
+ critical: z.boolean().optional(),
354
+ provenance: workspaceCriticalEvidenceProvenanceSchema.optional(),
355
+ })
356
+ .superRefine((entry, ctx) => {
357
+ if (entry.critical === true && !entry.provenance) {
358
+ ctx.addIssue({
359
+ code: z.ZodIssueCode.custom,
360
+ path: ['provenance'],
361
+ message: 'critical evidence entries must include provenance with command, exit_code, timestamp_iso, commit_sha, artifact_path, and artifact_hash.',
362
+ });
363
+ }
364
+ });
159
365
  export const workspaceQualitySchema = z.object({
160
366
  schema_version: z.literal(1),
161
367
  feature_id: workspaceFeatureIdSchema,
162
368
  coverage_targets: z.object({
163
- unit: z.number(),
164
- integration: z.number(),
165
- modules: z.record(z.string(), z.number()).optional(),
369
+ unit: workspacePercentSchema,
370
+ integration: workspacePercentSchema,
371
+ modules: z.record(z.string(), workspacePercentSchema).optional(),
166
372
  }),
167
373
  validation_strategies: z.array(z.object({
168
374
  name: z.string(),
169
375
  command: z.string(),
170
376
  expected: z.string(),
171
377
  })),
172
- evidence_log: z.array(z.object({
173
- timestamp: z.string(),
174
- kind: z.string(),
175
- result: z.string(),
176
- artifact: z.string().optional(),
177
- })),
378
+ evidence_log: z.array(workspaceEvidenceLogEntrySchema),
178
379
  skill_evidence: z
179
380
  .object({
180
381
  required_skill_ids: z.array(z.string()),
@@ -234,65 +435,17 @@ export const workspaceQualitySchema = z.object({
234
435
  notes: z.string().optional(),
235
436
  })
236
437
  .optional(),
237
- q95_ledger: z
238
- .object({
239
- threshold: z.number().default(95),
240
- score: z.number().default(0),
241
- status: z.enum(['pass', 'fail', 'pending']).default('pending'),
242
- computed_at: z.string().default(''),
243
- weights: z
244
- .object({
245
- coverage: z.number().default(30),
246
- traceability: z.number().default(20),
247
- integrity: z.number().default(20),
248
- naming: z.number().default(10),
249
- token: z.number().default(20),
250
- })
251
- .default({
252
- coverage: 30,
253
- traceability: 20,
254
- integrity: 20,
255
- naming: 10,
256
- token: 20,
257
- }),
258
- axes: z
259
- .object({
260
- coverage: z.object({ raw_score: z.number(), weighted_score: z.number(), rationale: z.string() }),
261
- traceability: z.object({ raw_score: z.number(), weighted_score: z.number(), rationale: z.string() }),
262
- integrity: z.object({ raw_score: z.number(), weighted_score: z.number(), rationale: z.string() }),
263
- naming: z.object({ raw_score: z.number(), weighted_score: z.number(), rationale: z.string() }),
264
- token: z.object({ raw_score: z.number(), weighted_score: z.number(), rationale: z.string() }),
265
- })
266
- .default({
267
- coverage: {
268
- raw_score: 0,
269
- weighted_score: 0,
270
- rationale: 'Computed during finalize.'
271
- },
272
- traceability: {
273
- raw_score: 0,
274
- weighted_score: 0,
275
- rationale: 'Computed during finalize.'
276
- },
277
- integrity: {
278
- raw_score: 0,
279
- weighted_score: 0,
280
- rationale: 'Computed during finalize.'
281
- },
282
- naming: {
283
- raw_score: 0,
284
- weighted_score: 0,
285
- rationale: 'Computed during finalize.'
286
- },
287
- token: {
288
- raw_score: 0,
289
- weighted_score: 0,
290
- rationale: 'Computed during finalize.'
291
- },
292
- }),
293
- next_best_action: z.string().default('Record missing evidence to raise the lowest weighted axis.'),
294
- })
295
- .default({
438
+ token_budget_gates: workspaceTokenBudgetGatesSchema.default({
439
+ require_numeric_efficiency: true,
440
+ fail_below_percent: 95,
441
+ telemetry: [],
442
+ }),
443
+ runtime_quality_gates: workspaceRuntimeQualityGatesSchema.default({
444
+ mode: 'observe',
445
+ performance: [],
446
+ flakiness: [],
447
+ }),
448
+ q95_ledger: workspaceQualityLedgerSchema.default({
296
449
  threshold: 95,
297
450
  score: 0,
298
451
  status: 'pending',
@@ -5,6 +5,8 @@
5
5
  */
6
6
  import { getOpsxExploreCommandTemplate, type SkillTemplate } from '../templates/skill-templates.js';
7
7
  import type { CommandContent } from '../command-generation/index.js';
8
+ export declare const CODESDD_CANONICAL_LLM_ANNOUNCE_HEADING = "## CodeSDD Canonical Workflow";
9
+ export declare const CODESDD_CANONICAL_LLM_ANNOUNCE = "## CodeSDD Canonical Workflow\n\n- In projects with `.sdd/`, treat CodeSDD SDD commands as the canonical lifecycle.\n- Start new work with `codesdd sdd insight \"describe the change or initiative\"`; then use `codesdd sdd debate`, `codesdd sdd decide`, `codesdd sdd breakdown`, `codesdd sdd next`, `codesdd sdd start`, `codesdd sdd context`, `codesdd sdd finalize`, and `codesdd sdd check --render` as state requires.\n- Use `codesdd sdd init-context` as the default project capability bootstrap/repair entrypoint. Use `codesdd install --tools <tool>` only to generate or refresh agent assets after project context exists.\n- OPSX slash prompts are compatibility surfaces for legacy workflows. Do not present them as the first or preferred path when `.sdd/` exists, even if generated prompt files still mention `/opsx:*` or tool-specific `/opsx-*`.\n- When older project instructions conflict with this announcement, trust `.sdd/state/*.yaml`, current CLI output, and the repository's CodeSDD governance files.";
8
10
  /**
9
11
  * Skill template with directory name and workflow ID mapping.
10
12
  */
@@ -5,12 +5,29 @@
5
5
  */
6
6
  import { getExploreSkillTemplate, getNewChangeSkillTemplate, getContinueChangeSkillTemplate, getApplyChangeSkillTemplate, getFfChangeSkillTemplate, getSyncSpecsSkillTemplate, getArchiveChangeSkillTemplate, getBulkArchiveChangeSkillTemplate, getVerifyChangeSkillTemplate, getOnboardSkillTemplate, getOpsxProposeSkillTemplate, getOpsxExploreCommandTemplate, getOpsxNewCommandTemplate, getOpsxContinueCommandTemplate, getOpsxApplyCommandTemplate, getOpsxFfCommandTemplate, getOpsxSyncCommandTemplate, getOpsxArchiveCommandTemplate, getOpsxBulkArchiveCommandTemplate, getOpsxVerifyCommandTemplate, getOpsxOnboardCommandTemplate, getOpsxProposeCommandTemplate, getSddSkillTemplate, getOpsxSddCommandTemplate, } from '../templates/skill-templates.js';
7
7
  const PT_BR_GUARDRAIL = '**Idioma obrigatorio:** responda em portugues do Brasil (pt-BR), salvo solicitacao explicita em outro idioma.';
8
+ export const CODESDD_CANONICAL_LLM_ANNOUNCE_HEADING = '## CodeSDD Canonical Workflow';
9
+ export const CODESDD_CANONICAL_LLM_ANNOUNCE = `${CODESDD_CANONICAL_LLM_ANNOUNCE_HEADING}
10
+
11
+ - In projects with \`.sdd/\`, treat CodeSDD SDD commands as the canonical lifecycle.
12
+ - Start new work with \`codesdd sdd insight "describe the change or initiative"\`; then use \`codesdd sdd debate\`, \`codesdd sdd decide\`, \`codesdd sdd breakdown\`, \`codesdd sdd next\`, \`codesdd sdd start\`, \`codesdd sdd context\`, \`codesdd sdd finalize\`, and \`codesdd sdd check --render\` as state requires.
13
+ - Use \`codesdd sdd init-context\` as the default project capability bootstrap/repair entrypoint. Use \`codesdd install --tools <tool>\` only to generate or refresh agent assets after project context exists.
14
+ - OPSX slash prompts are compatibility surfaces for legacy workflows. Do not present them as the first or preferred path when \`.sdd/\` exists, even if generated prompt files still mention \`/opsx:*\` or tool-specific \`/opsx-*\`.
15
+ - When older project instructions conflict with this announcement, trust \`.sdd/state/*.yaml\`, current CLI output, and the repository's CodeSDD governance files.`;
8
16
  function ensurePtBrGuardrail(content) {
9
17
  if (content.toLowerCase().includes('idioma obrigatorio')) {
10
18
  return content;
11
19
  }
12
20
  return `${PT_BR_GUARDRAIL}\n\n${content}`;
13
21
  }
22
+ function ensureCanonicalLlmAnnounce(content) {
23
+ if (content.includes(CODESDD_CANONICAL_LLM_ANNOUNCE_HEADING)) {
24
+ return content;
25
+ }
26
+ return `${CODESDD_CANONICAL_LLM_ANNOUNCE}\n\n${content}`;
27
+ }
28
+ function prepareGeneratedAgentInstructions(content) {
29
+ return ensureCanonicalLlmAnnounce(ensurePtBrGuardrail(content));
30
+ }
14
31
  /**
15
32
  * Gets skill templates with their directory names, optionally filtered by workflow IDs.
16
33
  *
@@ -74,7 +91,7 @@ export function getCommandContents(workflowFilter) {
74
91
  description: template.description,
75
92
  category: template.category,
76
93
  tags: template.tags,
77
- body: ensurePtBrGuardrail(template.content),
94
+ body: prepareGeneratedAgentInstructions(template.content),
78
95
  }));
79
96
  }
80
97
  /**
@@ -88,7 +105,7 @@ export function generateSkillContent(template, generatedByVersion, transformInst
88
105
  const transformedInstructions = transformInstructions
89
106
  ? transformInstructions(template.instructions)
90
107
  : template.instructions;
91
- const instructions = ensurePtBrGuardrail(transformedInstructions);
108
+ const instructions = prepareGeneratedAgentInstructions(transformedInstructions);
92
109
  return `---
93
110
  name: ${template.name}
94
111
  description: ${template.description}
@@ -39,6 +39,24 @@ export interface ToolVersionStatus {
39
39
  /** Whether the tool needs updating (version mismatch or missing) */
40
40
  needsUpdate: boolean;
41
41
  }
42
+ export interface GeneratedInstructionDriftEntry {
43
+ toolId: string;
44
+ toolName: string;
45
+ kind: 'skill' | 'command';
46
+ path: string;
47
+ issue: 'missing_canonical_announcement';
48
+ }
49
+ export interface GeneratedInstructionDriftReport {
50
+ schema_version: 1;
51
+ status: 'not_configured' | 'clean' | 'stale';
52
+ checked_count: number;
53
+ stale_count: number;
54
+ canonical_heading: string;
55
+ compatibility_warning: string;
56
+ stale_files: GeneratedInstructionDriftEntry[];
57
+ warnings: string[];
58
+ next_action: string;
59
+ }
42
60
  /**
43
61
  * Gets the list of tools with skillsDir configured.
44
62
  */
@@ -68,4 +86,5 @@ export declare function getConfiguredTools(projectRoot: string): string[];
68
86
  * Gets version status for all configured tools.
69
87
  */
70
88
  export declare function getAllToolVersionStatus(projectRoot: string, currentVersion: string): ToolVersionStatus[];
89
+ export declare function buildGeneratedInstructionDriftReport(projectRoot: string): GeneratedInstructionDriftReport;
71
90
  //# sourceMappingURL=tool-detection.d.ts.map
@@ -6,6 +6,8 @@
6
6
  import path from 'path';
7
7
  import * as fs from 'fs';
8
8
  import { AI_TOOLS } from '../config.js';
9
+ import { CommandAdapterRegistry } from '../command-generation/registry.js';
10
+ import { CODESDD_CANONICAL_LLM_ANNOUNCE_HEADING } from './skill-generation.js';
9
11
  /**
10
12
  * Names of skill directories created by codesdd init.
11
13
  */
@@ -155,4 +157,91 @@ export function getAllToolVersionStatus(projectRoot, currentVersion) {
155
157
  const configuredTools = getConfiguredTools(projectRoot);
156
158
  return configuredTools.map((toolId) => getToolVersionStatus(projectRoot, toolId, currentVersion));
157
159
  }
160
+ function formatInstructionPath(projectRoot, filePath) {
161
+ if (!path.isAbsolute(filePath)) {
162
+ return filePath;
163
+ }
164
+ const relative = path.relative(projectRoot, filePath);
165
+ if (relative && !relative.startsWith('..') && !path.isAbsolute(relative)) {
166
+ return relative;
167
+ }
168
+ return filePath;
169
+ }
170
+ function inspectGeneratedInstructionFile(projectRoot, toolId, toolName, kind, filePath) {
171
+ if (!fs.existsSync(filePath)) {
172
+ return { checked: false };
173
+ }
174
+ try {
175
+ const content = fs.readFileSync(filePath, 'utf-8');
176
+ const checked = true;
177
+ if (content.includes(CODESDD_CANONICAL_LLM_ANNOUNCE_HEADING)) {
178
+ return { checked };
179
+ }
180
+ return {
181
+ checked,
182
+ stale: {
183
+ toolId,
184
+ toolName,
185
+ kind,
186
+ path: formatInstructionPath(projectRoot, filePath),
187
+ issue: 'missing_canonical_announcement',
188
+ },
189
+ };
190
+ }
191
+ catch {
192
+ return { checked: false };
193
+ }
194
+ }
195
+ export function buildGeneratedInstructionDriftReport(projectRoot) {
196
+ const staleFiles = [];
197
+ let checkedCount = 0;
198
+ for (const tool of AI_TOOLS.filter((item) => item.skillsDir)) {
199
+ if (!tool.skillsDir)
200
+ continue;
201
+ const skillStatus = getToolSkillStatus(projectRoot, tool.value);
202
+ const skillsDir = path.join(projectRoot, tool.skillsDir, 'skills');
203
+ for (const skillName of SKILL_NAMES) {
204
+ const skillFile = path.join(skillsDir, skillName, 'SKILL.md');
205
+ const result = inspectGeneratedInstructionFile(projectRoot, tool.value, tool.name, 'skill', skillFile);
206
+ if (result.checked)
207
+ checkedCount++;
208
+ if (result.stale)
209
+ staleFiles.push(result.stale);
210
+ }
211
+ const adapter = CommandAdapterRegistry.get(tool.value);
212
+ if (!adapter)
213
+ continue;
214
+ for (const commandId of COMMAND_IDS) {
215
+ const adapterPath = adapter.getFilePath(commandId);
216
+ if (path.isAbsolute(adapterPath) && !skillStatus.configured) {
217
+ continue;
218
+ }
219
+ const commandFile = path.isAbsolute(adapterPath) ? adapterPath : path.join(projectRoot, adapterPath);
220
+ const result = inspectGeneratedInstructionFile(projectRoot, tool.value, tool.name, 'command', commandFile);
221
+ if (result.checked)
222
+ checkedCount++;
223
+ if (result.stale)
224
+ staleFiles.push(result.stale);
225
+ }
226
+ }
227
+ const staleCount = staleFiles.length;
228
+ const status = checkedCount === 0 ? 'not_configured' : staleCount > 0 ? 'stale' : 'clean';
229
+ const warnings = staleCount > 0
230
+ ? [
231
+ `${staleCount} generated CodeSDD instruction file(s) are missing the canonical LLM announcement.`,
232
+ 'Regenerate instructions with `codesdd update` or rerun `codesdd install --tools <tool>` for the affected tools.',
233
+ ]
234
+ : [];
235
+ return {
236
+ schema_version: 1,
237
+ status,
238
+ checked_count: checkedCount,
239
+ stale_count: staleCount,
240
+ canonical_heading: CODESDD_CANONICAL_LLM_ANNOUNCE_HEADING,
241
+ compatibility_warning: 'OPSX slash prompts are compatibility surfaces; prefer CodeSDD SDD commands when .sdd/ exists.',
242
+ stale_files: staleFiles,
243
+ warnings,
244
+ next_action: staleCount > 0 ? 'codesdd update' : 'none',
245
+ };
246
+ }
158
247
  //# sourceMappingURL=tool-detection.js.map
@@ -0,0 +1,6 @@
1
+ export { buildFeatureTitle, computeCanonicalTitle, markdownInsightTemplate, slugify, stripFunctionalTitlePrefixes, } from '../../core/sdd/domain/helpers.js';
2
+ export { evaluateFeatureFinalizeGuardrails, evaluateFeatureStartGuardrails, type FeatureFinalizeGuardrails, type FeatureStartGuardrails, type LifecycleDependencyCheck, type LifecycleLockCheck, } from '../../core/sdd/domain/lifecycle-guardrails.js';
3
+ export { clearLifecycleHooks, registerLifecycleHook, runLifecycleHooks, unregisterLifecycleHook, type LifecycleHook, type LifecycleHookContext, type LifecycleHookEvent, } from '../../core/sdd/domain/lifecycle-hooks.js';
4
+ export { TransitionEngine, type EntityStatus } from '../../core/sdd/domain/transition-engine.js';
5
+ export { evaluateWorkspaceTraceability } from '../../core/sdd/domain/traceability.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,6 @@
1
+ export { buildFeatureTitle, computeCanonicalTitle, markdownInsightTemplate, slugify, stripFunctionalTitlePrefixes, } from '../../core/sdd/domain/helpers.js';
2
+ export { evaluateFeatureFinalizeGuardrails, evaluateFeatureStartGuardrails, } from '../../core/sdd/domain/lifecycle-guardrails.js';
3
+ export { clearLifecycleHooks, registerLifecycleHook, runLifecycleHooks, unregisterLifecycleHook, } from '../../core/sdd/domain/lifecycle-hooks.js';
4
+ export { TransitionEngine } from '../../core/sdd/domain/transition-engine.js';
5
+ export { evaluateWorkspaceTraceability } from '../../core/sdd/domain/traceability.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ export { FileSystemLockAdapter, InMemoryCoordinationCache, InMemoryCoordinationEventBus, InMemoryCoordinationQueue, MultiTierCoordinationCache, createFilesystemFirstCoordinationAdapters, type CoordinationCacheAdapter, type CoordinationEvent, type CoordinationEventBusAdapter, type CoordinationLockAdapter, type CoordinationQueueAdapter, type SddCoordinationAdapters, } from '../../core/sdd/coordination/coordination-adapters.js';
2
+ export { RedisClientFactory, RedisCoordinationCache, RedisEventBusAdapter, RedisLockAdapter, RedisQueueAdapter, RedisWorkDeduper, buildRedisKey, hashRedisKey, redactRedisUrl, resolveRedisBoundaryConfig, resolveRedisRuntimeConfig, sanitizeRedisError, type RedisOperationalReport, type RedisRuntimeConfig, type RedisRuntimeStatus, } from '../../core/sdd/coordination/redis-runtime.js';
3
+ export { InMemoryAdapter } from '../../core/sdd/store/in-memory-adapter.js';
4
+ export { YamlFileAdapter } from '../../core/sdd/store/yaml-file-adapter.js';
5
+ export { createInMemorySddStores, createSddStores, type SddStores } from '../../core/sdd/store/sdd-stores.js';
6
+ export type { StateStore } from '../../core/sdd/store/state-store.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,6 @@
1
+ export { FileSystemLockAdapter, InMemoryCoordinationCache, InMemoryCoordinationEventBus, InMemoryCoordinationQueue, MultiTierCoordinationCache, createFilesystemFirstCoordinationAdapters, } from '../../core/sdd/coordination/coordination-adapters.js';
2
+ export { RedisClientFactory, RedisCoordinationCache, RedisEventBusAdapter, RedisLockAdapter, RedisQueueAdapter, RedisWorkDeduper, buildRedisKey, hashRedisKey, redactRedisUrl, resolveRedisBoundaryConfig, resolveRedisRuntimeConfig, sanitizeRedisError, } from '../../core/sdd/coordination/redis-runtime.js';
3
+ export { InMemoryAdapter } from '../../core/sdd/store/in-memory-adapter.js';
4
+ export { YamlFileAdapter } from '../../core/sdd/store/yaml-file-adapter.js';
5
+ export { createInMemorySddStores, createSddStores } from '../../core/sdd/store/sdd-stores.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,3 @@
1
+ export { registerSddCommand } from '../../../commands/sdd.js';
2
+ export { registerPluginCommands } from '../../../commands/sdd/plugin.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,3 @@
1
+ export { registerSddCommand } from '../../../commands/sdd.js';
2
+ export { registerPluginCommands } from '../../../commands/sdd/plugin.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,3 @@
1
+ export type { BacklogItem, BacklogState, DiscoveryIndexState, DiscoveryRecord, FinalizeQueueState, FrontendGapsState, FrontendMapState, RepoMapState, ServiceCatalogState, TransitionLogState, } from '../../core/sdd/types.js';
2
+ export { stringifyWorkspaceYamlDocument, workspaceDocumentSchemas, workspaceSchemaForFile, type WorkspaceChangelogDocument, type WorkspaceDocumentFileName, type WorkspacePlanDocument, type WorkspaceQualityDocument, type WorkspaceSpecDocument, type WorkspaceTasksDocument, } from '../../core/sdd/workspace-schemas.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,2 @@
1
+ export { stringifyWorkspaceYamlDocument, workspaceDocumentSchemas, workspaceSchemaForFile, } from '../../core/sdd/workspace-schemas.js';
2
+ //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devtrack-solution/codesdd",
3
- "version": "1.2.3",
3
+ "version": "1.2.4",
4
4
  "description": "AI-native system for spec-driven development",
5
5
  "keywords": [
6
6
  "codesdd",
@@ -22,7 +22,8 @@
22
22
  "type": "module",
23
23
  "packageManager": "pnpm@10.33.2",
24
24
  "publishConfig": {
25
- "access": "public"
25
+ "access": "public",
26
+ "provenance": true
26
27
  },
27
28
  "pnpm": {
28
29
  "overrides": {
@@ -64,15 +65,15 @@
64
65
  "build": "node build.js",
65
66
  "dev": "tsc --watch",
66
67
  "dev:cli": "pnpm build && node bin/codesdd.js",
67
- "test": "vitest run",
68
+ "test": "vitest run --silent=passed-only",
68
69
  "test:watch": "vitest",
69
- "test:e2e": "vitest run test/e2e test/cli-e2e",
70
+ "test:e2e": "vitest run test/e2e test/cli-e2e --silent=passed-only",
70
71
  "test:deepagents-smoke": "vitest run test/e2e/deepagents-agent-run-smoke.test.ts",
71
72
  "test:ui": "vitest --ui",
72
- "test:coverage": "vitest run --coverage",
73
- "coverage": "vitest run --coverage",
73
+ "test:coverage": "vitest run --coverage --silent=passed-only",
74
+ "coverage": "vitest run --coverage --silent=passed-only",
74
75
  "quality": "pnpm run cleanup:install && pnpm run build && pnpm run lint && pnpm run test && pnpm run test:e2e && pnpm run coverage",
75
- "quality:review": "pnpm run build && pnpm run lint && pnpm run test && pnpm run test:e2e && pnpm run coverage && pnpm run sdd:validate && pnpm run check:pack-version",
76
+ "quality:review": "pnpm run build && pnpm run lint && pnpm run test && pnpm run test:e2e && pnpm run coverage && pnpm run sdd:validate && pnpm run check:pack-version && node bin/codesdd.js sdd check --render --strict",
76
77
  "prepublishOnly": "node build.js",
77
78
  "prepare": "node scripts/install-git-hooks.mjs",
78
79
  "check:pack-version": "node scripts/pack-version-check.mjs",
@@ -80,11 +81,13 @@
80
81
  "sdd:schema:check": "node scripts/export-sdd-schemas.mjs --check",
81
82
  "sdd:scan-naming": "node bin/codesdd.js sdd scan-naming",
82
83
  "sdd:scan-naming:strict": "node bin/codesdd.js sdd scan-naming --strict",
84
+ "sdd:service-catalog:maturity": "node scripts/audit-service-catalog-maturity.mjs",
83
85
  "sdd:precommit:fast": "node scripts/pre-commit-sdd-fast.mjs",
84
86
  "sdd:validate:no-build": "node bin/codesdd.js sdd check --render --strict && node bin/codesdd.js sdd diagnose --strict && node bin/codesdd.js sdd scan-naming",
85
87
  "sdd:validate": "pnpm run build && pnpm run sdd:schema:check && pnpm run sdd:validate:no-build",
86
88
  "release": "pnpm run release:ci",
87
89
  "release:ci": "pnpm run check:pack-version && pnpm exec changeset publish",
90
+ "release:sbom": "npm sbom --sbom-format cyclonedx",
88
91
  "changeset": "changeset"
89
92
  },
90
93
  "engines": {
@@ -94,13 +97,13 @@
94
97
  "@changesets/changelog-github": "^0.7.0",
95
98
  "@changesets/cli": "^2.31.0",
96
99
  "@mermaid-js/mermaid-cli": "^11.15.0",
97
- "@vitest/coverage-v8": "^3.2.4",
98
- "@vitest/ui": "^3.2.4",
100
+ "@vitest/coverage-v8": "^4.1.8",
101
+ "@vitest/ui": "^4.1.8",
99
102
  "eslint": "^10.4.0",
100
103
  "puppeteer": "24.43.1",
101
104
  "ts-morph": "^28.0.0",
102
105
  "typescript-eslint": "^8.59.4",
103
- "vitest": "^3.2.4"
106
+ "vitest": "^4.1.8"
104
107
  },
105
108
  "dependencies": {
106
109
  "@inquirer/core": "^11.1.10",
@@ -114,6 +117,7 @@
114
117
  "fast-glob": "^3.3.3",
115
118
  "ora": "^9.4.0",
116
119
  "posthog-node": "^5.35.1",
120
+ "redis": "^6.0.0",
117
121
  "typescript": "^6.0.3",
118
122
  "yaml": "^2.9.0",
119
123
  "zod": "^4.4.3"