intentdna 1.7.4 → 1.8.0

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 (152) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/LICENSE +201 -0
  4. package/README.md +143 -194
  5. package/dist/assets/candidates.d.ts +124 -0
  6. package/dist/assets/candidates.js +1249 -0
  7. package/dist/assets/catalog.d.ts +101 -0
  8. package/dist/assets/catalog.js +311 -0
  9. package/dist/assets/evidence.d.ts +93 -0
  10. package/dist/assets/evidence.js +391 -0
  11. package/dist/assets/index.d.ts +4 -0
  12. package/dist/assets/index.js +4 -0
  13. package/dist/assets/metadata.d.ts +19 -0
  14. package/dist/assets/metadata.js +227 -0
  15. package/dist/cli/commands/assets.d.ts +65 -0
  16. package/dist/cli/commands/assets.js +2871 -0
  17. package/dist/cli/commands/auth.d.ts +322 -0
  18. package/dist/cli/commands/auth.js +1592 -0
  19. package/dist/cli/commands/cloud-auth-guidance.d.ts +2 -0
  20. package/dist/cli/commands/cloud-auth-guidance.js +4 -0
  21. package/dist/cli/commands/cloud.d.ts +1359 -0
  22. package/dist/cli/commands/cloud.js +8364 -0
  23. package/dist/cli/commands/evolve.js +18 -2
  24. package/dist/cli/commands/generate.js +25 -2
  25. package/dist/cli/commands/guard.d.ts +1 -1
  26. package/dist/cli/commands/guard.js +1 -1
  27. package/dist/cli/commands/guide.d.ts +15 -0
  28. package/dist/cli/commands/guide.js +1747 -0
  29. package/dist/cli/commands/init.d.ts +12 -0
  30. package/dist/cli/commands/init.js +95 -60
  31. package/dist/cli/commands/org.d.ts +16 -0
  32. package/dist/cli/commands/org.js +2393 -0
  33. package/dist/cli/commands/release.d.ts +59 -0
  34. package/dist/cli/commands/release.js +716 -0
  35. package/dist/cli/commands/report.d.ts +82 -0
  36. package/dist/cli/commands/report.js +1516 -0
  37. package/dist/cli/commands/run.d.ts +6 -1
  38. package/dist/cli/commands/run.js +95 -26
  39. package/dist/cli/commands/sync.d.ts +8 -1
  40. package/dist/cli/commands/sync.js +436 -141
  41. package/dist/cli/commands/templates.d.ts +64 -0
  42. package/dist/cli/commands/templates.js +2151 -1
  43. package/dist/cli/commands/workflow.d.ts +26 -0
  44. package/dist/cli/commands/workflow.js +3053 -0
  45. package/dist/cli/index.js +719 -42
  46. package/dist/compiler/cascade.js +4 -9
  47. package/dist/compiler/compile.js +1 -0
  48. package/dist/governance/evidence-capture-attribution.d.ts +12 -0
  49. package/dist/governance/evidence-capture-attribution.js +46 -0
  50. package/dist/governance/index.d.ts +2 -0
  51. package/dist/governance/index.js +1 -0
  52. package/dist/hooks/cli.d.ts +6 -0
  53. package/dist/hooks/cli.js +168 -12
  54. package/dist/hooks/enforce.d.ts +1 -0
  55. package/dist/hooks/protocol.d.ts +1 -1
  56. package/dist/hooks/protocol.js +1 -1
  57. package/dist/hooks/state.d.ts +41 -0
  58. package/dist/hooks/state.js +126 -2
  59. package/dist/index.d.ts +3 -0
  60. package/dist/index.js +3 -0
  61. package/dist/mcp/tools-state.js +2 -0
  62. package/dist/organization/index.d.ts +121 -0
  63. package/dist/organization/index.js +413 -0
  64. package/dist/runtime/claude-sync-target.d.ts +49 -0
  65. package/dist/runtime/claude-sync-target.js +280 -0
  66. package/dist/runtime/codex-adapter.d.ts +254 -0
  67. package/dist/runtime/codex-adapter.js +1204 -0
  68. package/dist/runtime/codex-sync-target.d.ts +33 -0
  69. package/dist/runtime/codex-sync-target.js +241 -0
  70. package/dist/runtime/index.d.ts +8 -0
  71. package/dist/runtime/index.js +4 -0
  72. package/dist/runtime/output-artifact-registry.d.ts +1 -1
  73. package/dist/runtime/output-artifact-registry.js +2 -0
  74. package/dist/runtime/settings-adapter.d.ts +1 -1
  75. package/dist/runtime/settings-adapter.js +1 -1
  76. package/dist/runtime/skill-adapter.d.ts +5 -1
  77. package/dist/runtime/skill-adapter.js +120 -34
  78. package/dist/runtime/sync-artifact-registry.d.ts +99 -0
  79. package/dist/runtime/sync-artifact-registry.js +194 -0
  80. package/dist/runtime/sync-target-plan.d.ts +45 -0
  81. package/dist/runtime/sync-target-plan.js +19 -0
  82. package/dist/schema/controller-registry.d.ts +8 -1
  83. package/dist/schema/controller-registry.js +8 -0
  84. package/dist/schema/types.d.ts +35 -23
  85. package/dist/schema/types.js +10 -1
  86. package/dist/schema/validate.js +22 -22
  87. package/dist/schema/validators/controllers.js +38 -20
  88. package/dist/schema/workflow-authoring-contract.d.ts +29 -0
  89. package/dist/schema/workflow-authoring-contract.js +109 -0
  90. package/dist/schema/yaml-parser.js +18 -0
  91. package/dist/templates/api-backend.dna.yaml +19 -0
  92. package/dist/templates/brainstorming-first.dna.yaml +19 -0
  93. package/dist/templates/code-cleanup.dna.yaml +19 -0
  94. package/dist/templates/code-review-pipeline.dna.yaml +18 -0
  95. package/dist/templates/documentation-writer.dna.yaml +19 -0
  96. package/dist/templates/flutter-behavior-lock.dna.yaml +19 -0
  97. package/dist/templates/flutter-refactoring-rescue.dna.yaml +19 -0
  98. package/dist/templates/flutter-rewrite-diagnosis-review.dna.yaml +210 -0
  99. package/dist/templates/flutter-rewrite-fix-review-loop.dna.yaml +260 -0
  100. package/dist/templates/flutter-rewrite-new.dna.yaml +506 -0
  101. package/dist/templates/flutter-rewrite.dna.yaml +20 -0
  102. package/dist/templates/frontend-quality.dna.yaml +19 -0
  103. package/dist/templates/full-pipeline.dna.yaml +20 -0
  104. package/dist/templates/marketplace.d.ts +92 -0
  105. package/dist/templates/marketplace.js +502 -0
  106. package/dist/templates/metadata.d.ts +25 -0
  107. package/dist/templates/metadata.js +136 -3
  108. package/dist/templates/mobile-dev.dna.yaml +19 -0
  109. package/dist/templates/multi-agent-handoff-coordination.dna.yaml +156 -0
  110. package/dist/templates/multi-perspective-review.dna.yaml +19 -0
  111. package/dist/templates/persistent-executor.dna.yaml +19 -0
  112. package/dist/templates/qa-loop.dna.yaml +18 -0
  113. package/dist/templates/release-evidence-gate.dna.yaml +131 -0
  114. package/dist/templates/requirements-gate.dna.yaml +19 -0
  115. package/dist/templates/research-orchestration.dna.yaml +19 -0
  116. package/dist/templates/root-cause-analysis.dna.yaml +19 -0
  117. package/dist/templates/safe-refactoring.dna.yaml +321 -0
  118. package/dist/templates/secure-dev.dna.yaml +19 -0
  119. package/dist/templates/subagent-parallel.dna.yaml +19 -0
  120. package/dist/templates/systematic-debugging.dna.yaml +19 -0
  121. package/dist/templates/tdd-strict.dna.yaml +19 -0
  122. package/dist/templates/ui-visual-regression-qa.dna.yaml +133 -0
  123. package/dist/templates/workflow-author.dna.yaml +302 -0
  124. package/dist/templates/workflow-blocked-scope-triage.dna.yaml +242 -0
  125. package/dist/templates/workflow-completion-audit.dna.yaml +254 -0
  126. package/dist/templates/workflow-cross-boundary-resource-approval.dna.yaml +249 -0
  127. package/dist/templates/workflow-evidence-review.dna.yaml +198 -0
  128. package/dist/templates/workflow-module-inventory.dna.yaml +257 -0
  129. package/dist/templates/workflow-runtime-smoke-review.dna.yaml +252 -0
  130. package/dist/templates/workflow-verification-command-routing.dna.yaml +278 -0
  131. package/dist/workflow/authoring-packet.d.ts +67 -0
  132. package/dist/workflow/authoring-packet.js +218 -0
  133. package/dist/workflow/draft.d.ts +159 -0
  134. package/dist/workflow/draft.js +800 -0
  135. package/dist/workflow/index.d.ts +3 -0
  136. package/dist/workflow/index.js +3 -0
  137. package/dist/workflow/suggestion-review.d.ts +65 -0
  138. package/dist/workflow/suggestion-review.js +245 -0
  139. package/package.json +1 -1
  140. package/spec/README.md +15 -48
  141. package/spec/codex-adapter-contract.md +176 -0
  142. package/spec/sync-target-plan.md +158 -0
  143. package/spec/workflow-capability-ir.md +153 -0
  144. package/spec/agent-dispatch-fix.md +0 -116
  145. package/spec/control-plane-convergence-handoff-2026-04-24.md +0 -432
  146. package/spec/flutter-rewrite-template-optimization.md +0 -301
  147. package/spec/foundation-hardening.md +0 -178
  148. package/spec/hooks-infra-harness-hardening.md +0 -741
  149. package/spec/multi-config.md +0 -172
  150. package/spec/parallel-isolation.md +0 -268
  151. package/spec/template-version-namespace-fix.md +0 -653
  152. package/spec/workflow-pipeline.md +0 -101
@@ -0,0 +1,101 @@
1
+ import { type TemplateCatalogEntry } from "../templates/catalog.js";
2
+ import { type WorkflowAssetEvidenceLink } from "./metadata.js";
3
+ export interface WorkflowAssetRoleSummary {
4
+ id: string;
5
+ description?: string;
6
+ readScope: string[];
7
+ writeScope: string[];
8
+ allowTools: string[];
9
+ denyTools: string[];
10
+ }
11
+ export interface WorkflowAssetStepSummary {
12
+ id: string;
13
+ role: string;
14
+ description?: string;
15
+ dependsOn: string[];
16
+ consumes: number;
17
+ produces: number;
18
+ checkpoints: number;
19
+ }
20
+ export interface WorkflowAssetWorkflowSummary {
21
+ id: string;
22
+ name: string;
23
+ description?: string;
24
+ stepCount: number;
25
+ steps: WorkflowAssetStepSummary[];
26
+ }
27
+ export interface WorkflowAssetControllerSummary {
28
+ id: string;
29
+ name: string;
30
+ kind: string;
31
+ description?: string;
32
+ maxRounds?: number;
33
+ progressArtifactPath?: string;
34
+ diagnosisWorkflow?: string;
35
+ fixWorkflow?: string;
36
+ }
37
+ export interface WorkflowAssetCascadeSummary {
38
+ declared: boolean;
39
+ type?: string;
40
+ inherits: string[];
41
+ priority?: number;
42
+ }
43
+ export interface WorkflowAssetEvolutionSummary {
44
+ supported: boolean;
45
+ posture: "preview_supported" | "marker_seeded";
46
+ declaredMarkers: number;
47
+ markerIds: string[];
48
+ outcomeStore: string;
49
+ previewCommand: string;
50
+ mutatingCommand: string;
51
+ reviewMode: "preview_first";
52
+ }
53
+ export interface WorkflowAssetSummary {
54
+ id: string;
55
+ name: string;
56
+ dnaId?: string;
57
+ displayName?: string;
58
+ purpose?: string;
59
+ maturity: "draft" | "reviewed" | "adopted" | "unknown";
60
+ fit: string[];
61
+ notFor: string[];
62
+ inputs: string[];
63
+ outputs: string[];
64
+ lineage?: Record<string, unknown>;
65
+ source: TemplateCatalogEntry["source"];
66
+ path: string;
67
+ namespace?: string;
68
+ version?: string;
69
+ contentHash: string;
70
+ positioning?: string;
71
+ keywords: readonly string[];
72
+ roles: WorkflowAssetRoleSummary[];
73
+ workflows: WorkflowAssetWorkflowSummary[];
74
+ controllers: WorkflowAssetControllerSummary[];
75
+ cascade: WorkflowAssetCascadeSummary;
76
+ evolution: WorkflowAssetEvolutionSummary;
77
+ evidence: readonly WorkflowAssetEvidenceLink[];
78
+ status: WorkflowAssetStatus;
79
+ }
80
+ export type WorkflowAssetEvidencePosture = "dogfood_linked" | "reference_linked" | "unlinked";
81
+ export type WorkflowAssetManagementStatus = "dogfood_ready" | "asset_ready" | "template_only";
82
+ export interface WorkflowAssetStatus {
83
+ managementStatus: WorkflowAssetManagementStatus;
84
+ evidencePosture: WorkflowAssetEvidencePosture;
85
+ configurationPosture: "configured" | "available";
86
+ cascadePosture: "declared" | "standalone";
87
+ evolutionPosture: "preview_supported" | "marker_seeded";
88
+ configured: boolean;
89
+ configPaths: string[];
90
+ hasWorkflow: boolean;
91
+ hasController: boolean;
92
+ hasCascade: boolean;
93
+ hasEvidence: boolean;
94
+ notes: string[];
95
+ }
96
+ export declare function listWorkflowAssets(options?: {
97
+ projectDir?: string;
98
+ }): Promise<WorkflowAssetSummary[]>;
99
+ export declare function findWorkflowAsset(name: string, options?: {
100
+ projectDir?: string;
101
+ }): Promise<WorkflowAssetSummary | undefined>;
@@ -0,0 +1,311 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { relative } from "node:path";
3
+ import { detectDNAConfigs } from "../compiler/index.js";
4
+ import { DEFAULT_EVOLUTION_CONFIG } from "../evolution/types.js";
5
+ import { parseYAML } from "../schema/yaml-parser.js";
6
+ import { listTemplateCatalog, findTemplateCatalogEntry } from "../templates/catalog.js";
7
+ import { getWorkflowAssetMetadata } from "./metadata.js";
8
+ function isRecord(value) {
9
+ return typeof value === "object" && value !== null && !Array.isArray(value);
10
+ }
11
+ function asString(value) {
12
+ return typeof value === "string" && value.length > 0 ? value : undefined;
13
+ }
14
+ function asStringArray(value) {
15
+ return Array.isArray(value) ? value.filter((entry) => typeof entry === "string") : [];
16
+ }
17
+ function assetMaturity(value) {
18
+ return value === "draft" || value === "reviewed" || value === "adopted" ? value : "unknown";
19
+ }
20
+ function asEvidenceKind(value) {
21
+ return value === "doc" || value === "dogfood" || value === "reference" ? value : undefined;
22
+ }
23
+ function recordEntries(value) {
24
+ if (!isRecord(value))
25
+ return [];
26
+ return Object.entries(value)
27
+ .filter((entry) => isRecord(entry[1]));
28
+ }
29
+ function templateEvidenceLinks(data) {
30
+ if (!Array.isArray(data.evidence))
31
+ return [];
32
+ const links = [];
33
+ for (const entry of data.evidence) {
34
+ if (!isRecord(entry))
35
+ continue;
36
+ const label = asString(entry.label);
37
+ const path = asString(entry.path);
38
+ const kind = asEvidenceKind(entry.kind);
39
+ if (!label || !path || !kind)
40
+ continue;
41
+ links.push({
42
+ label,
43
+ path,
44
+ kind,
45
+ description: asString(entry.description),
46
+ });
47
+ }
48
+ return links;
49
+ }
50
+ function mergeEvidenceLinks(links) {
51
+ const seen = new Set();
52
+ const merged = [];
53
+ for (const link of links) {
54
+ const key = `${link.kind}:${link.path}`;
55
+ if (seen.has(key))
56
+ continue;
57
+ seen.add(key);
58
+ merged.push(link);
59
+ }
60
+ return merged;
61
+ }
62
+ function workflowRecords(data) {
63
+ const workflows = recordEntries(data.workflows);
64
+ if (workflows.length > 0)
65
+ return workflows;
66
+ if (isRecord(data.workflow)) {
67
+ const name = asString(data.workflow.name) ?? "workflow";
68
+ return [[name, data.workflow]];
69
+ }
70
+ return [];
71
+ }
72
+ function roleSummaries(data) {
73
+ return recordEntries(data.roles).map(([id, role]) => {
74
+ const toolPermissions = isRecord(role.tool_permissions) ? role.tool_permissions : {};
75
+ const scope = isRecord(role.scope) ? role.scope : {};
76
+ return {
77
+ id,
78
+ description: asString(role.description),
79
+ readScope: asStringArray(scope.read),
80
+ writeScope: asStringArray(scope.write),
81
+ allowTools: asStringArray(toolPermissions.allow),
82
+ denyTools: asStringArray(toolPermissions.deny),
83
+ };
84
+ });
85
+ }
86
+ function stepSummaries(workflow) {
87
+ if (!Array.isArray(workflow.steps))
88
+ return [];
89
+ return workflow.steps
90
+ .filter((step) => isRecord(step))
91
+ .filter((step) => typeof step.id === "string" && typeof step.role === "string")
92
+ .map((step) => {
93
+ const handoff = isRecord(step.handoff) ? step.handoff : {};
94
+ return {
95
+ id: step.id,
96
+ role: step.role,
97
+ description: asString(step.description),
98
+ dependsOn: asStringArray(step.depends_on),
99
+ consumes: Array.isArray(handoff.consumes) ? handoff.consumes.length : 0,
100
+ produces: Array.isArray(handoff.produces) ? handoff.produces.length : 0,
101
+ checkpoints: Array.isArray(step.checkpoints) ? step.checkpoints.length : 0,
102
+ };
103
+ });
104
+ }
105
+ function workflowSummaries(data) {
106
+ return workflowRecords(data).map(([id, workflow]) => {
107
+ const steps = stepSummaries(workflow);
108
+ return {
109
+ id,
110
+ name: asString(workflow.name) ?? id,
111
+ description: asString(workflow.description),
112
+ stepCount: steps.length,
113
+ steps,
114
+ };
115
+ });
116
+ }
117
+ function controllerSummaries(data) {
118
+ return recordEntries(data.controllers).map(([id, controller]) => ({
119
+ id,
120
+ name: asString(controller.name) ?? id,
121
+ kind: asString(controller.kind) ?? "unknown",
122
+ description: asString(controller.description),
123
+ maxRounds: typeof controller.max_rounds === "number" ? controller.max_rounds : undefined,
124
+ progressArtifactPath: asString(controller.progress_artifact_path),
125
+ diagnosisWorkflow: asString(controller.diagnosis_workflow),
126
+ fixWorkflow: asString(controller.fix_workflow),
127
+ }));
128
+ }
129
+ function cascadeSummary(data) {
130
+ const cascade = isRecord(data.cascade) ? data.cascade : {};
131
+ const inherits = asStringArray(cascade.inherits);
132
+ const priority = typeof cascade.priority === "number" ? cascade.priority : undefined;
133
+ return {
134
+ declared: inherits.length > 0 || priority !== undefined,
135
+ type: asString(data.type),
136
+ inherits,
137
+ priority,
138
+ };
139
+ }
140
+ function evolutionSummary(dnaId, data) {
141
+ const epigenetic = isRecord(data.epigenetic) ? data.epigenetic : {};
142
+ const markers = Array.isArray(epigenetic.markers)
143
+ ? epigenetic.markers.filter((marker) => isRecord(marker))
144
+ : [];
145
+ const markerIds = markers
146
+ .map((marker) => asString(marker.id))
147
+ .filter((id) => id !== undefined);
148
+ return {
149
+ supported: true,
150
+ posture: markerIds.length > 0 ? "marker_seeded" : "preview_supported",
151
+ declaredMarkers: markerIds.length,
152
+ markerIds,
153
+ outcomeStore: DEFAULT_EVOLUTION_CONFIG.store_dir,
154
+ previewCommand: `dna evolve ${dnaId}`,
155
+ mutatingCommand: "dna sync --evolve",
156
+ reviewMode: "preview_first",
157
+ };
158
+ }
159
+ function templateIdForAsset(assetName) {
160
+ return `template_${assetName.replaceAll("-", "_")}`;
161
+ }
162
+ function relativeConfigPath(projectDir, configPath) {
163
+ const rel = relative(projectDir, configPath);
164
+ return rel.length > 0 && !rel.startsWith("..") ? rel : configPath;
165
+ }
166
+ function configMatchesAsset(config, template) {
167
+ if (!isRecord(config))
168
+ return false;
169
+ const sourceTemplate = asString(config._source_template);
170
+ if (sourceTemplate === template.name)
171
+ return true;
172
+ const namespace = asString(config.namespace);
173
+ if (namespace !== undefined && namespace === template.namespace)
174
+ return true;
175
+ const id = asString(config.id);
176
+ return id === templateIdForAsset(template.name);
177
+ }
178
+ async function loadProjectDNAConfigs(projectDir) {
179
+ const configPaths = await detectDNAConfigs(projectDir);
180
+ const configs = [];
181
+ for (const configPath of configPaths) {
182
+ try {
183
+ const raw = await readFile(configPath, "utf-8");
184
+ const parsed = configPath.endsWith(".json") ? JSON.parse(raw) : parseYAML(raw);
185
+ configs.push({ path: relativeConfigPath(projectDir, configPath), data: parsed });
186
+ }
187
+ catch {
188
+ // Asset status is read-only inventory; invalid configs are reported by validate/health.
189
+ }
190
+ }
191
+ return configs;
192
+ }
193
+ function configuredAssetPaths(template, projectConfigs) {
194
+ return projectConfigs
195
+ .filter((config) => configMatchesAsset(config.data, template))
196
+ .map((config) => config.path);
197
+ }
198
+ function assetStatus(params) {
199
+ const hasWorkflow = params.workflows.length > 0;
200
+ const hasController = params.controllers.length > 0;
201
+ const hasCascade = params.cascade.declared;
202
+ const hasEvidence = params.evidence.length > 0;
203
+ const configured = params.configPaths.length > 0;
204
+ const hasDogfood = params.evidence.some((evidence) => evidence.kind === "dogfood");
205
+ const evidencePosture = hasDogfood
206
+ ? "dogfood_linked"
207
+ : hasEvidence
208
+ ? "reference_linked"
209
+ : "unlinked";
210
+ const managementStatus = hasDogfood
211
+ ? "dogfood_ready"
212
+ : hasWorkflow || hasController
213
+ ? "asset_ready"
214
+ : "template_only";
215
+ const notes = [];
216
+ if (!hasWorkflow)
217
+ notes.push("No workflow definition found; this asset is role/policy-only until workflow steps are declared.");
218
+ if (!hasController)
219
+ notes.push("No controller definition found; execution loop status is not represented.");
220
+ if (!hasCascade)
221
+ notes.push("No cascade inheritance declared; this asset is standalone until an org/project layer is attached.");
222
+ if (!hasEvidence)
223
+ notes.push("No evidence/reference links registered for this asset.");
224
+ if (!configured)
225
+ notes.push("This workflow asset is available in the catalog but not configured in this project.");
226
+ if (hasDogfood)
227
+ notes.push("Dogfood evidence is linked as a human review surface; runtime truth still lives in source evidence files.");
228
+ if (params.evolution.reviewMode === "preview_first")
229
+ notes.push("Evolution is preview-first; marker mutation requires an explicit sync/evolve path and human review.");
230
+ return {
231
+ managementStatus,
232
+ evidencePosture,
233
+ configurationPosture: configured ? "configured" : "available",
234
+ cascadePosture: hasCascade ? "declared" : "standalone",
235
+ evolutionPosture: params.evolution.posture,
236
+ configured,
237
+ configPaths: params.configPaths,
238
+ hasWorkflow,
239
+ hasController,
240
+ hasCascade,
241
+ hasEvidence,
242
+ notes,
243
+ };
244
+ }
245
+ async function assetFromTemplate(template, projectConfigs) {
246
+ const content = await readFile(template.path, "utf-8");
247
+ const parsed = parseYAML(content);
248
+ if (!isRecord(parsed))
249
+ return null;
250
+ const roles = roleSummaries(parsed);
251
+ const workflows = workflowSummaries(parsed);
252
+ const controllers = controllerSummaries(parsed);
253
+ if (roles.length === 0 && workflows.length === 0 && controllers.length === 0)
254
+ return null;
255
+ const dnaId = asString(parsed.id) ?? templateIdForAsset(template.name);
256
+ const cascade = cascadeSummary(parsed);
257
+ const evolution = evolutionSummary(dnaId, parsed);
258
+ const metadata = getWorkflowAssetMetadata(template.name);
259
+ const evidence = mergeEvidenceLinks([
260
+ ...(metadata?.evidence ?? []),
261
+ ...templateEvidenceLinks(parsed),
262
+ ]);
263
+ const configPaths = configuredAssetPaths(template, projectConfigs);
264
+ return {
265
+ id: template.name,
266
+ name: template.name,
267
+ dnaId,
268
+ displayName: template.displayName,
269
+ purpose: asString(parsed.purpose),
270
+ maturity: assetMaturity(parsed.maturity),
271
+ fit: asStringArray(parsed.fit),
272
+ notFor: asStringArray(parsed.not_for),
273
+ inputs: asStringArray(parsed.inputs),
274
+ outputs: asStringArray(parsed.outputs),
275
+ lineage: isRecord(parsed.lineage) ? parsed.lineage : undefined,
276
+ source: template.source,
277
+ path: template.path,
278
+ namespace: template.namespace,
279
+ version: template.version,
280
+ contentHash: template.contentHash,
281
+ positioning: metadata?.positioning,
282
+ keywords: template.keywords,
283
+ roles,
284
+ workflows,
285
+ controllers,
286
+ cascade,
287
+ evolution,
288
+ evidence,
289
+ status: assetStatus({ workflows, controllers, cascade, evolution, evidence, configPaths }),
290
+ };
291
+ }
292
+ export async function listWorkflowAssets(options) {
293
+ const projectDir = options?.projectDir ?? process.cwd();
294
+ const templates = await listTemplateCatalog({ projectDir });
295
+ const projectConfigs = await loadProjectDNAConfigs(projectDir);
296
+ const assets = [];
297
+ for (const template of templates) {
298
+ const asset = await assetFromTemplate(template, projectConfigs);
299
+ if (asset)
300
+ assets.push(asset);
301
+ }
302
+ return assets;
303
+ }
304
+ export async function findWorkflowAsset(name, options) {
305
+ const projectDir = options?.projectDir ?? process.cwd();
306
+ const template = await findTemplateCatalogEntry(name, { projectDir });
307
+ if (!template)
308
+ return undefined;
309
+ const projectConfigs = await loadProjectDNAConfigs(projectDir);
310
+ return (await assetFromTemplate(template, projectConfigs)) ?? undefined;
311
+ }
@@ -0,0 +1,93 @@
1
+ export type WorkflowAssetEvidenceVerdict = "PASS" | "CONTINUE" | "REQUEST_CHANGES" | "BLOCKED" | "UNKNOWN";
2
+ export type WorkflowAssetRuntimeArtifactTarget = "claude_code";
3
+ export type WorkflowAssetRuntimeArtifactKind = "agent_prompt" | "skill_entrypoint" | "skill_map";
4
+ export type WorkflowAssetEvidenceCaptureFact = "command" | "result" | "retry" | "manual_intervention" | "blocker" | "handoff";
5
+ export type WorkflowAssetEvidenceCaptureResult = "success" | "failure" | "blocked" | "skipped" | "unknown" | "unsupported";
6
+ export interface WorkflowAssetEvidenceCapture {
7
+ eventId: string;
8
+ capturedAt: string;
9
+ source: string;
10
+ workflowAsset: string;
11
+ workflowId: string;
12
+ runId: string;
13
+ stepId: string;
14
+ fact: WorkflowAssetEvidenceCaptureFact;
15
+ summary: string;
16
+ command?: string;
17
+ result?: WorkflowAssetEvidenceCaptureResult;
18
+ evidenceRefs: Array<{
19
+ type: string;
20
+ ref: string;
21
+ }>;
22
+ path: string;
23
+ }
24
+ export interface WorkflowAssetRuntimeArtifact {
25
+ target: WorkflowAssetRuntimeArtifactTarget;
26
+ kind: WorkflowAssetRuntimeArtifactKind;
27
+ name: string;
28
+ path: string;
29
+ managed: boolean;
30
+ source?: string;
31
+ description?: string;
32
+ roles?: string[];
33
+ consumes?: number;
34
+ produces?: number;
35
+ bodyPath?: string;
36
+ }
37
+ export interface WorkflowAssetEvidenceModule {
38
+ module: string;
39
+ verdict: WorkflowAssetEvidenceVerdict;
40
+ review?: string;
41
+ moduleComplete: boolean;
42
+ round?: number;
43
+ runId?: string;
44
+ gitHead?: string;
45
+ lastFixCommit?: string;
46
+ fixedCount: number;
47
+ newRedCount: number;
48
+ blockedCount: number;
49
+ remainingCount: number;
50
+ remainingUnimplementedSkippedCount: number;
51
+ updatedAt?: string;
52
+ progressJsonPath: string;
53
+ progressMarkdownPath?: string;
54
+ evidencePaths: string[];
55
+ failureReason?: string;
56
+ nextRoundFocus?: string;
57
+ }
58
+ export interface WorkflowAssetEvidenceIndex {
59
+ asset: string;
60
+ projectPath: string;
61
+ progressDir: string;
62
+ sourceDescription?: string;
63
+ totals: {
64
+ modules: number;
65
+ pass: number;
66
+ continue: number;
67
+ requestChanges: number;
68
+ blocked: number;
69
+ unknown: number;
70
+ complete: number;
71
+ remaining: number;
72
+ remainingUnimplementedSkipped: number;
73
+ newRed: number;
74
+ runtimeArtifacts: number;
75
+ agentPrompts: number;
76
+ skillEntrypoints: number;
77
+ captureFacts: number;
78
+ captureBlocked: number;
79
+ captureFailures: number;
80
+ captureManualInterventions: number;
81
+ captureRetries: number;
82
+ };
83
+ modules: WorkflowAssetEvidenceModule[];
84
+ runtimeArtifacts: WorkflowAssetRuntimeArtifact[];
85
+ captureFacts: WorkflowAssetEvidenceCapture[];
86
+ warnings: string[];
87
+ }
88
+ export interface WorkflowAssetEvidenceOptions {
89
+ projectDir?: string;
90
+ dogfoodProjectPath?: string;
91
+ dogfoodProgressDir?: string;
92
+ }
93
+ export declare function buildWorkflowAssetEvidenceIndex(name: string, options?: WorkflowAssetEvidenceOptions): Promise<WorkflowAssetEvidenceIndex | undefined>;