daedalion 0.0.2 → 0.3.1

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 (99) hide show
  1. package/README.md +39 -44
  2. package/bin/daedalion.js +12 -6
  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 +193 -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 +88 -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 +114 -0
  26. package/dist/generators/agent.js.map +1 -0
  27. package/dist/generators/agents-index.d.ts +3 -0
  28. package/dist/generators/agents-index.d.ts.map +1 -0
  29. package/dist/generators/agents-index.js +29 -0
  30. package/dist/generators/agents-index.js.map +1 -0
  31. package/dist/generators/instructions.d.ts +3 -0
  32. package/dist/generators/instructions.d.ts.map +1 -0
  33. package/dist/generators/instructions.js +72 -0
  34. package/dist/generators/instructions.js.map +1 -0
  35. package/dist/generators/pattern-instructions.d.ts +3 -0
  36. package/dist/generators/pattern-instructions.d.ts.map +1 -0
  37. package/dist/generators/pattern-instructions.js +28 -0
  38. package/dist/generators/pattern-instructions.js.map +1 -0
  39. package/dist/generators/prompt.d.ts +4 -0
  40. package/dist/generators/prompt.d.ts.map +1 -0
  41. package/{src → dist}/generators/prompt.js +96 -102
  42. package/dist/generators/prompt.js.map +1 -0
  43. package/dist/generators/skill.d.ts +3 -0
  44. package/dist/generators/skill.d.ts.map +1 -0
  45. package/dist/generators/skill.js +98 -0
  46. package/dist/generators/skill.js.map +1 -0
  47. package/dist/generators/tools.d.ts +3 -0
  48. package/dist/generators/tools.d.ts.map +1 -0
  49. package/dist/generators/tools.js +192 -0
  50. package/dist/generators/tools.js.map +1 -0
  51. package/dist/generators/workflow.d.ts +3 -0
  52. package/dist/generators/workflow.d.ts.map +1 -0
  53. package/{src → dist}/generators/workflow.js +47 -53
  54. package/dist/generators/workflow.js.map +1 -0
  55. package/dist/index.d.ts +16 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/{src → dist}/index.js +1 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/parsers/proposal.d.ts +3 -0
  60. package/dist/parsers/proposal.d.ts.map +1 -0
  61. package/dist/parsers/proposal.js +50 -0
  62. package/dist/parsers/proposal.js.map +1 -0
  63. package/dist/parsers/spec.d.ts +3 -0
  64. package/dist/parsers/spec.d.ts.map +1 -0
  65. package/dist/parsers/spec.js +87 -0
  66. package/dist/parsers/spec.js.map +1 -0
  67. package/dist/parsers/tasks.d.ts +4 -0
  68. package/dist/parsers/tasks.d.ts.map +1 -0
  69. package/dist/parsers/tasks.js +39 -0
  70. package/dist/parsers/tasks.js.map +1 -0
  71. package/dist/types.d.ts +108 -0
  72. package/dist/types.d.ts.map +1 -0
  73. package/dist/types.js +2 -0
  74. package/dist/types.js.map +1 -0
  75. package/dist/utils.d.ts +5 -0
  76. package/dist/utils.d.ts.map +1 -0
  77. package/dist/utils.js +46 -0
  78. package/dist/utils.js.map +1 -0
  79. package/dist/version.d.ts +3 -0
  80. package/dist/version.d.ts.map +1 -0
  81. package/dist/version.js +47 -0
  82. package/dist/version.js.map +1 -0
  83. package/package.json +20 -5
  84. package/templates/init/.github/prompts/daedalion-compile.prompt.md +36 -0
  85. package/templates/init/daedalion.yaml +1 -11
  86. package/src/commands/build.js +0 -198
  87. package/src/commands/clean.js +0 -85
  88. package/src/commands/init.js +0 -101
  89. package/src/commands/validate.js +0 -141
  90. package/src/config.js +0 -50
  91. package/src/generators/agent.js +0 -121
  92. package/src/generators/instructions.js +0 -65
  93. package/src/generators/skill.js +0 -108
  94. package/src/generators/tools.js +0 -183
  95. package/src/parsers/proposal.js +0 -52
  96. package/src/parsers/spec.js +0 -105
  97. package/src/parsers/tasks.js +0 -46
  98. package/src/utils.js +0 -51
  99. 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
@@ -22,40 +25,21 @@ OpenSpec (what) ───▶ Daedalion ───▶ GitHub Copilot (how)
22
25
 
23
26
  **Daedalion's primary mission:** Ensure humans and AIs agree on **what to build** *before* any code is written.
24
27
 
25
- When you run `daedalion build`, it generates **`.github/prompts/daedalion-openspec-cycle.prompt.md`** a guided workflow that:
26
-
27
- 1. Routes AI to draft **proposals** (why, goals, scope) + **spec deltas** (what needs to change)
28
- 2. Blocks coding until the **human explicitly approves specs**
29
- 3. Guides implementation via a clear **task checklist**
30
- 4. Archives completed changes and **merges specs into canonical truth**
31
-
32
- This prompt is your **AI code coordinator** — it prevents costly rework by enforcing spec clarity and human review at every phase.
28
+ Write specs in `openspec/` using any format — hand-crafted or generated by [OpenSpec](https://github.com/fission-ai/openspec). Run `daedalion build` to compile them into GitHub Copilot artifacts:
33
29
 
34
- **The result:** Predictable, spec-aligned development where both humans and AIs follow the same playbook.
30
+ - **Skills** tell Copilot what requirements and acceptance criteria apply in each domain
31
+ - **Agents** give Copilot domain-aware personas
32
+ - **Change prompts** surface active work items directly in the IDE
33
+ - **AGENTS.md** provides a root-level discovery index for agent coordination
35
34
 
36
- ## Why Daedalion + OpenSpec
35
+ **The result:** Copilot always has the right context for the domain it is working in.
37
36
 
38
- - Aligns humans and AIs on the “what” before any code.
39
- - Enforces approval gates with an AI coordinator prompt.
40
- - Generates native Copilot artifacts from `openspec/` automatically.
41
- - Prevents drift with `validate` and supports CI.
37
+ ## Why Daedalion
42
38
 
43
- ## The Core Idea
44
-
45
- `daedalion build` generates `.github/prompts/daedalion-openspec-cycle.prompt.md` your AI code coordinator that:
46
- - Routes work: proposal review implementation archive
47
- - Blocks coding until specs are explicitly approved
48
- - Keeps tasks and deltas in lockstep with human review
49
-
50
- ```mermaid
51
- flowchart LR
52
- D[Draft: proposal + spec deltas] --> E{Approved?}
53
- E -- no --> D
54
- E -- yes --> F[Implement: tasks]
55
- F --> G{All tasks complete?}
56
- G -- no --> F
57
- G -- yes --> H[Archive: merge into openspec/specs]
58
- ```
39
+ - Compiles any spec format into native Copilot artifacts
40
+ - Generates native Copilot surface: agents, skills, prompts, instructions, AGENTS.md
41
+ - Prevents drift: `validate` checks specs artifacts are in sync
42
+ - Safe cleanup: `clean` removes only Daedalion-generated files (via manifest)
59
43
 
60
44
  ## Quick Start
61
45
 
@@ -72,15 +56,25 @@ Use the coordinator by asking your AI: “Help me work through the OpenSpec cycl
72
56
 
73
57
  ## What It Generates
74
58
 
59
+ `daedalion init` installs:
60
+
61
+ ```
62
+ .github/
63
+ └── prompts/
64
+ └── daedalion-compile.prompt.md # Slash prompt to trigger compilation
65
+ ```
66
+
67
+ `daedalion build` generates:
68
+
75
69
  ```
76
70
  .github/
77
- ├── prompts/
78
- ├── daedalion-openspec-cycle.prompt.md # AI coordinator (spec-driven workflow)
79
- │ └── {change}.prompt.md # Slash prompts for active changes
71
+ ├── AGENTS.md # Agent discovery index
72
+ ├── instructions/{domain}.instructions.md # Pattern-specific domain context
73
+ ├── prompts/{change}.prompt.md # Slash prompts for active changes
80
74
  ├── agents/{domain}.agent.md # Domain personas
81
75
  ├── skills/{domain}/SKILL.md # Auto-loaded skills from specs
82
- ├── copilot-instructions.md # Project context from openspec/project.md
83
- └── workflows/daedalion.yml # Optional CI (validate / auto-regenerate)
76
+ ├── copilot-instructions.md # Project context (conventions, domain list)
77
+ └── workflows/daedalion.yml # CI workflow (validate / auto-regenerate)
84
78
  ```
85
79
 
86
80
  ## Commands
@@ -114,15 +108,14 @@ project/
114
108
 
115
109
  ```
116
110
  .github/
117
- ├── skills/
118
- │ └── {domain}/
119
- │ └── SKILL.md
120
- ├── agents/
121
- │ └── {domain}.agent.md
122
- ├── prompts/
123
- │ └── {change-name}.prompt.md
124
- ├── workflows/
125
- │ └── daedalion.yml
111
+ ├── AGENTS.md
112
+ ├── instructions/{domain}.instructions.md
113
+ ├── skills/{domain}/
114
+ ├── SKILL.md # hub: compact requirements + spoke links
115
+ │ └── {requirement-slug}.md # spoke: scenario details per requirement
116
+ ├── agents/{domain}.agent.md
117
+ ├── prompts/{change-name}.prompt.md
118
+ ├── workflows/daedalion.yml # only when ci.enabled: true
126
119
  └── copilot-instructions.md
127
120
  ```
128
121
 
@@ -136,6 +129,8 @@ project/
136
129
  - Generated output details: [docs/generated-output.md](docs/generated-output.md)
137
130
  - CI setup and options: [docs/ci-workflow.md](docs/ci-workflow.md)
138
131
  - Developer notes: [docs/DEVELOPER.md](docs/DEVELOPER.md)
132
+ - TypeScript migration plan: [docs/TYPESCRIPT_MIGRATION_PLAN.md](docs/TYPESCRIPT_MIGRATION_PLAN.md)
133
+ - Release notes: [RELEASE.md](RELEASE.md)
139
134
 
140
135
  ## License
141
136
 
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 = `
@@ -32,7 +38,7 @@ if (!process.argv.includes('--help') && !process.argv.includes('-h')) {
32
38
 
33
39
  program
34
40
  .name('daedalion')
35
- .description('OpenSpec-to-Agent compiler for GitHub Copilot')
41
+ .description('Spec-to-Agent compiler for GitHub Copilot')
36
42
  .version(VERSION)
37
43
  .helpOption('-h, --help', 'display help for command');
38
44
 
@@ -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":"AAkBA,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,CA0G7F"}
@@ -0,0 +1,193 @@
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 } 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 { generateAgentsIndex } from '../generators/agents-index.js';
17
+ import { generatePatternInstructions } from '../generators/pattern-instructions.js';
18
+ import { ensureDir } from '../utils.js';
19
+ const MANIFEST_FILENAME = '.daedalion-manifest.json';
20
+ export async function build(cwd, options = {}) {
21
+ console.log();
22
+ console.log(chalk.bold(` Daedalion v${VERSION}`));
23
+ console.log();
24
+ const config = loadConfig(cwd);
25
+ const openspecDir = resolveOpenspecPath(cwd, config);
26
+ const outputDir = resolveOutputPath(cwd, config);
27
+ if (!existsSync(openspecDir)) {
28
+ throw new Error(`OpenSpec directory not found: ${openspecDir}\n Run 'daedalion init' first.`);
29
+ }
30
+ const generatedFiles = [];
31
+ // Parse specs
32
+ console.log(' Parsing specs...');
33
+ const specs = await findAndParseSpecs(openspecDir, options);
34
+ for (const spec of specs) {
35
+ console.log(chalk.gray(` ✓ ${relative(cwd, spec.path)}`));
36
+ }
37
+ // Parse changes
38
+ console.log();
39
+ console.log(' Parsing changes...');
40
+ const changes = await findAndParseChanges(openspecDir, options);
41
+ for (const change of changes) {
42
+ console.log(chalk.gray(` ✓ ${relative(cwd, change.proposal.path)}`));
43
+ }
44
+ // Aggregate tasks from all changes for skills
45
+ const allTasks = aggregateTasks(changes);
46
+ // Generate outputs
47
+ console.log();
48
+ console.log(' Generating...');
49
+ // Generate skills and agents from specs
50
+ for (const spec of specs) {
51
+ const tasks = allTasks[spec.domain] || null;
52
+ const skillResults = generateSkill(spec, tasks, outputDir, options);
53
+ for (const skillResult of skillResults) {
54
+ generatedFiles.push(skillResult);
55
+ logGenerated(skillResult.path, cwd, options);
56
+ }
57
+ const agentResult = generateAgent(spec, outputDir, options, config);
58
+ generatedFiles.push(agentResult);
59
+ logGenerated(agentResult.path, cwd, options);
60
+ const patternInstructionsResult = generatePatternInstructions(spec, outputDir, options);
61
+ generatedFiles.push(patternInstructionsResult);
62
+ logGenerated(patternInstructionsResult.path, cwd, options);
63
+ }
64
+ // Generate tool stubs if --with-tools flag is set
65
+ if (options.withTools) {
66
+ console.log(chalk.gray(` (generating tool stubs)`));
67
+ for (const spec of specs) {
68
+ const toolResults = generateTools(spec, outputDir, config, options);
69
+ for (const toolResult of toolResults) {
70
+ generatedFiles.push(toolResult);
71
+ logGenerated(toolResult.path, cwd, options);
72
+ }
73
+ }
74
+ }
75
+ // Generate AGENTS.md index
76
+ const agentsIndexResult = generateAgentsIndex(specs, outputDir, options);
77
+ generatedFiles.push(agentsIndexResult);
78
+ logGenerated(agentsIndexResult.path, cwd, options);
79
+ // Generate prompts from changes
80
+ for (const change of changes) {
81
+ const domain = findDomainForChange(change, specs);
82
+ const promptResult = generatePrompt(change.proposal, change.tasks, domain, outputDir, options);
83
+ generatedFiles.push(promptResult);
84
+ logGenerated(promptResult.path, cwd, options);
85
+ }
86
+ // Generate CI workflow (opt-in: only when ci.enabled is explicitly true)
87
+ if (config.ci?.enabled === true) {
88
+ const workflowResult = generateWorkflow(config, outputDir, options);
89
+ generatedFiles.push(workflowResult);
90
+ logGenerated(workflowResult.path, cwd, options);
91
+ }
92
+ // Generate copilot-instructions.md
93
+ const instructionsResult = generateInstructions(openspecDir, outputDir, options, specs);
94
+ generatedFiles.push(instructionsResult);
95
+ logGenerated(instructionsResult.path, cwd, options);
96
+ // Write manifest of generated files (for clean command)
97
+ if (!options.dryRun) {
98
+ writeManifest(outputDir, generatedFiles, cwd);
99
+ }
100
+ console.log();
101
+ if (options.dryRun) {
102
+ console.log(chalk.yellow(` Dry run complete. ${generatedFiles.length} files would be generated.`));
103
+ }
104
+ else {
105
+ console.log(chalk.green(` Done. ${generatedFiles.length} files generated.`));
106
+ }
107
+ console.log();
108
+ return generatedFiles;
109
+ }
110
+ function writeManifest(outputDir, generatedFiles, cwd) {
111
+ const manifestPath = join(outputDir, MANIFEST_FILENAME);
112
+ const manifest = {
113
+ version: 1,
114
+ generatedAt: new Date().toISOString(),
115
+ files: generatedFiles.map(f => relative(cwd, f.path))
116
+ };
117
+ ensureDir(manifestPath);
118
+ writeFileSync(manifestPath, JSON.stringify(manifest, null, 2));
119
+ }
120
+ async function findAndParseSpecs(openspecDir, _options) {
121
+ const specsByDomain = new Map();
122
+ // 1. Canonical specs: openspec/specs/*/spec.md (always take priority)
123
+ const canonicalDir = join(openspecDir, 'specs');
124
+ if (existsSync(canonicalDir)) {
125
+ const files = await glob('*/spec.md', { cwd: canonicalDir });
126
+ for (const file of files) {
127
+ const spec = parseSpec(join(canonicalDir, file));
128
+ specsByDomain.set(spec.domain, spec);
129
+ }
130
+ }
131
+ // 2. Delta specs: openspec/changes/*/specs/*/spec.md
132
+ // Only used when no canonical spec exists for that domain
133
+ const changesDir = join(openspecDir, 'changes');
134
+ if (existsSync(changesDir)) {
135
+ const files = await glob('*/specs/*/spec.md', { cwd: changesDir });
136
+ for (const file of files) {
137
+ const spec = parseSpec(join(changesDir, file));
138
+ if (!specsByDomain.has(spec.domain)) {
139
+ specsByDomain.set(spec.domain, spec);
140
+ }
141
+ }
142
+ }
143
+ return Array.from(specsByDomain.values());
144
+ }
145
+ async function findAndParseChanges(openspecDir, _options) {
146
+ const changesDir = join(openspecDir, 'changes');
147
+ if (!existsSync(changesDir)) {
148
+ return [];
149
+ }
150
+ const changes = [];
151
+ const changeDirs = readdirSync(changesDir).filter(name => {
152
+ const fullPath = join(changesDir, name);
153
+ return statSync(fullPath).isDirectory();
154
+ });
155
+ for (const changeDir of changeDirs) {
156
+ const proposalPath = join(changesDir, changeDir, 'proposal.md');
157
+ const tasksPath = join(changesDir, changeDir, 'tasks.md');
158
+ if (existsSync(proposalPath)) {
159
+ changes.push({
160
+ proposal: parseProposal(proposalPath),
161
+ tasks: parseTasks(tasksPath)
162
+ });
163
+ }
164
+ }
165
+ return changes;
166
+ }
167
+ function aggregateTasks(changes) {
168
+ const tasksByDomain = {};
169
+ for (const change of changes) {
170
+ if (!tasksByDomain['default']) {
171
+ tasksByDomain['default'] = { groups: [], items: [], hasMore: false };
172
+ }
173
+ tasksByDomain['default'].items.push(...change.tasks.items);
174
+ tasksByDomain['default'].hasMore = tasksByDomain['default'].hasMore || change.tasks.hasMore;
175
+ }
176
+ return tasksByDomain;
177
+ }
178
+ function findDomainForChange(change, specs) {
179
+ if (specs.length > 0) {
180
+ return specs[0].domain;
181
+ }
182
+ return 'default';
183
+ }
184
+ function logGenerated(filePath, cwd, options) {
185
+ const relativePath = relative(cwd, filePath);
186
+ if (options.dryRun) {
187
+ console.log(chalk.yellow(` → ${relativePath}`));
188
+ }
189
+ else {
190
+ console.log(chalk.green(` ✓ ${relativePath}`));
191
+ }
192
+ }
193
+ //# 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,CAqEhF"}
@@ -0,0 +1,88 @@
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
+ if (withExample) {
60
+ console.log(' 1. Edit openspec/specs/example/spec.md with your specifications');
61
+ console.log(' 2. Run `daedalion build` to generate GitHub Copilot artifacts');
62
+ }
63
+ else {
64
+ console.log(' 1. Run `daedalion build` to generate GitHub Copilot artifacts');
65
+ }
66
+ console.log();
67
+ }
68
+ function getAllFiles(dir, files = []) {
69
+ const entries = readdirSync(dir);
70
+ for (const entry of entries) {
71
+ const fullPath = join(dir, entry);
72
+ const stat = statSync(fullPath);
73
+ if (stat.isDirectory()) {
74
+ getAllFiles(fullPath, files);
75
+ }
76
+ else {
77
+ files.push(fullPath);
78
+ }
79
+ }
80
+ return files;
81
+ }
82
+ function isExampleFile(relativePath) {
83
+ return relativePath.includes('specs/example/') ||
84
+ relativePath.includes('specs\\example\\') ||
85
+ relativePath.includes('changes/example-feature/') ||
86
+ relativePath.includes('changes\\example-feature\\');
87
+ }
88
+ //# 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"}