intentdna 1.0.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 (184) hide show
  1. package/LICENSE +69 -0
  2. package/README.md +251 -0
  3. package/dist/audit/index.d.ts +109 -0
  4. package/dist/audit/index.d.ts.map +1 -0
  5. package/dist/audit/index.js +144 -0
  6. package/dist/audit/index.js.map +1 -0
  7. package/dist/cli/commands/compile.d.ts +14 -0
  8. package/dist/cli/commands/compile.d.ts.map +1 -0
  9. package/dist/cli/commands/compile.js +89 -0
  10. package/dist/cli/commands/compile.js.map +1 -0
  11. package/dist/cli/commands/epigenetic.d.ts +20 -0
  12. package/dist/cli/commands/epigenetic.d.ts.map +1 -0
  13. package/dist/cli/commands/epigenetic.js +112 -0
  14. package/dist/cli/commands/epigenetic.js.map +1 -0
  15. package/dist/cli/commands/evolve.d.ts +12 -0
  16. package/dist/cli/commands/evolve.d.ts.map +1 -0
  17. package/dist/cli/commands/evolve.js +52 -0
  18. package/dist/cli/commands/evolve.js.map +1 -0
  19. package/dist/cli/commands/guard.d.ts +22 -0
  20. package/dist/cli/commands/guard.d.ts.map +1 -0
  21. package/dist/cli/commands/guard.js +257 -0
  22. package/dist/cli/commands/guard.js.map +1 -0
  23. package/dist/cli/commands/import.d.ts +71 -0
  24. package/dist/cli/commands/import.d.ts.map +1 -0
  25. package/dist/cli/commands/import.js +428 -0
  26. package/dist/cli/commands/import.js.map +1 -0
  27. package/dist/cli/commands/init.d.ts +13 -0
  28. package/dist/cli/commands/init.d.ts.map +1 -0
  29. package/dist/cli/commands/init.js +171 -0
  30. package/dist/cli/commands/init.js.map +1 -0
  31. package/dist/cli/commands/run.d.ts +59 -0
  32. package/dist/cli/commands/run.d.ts.map +1 -0
  33. package/dist/cli/commands/run.js +350 -0
  34. package/dist/cli/commands/run.js.map +1 -0
  35. package/dist/cli/commands/show.d.ts +12 -0
  36. package/dist/cli/commands/show.d.ts.map +1 -0
  37. package/dist/cli/commands/show.js +78 -0
  38. package/dist/cli/commands/show.js.map +1 -0
  39. package/dist/cli/commands/sync.d.ts +31 -0
  40. package/dist/cli/commands/sync.d.ts.map +1 -0
  41. package/dist/cli/commands/sync.js +307 -0
  42. package/dist/cli/commands/sync.js.map +1 -0
  43. package/dist/cli/commands/validate.d.ts +11 -0
  44. package/dist/cli/commands/validate.d.ts.map +1 -0
  45. package/dist/cli/commands/validate.js +30 -0
  46. package/dist/cli/commands/validate.js.map +1 -0
  47. package/dist/cli/commands/verify.d.ts +33 -0
  48. package/dist/cli/commands/verify.d.ts.map +1 -0
  49. package/dist/cli/commands/verify.js +102 -0
  50. package/dist/cli/commands/verify.js.map +1 -0
  51. package/dist/cli/index.d.ts +15 -0
  52. package/dist/cli/index.d.ts.map +1 -0
  53. package/dist/cli/index.js +358 -0
  54. package/dist/cli/index.js.map +1 -0
  55. package/dist/cli/util/format.d.ts +24 -0
  56. package/dist/cli/util/format.d.ts.map +1 -0
  57. package/dist/cli/util/format.js +67 -0
  58. package/dist/cli/util/format.js.map +1 -0
  59. package/dist/cli/util/prompt.d.ts +11 -0
  60. package/dist/cli/util/prompt.d.ts.map +1 -0
  61. package/dist/cli/util/prompt.js +51 -0
  62. package/dist/cli/util/prompt.js.map +1 -0
  63. package/dist/compiler/activate.d.ts +29 -0
  64. package/dist/compiler/activate.d.ts.map +1 -0
  65. package/dist/compiler/activate.js +141 -0
  66. package/dist/compiler/activate.js.map +1 -0
  67. package/dist/compiler/cascade.d.ts +27 -0
  68. package/dist/compiler/cascade.d.ts.map +1 -0
  69. package/dist/compiler/cascade.js +124 -0
  70. package/dist/compiler/cascade.js.map +1 -0
  71. package/dist/compiler/compile.d.ts +17 -0
  72. package/dist/compiler/compile.d.ts.map +1 -0
  73. package/dist/compiler/compile.js +219 -0
  74. package/dist/compiler/compile.js.map +1 -0
  75. package/dist/compiler/index.d.ts +28 -0
  76. package/dist/compiler/index.d.ts.map +1 -0
  77. package/dist/compiler/index.js +51 -0
  78. package/dist/compiler/index.js.map +1 -0
  79. package/dist/compiler/workflow.d.ts +37 -0
  80. package/dist/compiler/workflow.d.ts.map +1 -0
  81. package/dist/compiler/workflow.js +274 -0
  82. package/dist/compiler/workflow.js.map +1 -0
  83. package/dist/evolution/collector.d.ts +52 -0
  84. package/dist/evolution/collector.d.ts.map +1 -0
  85. package/dist/evolution/collector.js +72 -0
  86. package/dist/evolution/collector.js.map +1 -0
  87. package/dist/evolution/fitness.d.ts +33 -0
  88. package/dist/evolution/fitness.d.ts.map +1 -0
  89. package/dist/evolution/fitness.js +96 -0
  90. package/dist/evolution/fitness.js.map +1 -0
  91. package/dist/evolution/index.d.ts +53 -0
  92. package/dist/evolution/index.d.ts.map +1 -0
  93. package/dist/evolution/index.js +69 -0
  94. package/dist/evolution/index.js.map +1 -0
  95. package/dist/evolution/marker-gen.d.ts +31 -0
  96. package/dist/evolution/marker-gen.d.ts.map +1 -0
  97. package/dist/evolution/marker-gen.js +141 -0
  98. package/dist/evolution/marker-gen.js.map +1 -0
  99. package/dist/evolution/store.d.ts +24 -0
  100. package/dist/evolution/store.d.ts.map +1 -0
  101. package/dist/evolution/store.js +78 -0
  102. package/dist/evolution/store.js.map +1 -0
  103. package/dist/evolution/types.d.ts +73 -0
  104. package/dist/evolution/types.d.ts.map +1 -0
  105. package/dist/evolution/types.js +14 -0
  106. package/dist/evolution/types.js.map +1 -0
  107. package/dist/index.d.ts +4 -0
  108. package/dist/index.d.ts.map +1 -0
  109. package/dist/index.js +4 -0
  110. package/dist/index.js.map +1 -0
  111. package/dist/log/logger.d.ts +15 -0
  112. package/dist/log/logger.d.ts.map +1 -0
  113. package/dist/log/logger.js +36 -0
  114. package/dist/log/logger.js.map +1 -0
  115. package/dist/runtime/agent-md.d.ts +56 -0
  116. package/dist/runtime/agent-md.d.ts.map +1 -0
  117. package/dist/runtime/agent-md.js +257 -0
  118. package/dist/runtime/agent-md.js.map +1 -0
  119. package/dist/runtime/claude-sdk.d.ts +51 -0
  120. package/dist/runtime/claude-sdk.d.ts.map +1 -0
  121. package/dist/runtime/claude-sdk.js +78 -0
  122. package/dist/runtime/claude-sdk.js.map +1 -0
  123. package/dist/runtime/hooks.d.ts +67 -0
  124. package/dist/runtime/hooks.d.ts.map +1 -0
  125. package/dist/runtime/hooks.js +645 -0
  126. package/dist/runtime/hooks.js.map +1 -0
  127. package/dist/runtime/index.d.ts +9 -0
  128. package/dist/runtime/index.d.ts.map +1 -0
  129. package/dist/runtime/index.js +5 -0
  130. package/dist/runtime/index.js.map +1 -0
  131. package/dist/runtime/markdown.d.ts +36 -0
  132. package/dist/runtime/markdown.d.ts.map +1 -0
  133. package/dist/runtime/markdown.js +214 -0
  134. package/dist/runtime/markdown.js.map +1 -0
  135. package/dist/runtime/settings-adapter.d.ts +33 -0
  136. package/dist/runtime/settings-adapter.d.ts.map +1 -0
  137. package/dist/runtime/settings-adapter.js +78 -0
  138. package/dist/runtime/settings-adapter.js.map +1 -0
  139. package/dist/runtime/skill-adapter.d.ts +22 -0
  140. package/dist/runtime/skill-adapter.d.ts.map +1 -0
  141. package/dist/runtime/skill-adapter.js +170 -0
  142. package/dist/runtime/skill-adapter.js.map +1 -0
  143. package/dist/runtime/workflow-runner.d.ts +53 -0
  144. package/dist/runtime/workflow-runner.d.ts.map +1 -0
  145. package/dist/runtime/workflow-runner.js +420 -0
  146. package/dist/runtime/workflow-runner.js.map +1 -0
  147. package/dist/schema/index.d.ts +2 -0
  148. package/dist/schema/index.d.ts.map +1 -0
  149. package/dist/schema/index.js +2 -0
  150. package/dist/schema/index.js.map +1 -0
  151. package/dist/schema/types.d.ts +275 -0
  152. package/dist/schema/types.d.ts.map +1 -0
  153. package/dist/schema/types.js +11 -0
  154. package/dist/schema/types.js.map +1 -0
  155. package/dist/schema/validate.d.ts +20 -0
  156. package/dist/schema/validate.d.ts.map +1 -0
  157. package/dist/schema/validate.js +379 -0
  158. package/dist/schema/validate.js.map +1 -0
  159. package/dist/schema/yaml-parser.d.ts +12 -0
  160. package/dist/schema/yaml-parser.d.ts.map +1 -0
  161. package/dist/schema/yaml-parser.js +298 -0
  162. package/dist/schema/yaml-parser.js.map +1 -0
  163. package/dist/species/default.dna.json +62 -0
  164. package/dist/templates/api-backend.dna.yaml +77 -0
  165. package/dist/templates/brainstorming-first.dna.yaml +71 -0
  166. package/dist/templates/branch-finishing.dna.yaml +54 -0
  167. package/dist/templates/code-review-pipeline.dna.yaml +91 -0
  168. package/dist/templates/devops-cicd.dna.yaml +67 -0
  169. package/dist/templates/documentation-writer.dna.yaml +71 -0
  170. package/dist/templates/enterprise-baseline.dna.yaml +66 -0
  171. package/dist/templates/frontend-quality.dna.yaml +88 -0
  172. package/dist/templates/full-pipeline.dna.yaml +129 -0
  173. package/dist/templates/mobile-dev.dna.yaml +68 -0
  174. package/dist/templates/monorepo-governance.dna.yaml +60 -0
  175. package/dist/templates/multi-perspective-review.dna.yaml +109 -0
  176. package/dist/templates/pr-submitter.dna.yaml +55 -0
  177. package/dist/templates/safe-refactoring.dna.yaml +65 -0
  178. package/dist/templates/secure-dev.dna.yaml +90 -0
  179. package/dist/templates/subagent-parallel.dna.yaml +98 -0
  180. package/dist/templates/systematic-debugging.dna.yaml +55 -0
  181. package/dist/templates/tdd-strict.dna.yaml +69 -0
  182. package/dist/templates/verification-loop.dna.yaml +53 -0
  183. package/dist/templates/yolo-with-guardrails.dna.yaml +56 -0
  184. package/package.json +43 -0
@@ -0,0 +1,78 @@
1
+ /**
2
+ * dna show <files...> [--context <name>] [--json]
3
+ *
4
+ * Show DNA gene expression state in human-readable format.
5
+ */
6
+ import { resolve, dirname } from "node:path";
7
+ import { readFile } from "node:fs/promises";
8
+ import { fileURLToPath } from "node:url";
9
+ import { loadDNA, cascadeDNA, activateDNA } from "../../compiler/index.js";
10
+ import { formatGene, bold } from "../util/format.js";
11
+ function resolveSpeciesPath(ref) {
12
+ if (!ref.startsWith("species:"))
13
+ return null;
14
+ const name = ref.slice("species:".length);
15
+ const thisDir = dirname(fileURLToPath(import.meta.url));
16
+ return resolve(thisDir, "..", "..", "species", `${name}.dna.json`);
17
+ }
18
+ async function expandFiles(files) {
19
+ const expanded = [];
20
+ const seen = new Set();
21
+ for (const file of files) {
22
+ const abs = resolve(file);
23
+ if (seen.has(abs))
24
+ continue;
25
+ seen.add(abs);
26
+ expanded.push(abs);
27
+ try {
28
+ const raw = await readFile(abs, "utf-8");
29
+ const dna = JSON.parse(raw);
30
+ for (const ref of dna.cascade?.inherits ?? []) {
31
+ const speciesPath = resolveSpeciesPath(ref);
32
+ if (speciesPath && !seen.has(speciesPath)) {
33
+ seen.add(speciesPath);
34
+ expanded.unshift(speciesPath);
35
+ }
36
+ }
37
+ }
38
+ catch {
39
+ // Will fail later with proper error
40
+ }
41
+ }
42
+ return expanded;
43
+ }
44
+ export async function runShow(opts) {
45
+ if (opts.files.length === 0) {
46
+ process.stderr.write("Error: no files specified\n");
47
+ return 2;
48
+ }
49
+ try {
50
+ const expandedFiles = await expandFiles(opts.files);
51
+ const dnas = await Promise.all(expandedFiles.map(loadDNA));
52
+ const cascaded = cascadeDNA(dnas);
53
+ const activated = activateDNA(cascaded, opts.context ?? null);
54
+ if (opts.json) {
55
+ process.stdout.write(JSON.stringify(activated, null, 2) + "\n");
56
+ return 0;
57
+ }
58
+ // Human-readable output
59
+ const lines = [];
60
+ lines.push(bold("Intent DNA — Gene Expression"));
61
+ if (opts.context) {
62
+ lines.push(`Context: ${opts.context}`);
63
+ }
64
+ lines.push(`Sources: ${activated.source_ids.join(", ")}`);
65
+ lines.push("");
66
+ for (const [name, gene] of Object.entries(activated.genes)) {
67
+ lines.push(formatGene(name, gene));
68
+ lines.push("");
69
+ }
70
+ process.stderr.write(lines.join("\n"));
71
+ return 0;
72
+ }
73
+ catch (err) {
74
+ process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\n`);
75
+ return 1;
76
+ }
77
+ }
78
+ //# sourceMappingURL=show.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"show.js","sourceRoot":"","sources":["../../../src/cli/commands/show.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * dna sync <files...> --target <target> --inject <path> [--context <name>] [--evolve] [--store-dir <path>] [--hooks <dir>] [--agents <dir>] [--remove]
3
+ *
4
+ * One-command workflow:
5
+ * 1. (optional) evolve markers from accumulated outcomes
6
+ * 2. compile DNA with species auto-resolution + epigenetic markers
7
+ * 3. inject into target file (CLAUDE.md, SOUL.md, .cursorrules, etc.)
8
+ * 4. (optional) generate hook scripts for harness-level enforcement
9
+ * 5. (optional) generate agent MD files from role definitions
10
+ *
11
+ * Targets: claude-md, soul-md, cursorrules, system-prompt
12
+ */
13
+ export interface SyncOptions {
14
+ files: string[];
15
+ target: string;
16
+ inject: string;
17
+ context?: string;
18
+ role?: string;
19
+ evolve: boolean;
20
+ storeDir?: string;
21
+ hooksDir?: string;
22
+ agentsDir?: string;
23
+ workflowDir?: string;
24
+ workflowName?: string;
25
+ skillsDir?: string;
26
+ settingsPath?: string;
27
+ lockFile?: string;
28
+ remove: boolean;
29
+ }
30
+ export declare function runSync(opts: SyncOptions): Promise<number>;
31
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAiBH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;CACjB;AAuED,wBAAsB,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CA0PhE"}
@@ -0,0 +1,307 @@
1
+ /**
2
+ * dna sync <files...> --target <target> --inject <path> [--context <name>] [--evolve] [--store-dir <path>] [--hooks <dir>] [--agents <dir>] [--remove]
3
+ *
4
+ * One-command workflow:
5
+ * 1. (optional) evolve markers from accumulated outcomes
6
+ * 2. compile DNA with species auto-resolution + epigenetic markers
7
+ * 3. inject into target file (CLAUDE.md, SOUL.md, .cursorrules, etc.)
8
+ * 4. (optional) generate hook scripts for harness-level enforcement
9
+ * 5. (optional) generate agent MD files from role definitions
10
+ *
11
+ * Targets: claude-md, soul-md, cursorrules, system-prompt
12
+ */
13
+ import { resolve, dirname } from "node:path";
14
+ import { readFile, writeFile as writeFileAsync } from "node:fs/promises";
15
+ import { createHash } from "node:crypto";
16
+ import { fileURLToPath } from "node:url";
17
+ import { loadDNA, compileFromFiles } from "../../compiler/index.js";
18
+ import { compileToMarkdown, injectIntoFile, removeFromFile } from "../../runtime/markdown.js";
19
+ import { compileToHooks, writeHookScripts, removeHookScripts } from "../../runtime/hooks.js";
20
+ import { compileAllRolesToAgentMD, writeAgentMDFiles, removeAgentMDFiles } from "../../runtime/agent-md.js";
21
+ import { removeWorkflowScripts } from "../../runtime/workflow-runner.js";
22
+ import { compileWorkflowToSkill, writeSkillFiles } from "../../runtime/skill-adapter.js";
23
+ import { compileSettings, mergeSettingsFile } from "../../runtime/settings-adapter.js";
24
+ import { cascadeDNA } from "../../compiler/cascade.js";
25
+ import { EvolutionEngine } from "../../evolution/index.js";
26
+ const VALID_TARGETS = ["claude-md", "soul-md", "cursorrules", "system-prompt"];
27
+ function resolveSpeciesPath(ref) {
28
+ if (!ref.startsWith("species:"))
29
+ return null;
30
+ const name = ref.slice("species:".length);
31
+ const thisDir = dirname(fileURLToPath(import.meta.url));
32
+ return resolve(thisDir, "..", "..", "species", `${name}.dna.json`);
33
+ }
34
+ async function expandFiles(files) {
35
+ const expanded = [];
36
+ const seen = new Set();
37
+ for (const file of files) {
38
+ const abs = resolve(file);
39
+ if (seen.has(abs))
40
+ continue;
41
+ seen.add(abs);
42
+ expanded.push(abs);
43
+ try {
44
+ const raw = await readFile(abs, "utf-8");
45
+ const dna = JSON.parse(raw);
46
+ for (const ref of dna.cascade?.inherits ?? []) {
47
+ const speciesPath = resolveSpeciesPath(ref);
48
+ if (speciesPath && !seen.has(speciesPath)) {
49
+ seen.add(speciesPath);
50
+ expanded.unshift(speciesPath);
51
+ }
52
+ }
53
+ }
54
+ catch {
55
+ // Will fail later with proper error
56
+ }
57
+ }
58
+ return expanded;
59
+ }
60
+ function fileSha256(content) {
61
+ return createHash("sha256").update(content, "utf-8").digest("hex");
62
+ }
63
+ async function computeFileHash(filePath) {
64
+ const content = await readFile(filePath, "utf-8");
65
+ return fileSha256(content);
66
+ }
67
+ async function generateLockFile(lockPath, dnaSources, outputFiles) {
68
+ const outputs = {};
69
+ for (const f of outputFiles) {
70
+ outputs[f] = { sha256: await computeFileHash(f) };
71
+ }
72
+ const lock = {
73
+ synced_at: new Date().toISOString(),
74
+ dna_sources: dnaSources,
75
+ outputs,
76
+ };
77
+ await writeFileAsync(lockPath, JSON.stringify(lock, null, 2) + "\n", "utf-8");
78
+ }
79
+ export async function runSync(opts) {
80
+ // Handle --remove
81
+ if (opts.remove) {
82
+ if (!opts.inject && !opts.hooksDir && !opts.agentsDir && !opts.workflowDir) {
83
+ process.stderr.write("Error: --inject, --hooks, --agents, or --workflow is required with --remove\n");
84
+ return 2;
85
+ }
86
+ if (opts.inject) {
87
+ const removed = await removeFromFile(opts.inject);
88
+ if (removed) {
89
+ process.stderr.write(`Removed Intent DNA block from ${opts.inject}\n`);
90
+ }
91
+ else {
92
+ process.stderr.write(`No Intent DNA block found in ${opts.inject}\n`);
93
+ }
94
+ }
95
+ if (opts.hooksDir) {
96
+ const count = await removeHookScripts(opts.hooksDir);
97
+ if (count > 0) {
98
+ process.stderr.write(`Removed ${count} Intent DNA hook script(s) from ${opts.hooksDir}\n`);
99
+ }
100
+ else {
101
+ process.stderr.write(`No Intent DNA hook scripts found in ${opts.hooksDir}\n`);
102
+ }
103
+ }
104
+ if (opts.agentsDir) {
105
+ const count = await removeAgentMDFiles(opts.agentsDir);
106
+ if (count > 0) {
107
+ process.stderr.write(`Removed ${count} Intent DNA agent file(s) from ${opts.agentsDir}\n`);
108
+ }
109
+ else {
110
+ process.stderr.write(`No Intent DNA agent files found in ${opts.agentsDir}\n`);
111
+ }
112
+ }
113
+ if (opts.workflowDir) {
114
+ const count = await removeWorkflowScripts(opts.workflowDir);
115
+ if (count > 0) {
116
+ process.stderr.write(`Removed ${count} Intent DNA workflow script(s) from ${opts.workflowDir}\n`);
117
+ }
118
+ else {
119
+ process.stderr.write(`No Intent DNA workflow scripts found in ${opts.workflowDir}\n`);
120
+ }
121
+ }
122
+ return 0;
123
+ }
124
+ if (opts.files.length === 0) {
125
+ process.stderr.write("Error: no DNA files specified\n");
126
+ return 2;
127
+ }
128
+ if (!opts.inject && !opts.hooksDir && !opts.agentsDir && !opts.workflowDir && !opts.skillsDir && !opts.settingsPath) {
129
+ process.stderr.write("Error: --inject <path>, --hooks <dir>, --agents <dir>, --workflow <dir>, --skills <dir>, or --settings <path> is required\n");
130
+ return 2;
131
+ }
132
+ if (opts.inject && !VALID_TARGETS.includes(opts.target)) {
133
+ process.stderr.write(`Error: unknown target '${opts.target}'. Available: ${VALID_TARGETS.join(", ")}\n`);
134
+ return 2;
135
+ }
136
+ const target = opts.target;
137
+ try {
138
+ // Track all output file paths for lock file generation
139
+ const trackedOutputs = [];
140
+ // Step 1: Evolve if requested
141
+ let epigeneticMarkers = undefined;
142
+ if (opts.evolve) {
143
+ // Need to know the DNA ID for evolution
144
+ const expandedFiles = await expandFiles(opts.files);
145
+ const dnas = await Promise.all(expandedFiles.map(loadDNA));
146
+ // Use the highest-priority DNA's ID
147
+ const primaryDna = dnas.reduce((a, b) => a.cascade.priority >= b.cascade.priority ? a : b);
148
+ const engine = new EvolutionEngine(opts.storeDir ? { store_dir: opts.storeDir } : undefined);
149
+ const markers = await engine.evolve(primaryDna.id);
150
+ if (markers.length > 0) {
151
+ process.stderr.write(`Evolved: ${markers.length} active markers\n`);
152
+ epigeneticMarkers = markers;
153
+ }
154
+ }
155
+ // Step 2: Compile
156
+ const expandedFiles = await expandFiles(opts.files);
157
+ const ir = await compileFromFiles(expandedFiles, {
158
+ context: opts.context,
159
+ role: opts.role,
160
+ epigenetic_markers: epigeneticMarkers,
161
+ });
162
+ // Step 3: Render and inject markdown
163
+ if (opts.inject) {
164
+ const target = opts.target;
165
+ const markdown = compileToMarkdown(ir, target);
166
+ const modified = await injectIntoFile(opts.inject, markdown);
167
+ if (modified) {
168
+ process.stderr.write(`Synced to ${opts.inject} (${target})\n`);
169
+ }
170
+ else {
171
+ process.stderr.write(`No changes needed in ${opts.inject}\n`);
172
+ }
173
+ trackedOutputs.push(resolve(opts.inject));
174
+ }
175
+ // Step 4: Generate hook scripts
176
+ if (opts.hooksDir) {
177
+ const scripts = compileToHooks(ir);
178
+ const written = await writeHookScripts(opts.hooksDir, scripts);
179
+ if (written.length > 0) {
180
+ process.stderr.write(`Generated ${written.length} hook script(s) in ${opts.hooksDir}\n`);
181
+ for (const f of written) {
182
+ process.stderr.write(` ${f}\n`);
183
+ }
184
+ trackedOutputs.push(...written.map(f => resolve(f)));
185
+ // Report role scope information
186
+ if (ir.roles_scope_map && ir.roles_scope_map.length > 0) {
187
+ const roleNames = ir.roles_scope_map.map(r => r.role_name).join(", ");
188
+ process.stderr.write(` ${ir.roles_scope_map.length} role scope(s) compiled: ${roleNames}\n`);
189
+ }
190
+ }
191
+ else {
192
+ process.stderr.write(`No hook-enforceable constraints found\n`);
193
+ }
194
+ }
195
+ // Step 5: Generate agent MD files
196
+ if (opts.agentsDir) {
197
+ const dnas = await Promise.all(expandedFiles.map(loadDNA));
198
+ const cascaded = cascadeDNA(dnas);
199
+ const roles = cascaded.roles;
200
+ if (Object.keys(roles).length === 0) {
201
+ process.stderr.write(`No roles defined in DNA files\n`);
202
+ }
203
+ else {
204
+ const results = compileAllRolesToAgentMD(roles, ir);
205
+ const written = await writeAgentMDFiles(results, opts.agentsDir);
206
+ if (written.length > 0) {
207
+ process.stderr.write(`Generated ${written.length} agent file(s) in ${opts.agentsDir}\n`);
208
+ for (const f of written) {
209
+ process.stderr.write(` ${f}\n`);
210
+ }
211
+ trackedOutputs.push(...written.map(f => resolve(f)));
212
+ }
213
+ }
214
+ }
215
+ // Step 6: Generate workflow script(s)
216
+ if (opts.workflowDir) {
217
+ const dnas = await Promise.all(expandedFiles.map(loadDNA));
218
+ const cascadedForWf = cascadeDNA(dnas);
219
+ const workflows = cascadedForWf.workflows;
220
+ if (Object.keys(workflows).length === 0) {
221
+ process.stderr.write("No workflow defined in DNA files\n");
222
+ }
223
+ else {
224
+ const { compileWorkflow } = await import("../../compiler/workflow.js");
225
+ const { compileWorkflowToShell, writeWorkflowScript } = await import("../../runtime/workflow-runner.js");
226
+ // If --workflow-name specified, only compile that workflow; otherwise compile all
227
+ const targetWorkflows = opts.workflowName
228
+ ? { [opts.workflowName]: workflows[opts.workflowName] }
229
+ : workflows;
230
+ for (const [name, wfDef] of Object.entries(targetWorkflows)) {
231
+ if (!wfDef) {
232
+ process.stderr.write(`Workflow '${name}' not found\n`);
233
+ continue;
234
+ }
235
+ const result = compileWorkflow(wfDef);
236
+ if (!result.ok) {
237
+ process.stderr.write(`Workflow '${name}' compilation failed:\n`);
238
+ for (const err of result.errors) {
239
+ process.stderr.write(` ${err.path}: ${err.message}\n`);
240
+ }
241
+ }
242
+ else {
243
+ const shellResult = compileWorkflowToShell(result.plan);
244
+ const written = await writeWorkflowScript(shellResult, opts.workflowDir);
245
+ process.stderr.write(`Generated workflow script: ${written}\n`);
246
+ trackedOutputs.push(resolve(written));
247
+ }
248
+ }
249
+ }
250
+ }
251
+ // Step 7: Generate skill files from workflows
252
+ if (opts.skillsDir) {
253
+ const dnas = await Promise.all(expandedFiles.map(loadDNA));
254
+ const cascadedForSkills = cascadeDNA(dnas);
255
+ const workflows = cascadedForSkills.workflows;
256
+ const roles = cascadedForSkills.roles;
257
+ if (Object.keys(workflows).length === 0) {
258
+ process.stderr.write("No workflow defined — no skills to generate\n");
259
+ }
260
+ else {
261
+ const { compileWorkflow } = await import("../../compiler/workflow.js");
262
+ const skillResults = [];
263
+ for (const [, wfDef] of Object.entries(workflows)) {
264
+ const result = compileWorkflow(wfDef);
265
+ if (result.ok) {
266
+ skillResults.push(compileWorkflowToSkill(result.plan, roles, ir));
267
+ }
268
+ }
269
+ if (skillResults.length > 0) {
270
+ const written = await writeSkillFiles(skillResults, opts.skillsDir);
271
+ process.stderr.write(`Generated ${written.length} skill file(s) in ${opts.skillsDir}\n`);
272
+ for (const f of written) {
273
+ process.stderr.write(` ${f}\n`);
274
+ }
275
+ trackedOutputs.push(...written.map(f => resolve(f)));
276
+ }
277
+ }
278
+ }
279
+ // Step 8: Generate/merge settings file
280
+ if (opts.settingsPath && opts.hooksDir) {
281
+ const hookScripts = compileToHooks(ir);
282
+ const hasPreHook = hookScripts.preToolUse !== null;
283
+ const hasPostHook = hookScripts.postToolUse !== null;
284
+ const dnaSettings = compileSettings(opts.hooksDir, hasPreHook, hasPostHook);
285
+ await mergeSettingsFile(dnaSettings, opts.settingsPath);
286
+ process.stderr.write(`Merged DNA hook config into ${opts.settingsPath}\n`);
287
+ trackedOutputs.push(resolve(opts.settingsPath));
288
+ }
289
+ // Also output the compiled content to stderr for visibility
290
+ const directiveCount = ir.prompt_directives.length;
291
+ const gateCount = ir.pre_execution_gates.length;
292
+ const filterCount = ir.tool_filters.length;
293
+ process.stderr.write(` ${directiveCount} directives, ${gateCount} gates, ${filterCount} filters\n`);
294
+ // Step 9: Generate .dna.lock file (only when --lock is specified or outputs exist)
295
+ if (opts.lockFile && trackedOutputs.length > 0) {
296
+ const lockPath = resolve(opts.lockFile);
297
+ await generateLockFile(lockPath, expandedFiles, trackedOutputs);
298
+ process.stderr.write(`Lock file: ${lockPath}\n`);
299
+ }
300
+ return 0;
301
+ }
302
+ catch (err) {
303
+ process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\n`);
304
+ return 1;
305
+ }
306
+ }
307
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../src/cli/commands/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * dna validate <files...> [--quiet]
3
+ *
4
+ * Validate DNA files for structural correctness.
5
+ */
6
+ export interface ValidateOptions {
7
+ files: string[];
8
+ quiet: boolean;
9
+ }
10
+ export declare function runValidate(opts: ValidateOptions): Promise<number>;
11
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/validate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAwBxE"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * dna validate <files...> [--quiet]
3
+ *
4
+ * Validate DNA files for structural correctness.
5
+ */
6
+ import { loadDNA } from "../../compiler/index.js";
7
+ export async function runValidate(opts) {
8
+ if (opts.files.length === 0) {
9
+ process.stderr.write("Error: no files specified\n");
10
+ return 2;
11
+ }
12
+ let allValid = true;
13
+ for (const file of opts.files) {
14
+ try {
15
+ await loadDNA(file);
16
+ if (!opts.quiet) {
17
+ process.stderr.write(`valid: ${file}\n`);
18
+ }
19
+ }
20
+ catch (err) {
21
+ allValid = false;
22
+ process.stderr.write(`invalid: ${file}\n`);
23
+ if (!opts.quiet && err instanceof Error) {
24
+ process.stderr.write(`${err.message}\n`);
25
+ }
26
+ }
27
+ }
28
+ return allValid ? 0 : 1;
29
+ }
30
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/cli/commands/validate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAOlD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAqB;IACrD,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACpD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,QAAQ,GAAG,IAAI,CAAC;IAEpB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,GAAG,KAAK,CAAC;YACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC;YAC3C,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;gBACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Intent DNA — dna verify command
3
+ *
4
+ * Reads a .dna.lock file and verifies that all tracked output files
5
+ * still match their recorded sha256 checksums.
6
+ *
7
+ * Exit codes:
8
+ * 0 — all files match (no drift)
9
+ * 1 — drift detected (modified or missing files)
10
+ * 2 — usage error (e.g. lock file not found)
11
+ */
12
+ export interface VerifyOptions {
13
+ lockFile: string;
14
+ }
15
+ export interface LockFileEntry {
16
+ sha256: string;
17
+ }
18
+ export interface LockFile {
19
+ synced_at: string;
20
+ dna_sources: string[];
21
+ outputs: Record<string, LockFileEntry>;
22
+ }
23
+ export interface VerifyResult {
24
+ file: string;
25
+ status: "match" | "mismatch" | "missing";
26
+ expected?: string;
27
+ actual?: string;
28
+ }
29
+ export declare function sha256(content: string): string;
30
+ export declare function parseLockFile(raw: string): LockFile;
31
+ export declare function verifyLock(lock: LockFile): Promise<VerifyResult[]>;
32
+ export declare function runVerify(opts: VerifyOptions): Promise<number>;
33
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/verify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAID,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAYnD;AAID,wBAAsB,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAuBxE;AAID,wBAAsB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAkDpE"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Intent DNA — dna verify command
3
+ *
4
+ * Reads a .dna.lock file and verifies that all tracked output files
5
+ * still match their recorded sha256 checksums.
6
+ *
7
+ * Exit codes:
8
+ * 0 — all files match (no drift)
9
+ * 1 — drift detected (modified or missing files)
10
+ * 2 — usage error (e.g. lock file not found)
11
+ */
12
+ import { readFile } from "node:fs/promises";
13
+ import { createHash } from "node:crypto";
14
+ // ── Helpers ────────────────────────────────────────────────
15
+ export function sha256(content) {
16
+ return createHash("sha256").update(content, "utf-8").digest("hex");
17
+ }
18
+ export function parseLockFile(raw) {
19
+ const parsed = JSON.parse(raw);
20
+ if (!parsed ||
21
+ typeof parsed !== "object" ||
22
+ typeof parsed.synced_at !== "string" ||
23
+ !Array.isArray(parsed.dna_sources) ||
24
+ typeof parsed.outputs !== "object") {
25
+ throw new Error("Invalid .dna.lock format");
26
+ }
27
+ return parsed;
28
+ }
29
+ // ── Core verify logic ──────────────────────────────────────
30
+ export async function verifyLock(lock) {
31
+ const results = [];
32
+ for (const [filePath, entry] of Object.entries(lock.outputs)) {
33
+ try {
34
+ const content = await readFile(filePath, "utf-8");
35
+ const actual = sha256(content);
36
+ if (actual === entry.sha256) {
37
+ results.push({ file: filePath, status: "match" });
38
+ }
39
+ else {
40
+ results.push({
41
+ file: filePath,
42
+ status: "mismatch",
43
+ expected: entry.sha256,
44
+ actual,
45
+ });
46
+ }
47
+ }
48
+ catch {
49
+ results.push({ file: filePath, status: "missing" });
50
+ }
51
+ }
52
+ return results;
53
+ }
54
+ // ── CLI entry ──────────────────────────────────────────────
55
+ export async function runVerify(opts) {
56
+ // Read lock file
57
+ let raw;
58
+ try {
59
+ raw = await readFile(opts.lockFile, "utf-8");
60
+ }
61
+ catch {
62
+ process.stderr.write(`Error: lock file not found: ${opts.lockFile}\n`);
63
+ return 2;
64
+ }
65
+ let lock;
66
+ try {
67
+ lock = parseLockFile(raw);
68
+ }
69
+ catch (err) {
70
+ process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\n`);
71
+ return 2;
72
+ }
73
+ // Verify
74
+ const results = await verifyLock(lock);
75
+ // Report
76
+ let hasFailure = false;
77
+ for (const r of results) {
78
+ if (r.status === "match") {
79
+ process.stderr.write(` ok ${r.file}\n`);
80
+ }
81
+ else if (r.status === "mismatch") {
82
+ process.stderr.write(` MISMATCH ${r.file}\n`);
83
+ hasFailure = true;
84
+ }
85
+ else {
86
+ process.stderr.write(` MISSING ${r.file}\n`);
87
+ hasFailure = true;
88
+ }
89
+ }
90
+ const total = results.length;
91
+ const ok = results.filter((r) => r.status === "match").length;
92
+ const failed = total - ok;
93
+ if (hasFailure) {
94
+ process.stderr.write(`\nDrift detected: ${failed}/${total} file(s) changed since last sync\n`);
95
+ return 1;
96
+ }
97
+ else {
98
+ process.stderr.write(`\nAll ${total} file(s) verified — no drift\n`);
99
+ return 0;
100
+ }
101
+ }
102
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../../src/cli/commands/verify.ts"],"names":[],"mappings":"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"}