daedalion 0.0.2 → 0.1.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 (88) hide show
  1. package/README.md +5 -0
  2. package/bin/daedalion.js +11 -5
  3. package/dist/commands/build.d.ts +3 -0
  4. package/dist/commands/build.d.ts.map +1 -0
  5. package/dist/commands/build.js +167 -0
  6. package/dist/commands/build.js.map +1 -0
  7. package/dist/commands/clean.d.ts +2 -0
  8. package/dist/commands/clean.d.ts.map +1 -0
  9. package/dist/commands/clean.js +106 -0
  10. package/dist/commands/clean.js.map +1 -0
  11. package/dist/commands/init.d.ts +3 -0
  12. package/dist/commands/init.d.ts.map +1 -0
  13. package/dist/commands/init.js +83 -0
  14. package/dist/commands/init.js.map +1 -0
  15. package/dist/commands/validate.d.ts +2 -0
  16. package/dist/commands/validate.d.ts.map +1 -0
  17. package/dist/commands/validate.js +119 -0
  18. package/dist/commands/validate.js.map +1 -0
  19. package/dist/config.d.ts +5 -0
  20. package/dist/config.d.ts.map +1 -0
  21. package/dist/config.js +101 -0
  22. package/dist/config.js.map +1 -0
  23. package/dist/generators/agent.d.ts +3 -0
  24. package/dist/generators/agent.d.ts.map +1 -0
  25. package/dist/generators/agent.js +105 -0
  26. package/dist/generators/agent.js.map +1 -0
  27. package/dist/generators/instructions.d.ts +3 -0
  28. package/dist/generators/instructions.d.ts.map +1 -0
  29. package/{src → dist}/generators/instructions.js +42 -52
  30. package/dist/generators/instructions.js.map +1 -0
  31. package/dist/generators/prompt.d.ts +4 -0
  32. package/dist/generators/prompt.d.ts.map +1 -0
  33. package/{src → dist}/generators/prompt.js +96 -102
  34. package/dist/generators/prompt.js.map +1 -0
  35. package/dist/generators/skill.d.ts +3 -0
  36. package/dist/generators/skill.d.ts.map +1 -0
  37. package/dist/generators/skill.js +89 -0
  38. package/dist/generators/skill.js.map +1 -0
  39. package/dist/generators/tools.d.ts +3 -0
  40. package/dist/generators/tools.d.ts.map +1 -0
  41. package/dist/generators/tools.js +192 -0
  42. package/dist/generators/tools.js.map +1 -0
  43. package/dist/generators/workflow.d.ts +3 -0
  44. package/dist/generators/workflow.d.ts.map +1 -0
  45. package/{src → dist}/generators/workflow.js +47 -53
  46. package/dist/generators/workflow.js.map +1 -0
  47. package/dist/index.d.ts +16 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/{src → dist}/index.js +1 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/parsers/proposal.d.ts +3 -0
  52. package/dist/parsers/proposal.d.ts.map +1 -0
  53. package/dist/parsers/proposal.js +45 -0
  54. package/dist/parsers/proposal.js.map +1 -0
  55. package/dist/parsers/spec.d.ts +3 -0
  56. package/dist/parsers/spec.d.ts.map +1 -0
  57. package/dist/parsers/spec.js +87 -0
  58. package/dist/parsers/spec.js.map +1 -0
  59. package/dist/parsers/tasks.d.ts +4 -0
  60. package/dist/parsers/tasks.d.ts.map +1 -0
  61. package/dist/parsers/tasks.js +39 -0
  62. package/dist/parsers/tasks.js.map +1 -0
  63. package/dist/types.d.ts +107 -0
  64. package/dist/types.d.ts.map +1 -0
  65. package/dist/types.js +2 -0
  66. package/dist/types.js.map +1 -0
  67. package/dist/utils.d.ts +5 -0
  68. package/dist/utils.d.ts.map +1 -0
  69. package/dist/utils.js +46 -0
  70. package/dist/utils.js.map +1 -0
  71. package/dist/version.d.ts +3 -0
  72. package/dist/version.d.ts.map +1 -0
  73. package/dist/version.js +47 -0
  74. package/dist/version.js.map +1 -0
  75. package/package.json +19 -4
  76. package/src/commands/build.js +0 -198
  77. package/src/commands/clean.js +0 -85
  78. package/src/commands/init.js +0 -101
  79. package/src/commands/validate.js +0 -141
  80. package/src/config.js +0 -50
  81. package/src/generators/agent.js +0 -121
  82. package/src/generators/skill.js +0 -108
  83. package/src/generators/tools.js +0 -183
  84. package/src/parsers/proposal.js +0 -52
  85. package/src/parsers/spec.js +0 -105
  86. package/src/parsers/tasks.js +0 -46
  87. package/src/utils.js +0 -51
  88. package/src/version.js +0 -60
package/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # Daedalion
2
2
 
3
3
  [![Node.js](https://img.shields.io/badge/node-%3E%3D20-brightgreen)](https://nodejs.org/)
4
+ [![TypeScript](https://img.shields.io/badge/TypeScript-strict-blue)](https://www.typescriptlang.org/)
4
5
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
6
  [![npm version](https://img.shields.io/npm/v/daedalion)](https://www.npmjs.com/package/daedalion)
6
7
 
@@ -8,6 +9,8 @@ Spec-to-Agent compiler for GitHub Copilot. Write specs; get agents, skills, and
8
9
 
9
10
  > *"Write specs, get agents automatically."*
10
11
 
12
+ Written in **TypeScript** with strict mode. Ships compiled JS + type declarations.
13
+
11
14
  ![daedalion-init](docs/assets/daedalion-init.png)
12
15
 
13
16
  ## Overview
@@ -136,6 +139,8 @@ project/
136
139
  - Generated output details: [docs/generated-output.md](docs/generated-output.md)
137
140
  - CI setup and options: [docs/ci-workflow.md](docs/ci-workflow.md)
138
141
  - Developer notes: [docs/DEVELOPER.md](docs/DEVELOPER.md)
142
+ - TypeScript migration plan: [docs/TYPESCRIPT_MIGRATION_PLAN.md](docs/TYPESCRIPT_MIGRATION_PLAN.md)
143
+ - Release notes: [RELEASE.md](RELEASE.md)
139
144
 
140
145
  ## License
141
146
 
package/bin/daedalion.js CHANGED
@@ -1,12 +1,18 @@
1
1
  #!/usr/bin/env node
2
2
 
3
+ const [major] = process.versions.node.split('.').map(Number);
4
+ if (major < 20) {
5
+ console.error('Daedalion requires Node.js >= 20');
6
+ process.exit(1);
7
+ }
8
+
3
9
  import { program } from 'commander';
4
10
  import chalk from 'chalk';
5
- import { init } from '../src/commands/init.js';
6
- import { build } from '../src/commands/build.js';
7
- import { validate } from '../src/commands/validate.js';
8
- import { clean } from '../src/commands/clean.js';
9
- import { VERSION, getVersionString } from '../src/version.js';
11
+ import { init } from '../dist/commands/init.js';
12
+ import { build } from '../dist/commands/build.js';
13
+ import { validate } from '../dist/commands/validate.js';
14
+ import { clean } from '../dist/commands/clean.js';
15
+ import { VERSION, getVersionString } from '../dist/version.js';
10
16
 
11
17
  function displayLogo() {
12
18
  const logo = `
@@ -0,0 +1,3 @@
1
+ import type { BuildOptions, GeneratedFile } from '../types.js';
2
+ export declare function build(cwd: string, options?: BuildOptions): Promise<GeneratedFile[]>;
3
+ //# sourceMappingURL=build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EAKd,MAAM,aAAa,CAAC;AAIrB,wBAAsB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAkG7F"}
@@ -0,0 +1,167 @@
1
+ import { existsSync, readdirSync, statSync, writeFileSync } from 'fs';
2
+ import { join, relative } from 'path';
3
+ import chalk from 'chalk';
4
+ import { VERSION } from '../version.js';
5
+ import { glob } from 'glob';
6
+ import { loadConfig, resolveOpenspecPath, resolveOutputPath } from '../config.js';
7
+ import { parseSpec } from '../parsers/spec.js';
8
+ import { parseProposal } from '../parsers/proposal.js';
9
+ import { parseTasks } from '../parsers/tasks.js';
10
+ import { generateSkill } from '../generators/skill.js';
11
+ import { generateAgent } from '../generators/agent.js';
12
+ import { generatePrompt, generateCyclePrompt } from '../generators/prompt.js';
13
+ import { generateWorkflow } from '../generators/workflow.js';
14
+ import { generateInstructions } from '../generators/instructions.js';
15
+ import { generateTools } from '../generators/tools.js';
16
+ import { ensureDir } from '../utils.js';
17
+ const MANIFEST_FILENAME = '.daedalion-manifest.json';
18
+ export async function build(cwd, options = {}) {
19
+ console.log();
20
+ console.log(chalk.bold(` Daedalion v${VERSION}`));
21
+ console.log();
22
+ const config = loadConfig(cwd);
23
+ const openspecDir = resolveOpenspecPath(cwd, config);
24
+ const outputDir = resolveOutputPath(cwd, config);
25
+ if (!existsSync(openspecDir)) {
26
+ throw new Error(`OpenSpec directory not found: ${openspecDir}\n Run 'daedalion init' first.`);
27
+ }
28
+ const generatedFiles = [];
29
+ // Parse specs
30
+ console.log(' Parsing specs...');
31
+ const specs = await findAndParseSpecs(openspecDir, options);
32
+ for (const spec of specs) {
33
+ console.log(chalk.gray(` ✓ ${relative(cwd, spec.path)}`));
34
+ }
35
+ // Parse changes
36
+ console.log();
37
+ console.log(' Parsing changes...');
38
+ const changes = await findAndParseChanges(openspecDir, options);
39
+ for (const change of changes) {
40
+ console.log(chalk.gray(` ✓ ${relative(cwd, change.proposal.path)}`));
41
+ }
42
+ // Aggregate tasks from all changes for skills
43
+ const allTasks = aggregateTasks(changes);
44
+ // Generate outputs
45
+ console.log();
46
+ console.log(' Generating...');
47
+ // Generate skills and agents from specs
48
+ for (const spec of specs) {
49
+ const tasks = allTasks[spec.domain] || null;
50
+ const skillResult = generateSkill(spec, tasks, outputDir, options);
51
+ generatedFiles.push(skillResult);
52
+ logGenerated(skillResult.path, cwd, options);
53
+ const agentResult = generateAgent(spec, outputDir, options, config);
54
+ generatedFiles.push(agentResult);
55
+ logGenerated(agentResult.path, cwd, options);
56
+ }
57
+ // Generate tool stubs if --with-tools flag is set
58
+ if (options.withTools) {
59
+ console.log(chalk.gray(` (generating tool stubs)`));
60
+ for (const spec of specs) {
61
+ const toolResults = generateTools(spec, outputDir, config, options);
62
+ for (const toolResult of toolResults) {
63
+ generatedFiles.push(toolResult);
64
+ logGenerated(toolResult.path, cwd, options);
65
+ }
66
+ }
67
+ }
68
+ // Generate prompts from changes
69
+ for (const change of changes) {
70
+ const domain = findDomainForChange(change, specs);
71
+ const promptResult = generatePrompt(change.proposal, change.tasks, domain, outputDir, options);
72
+ generatedFiles.push(promptResult);
73
+ logGenerated(promptResult.path, cwd, options);
74
+ }
75
+ // Generate OpenSpec cycle prompt
76
+ const cyclePromptResult = generateCyclePrompt(outputDir, options);
77
+ generatedFiles.push(cyclePromptResult);
78
+ logGenerated(cyclePromptResult.path, cwd, options);
79
+ // Generate workflow
80
+ const workflowResult = generateWorkflow(config, outputDir, options);
81
+ generatedFiles.push(workflowResult);
82
+ logGenerated(workflowResult.path, cwd, options);
83
+ // Generate copilot-instructions.md
84
+ const instructionsResult = generateInstructions(openspecDir, outputDir, options);
85
+ generatedFiles.push(instructionsResult);
86
+ logGenerated(instructionsResult.path, cwd, options);
87
+ // Write manifest of generated files (for clean command)
88
+ if (!options.dryRun) {
89
+ writeManifest(outputDir, generatedFiles, cwd);
90
+ }
91
+ console.log();
92
+ if (options.dryRun) {
93
+ console.log(chalk.yellow(` Dry run complete. ${generatedFiles.length} files would be generated.`));
94
+ }
95
+ else {
96
+ console.log(chalk.green(` Done. ${generatedFiles.length} files generated.`));
97
+ }
98
+ console.log();
99
+ return generatedFiles;
100
+ }
101
+ function writeManifest(outputDir, generatedFiles, cwd) {
102
+ const manifestPath = join(outputDir, MANIFEST_FILENAME);
103
+ const manifest = {
104
+ version: 1,
105
+ generatedAt: new Date().toISOString(),
106
+ files: generatedFiles.map(f => relative(cwd, f.path))
107
+ };
108
+ ensureDir(manifestPath);
109
+ writeFileSync(manifestPath, JSON.stringify(manifest, null, 2));
110
+ }
111
+ async function findAndParseSpecs(openspecDir, _options) {
112
+ const specsDir = join(openspecDir, 'specs');
113
+ if (!existsSync(specsDir)) {
114
+ return [];
115
+ }
116
+ const specFiles = await glob('*/spec.md', { cwd: specsDir });
117
+ return specFiles.map(file => parseSpec(join(specsDir, file)));
118
+ }
119
+ async function findAndParseChanges(openspecDir, _options) {
120
+ const changesDir = join(openspecDir, 'changes');
121
+ if (!existsSync(changesDir)) {
122
+ return [];
123
+ }
124
+ const changes = [];
125
+ const changeDirs = readdirSync(changesDir).filter(name => {
126
+ const fullPath = join(changesDir, name);
127
+ return statSync(fullPath).isDirectory();
128
+ });
129
+ for (const changeDir of changeDirs) {
130
+ const proposalPath = join(changesDir, changeDir, 'proposal.md');
131
+ const tasksPath = join(changesDir, changeDir, 'tasks.md');
132
+ if (existsSync(proposalPath)) {
133
+ changes.push({
134
+ proposal: parseProposal(proposalPath),
135
+ tasks: parseTasks(tasksPath)
136
+ });
137
+ }
138
+ }
139
+ return changes;
140
+ }
141
+ function aggregateTasks(changes) {
142
+ const tasksByDomain = {};
143
+ for (const change of changes) {
144
+ if (!tasksByDomain['default']) {
145
+ tasksByDomain['default'] = { groups: [], items: [], hasMore: false };
146
+ }
147
+ tasksByDomain['default'].items.push(...change.tasks.items);
148
+ tasksByDomain['default'].hasMore = tasksByDomain['default'].hasMore || change.tasks.hasMore;
149
+ }
150
+ return tasksByDomain;
151
+ }
152
+ function findDomainForChange(change, specs) {
153
+ if (specs.length > 0) {
154
+ return specs[0].domain;
155
+ }
156
+ return 'default';
157
+ }
158
+ function logGenerated(filePath, cwd, options) {
159
+ const relativePath = relative(cwd, filePath);
160
+ if (options.dryRun) {
161
+ console.log(chalk.yellow(` → ${relativePath}`));
162
+ }
163
+ else {
164
+ console.log(chalk.green(` ✓ ${relativePath}`));
165
+ }
166
+ }
167
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function clean(cwd: string): Promise<void>;
2
+ //# sourceMappingURL=clean.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clean.d.ts","sourceRoot":"","sources":["../../src/commands/clean.ts"],"names":[],"mappings":"AAwDA,wBAAsB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+DtD"}
@@ -0,0 +1,106 @@
1
+ import { existsSync, rmSync, readdirSync, readFileSync } from 'fs';
2
+ import { join, dirname, resolve, relative } from 'path';
3
+ import chalk from 'chalk';
4
+ import { VERSION } from '../version.js';
5
+ import { loadConfig, resolveOutputPath } from '../config.js';
6
+ const MANIFEST_FILENAME = '.daedalion-manifest.json';
7
+ /**
8
+ * Validate that the parsed JSON conforms to the {@link Manifest} shape.
9
+ * Throws a descriptive error when the structure is invalid.
10
+ */
11
+ function validateManifest(data) {
12
+ if (typeof data !== 'object' ||
13
+ data === null ||
14
+ Array.isArray(data)) {
15
+ throw new Error('Manifest is not a valid JSON object.');
16
+ }
17
+ const obj = data;
18
+ if (typeof obj.version !== 'number') {
19
+ throw new Error(`Manifest "version" must be a number, got ${typeof obj.version}.`);
20
+ }
21
+ if (!Array.isArray(obj.files)) {
22
+ throw new Error('Manifest "files" must be an array.');
23
+ }
24
+ for (const entry of obj.files) {
25
+ if (typeof entry !== 'string') {
26
+ throw new Error(`Every entry in manifest "files" must be a string, got ${typeof entry}.`);
27
+ }
28
+ }
29
+ return obj;
30
+ }
31
+ /**
32
+ * Return `true` when `target` is safely contained inside `base`.
33
+ * Prevents path-traversal attacks that could delete files outside the output
34
+ * directory.
35
+ */
36
+ function isSafePath(base, target) {
37
+ const resolved = resolve(target);
38
+ const rel = relative(base, resolved);
39
+ return !rel.startsWith('..') && !resolve(base, rel).startsWith('..');
40
+ }
41
+ export async function clean(cwd) {
42
+ console.log();
43
+ console.log(chalk.bold(` Daedalion v${VERSION} - Clean`));
44
+ console.log();
45
+ const config = loadConfig(cwd);
46
+ const outputDir = resolveOutputPath(cwd, config);
47
+ if (!existsSync(outputDir)) {
48
+ console.log(chalk.yellow(' No output directory found. Nothing to clean.'));
49
+ console.log();
50
+ return;
51
+ }
52
+ const manifestPath = join(outputDir, MANIFEST_FILENAME);
53
+ if (!existsSync(manifestPath)) {
54
+ console.log(chalk.yellow(' No manifest found. Run `daedalion build` first to generate a manifest.'));
55
+ console.log(chalk.gray(' (Clean requires a manifest to avoid deleting non-Daedalion files)'));
56
+ console.log();
57
+ return;
58
+ }
59
+ const raw = JSON.parse(readFileSync(manifestPath, 'utf-8'));
60
+ const manifest = validateManifest(raw);
61
+ const filesToRemove = manifest.files;
62
+ let removed = 0;
63
+ const cleanedDirs = new Set();
64
+ for (const relativePath of filesToRemove) {
65
+ const fullPath = join(cwd, relativePath);
66
+ if (!isSafePath(outputDir, fullPath)) {
67
+ console.log(chalk.red(` ✗ Skipped unsafe path: ${relativePath}`));
68
+ continue;
69
+ }
70
+ if (existsSync(fullPath)) {
71
+ rmSync(fullPath, { force: true });
72
+ console.log(chalk.green(` ✓ Removed ${relativePath}`));
73
+ removed++;
74
+ cleanedDirs.add(dirname(fullPath));
75
+ }
76
+ }
77
+ rmSync(manifestPath, { force: true });
78
+ console.log(chalk.green(` ✓ Removed .github/${MANIFEST_FILENAME}`));
79
+ for (const dir of cleanedDirs) {
80
+ cleanEmptyDirs(dir, outputDir);
81
+ }
82
+ console.log();
83
+ if (removed > 0) {
84
+ console.log(chalk.green(` Done. ${removed} files removed.`));
85
+ }
86
+ else {
87
+ console.log(chalk.yellow(' No generated files found to clean.'));
88
+ }
89
+ console.log();
90
+ }
91
+ function cleanEmptyDirs(dir, stopAt) {
92
+ if (dir === stopAt || !existsSync(dir)) {
93
+ return;
94
+ }
95
+ try {
96
+ const contents = readdirSync(dir);
97
+ if (contents.length === 0) {
98
+ rmSync(dir, { recursive: true, force: true });
99
+ cleanEmptyDirs(dirname(dir), stopAt);
100
+ }
101
+ }
102
+ catch {
103
+ // Directory might have been removed already
104
+ }
105
+ }
106
+ //# sourceMappingURL=clean.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clean.js","sourceRoot":"","sources":["../../src/commands/clean.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { InitOptions } from '../types.js';
2
+ export declare function init(cwd: string, options?: InitOptions): Promise<void>;
3
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAK/C,wBAAsB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiEhF"}
@@ -0,0 +1,83 @@
1
+ import { existsSync, mkdirSync, copyFileSync, readdirSync, statSync, readFileSync, writeFileSync } from 'fs';
2
+ import { join, dirname, relative } from 'path';
3
+ import { fileURLToPath } from 'url';
4
+ import chalk from 'chalk';
5
+ import { VERSION } from '../version.js';
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = dirname(__filename);
8
+ export async function init(cwd, options = {}) {
9
+ console.log();
10
+ console.log(chalk.bold(` Daedalion v${VERSION}`));
11
+ console.log();
12
+ const templatesDir = join(__dirname, '../../templates/init');
13
+ const files = getAllFiles(templatesDir);
14
+ const { agentTarget, withExample } = options;
15
+ let created = 0;
16
+ let skipped = 0;
17
+ for (const file of files) {
18
+ const relativePath = relative(templatesDir, file);
19
+ const targetPath = join(cwd, relativePath);
20
+ if (!withExample && isExampleFile(relativePath)) {
21
+ continue;
22
+ }
23
+ if (existsSync(targetPath)) {
24
+ console.log(chalk.yellow(` ⚠ ${relativePath} already exists, skipping`));
25
+ skipped++;
26
+ continue;
27
+ }
28
+ const dir = dirname(targetPath);
29
+ if (!existsSync(dir)) {
30
+ mkdirSync(dir, { recursive: true });
31
+ }
32
+ copyFileSync(file, targetPath);
33
+ console.log(chalk.green(` ✓ ${relativePath}`));
34
+ created++;
35
+ }
36
+ if (agentTarget === 'sdk') {
37
+ const configPath = join(cwd, 'daedalion.yaml');
38
+ if (existsSync(configPath)) {
39
+ let config = readFileSync(configPath, 'utf-8');
40
+ config = config.replace(/agents:\s*\n\s*target:\s*ide/, 'agents:\n target: sdk');
41
+ writeFileSync(configPath, config);
42
+ console.log(chalk.cyan(` ✓ Updated daedalion.yaml with SDK target`));
43
+ }
44
+ }
45
+ console.log();
46
+ if (created > 0) {
47
+ console.log(chalk.green(` Done. ${created} files created.`));
48
+ }
49
+ if (skipped > 0) {
50
+ console.log(chalk.yellow(` ${skipped} files skipped (already exist).`));
51
+ }
52
+ if (agentTarget === 'sdk') {
53
+ console.log();
54
+ console.log(chalk.cyan(` Agent target set to SDK (for CI pipelines)`));
55
+ console.log(chalk.gray(` Edit daedalion.yaml to add custom tool names under agents.tools`));
56
+ }
57
+ console.log();
58
+ console.log(' Next steps:');
59
+ console.log(' 1. Edit openspec/specs/example/spec.md with your specifications');
60
+ console.log(' 2. Run `daedalion build` to generate GitHub Copilot artifacts');
61
+ console.log();
62
+ }
63
+ function getAllFiles(dir, files = []) {
64
+ const entries = readdirSync(dir);
65
+ for (const entry of entries) {
66
+ const fullPath = join(dir, entry);
67
+ const stat = statSync(fullPath);
68
+ if (stat.isDirectory()) {
69
+ getAllFiles(fullPath, files);
70
+ }
71
+ else {
72
+ files.push(fullPath);
73
+ }
74
+ }
75
+ return files;
76
+ }
77
+ function isExampleFile(relativePath) {
78
+ return relativePath.includes('specs/example/') ||
79
+ relativePath.includes('specs\\example\\') ||
80
+ relativePath.includes('changes/example-feature/') ||
81
+ relativePath.includes('changes\\example-feature\\');
82
+ }
83
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function validate(cwd: string): Promise<boolean>;
2
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAUA,wBAAsB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA4F5D"}
@@ -0,0 +1,119 @@
1
+ import { existsSync, readdirSync, statSync } from 'fs';
2
+ import { join } from 'path';
3
+ import chalk from 'chalk';
4
+ import { VERSION } from '../version.js';
5
+ import { glob } from 'glob';
6
+ import { loadConfig, resolveOpenspecPath, resolveOutputPath } from '../config.js';
7
+ import { parseSpec } from '../parsers/spec.js';
8
+ import { parseProposal } from '../parsers/proposal.js';
9
+ export async function validate(cwd) {
10
+ console.log();
11
+ console.log(chalk.bold(` Daedalion v${VERSION} - Validate`));
12
+ console.log();
13
+ const config = loadConfig(cwd);
14
+ const openspecDir = resolveOpenspecPath(cwd, config);
15
+ const outputDir = resolveOutputPath(cwd, config);
16
+ const errors = [];
17
+ const specs = await findAndParseSpecs(openspecDir);
18
+ const changes = await findAndParseChanges(openspecDir);
19
+ // Rule 1: Every spec has ≥1 requirement
20
+ for (const spec of specs) {
21
+ if (spec.requirements.length === 0) {
22
+ errors.push({
23
+ rule: 'spec-has-requirements',
24
+ message: `Spec "${spec.path}" has no requirements.\n Add at least one "### Requirement:" section.`
25
+ });
26
+ }
27
+ }
28
+ // Rule 2: Every requirement has ≥1 scenario
29
+ for (const spec of specs) {
30
+ for (const req of spec.requirements) {
31
+ if (req.scenarios.length === 0) {
32
+ errors.push({
33
+ rule: 'requirement-has-scenarios',
34
+ message: `Requirement "${req.name}" in ${spec.domain} lacks scenarios.\n Add at least one "#### Scenario:" section.`
35
+ });
36
+ }
37
+ }
38
+ }
39
+ // Rule 3: Generated skill exists for each spec
40
+ for (const spec of specs) {
41
+ const skillPath = join(outputDir, 'skills', spec.domain, 'SKILL.md');
42
+ if (!existsSync(skillPath)) {
43
+ errors.push({
44
+ rule: 'skill-exists-for-spec',
45
+ message: `Missing skill for spec ${spec.domain}.\n Run 'daedalion build' to generate.`
46
+ });
47
+ }
48
+ }
49
+ // Rule 4: Generated prompt exists for each active change
50
+ for (const change of changes) {
51
+ const promptPath = join(outputDir, 'prompts', `${change.changeName}.prompt.md`);
52
+ if (!existsSync(promptPath)) {
53
+ errors.push({
54
+ rule: 'prompt-exists-for-change',
55
+ message: `Missing prompt for change ${change.changeName}.\n Run 'daedalion build' to generate.`
56
+ });
57
+ }
58
+ }
59
+ // Rule 5: No orphaned skills
60
+ const skillsDir = join(outputDir, 'skills');
61
+ if (existsSync(skillsDir)) {
62
+ const skillDirs = readdirSync(skillsDir).filter((name) => {
63
+ const fullPath = join(skillsDir, name);
64
+ return statSync(fullPath).isDirectory();
65
+ });
66
+ for (const skillName of skillDirs) {
67
+ const hasSpec = specs.some((s) => s.domain === skillName);
68
+ if (!hasSpec) {
69
+ errors.push({
70
+ rule: 'no-orphan-skills',
71
+ message: `Orphan skill: ${skillName} has no source spec.\n Remove .github/skills/${skillName}/ or create openspec/specs/${skillName}/spec.md`
72
+ });
73
+ }
74
+ }
75
+ }
76
+ if (errors.length === 0) {
77
+ console.log(chalk.green(' ✓ All validations passed'));
78
+ console.log();
79
+ return true;
80
+ }
81
+ console.log(chalk.red(` ✗ ${errors.length} validation error(s) found:`));
82
+ console.log();
83
+ for (const error of errors) {
84
+ console.log(chalk.red(` Error: ${error.message}`));
85
+ console.log();
86
+ }
87
+ return false;
88
+ }
89
+ async function findAndParseSpecs(openspecDir) {
90
+ const specsDir = join(openspecDir, 'specs');
91
+ if (!existsSync(specsDir)) {
92
+ return [];
93
+ }
94
+ const specFiles = await glob('*/spec.md', { cwd: specsDir });
95
+ return specFiles.map((file) => parseSpec(join(specsDir, file)));
96
+ }
97
+ async function findAndParseChanges(openspecDir) {
98
+ const changesDir = join(openspecDir, 'changes');
99
+ if (!existsSync(changesDir)) {
100
+ return [];
101
+ }
102
+ const changes = [];
103
+ const changeDirs = readdirSync(changesDir).filter((name) => {
104
+ const fullPath = join(changesDir, name);
105
+ return statSync(fullPath).isDirectory();
106
+ });
107
+ for (const changeDir of changeDirs) {
108
+ const proposalPath = join(changesDir, changeDir, 'proposal.md');
109
+ if (existsSync(proposalPath)) {
110
+ const proposal = parseProposal(proposalPath);
111
+ changes.push({
112
+ changeName: proposal.changeName,
113
+ path: proposalPath
114
+ });
115
+ }
116
+ }
117
+ return changes;
118
+ }
119
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { DaedalionConfig } from './types.js';
2
+ export declare function loadConfig(cwd: string): DaedalionConfig;
3
+ export declare function resolveOpenspecPath(cwd: string, config: DaedalionConfig): string;
4
+ export declare function resolveOutputPath(cwd: string, config: DaedalionConfig): string;
5
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAwFlD,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAwBvD;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,MAAM,CAEhF;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,MAAM,CAE9E"}