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.
- package/LICENSE +69 -0
- package/README.md +251 -0
- package/dist/audit/index.d.ts +109 -0
- package/dist/audit/index.d.ts.map +1 -0
- package/dist/audit/index.js +144 -0
- package/dist/audit/index.js.map +1 -0
- package/dist/cli/commands/compile.d.ts +14 -0
- package/dist/cli/commands/compile.d.ts.map +1 -0
- package/dist/cli/commands/compile.js +89 -0
- package/dist/cli/commands/compile.js.map +1 -0
- package/dist/cli/commands/epigenetic.d.ts +20 -0
- package/dist/cli/commands/epigenetic.d.ts.map +1 -0
- package/dist/cli/commands/epigenetic.js +112 -0
- package/dist/cli/commands/epigenetic.js.map +1 -0
- package/dist/cli/commands/evolve.d.ts +12 -0
- package/dist/cli/commands/evolve.d.ts.map +1 -0
- package/dist/cli/commands/evolve.js +52 -0
- package/dist/cli/commands/evolve.js.map +1 -0
- package/dist/cli/commands/guard.d.ts +22 -0
- package/dist/cli/commands/guard.d.ts.map +1 -0
- package/dist/cli/commands/guard.js +257 -0
- package/dist/cli/commands/guard.js.map +1 -0
- package/dist/cli/commands/import.d.ts +71 -0
- package/dist/cli/commands/import.d.ts.map +1 -0
- package/dist/cli/commands/import.js +428 -0
- package/dist/cli/commands/import.js.map +1 -0
- package/dist/cli/commands/init.d.ts +13 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +171 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/run.d.ts +59 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +350 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/show.d.ts +12 -0
- package/dist/cli/commands/show.d.ts.map +1 -0
- package/dist/cli/commands/show.js +78 -0
- package/dist/cli/commands/show.js.map +1 -0
- package/dist/cli/commands/sync.d.ts +31 -0
- package/dist/cli/commands/sync.d.ts.map +1 -0
- package/dist/cli/commands/sync.js +307 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +11 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +30 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/commands/verify.d.ts +33 -0
- package/dist/cli/commands/verify.d.ts.map +1 -0
- package/dist/cli/commands/verify.js +102 -0
- package/dist/cli/commands/verify.js.map +1 -0
- package/dist/cli/index.d.ts +15 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +358 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/util/format.d.ts +24 -0
- package/dist/cli/util/format.d.ts.map +1 -0
- package/dist/cli/util/format.js +67 -0
- package/dist/cli/util/format.js.map +1 -0
- package/dist/cli/util/prompt.d.ts +11 -0
- package/dist/cli/util/prompt.d.ts.map +1 -0
- package/dist/cli/util/prompt.js +51 -0
- package/dist/cli/util/prompt.js.map +1 -0
- package/dist/compiler/activate.d.ts +29 -0
- package/dist/compiler/activate.d.ts.map +1 -0
- package/dist/compiler/activate.js +141 -0
- package/dist/compiler/activate.js.map +1 -0
- package/dist/compiler/cascade.d.ts +27 -0
- package/dist/compiler/cascade.d.ts.map +1 -0
- package/dist/compiler/cascade.js +124 -0
- package/dist/compiler/cascade.js.map +1 -0
- package/dist/compiler/compile.d.ts +17 -0
- package/dist/compiler/compile.d.ts.map +1 -0
- package/dist/compiler/compile.js +219 -0
- package/dist/compiler/compile.js.map +1 -0
- package/dist/compiler/index.d.ts +28 -0
- package/dist/compiler/index.d.ts.map +1 -0
- package/dist/compiler/index.js +51 -0
- package/dist/compiler/index.js.map +1 -0
- package/dist/compiler/workflow.d.ts +37 -0
- package/dist/compiler/workflow.d.ts.map +1 -0
- package/dist/compiler/workflow.js +274 -0
- package/dist/compiler/workflow.js.map +1 -0
- package/dist/evolution/collector.d.ts +52 -0
- package/dist/evolution/collector.d.ts.map +1 -0
- package/dist/evolution/collector.js +72 -0
- package/dist/evolution/collector.js.map +1 -0
- package/dist/evolution/fitness.d.ts +33 -0
- package/dist/evolution/fitness.d.ts.map +1 -0
- package/dist/evolution/fitness.js +96 -0
- package/dist/evolution/fitness.js.map +1 -0
- package/dist/evolution/index.d.ts +53 -0
- package/dist/evolution/index.d.ts.map +1 -0
- package/dist/evolution/index.js +69 -0
- package/dist/evolution/index.js.map +1 -0
- package/dist/evolution/marker-gen.d.ts +31 -0
- package/dist/evolution/marker-gen.d.ts.map +1 -0
- package/dist/evolution/marker-gen.js +141 -0
- package/dist/evolution/marker-gen.js.map +1 -0
- package/dist/evolution/store.d.ts +24 -0
- package/dist/evolution/store.d.ts.map +1 -0
- package/dist/evolution/store.js +78 -0
- package/dist/evolution/store.js.map +1 -0
- package/dist/evolution/types.d.ts +73 -0
- package/dist/evolution/types.d.ts.map +1 -0
- package/dist/evolution/types.js +14 -0
- package/dist/evolution/types.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/log/logger.d.ts +15 -0
- package/dist/log/logger.d.ts.map +1 -0
- package/dist/log/logger.js +36 -0
- package/dist/log/logger.js.map +1 -0
- package/dist/runtime/agent-md.d.ts +56 -0
- package/dist/runtime/agent-md.d.ts.map +1 -0
- package/dist/runtime/agent-md.js +257 -0
- package/dist/runtime/agent-md.js.map +1 -0
- package/dist/runtime/claude-sdk.d.ts +51 -0
- package/dist/runtime/claude-sdk.d.ts.map +1 -0
- package/dist/runtime/claude-sdk.js +78 -0
- package/dist/runtime/claude-sdk.js.map +1 -0
- package/dist/runtime/hooks.d.ts +67 -0
- package/dist/runtime/hooks.d.ts.map +1 -0
- package/dist/runtime/hooks.js +645 -0
- package/dist/runtime/hooks.js.map +1 -0
- package/dist/runtime/index.d.ts +9 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +5 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/markdown.d.ts +36 -0
- package/dist/runtime/markdown.d.ts.map +1 -0
- package/dist/runtime/markdown.js +214 -0
- package/dist/runtime/markdown.js.map +1 -0
- package/dist/runtime/settings-adapter.d.ts +33 -0
- package/dist/runtime/settings-adapter.d.ts.map +1 -0
- package/dist/runtime/settings-adapter.js +78 -0
- package/dist/runtime/settings-adapter.js.map +1 -0
- package/dist/runtime/skill-adapter.d.ts +22 -0
- package/dist/runtime/skill-adapter.d.ts.map +1 -0
- package/dist/runtime/skill-adapter.js +170 -0
- package/dist/runtime/skill-adapter.js.map +1 -0
- package/dist/runtime/workflow-runner.d.ts +53 -0
- package/dist/runtime/workflow-runner.d.ts.map +1 -0
- package/dist/runtime/workflow-runner.js +420 -0
- package/dist/runtime/workflow-runner.js.map +1 -0
- package/dist/schema/index.d.ts +2 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +2 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/types.d.ts +275 -0
- package/dist/schema/types.d.ts.map +1 -0
- package/dist/schema/types.js +11 -0
- package/dist/schema/types.js.map +1 -0
- package/dist/schema/validate.d.ts +20 -0
- package/dist/schema/validate.d.ts.map +1 -0
- package/dist/schema/validate.js +379 -0
- package/dist/schema/validate.js.map +1 -0
- package/dist/schema/yaml-parser.d.ts +12 -0
- package/dist/schema/yaml-parser.d.ts.map +1 -0
- package/dist/schema/yaml-parser.js +298 -0
- package/dist/schema/yaml-parser.js.map +1 -0
- package/dist/species/default.dna.json +62 -0
- package/dist/templates/api-backend.dna.yaml +77 -0
- package/dist/templates/brainstorming-first.dna.yaml +71 -0
- package/dist/templates/branch-finishing.dna.yaml +54 -0
- package/dist/templates/code-review-pipeline.dna.yaml +91 -0
- package/dist/templates/devops-cicd.dna.yaml +67 -0
- package/dist/templates/documentation-writer.dna.yaml +71 -0
- package/dist/templates/enterprise-baseline.dna.yaml +66 -0
- package/dist/templates/frontend-quality.dna.yaml +88 -0
- package/dist/templates/full-pipeline.dna.yaml +129 -0
- package/dist/templates/mobile-dev.dna.yaml +68 -0
- package/dist/templates/monorepo-governance.dna.yaml +60 -0
- package/dist/templates/multi-perspective-review.dna.yaml +109 -0
- package/dist/templates/pr-submitter.dna.yaml +55 -0
- package/dist/templates/safe-refactoring.dna.yaml +65 -0
- package/dist/templates/secure-dev.dna.yaml +90 -0
- package/dist/templates/subagent-parallel.dna.yaml +98 -0
- package/dist/templates/systematic-debugging.dna.yaml +55 -0
- package/dist/templates/tdd-strict.dna.yaml +69 -0
- package/dist/templates/verification-loop.dna.yaml +53 -0
- package/dist/templates/yolo-with-guardrails.dna.yaml +56 -0
- 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":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,SAAS,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE9F,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC7F,OAAO,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC5G,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAoB,MAAM,gCAAgC,CAAC;AAC3G,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACvF,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AA0B3D,MAAM,aAAa,GAAqB,CAAC,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,eAAe,CAAC,CAAC;AAEjG,SAAS,kBAAkB,CAAC,GAAW;IACrC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7C,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACxD,OAAO,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,IAAI,WAAW,CAAC,CAAC;AACrE,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,KAAe;IACxC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEnB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YACzC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5B,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,CAAC;gBAC9C,MAAM,WAAW,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;gBAC5C,IAAI,WAAW,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;oBAC1C,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;oBACtB,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;gBAChC,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,oCAAoC;QACtC,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,UAAU,CAAC,OAAe;IACjC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACrE,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,QAAgB;IAC7C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAClD,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,QAAgB,EAChB,UAAoB,EACpB,WAAqB;IAErB,MAAM,OAAO,GAAuC,EAAE,CAAC;IACvD,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5B,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;IACpD,CAAC;IACD,MAAM,IAAI,GAAiB;QACzB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,WAAW,EAAE,UAAU;QACvB,OAAO;KACR,CAAC;IACF,MAAM,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAiB;IAC7C,kBAAkB;IAClB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YAC3E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+EAA+E,CAAC,CAAC;YACtG,OAAO,CAAC,CAAC;QACX,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAClD,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;YACzE,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrD,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,KAAK,mCAAmC,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;YAC7F,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACvD,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,KAAK,kCAAkC,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC;YAC7F,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sCAAsC,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,KAAK,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC5D,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,KAAK,uCAAuC,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC;YACpG,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2CAA2C,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC;YACxF,CAAC;QACH,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACxD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QACpH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6HAA6H,CAAC,CAAC;QACpJ,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAwB,CAAC,EAAE,CAAC;QAC1E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,IAAI,CAAC,MAAM,iBAAiB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzG,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAwB,CAAC;IAE7C,IAAI,CAAC;QACH,uDAAuD;QACvD,MAAM,cAAc,GAAa,EAAE,CAAC;QAEpC,8BAA8B;QAC9B,IAAI,iBAAiB,GAAG,SAAS,CAAC;QAClC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,wCAAwC;YACxC,MAAM,aAAa,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YAC3D,oCAAoC;YACpC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACtC,CAAC,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAEpD,MAAM,MAAM,GAAG,IAAI,eAAe,CAChC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CACzD,CAAC;YACF,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YACnD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,OAAO,CAAC,MAAM,mBAAmB,CAAC,CAAC;gBACpE,iBAAiB,GAAG,OAAO,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,kBAAkB;QAClB,MAAM,aAAa,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpD,MAAM,EAAE,GAAG,MAAM,gBAAgB,CAAC,aAAa,EAAE;YAC/C,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,kBAAkB,EAAE,iBAAiB;SACtC,CAAC,CAAC;QAEH,qCAAqC;QACrC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAwB,CAAC;YAC7C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YAC/C,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAE7D,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,MAAM,KAAK,MAAM,KAAK,CAAC,CAAC;YACjE,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;YAChE,CAAC;YACD,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAC5C,CAAC;QAED,gCAAgC;QAChC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,OAAO,GAAG,cAAc,CAAC,EAAE,CAAC,CAAC;YACnC,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAE/D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,OAAO,CAAC,MAAM,sBAAsB,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;gBACzF,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;oBACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACnC,CAAC;gBACD,cAAc,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACrD,gCAAgC;gBAChC,IAAI,EAAE,CAAC,eAAe,IAAI,EAAE,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACxD,MAAM,SAAS,GAAG,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACtE,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,KAAK,EAAE,CAAC,eAAe,CAAC,MAAM,4BAA4B,SAAS,IAAI,CACxE,CAAC;gBACJ,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;QAED,kCAAkC;QAClC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YAC3D,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;YAE7B,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;YAC1D,CAAC;iBAAM,CAAC;gBACN,MAAM,OAAO,GAAG,wBAAwB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACpD,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;gBAEjE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,OAAO,CAAC,MAAM,qBAAqB,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC;oBACzF,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;wBACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACnC,CAAC;oBACD,cAAc,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACvD,CAAC;YACH,CAAC;QACH,CAAC;QAED,sCAAsC;QACtC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YAC3D,MAAM,aAAa,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,SAAS,GAAG,aAAa,CAAC,SAAS,CAAC;YAE1C,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;YAC7D,CAAC;iBAAM,CAAC;gBACN,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC;gBACvE,MAAM,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,kCAAkC,CAAC,CAAC;gBAEzG,kFAAkF;gBAClF,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY;oBACvC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;oBACvD,CAAC,CAAC,SAAS,CAAC;gBAEd,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;oBAC5D,IAAI,CAAC,KAAK,EAAE,CAAC;wBACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,IAAI,eAAe,CAAC,CAAC;wBACvD,SAAS;oBACX,CAAC;oBACD,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;oBACtC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;wBACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,IAAI,yBAAyB,CAAC,CAAC;wBACjE,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;4BAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;wBAC1D,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,MAAM,WAAW,GAAG,sBAAsB,CAAC,MAAM,CAAC,IAAK,CAAC,CAAC;wBACzD,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;wBACzE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,OAAO,IAAI,CAAC,CAAC;wBAChE,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;oBACxC,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,8CAA8C;QAC9C,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YAC3D,MAAM,iBAAiB,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;YAC3C,MAAM,SAAS,GAAG,iBAAiB,CAAC,SAAS,CAAC;YAC9C,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,CAAC;YAEtC,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;YACxE,CAAC;iBAAM,CAAC;gBACN,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC;gBAEvE,MAAM,YAAY,GAAG,EAAE,CAAC;gBACxB,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;oBAClD,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;oBACtC,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;wBACd,YAAY,CAAC,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,IAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;oBACrE,CAAC;gBACH,CAAC;gBAED,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC5B,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;oBACpE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,OAAO,CAAC,MAAM,qBAAqB,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC;oBACzF,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;wBACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACnC,CAAC;oBACD,cAAc,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACvD,CAAC;YACH,CAAC;QACH,CAAC;QAED,uCAAuC;QACvC,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACvC,MAAM,WAAW,GAAG,cAAc,CAAC,EAAE,CAAC,CAAC;YACvC,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,KAAK,IAAI,CAAC;YACnD,MAAM,WAAW,GAAG,WAAW,CAAC,WAAW,KAAK,IAAI,CAAC;YACrD,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;YAC5E,MAAM,iBAAiB,CAAC,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;YACxD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC;YAC3E,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;QAClD,CAAC;QAED,4DAA4D;QAC5D,MAAM,cAAc,GAAG,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC;QACnD,MAAM,SAAS,GAAG,EAAE,CAAC,mBAAmB,CAAC,MAAM,CAAC;QAChD,MAAM,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC;QAC3C,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,KAAK,cAAc,gBAAgB,SAAS,WAAW,WAAW,YAAY,CAC/E,CAAC;QAEF,mFAAmF;QACnF,IAAI,IAAI,CAAC,QAAQ,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/C,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACxC,MAAM,gBAAgB,CAAC,QAAQ,EAAE,aAAa,EAAE,cAAc,CAAC,CAAC;YAChE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,QAAQ,IAAI,CAAC,CAAC;QACnD,CAAC;QAED,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrF,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC"}
|
|
@@ -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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"}
|