@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
@@ -0,0 +1,225 @@
1
+ import path from 'node:path';
2
+ import { existsSync, promises as fs } from 'node:fs';
3
+ import { execFile } from 'node:child_process';
4
+ import { promisify } from 'node:util';
5
+ import { activeDocNamesForLayout, ensureMemoryInitialized, relProjectPath } from '../legacy-operations.js';
6
+ import { loadProjectSddConfig, resolveSddPaths } from '../state.js';
7
+ import { parseWorkspaceYamlDocument, } from '../workspace-schemas.js';
8
+ const execFileAsync = promisify(execFile);
9
+ function uniqueSorted(values) {
10
+ return Array.from(new Set(values.filter(Boolean))).sort((a, b) => a.localeCompare(b));
11
+ }
12
+ function normalizeCommand(value) {
13
+ return value.replace(/\s+/g, ' ').trim().toLowerCase();
14
+ }
15
+ function normalizePathForCoherence(value) {
16
+ const normalized = value.replace(/\\/g, '/').trim();
17
+ return normalized.replace(/\.sdd\/(planned|active|archived)\/(FEAT-\d{4})\//, '.sdd/*/$2/');
18
+ }
19
+ function pathCovered(plannedPath, evidencePaths) {
20
+ const planned = normalizePathForCoherence(plannedPath);
21
+ return evidencePaths.some((candidate) => {
22
+ const normalizedCandidate = normalizePathForCoherence(candidate);
23
+ return (normalizedCandidate === planned ||
24
+ normalizedCandidate.endsWith(`/${planned}`) ||
25
+ planned.endsWith(`/${normalizedCandidate}`));
26
+ });
27
+ }
28
+ function collectPlannedFiles(plan, tasks, quality) {
29
+ const includePath = (value) => {
30
+ const normalized = value.replace(/\\/g, '/');
31
+ if (normalized.startsWith('.sdd/state/'))
32
+ return false;
33
+ if (normalized.startsWith('.sdd/archived/'))
34
+ return false;
35
+ return true;
36
+ };
37
+ return uniqueSorted([
38
+ ...plan.execution_plan.command_sequence.flatMap((step) => step.expected_state_writes.filter(includePath)),
39
+ ...tasks.tasks
40
+ .filter((task) => task.phase !== 'finalization')
41
+ .flatMap((task) => task.files_touched.filter(includePath)),
42
+ ...quality.traceability.requirements.flatMap((req) => req.code_refs.map((ref) => ref.path)),
43
+ ]);
44
+ }
45
+ function collectPlannedCommands(plan, tasks, quality) {
46
+ return uniqueSorted([
47
+ ...plan.governance.validation_gates.map((gate) => gate.command),
48
+ ...tasks.tasks.flatMap((task) => task.test_scripts.map((script) => script.command)),
49
+ ...quality.validation_strategies.map((strategy) => strategy.command),
50
+ ]).map(normalizeCommand);
51
+ }
52
+ function collectExecutionFiles(quality, changelog, changedFiles) {
53
+ const changelogRefs = changelog.entries.flatMap((entry) => entry.refs);
54
+ return uniqueSorted([
55
+ ...changedFiles,
56
+ ...quality.evidence_log.map((entry) => entry.artifact ?? '').filter(Boolean),
57
+ ...quality.traceability.requirements.flatMap((req) => req.evidence_refs),
58
+ ...changelogRefs,
59
+ ]);
60
+ }
61
+ function collectExecutionCommands(quality) {
62
+ return uniqueSorted(quality.evidence_log
63
+ .map((entry) => entry.provenance?.command ?? '')
64
+ .filter(Boolean)
65
+ .map(normalizeCommand));
66
+ }
67
+ function expectsAdr(spec, tasks) {
68
+ const corpus = [spec.objective, spec.expected_outcome, ...tasks.tasks.map((task) => `${task.title} ${task.description}`)]
69
+ .join(' ')
70
+ .toLowerCase();
71
+ return corpus.includes('adr');
72
+ }
73
+ export function evaluatePlanningExecutionCoherence(input) {
74
+ const plannedFiles = collectPlannedFiles(input.plan, input.tasks, input.quality);
75
+ const plannedCommands = collectPlannedCommands(input.plan, input.tasks, input.quality);
76
+ const executionFiles = collectExecutionFiles(input.quality, input.changelog, input.changedFiles);
77
+ const executionCommands = collectExecutionCommands(input.quality);
78
+ const issues = [];
79
+ const missingFiles = plannedFiles.filter((plannedFile) => !pathCovered(plannedFile, executionFiles));
80
+ if (missingFiles.length > 0) {
81
+ issues.push({
82
+ code: 'MISSING_FILE_EVIDENCE',
83
+ severity: 'error',
84
+ message: 'Planned files are not reflected in diff/evidence artifacts.',
85
+ evidence: {
86
+ missing_files: missingFiles,
87
+ },
88
+ });
89
+ }
90
+ const missingCommands = plannedCommands.filter((command) => !executionCommands.includes(command));
91
+ if (missingCommands.length > 0) {
92
+ issues.push({
93
+ code: 'MISSING_COMMAND_EVIDENCE',
94
+ severity: 'warning',
95
+ message: 'Planned validation commands are missing from evidence provenance.',
96
+ evidence: {
97
+ missing_commands: missingCommands,
98
+ },
99
+ });
100
+ }
101
+ const notMetAcceptance = input.quality.acceptance_matrix.filter((entry) => entry.status === 'not_met');
102
+ if (notMetAcceptance.length > 0) {
103
+ issues.push({
104
+ code: 'ACCEPTANCE_NOT_MET',
105
+ severity: 'error',
106
+ message: 'Quality acceptance matrix still has not_met criteria.',
107
+ evidence: {
108
+ criteria: notMetAcceptance.map((entry) => entry.criterion),
109
+ },
110
+ });
111
+ }
112
+ const openRisks = input.quality.requirement_validation_evidence_risk_matrix.filter((entry) => entry.risk_status === 'open');
113
+ if (openRisks.length > 0) {
114
+ issues.push({
115
+ code: 'RISK_STATUS_OPEN',
116
+ severity: 'warning',
117
+ message: 'Requirement risk matrix still has open risk entries.',
118
+ evidence: {
119
+ requirements: openRisks.map((entry) => entry.requirement_ref),
120
+ },
121
+ });
122
+ }
123
+ if (expectsAdr(input.spec, input.tasks) && !input.adrExists) {
124
+ issues.push({
125
+ code: 'ADR_MISSING',
126
+ severity: 'error',
127
+ message: 'Planning requires ADR coherence but ADR file is missing.',
128
+ evidence: {
129
+ expected_adr: input.adrPath,
130
+ },
131
+ });
132
+ }
133
+ const healthy = !issues.some((issue) => issue.severity === 'error');
134
+ return {
135
+ schema_version: 1,
136
+ feature_id: input.featureId,
137
+ generated_at: new Date().toISOString(),
138
+ workspace_path: input.workspacePath,
139
+ adr_path: input.adrPath,
140
+ healthy,
141
+ planned: {
142
+ files: plannedFiles,
143
+ commands: plannedCommands,
144
+ },
145
+ execution: {
146
+ files: executionFiles,
147
+ commands: executionCommands,
148
+ },
149
+ issues,
150
+ };
151
+ }
152
+ async function listChangedFiles(projectRoot) {
153
+ try {
154
+ const { stdout } = await execFileAsync('git', ['status', '--porcelain'], {
155
+ cwd: projectRoot,
156
+ maxBuffer: 16 * 1024 * 1024,
157
+ });
158
+ return uniqueSorted(stdout
159
+ .split('\n')
160
+ .map((line) => line.trim())
161
+ .filter(Boolean)
162
+ .map((line) => line.slice(3).trim())
163
+ .map((line) => (line.includes('->') ? line.split('->').pop() ?? line : line))
164
+ .map((line) => line.trim())
165
+ .filter(Boolean));
166
+ }
167
+ catch {
168
+ return [];
169
+ }
170
+ }
171
+ async function resolveWorkspacePath(projectRoot, featureId) {
172
+ const config = await loadProjectSddConfig(projectRoot);
173
+ const paths = resolveSddPaths(projectRoot, config);
174
+ await ensureMemoryInitialized(paths);
175
+ const roots = [paths.activeDir, paths.plannedDir, paths.archivedDir];
176
+ for (const root of roots) {
177
+ const workspacePath = path.join(root, featureId);
178
+ if (existsSync(workspacePath)) {
179
+ return {
180
+ workspacePath,
181
+ adrPath: path.join(paths.coreDir, 'adrs', `ADR-${featureId}.md`),
182
+ };
183
+ }
184
+ }
185
+ throw new Error(`Workspace not found for ${featureId}.`);
186
+ }
187
+ export class PlanningExecutionCoherenceService {
188
+ async execute(projectRoot, featureId, options = {}) {
189
+ if (!/^FEAT-\d{4}$/.test(featureId)) {
190
+ throw new Error('Invalid feature id. Use FEAT-####.');
191
+ }
192
+ const config = await loadProjectSddConfig(projectRoot);
193
+ const paths = resolveSddPaths(projectRoot, config);
194
+ const names = activeDocNamesForLayout(config);
195
+ const { workspacePath, adrPath } = await resolveWorkspacePath(projectRoot, featureId);
196
+ const readDoc = async (name) => {
197
+ const filePath = path.join(workspacePath, name);
198
+ if (!existsSync(filePath)) {
199
+ throw new Error(`${name} not found for ${featureId}.`);
200
+ }
201
+ return fs.readFile(filePath, 'utf-8');
202
+ };
203
+ const [specRaw, planRaw, tasksRaw, changelogRaw, qualityRaw] = await Promise.all([
204
+ readDoc(names.spec),
205
+ readDoc(names.plan),
206
+ readDoc(names.tasks),
207
+ readDoc(names.changelog),
208
+ readDoc(names.quality),
209
+ ]);
210
+ const report = evaluatePlanningExecutionCoherence({
211
+ featureId,
212
+ workspacePath: relProjectPath(paths, workspacePath),
213
+ adrPath: relProjectPath(paths, adrPath),
214
+ adrExists: existsSync(adrPath),
215
+ spec: parseWorkspaceYamlDocument('1-spec.yaml', specRaw),
216
+ plan: parseWorkspaceYamlDocument('2-plan.yaml', planRaw),
217
+ tasks: parseWorkspaceYamlDocument('3-tasks.yaml', tasksRaw),
218
+ changelog: parseWorkspaceYamlDocument('4-changelog.yaml', changelogRaw),
219
+ quality: parseWorkspaceYamlDocument('5-quality.yaml', qualityRaw),
220
+ changedFiles: options.changedFiles ?? (await listChangedFiles(projectRoot)),
221
+ });
222
+ return report;
223
+ }
224
+ }
225
+ //# sourceMappingURL=planning-execution-coherence.service.js.map
@@ -0,0 +1,6 @@
1
+ import { type SemanticIntentClassification, type SemanticIntentClassifierInput } from '../domain/semantic-intent-classifier.js';
2
+ export type SemanticIntentClassifierServiceResult = SemanticIntentClassification;
3
+ export declare class SemanticIntentClassifierService {
4
+ execute(input: SemanticIntentClassifierInput): SemanticIntentClassifierServiceResult;
5
+ }
6
+ //# sourceMappingURL=semantic-intent-classifier.service.d.ts.map
@@ -0,0 +1,7 @@
1
+ import { classifySemanticIntent, } from '../domain/semantic-intent-classifier.js';
2
+ export class SemanticIntentClassifierService {
3
+ execute(input) {
4
+ return classifySemanticIntent(input);
5
+ }
6
+ }
7
+ //# sourceMappingURL=semantic-intent-classifier.service.js.map
@@ -24,6 +24,7 @@ export interface SddRuntimeConfig {
24
24
  autoRender: boolean;
25
25
  };
26
26
  }
27
+ export declare function buildDefaultSkillRoutingState(): SkillRoutingState;
27
28
  export interface SddPaths {
28
29
  projectRoot: string;
29
30
  memoryRoot: string;
@@ -9,6 +9,254 @@ import { CURRENT_SDD_STATE_VERSION, buildSddContractConfig } from './contract.js
9
9
  import { DEFAULT_CURATED_SKILL_CATALOG, BUILT_IN_SDD_SKILLS, buildCuratedBundlesMarkdown, buildCuratedBundlesCurationData, } from './default-skills.js';
10
10
  import { buildSddInternalReadme, PROMPT_00_COMECE_POR_AQUI_MD, PROMPT_01_INGESTAO_DEPOSITO_MD, PROMPT_02_NORMALIZAR_PLANEJAMENTO_MD, PROMPT_03_EXECUCAO_FEATURE_MD, PROMPT_04_CONSOLIDACAO_FINALIZE_MD, PROMPTS_README_MD, TEMPLATE_1_SPEC_MD, TEMPLATE_2_PLAN_MD, TEMPLATE_QUALITY_MD, TEMPLATE_3_TASKS_MD, TEMPLATE_4_CHANGELOG_MD, } from './default-bootstrap-files.js';
11
11
  import { SddWriteTransaction } from './transaction.js';
12
+ export function buildDefaultSkillRoutingState() {
13
+ return {
14
+ version: 1,
15
+ default_skills: ['architecture', 'concise-planning', 'context-window-management'],
16
+ routes: [
17
+ {
18
+ domain: 'backend',
19
+ skills: ['devtrack-api', 'architecture', 'api-design-principles'],
20
+ bundles: ['architecture-backend'],
21
+ },
22
+ {
23
+ domain: 'api',
24
+ skills: ['devtrack-api', 'api-design-principles'],
25
+ bundles: ['architecture-backend'],
26
+ },
27
+ {
28
+ domain: 'nestjs',
29
+ skills: ['devtrack-api', 'architecture'],
30
+ bundles: ['architecture-backend'],
31
+ },
32
+ {
33
+ domain: 'typeorm',
34
+ skills: ['devtrack-api', 'database-design'],
35
+ bundles: ['architecture-backend'],
36
+ },
37
+ {
38
+ domain: 'devtrack',
39
+ skills: ['devtrack-api'],
40
+ bundles: ['architecture-backend'],
41
+ },
42
+ {
43
+ domain: 'python',
44
+ skills: ['api-clean-flask-langgraph', 'architecture'],
45
+ bundles: ['python-agentic-backend'],
46
+ },
47
+ {
48
+ domain: 'flask',
49
+ skills: ['api-clean-flask-langgraph'],
50
+ bundles: ['python-agentic-backend'],
51
+ },
52
+ {
53
+ domain: 'frontend',
54
+ skills: ['frontend-design', 'react-patterns'],
55
+ bundles: ['frontend-product'],
56
+ },
57
+ {
58
+ domain: 'angular',
59
+ skills: ['frontend-design', 'frontend-security-coder'],
60
+ bundles: ['frontend-product', 'security-quality'],
61
+ },
62
+ {
63
+ domain: 'flutter',
64
+ skills: ['devtrack-flutter', 'mobile-design', 'frontend-design'],
65
+ bundles: ['frontend-product'],
66
+ },
67
+ {
68
+ domain: 'dart',
69
+ skills: ['devtrack-flutter', 'architecture'],
70
+ bundles: ['frontend-product', 'architecture-backend'],
71
+ },
72
+ {
73
+ domain: 'cross-platform',
74
+ skills: ['devtrack-flutter', 'mobile-design'],
75
+ bundles: ['frontend-product'],
76
+ },
77
+ {
78
+ domain: 'flutter-ui',
79
+ skills: ['devtrack-flutter', 'frontend-design'],
80
+ bundles: ['frontend-product'],
81
+ },
82
+ {
83
+ domain: 'flutter-layout',
84
+ skills: ['devtrack-flutter', 'frontend-design'],
85
+ bundles: ['frontend-product'],
86
+ },
87
+ {
88
+ domain: 'flutter-routing',
89
+ skills: ['devtrack-flutter', 'architecture'],
90
+ bundles: ['frontend-product', 'architecture-backend'],
91
+ },
92
+ {
93
+ domain: 'flutter-l10n',
94
+ skills: ['devtrack-flutter'],
95
+ bundles: ['frontend-product'],
96
+ },
97
+ {
98
+ domain: 'flutter-http',
99
+ skills: ['devtrack-flutter', 'frontend-security-coder'],
100
+ bundles: ['frontend-product', 'security-quality'],
101
+ },
102
+ {
103
+ domain: 'flutter-json',
104
+ skills: ['devtrack-flutter'],
105
+ bundles: ['frontend-product'],
106
+ },
107
+ {
108
+ domain: 'widget-preview',
109
+ skills: ['devtrack-flutter', 'frontend-design'],
110
+ bundles: ['frontend-product'],
111
+ },
112
+ {
113
+ domain: 'widget-test',
114
+ skills: ['devtrack-flutter'],
115
+ bundles: ['frontend-product'],
116
+ },
117
+ {
118
+ domain: 'integration-test',
119
+ skills: ['devtrack-flutter'],
120
+ bundles: ['frontend-product'],
121
+ },
122
+ {
123
+ domain: 'go-router',
124
+ skills: ['devtrack-flutter', 'architecture'],
125
+ bundles: ['frontend-product', 'architecture-backend'],
126
+ },
127
+ {
128
+ domain: 'arb',
129
+ skills: ['devtrack-flutter'],
130
+ bundles: ['frontend-product'],
131
+ },
132
+ {
133
+ domain: 'l10n',
134
+ skills: ['devtrack-flutter'],
135
+ bundles: ['frontend-product'],
136
+ },
137
+ {
138
+ domain: 'admin',
139
+ skills: ['devtrack-angular', 'frontend-design', 'frontend-security-coder'],
140
+ bundles: ['frontend-product', 'security-quality'],
141
+ },
142
+ {
143
+ domain: 'angular-admin',
144
+ skills: ['devtrack-angular', 'frontend-design', 'frontend-security-coder'],
145
+ bundles: ['frontend-product', 'security-quality'],
146
+ },
147
+ {
148
+ domain: 'backoffice',
149
+ skills: ['devtrack-angular', 'frontend-design', 'frontend-security-coder'],
150
+ bundles: ['frontend-product', 'security-quality'],
151
+ },
152
+ {
153
+ domain: 'dashboard',
154
+ skills: ['devtrack-angular', 'frontend-design'],
155
+ bundles: ['frontend-product'],
156
+ },
157
+ {
158
+ domain: 'crud',
159
+ skills: ['devtrack-angular', 'architecture'],
160
+ bundles: ['frontend-product', 'architecture-backend'],
161
+ },
162
+ {
163
+ domain: 'data-grid',
164
+ skills: ['devtrack-angular', 'frontend-design'],
165
+ bundles: ['frontend-product'],
166
+ },
167
+ {
168
+ domain: 'formly',
169
+ skills: ['frontend-design'],
170
+ bundles: ['frontend-product'],
171
+ },
172
+ {
173
+ domain: 'ngxs',
174
+ skills: ['architecture'],
175
+ bundles: ['frontend-product', 'architecture-backend'],
176
+ },
177
+ {
178
+ domain: 'admin-formly',
179
+ skills: ['devtrack-angular', 'frontend-design'],
180
+ bundles: ['frontend-product'],
181
+ },
182
+ {
183
+ domain: 'admin-state',
184
+ skills: ['devtrack-angular', 'architecture'],
185
+ bundles: ['frontend-product', 'architecture-backend'],
186
+ },
187
+ {
188
+ domain: 'ngxs-admin',
189
+ skills: ['devtrack-angular', 'architecture'],
190
+ bundles: ['frontend-product', 'architecture-backend'],
191
+ },
192
+ {
193
+ domain: 'uiux',
194
+ skills: ['frontend-design', 'ui-ux-pro-max'],
195
+ bundles: ['frontend-product'],
196
+ },
197
+ {
198
+ domain: 'permissions',
199
+ skills: ['devtrack-angular', 'frontend-security-coder'],
200
+ bundles: ['frontend-product', 'security-quality'],
201
+ },
202
+ {
203
+ domain: 'reports',
204
+ skills: ['devtrack-angular', 'frontend-design'],
205
+ bundles: ['frontend-product'],
206
+ },
207
+ {
208
+ domain: 'workflow',
209
+ skills: ['devtrack-angular', 'architecture'],
210
+ bundles: ['frontend-product', 'architecture-backend'],
211
+ },
212
+ {
213
+ domain: 'realtime',
214
+ skills: ['architecture'],
215
+ bundles: ['frontend-product'],
216
+ },
217
+ {
218
+ domain: 'rtc',
219
+ skills: ['architecture'],
220
+ bundles: ['frontend-product'],
221
+ },
222
+ {
223
+ domain: 'chat',
224
+ skills: ['frontend-design'],
225
+ bundles: ['frontend-product'],
226
+ },
227
+ {
228
+ domain: 'admin-realtime',
229
+ skills: ['devtrack-angular', 'architecture'],
230
+ bundles: ['frontend-product'],
231
+ },
232
+ {
233
+ domain: 'admin-chat',
234
+ skills: ['devtrack-angular', 'frontend-design'],
235
+ bundles: ['frontend-product'],
236
+ },
237
+ {
238
+ domain: 'mobile',
239
+ skills: ['mobile-design'],
240
+ bundles: ['frontend-product'],
241
+ },
242
+ {
243
+ domain: 'ionic',
244
+ skills: ['mobile-design'],
245
+ bundles: ['frontend-product'],
246
+ },
247
+ {
248
+ domain: 'nativescript',
249
+ skills: ['mobile-design'],
250
+ bundles: ['frontend-product'],
251
+ },
252
+ {
253
+ domain: 'infra',
254
+ skills: ['terraform-specialist', 'docker-expert'],
255
+ bundles: [],
256
+ },
257
+ ],
258
+ };
259
+ }
12
260
  const LEGACY_LAYOUT_FOLDERS = {
13
261
  discovery: 'discovery',
14
262
  planning: 'pendencias',
@@ -57,9 +305,9 @@ export function defaultFoldersForLayout(layout) {
57
305
  const DEFAULT_SDD_CONFIG = {
58
306
  enabled: true,
59
307
  memoryDir: '.sdd',
60
- language: 'pt-BR',
61
- layout: 'legacy',
62
- folders: defaultFoldersForLayout('legacy'),
308
+ language: 'en-US',
309
+ layout: 'en-US',
310
+ folders: defaultFoldersForLayout('en-US'),
63
311
  frontend: { enabled: false },
64
312
  views: { autoRender: true },
65
313
  };
@@ -110,8 +358,18 @@ export function mergeRuntimeConfig(raw) {
110
358
  }
111
359
  const frontend = isRecord(raw.frontend) ? raw.frontend : {};
112
360
  const views = isRecord(raw.views) ? raw.views : {};
113
- const language = raw.language === 'en-US' ? 'en-US' : 'pt-BR';
114
- const layout = raw.layout === 'pt-BR' ? 'pt-BR' : raw.layout === 'en-US' ? 'en-US' : 'legacy';
361
+ const language = raw.language === 'pt-BR'
362
+ ? 'pt-BR'
363
+ : raw.language === 'en-US'
364
+ ? 'en-US'
365
+ : DEFAULT_SDD_CONFIG.language;
366
+ const layout = raw.layout === 'pt-BR'
367
+ ? 'pt-BR'
368
+ : raw.layout === 'en-US'
369
+ ? 'en-US'
370
+ : raw.layout === 'legacy'
371
+ ? 'legacy'
372
+ : DEFAULT_SDD_CONFIG.layout;
115
373
  const folderDefaults = defaultFoldersForLayout(layout);
116
374
  const rawFolders = isRecord(raw.folders) ? raw.folders : {};
117
375
  // compatibilidade retroativa para nome legado "pendencias"
@@ -606,7 +864,7 @@ export async function ensureBaseFiles(paths, config) {
606
864
  });
607
865
  await writeYamlIfMissing(paths.stateFiles.backlog, { version: 1, items: [] });
608
866
  await writeYamlIfMissing(paths.stateFiles.techDebt, { version: 1, items: [] });
609
- await writeYamlIfMissing(paths.stateFiles.finalizeQueue, { version: 1, items: [] });
867
+ await writeYamlIfMissing(paths.stateFiles.finalizeQueue, { version: 1, items: [], history: [] });
610
868
  await ensureCuratedSkillCatalog(paths.stateFiles.skillCatalog);
611
869
  await writeYamlIfMissing(paths.stateFiles.unblockEvents, { version: 1, events: [] });
612
870
  await writeYamlIfMissing(paths.stateFiles.transitionLog, { version: 1, events: [] });
@@ -623,21 +881,7 @@ export async function ensureBaseFiles(paths, config) {
623
881
  jurisdiction_profiles: [],
624
882
  control_catalog: [],
625
883
  });
626
- await writeYamlIfMissing(paths.stateFiles.skillRouting, {
627
- version: 1,
628
- default_skills: ['architecture', 'concise-planning', 'context-window-management'],
629
- routes: [
630
- { domain: 'backend', skills: ['devtrack-api', 'architecture', 'api-design-principles'], bundles: ['architecture-backend'] },
631
- { domain: 'api', skills: ['devtrack-api', 'api-design-principles'], bundles: ['architecture-backend'] },
632
- { domain: 'python', skills: ['api-clean-flask-langgraph', 'architecture'], bundles: ['python-agentic-backend'] },
633
- { domain: 'flask', skills: ['api-clean-flask-langgraph'], bundles: ['python-agentic-backend'] },
634
- { domain: 'nestjs', skills: ['devtrack-api', 'architecture'], bundles: ['architecture-backend'] },
635
- { domain: 'typeorm', skills: ['devtrack-api', 'database-design'], bundles: ['architecture-backend'] },
636
- { domain: 'devtrack', skills: ['devtrack-api'], bundles: ['architecture-backend'] },
637
- { domain: 'frontend', skills: ['frontend-design', 'react-patterns'], bundles: [] },
638
- { domain: 'infra', skills: ['terraform-specialist', 'docker-expert'], bundles: [] }
639
- ]
640
- });
884
+ await writeYamlIfMissing(paths.stateFiles.skillRouting, buildDefaultSkillRoutingState());
641
885
  if (config.frontend.enabled) {
642
886
  await writeYamlIfMissing(paths.stateFiles.frontendGaps, { version: 1, items: [] });
643
887
  await writeYamlIfMissing(paths.stateFiles.frontendMap, { version: 1, routes: [] });
@@ -724,19 +968,7 @@ export async function loadStateSnapshot(paths, config) {
724
968
  skillRouting = SkillRoutingStateSchema.parse(await readYaml(paths.stateFiles.skillRouting));
725
969
  }
726
970
  catch (e) {
727
- skillRouting = {
728
- version: 1,
729
- default_skills: ['architecture', 'concise-planning', 'context-window-management'],
730
- routes: [
731
- { domain: 'backend', skills: ['devtrack-api', 'architecture', 'api-design-principles'], bundles: ['architecture-backend'] },
732
- { domain: 'api', skills: ['devtrack-api', 'api-design-principles'], bundles: ['architecture-backend'] },
733
- { domain: 'python', skills: ['api-clean-flask-langgraph', 'architecture'], bundles: ['python-agentic-backend'] },
734
- { domain: 'flask', skills: ['api-clean-flask-langgraph'], bundles: ['python-agentic-backend'] },
735
- { domain: 'nestjs', skills: ['devtrack-api', 'architecture'], bundles: ['architecture-backend'] },
736
- { domain: 'typeorm', skills: ['devtrack-api', 'database-design'], bundles: ['architecture-backend'] },
737
- { domain: 'devtrack', skills: ['devtrack-api'], bundles: ['architecture-backend'] }
738
- ]
739
- };
971
+ skillRouting = buildDefaultSkillRoutingState();
740
972
  }
741
973
  let frontendGaps;
742
974
  let frontendMap;
@@ -7,7 +7,7 @@ export function createSddStores(paths) {
7
7
  discoveryIndex: new YamlFileAdapter(stateFiles.discoveryIndex, DiscoveryIndexStateSchema, () => ({ version: 1, counters: { INS: 0, DEB: 0, RAD: 0, EPIC: 0, FEAT: 0, FGAP: 0, TD: 0 }, records: [] })),
8
8
  backlog: new YamlFileAdapter(stateFiles.backlog, BacklogStateSchema, () => ({ version: 1, items: [] })),
9
9
  techDebt: new YamlFileAdapter(stateFiles.techDebt, TechDebtStateSchema, () => ({ version: 1, items: [] })),
10
- finalizeQueue: new YamlFileAdapter(stateFiles.finalizeQueue, FinalizeQueueStateSchema, () => ({ version: 1, items: [] })),
10
+ finalizeQueue: new YamlFileAdapter(stateFiles.finalizeQueue, FinalizeQueueStateSchema, () => ({ version: 1, items: [], history: [] })),
11
11
  skillCatalog: new YamlFileAdapter(stateFiles.skillCatalog, SkillCatalogStateSchema, () => ({ version: 1, skills: [], bundles: [] })),
12
12
  unblockEvents: new YamlFileAdapter(stateFiles.unblockEvents, UnblockEventsStateSchema, () => ({ version: 1, events: [] })),
13
13
  transitionLog: new YamlFileAdapter(stateFiles.transitionLog, TransitionLogStateSchema, () => ({ version: 1, events: [] })),
@@ -34,7 +34,7 @@ export function createInMemorySddStores() {
34
34
  discoveryIndex: new InMemoryAdapter(DiscoveryIndexStateSchema, () => ({ version: 1, counters: { INS: 0, DEB: 0, RAD: 0, EPIC: 0, FEAT: 0, FGAP: 0, TD: 0 }, records: [] })),
35
35
  backlog: new InMemoryAdapter(BacklogStateSchema, () => ({ version: 1, items: [] })),
36
36
  techDebt: new InMemoryAdapter(TechDebtStateSchema, () => ({ version: 1, items: [] })),
37
- finalizeQueue: new InMemoryAdapter(FinalizeQueueStateSchema, () => ({ version: 1, items: [] })),
37
+ finalizeQueue: new InMemoryAdapter(FinalizeQueueStateSchema, () => ({ version: 1, items: [], history: [] })),
38
38
  skillCatalog: new InMemoryAdapter(SkillCatalogStateSchema, () => ({ version: 1, skills: [], bundles: [] })),
39
39
  unblockEvents: new InMemoryAdapter(UnblockEventsStateSchema, () => ({ version: 1, events: [] })),
40
40
  transitionLog: new InMemoryAdapter(TransitionLogStateSchema, () => ({ version: 1, events: [] })),