@rasensio/aidlc 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 (187) hide show
  1. package/README.md +251 -0
  2. package/capabilities/claude-code.yaml +9 -0
  3. package/capabilities/codex.yaml +8 -0
  4. package/capabilities/cursor.yaml +8 -0
  5. package/capabilities/kiro.yaml +9 -0
  6. package/capabilities/windsurf.yaml +8 -0
  7. package/ci/aidlc-gate.yml +100 -0
  8. package/dist/cli.d.ts +11 -0
  9. package/dist/cli.d.ts.map +1 -0
  10. package/dist/cli.js +39 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/commands/add-action.d.ts +83 -0
  13. package/dist/commands/add-action.d.ts.map +1 -0
  14. package/dist/commands/add-action.js +437 -0
  15. package/dist/commands/add-action.js.map +1 -0
  16. package/dist/commands/continue.d.ts +23 -0
  17. package/dist/commands/continue.d.ts.map +1 -0
  18. package/dist/commands/continue.js +238 -0
  19. package/dist/commands/continue.js.map +1 -0
  20. package/dist/commands/discover.d.ts +19 -0
  21. package/dist/commands/discover.d.ts.map +1 -0
  22. package/dist/commands/discover.js +85 -0
  23. package/dist/commands/discover.js.map +1 -0
  24. package/dist/commands/docs.d.ts +25 -0
  25. package/dist/commands/docs.d.ts.map +1 -0
  26. package/dist/commands/docs.js +282 -0
  27. package/dist/commands/docs.js.map +1 -0
  28. package/dist/commands/gate.d.ts +25 -0
  29. package/dist/commands/gate.d.ts.map +1 -0
  30. package/dist/commands/gate.js +168 -0
  31. package/dist/commands/gate.js.map +1 -0
  32. package/dist/commands/init.d.ts +24 -0
  33. package/dist/commands/init.d.ts.map +1 -0
  34. package/dist/commands/init.js +187 -0
  35. package/dist/commands/init.js.map +1 -0
  36. package/dist/commands/review.d.ts +60 -0
  37. package/dist/commands/review.d.ts.map +1 -0
  38. package/dist/commands/review.js +264 -0
  39. package/dist/commands/review.js.map +1 -0
  40. package/dist/commands/setup.d.ts +24 -0
  41. package/dist/commands/setup.d.ts.map +1 -0
  42. package/dist/commands/setup.js +206 -0
  43. package/dist/commands/setup.js.map +1 -0
  44. package/dist/commands/start.d.ts +27 -0
  45. package/dist/commands/start.d.ts.map +1 -0
  46. package/dist/commands/start.js +243 -0
  47. package/dist/commands/start.js.map +1 -0
  48. package/dist/commands/status.d.ts +25 -0
  49. package/dist/commands/status.d.ts.map +1 -0
  50. package/dist/commands/status.js +263 -0
  51. package/dist/commands/status.js.map +1 -0
  52. package/dist/commands/transition.d.ts +30 -0
  53. package/dist/commands/transition.d.ts.map +1 -0
  54. package/dist/commands/transition.js +353 -0
  55. package/dist/commands/transition.js.map +1 -0
  56. package/dist/compile/adapters/claude-code.d.ts +24 -0
  57. package/dist/compile/adapters/claude-code.d.ts.map +1 -0
  58. package/dist/compile/adapters/claude-code.js +271 -0
  59. package/dist/compile/adapters/claude-code.js.map +1 -0
  60. package/dist/compile/adapters/codex.d.ts +19 -0
  61. package/dist/compile/adapters/codex.d.ts.map +1 -0
  62. package/dist/compile/adapters/codex.js +157 -0
  63. package/dist/compile/adapters/codex.js.map +1 -0
  64. package/dist/compile/adapters/cursor.d.ts +21 -0
  65. package/dist/compile/adapters/cursor.d.ts.map +1 -0
  66. package/dist/compile/adapters/cursor.js +181 -0
  67. package/dist/compile/adapters/cursor.js.map +1 -0
  68. package/dist/compile/adapters/index.d.ts +16 -0
  69. package/dist/compile/adapters/index.d.ts.map +1 -0
  70. package/dist/compile/adapters/index.js +26 -0
  71. package/dist/compile/adapters/index.js.map +1 -0
  72. package/dist/compile/adapters/kiro.d.ts +24 -0
  73. package/dist/compile/adapters/kiro.d.ts.map +1 -0
  74. package/dist/compile/adapters/kiro.js +222 -0
  75. package/dist/compile/adapters/kiro.js.map +1 -0
  76. package/dist/compile/adapters/windsurf.d.ts +25 -0
  77. package/dist/compile/adapters/windsurf.d.ts.map +1 -0
  78. package/dist/compile/adapters/windsurf.js +242 -0
  79. package/dist/compile/adapters/windsurf.js.map +1 -0
  80. package/dist/compile/install-plan.d.ts +49 -0
  81. package/dist/compile/install-plan.d.ts.map +1 -0
  82. package/dist/compile/install-plan.js +112 -0
  83. package/dist/compile/install-plan.js.map +1 -0
  84. package/dist/compile/loaders.d.ts +81 -0
  85. package/dist/compile/loaders.d.ts.map +1 -0
  86. package/dist/compile/loaders.js +293 -0
  87. package/dist/compile/loaders.js.map +1 -0
  88. package/dist/compile/merger.d.ts +32 -0
  89. package/dist/compile/merger.d.ts.map +1 -0
  90. package/dist/compile/merger.js +60 -0
  91. package/dist/compile/merger.js.map +1 -0
  92. package/dist/core/gate.d.ts +36 -0
  93. package/dist/core/gate.d.ts.map +1 -0
  94. package/dist/core/gate.js +97 -0
  95. package/dist/core/gate.js.map +1 -0
  96. package/dist/core/index.d.ts +7 -0
  97. package/dist/core/index.d.ts.map +1 -0
  98. package/dist/core/index.js +7 -0
  99. package/dist/core/index.js.map +1 -0
  100. package/dist/core/lifecycle.d.ts +89 -0
  101. package/dist/core/lifecycle.d.ts.map +1 -0
  102. package/dist/core/lifecycle.js +356 -0
  103. package/dist/core/lifecycle.js.map +1 -0
  104. package/dist/core/template-resolver.d.ts +56 -0
  105. package/dist/core/template-resolver.d.ts.map +1 -0
  106. package/dist/core/template-resolver.js +261 -0
  107. package/dist/core/template-resolver.js.map +1 -0
  108. package/dist/core/types.d.ts +527 -0
  109. package/dist/core/types.d.ts.map +1 -0
  110. package/dist/core/types.js +8 -0
  111. package/dist/core/types.js.map +1 -0
  112. package/dist/discover/scanner.d.ts +58 -0
  113. package/dist/discover/scanner.d.ts.map +1 -0
  114. package/dist/discover/scanner.js +772 -0
  115. package/dist/discover/scanner.js.map +1 -0
  116. package/dist/events/event-bus.d.ts +53 -0
  117. package/dist/events/event-bus.d.ts.map +1 -0
  118. package/dist/events/event-bus.js +263 -0
  119. package/dist/events/event-bus.js.map +1 -0
  120. package/dist/events/plugin-hooks.d.ts +44 -0
  121. package/dist/events/plugin-hooks.d.ts.map +1 -0
  122. package/dist/events/plugin-hooks.js +225 -0
  123. package/dist/events/plugin-hooks.js.map +1 -0
  124. package/dist/orchestrator/budget-packer.d.ts +57 -0
  125. package/dist/orchestrator/budget-packer.d.ts.map +1 -0
  126. package/dist/orchestrator/budget-packer.js +70 -0
  127. package/dist/orchestrator/budget-packer.js.map +1 -0
  128. package/dist/orchestrator/config.d.ts +43 -0
  129. package/dist/orchestrator/config.d.ts.map +1 -0
  130. package/dist/orchestrator/config.js +109 -0
  131. package/dist/orchestrator/config.js.map +1 -0
  132. package/dist/orchestrator/endpoint-clients.d.ts +23 -0
  133. package/dist/orchestrator/endpoint-clients.d.ts.map +1 -0
  134. package/dist/orchestrator/endpoint-clients.js +129 -0
  135. package/dist/orchestrator/endpoint-clients.js.map +1 -0
  136. package/dist/orchestrator/orchestrator-loop.d.ts +93 -0
  137. package/dist/orchestrator/orchestrator-loop.d.ts.map +1 -0
  138. package/dist/orchestrator/orchestrator-loop.js +185 -0
  139. package/dist/orchestrator/orchestrator-loop.js.map +1 -0
  140. package/dist/security/confirmation.d.ts +90 -0
  141. package/dist/security/confirmation.d.ts.map +1 -0
  142. package/dist/security/confirmation.js +140 -0
  143. package/dist/security/confirmation.js.map +1 -0
  144. package/dist/setup/setup-compute.d.ts +54 -0
  145. package/dist/setup/setup-compute.d.ts.map +1 -0
  146. package/dist/setup/setup-compute.js +66 -0
  147. package/dist/setup/setup-compute.js.map +1 -0
  148. package/dist/state/snapshot-store.d.ts +79 -0
  149. package/dist/state/snapshot-store.d.ts.map +1 -0
  150. package/dist/state/snapshot-store.js +164 -0
  151. package/dist/state/snapshot-store.js.map +1 -0
  152. package/dist/state/state-recovery.d.ts +87 -0
  153. package/dist/state/state-recovery.d.ts.map +1 -0
  154. package/dist/state/state-recovery.js +274 -0
  155. package/dist/state/state-recovery.js.map +1 -0
  156. package/dist/state/transition-log.d.ts +40 -0
  157. package/dist/state/transition-log.d.ts.map +1 -0
  158. package/dist/state/transition-log.js +83 -0
  159. package/dist/state/transition-log.js.map +1 -0
  160. package/dist/state/yaml-helpers.d.ts +53 -0
  161. package/dist/state/yaml-helpers.d.ts.map +1 -0
  162. package/dist/state/yaml-helpers.js +110 -0
  163. package/dist/state/yaml-helpers.js.map +1 -0
  164. package/examples/.gitkeep +0 -0
  165. package/guidance/accessibility.md +67 -0
  166. package/guidance/api-conventions.md +124 -0
  167. package/guidance/index.yaml +7 -0
  168. package/guidance/secure-defaults.md +71 -0
  169. package/package.json +52 -0
  170. package/phases/.gitkeep +0 -0
  171. package/skills/00-overview.md +74 -0
  172. package/skills/10-ideation.md +45 -0
  173. package/skills/20-requirements.md +54 -0
  174. package/skills/30-design.md +57 -0
  175. package/skills/40-implementation.md +64 -0
  176. package/skills/50-testing.md +60 -0
  177. package/skills/60-deployment.md +63 -0
  178. package/skills/70-maintenance.md +56 -0
  179. package/skills/80-review.md +85 -0
  180. package/skills/81-continue.md +57 -0
  181. package/skills/82-add-action.md +71 -0
  182. package/templates/.gitkeep +0 -0
  183. package/templates/bugfix.yaml +14 -0
  184. package/templates/full-feature.yaml +44 -0
  185. package/templates/micro-task.yaml +11 -0
  186. package/templates/quick-feature.yaml +20 -0
  187. package/templates/spike.yaml +15 -0
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Install plan executors for the AIDLC install pipeline.
3
+ *
4
+ * The plan/execute split ensures `--dry-run` is provably equivalent to a real
5
+ * install — same plan, different executor (Req 1.5).
6
+ *
7
+ * - `executePlan()`: applies a plan to the filesystem (creates dirs, writes files,
8
+ * invokes `mergeBlock` for managed blocks).
9
+ * - `dryRunPlan()`: returns an identical report shape without touching the filesystem.
10
+ *
11
+ * Requirements: 1.2, 1.5, 17.2
12
+ *
13
+ * @module
14
+ */
15
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
16
+ import { join, dirname } from 'node:path';
17
+ import { mergeBlock } from './merger.js';
18
+ // ---------------------------------------------------------------------------
19
+ // Helpers
20
+ // ---------------------------------------------------------------------------
21
+ /**
22
+ * Resolve the final content for a file operation.
23
+ * For create/replace: the content itself.
24
+ * For merge-block: reads existing file (or empty) and calls mergeBlock.
25
+ */
26
+ function resolveContent(op, rootDir) {
27
+ if (op.kind === 'merge-block') {
28
+ const absPath = join(rootDir, op.path);
29
+ let existing = '';
30
+ if (existsSync(absPath)) {
31
+ existing = readFileSync(absPath, 'utf8');
32
+ }
33
+ return mergeBlock(existing, op.blockId, op.content);
34
+ }
35
+ // op.kind === 'create' | 'replace'
36
+ return op.content;
37
+ }
38
+ /**
39
+ * Read existing file content from disk, returning empty string if not found.
40
+ */
41
+ function readExisting(absPath) {
42
+ if (existsSync(absPath)) {
43
+ return readFileSync(absPath, 'utf8');
44
+ }
45
+ return '';
46
+ }
47
+ // ---------------------------------------------------------------------------
48
+ // Real Executor
49
+ // ---------------------------------------------------------------------------
50
+ /**
51
+ * Apply an install plan to the filesystem.
52
+ *
53
+ * - `create`/`replace`: write file content, creating directories as needed.
54
+ * - `merge-block`: read existing file (or empty), call `mergeBlock()`, write result.
55
+ *
56
+ * Skips files whose computed content is identical to what's already on disk.
57
+ *
58
+ * @param plan - The install plan to execute.
59
+ * @param rootDir - Absolute path to the project root. All `op.path` entries are relative to this.
60
+ * @returns Report of what was written, skipped, and warnings.
61
+ */
62
+ export function executePlan(plan, rootDir) {
63
+ const filesWritten = [];
64
+ const filesSkipped = [];
65
+ for (const op of plan.ops) {
66
+ const absPath = join(rootDir, op.path);
67
+ const newContent = resolveContent(op, rootDir);
68
+ const existingContent = readExisting(absPath);
69
+ if (existingContent === newContent) {
70
+ filesSkipped.push(op.path);
71
+ continue;
72
+ }
73
+ // Ensure directory exists
74
+ const dir = dirname(absPath);
75
+ if (!existsSync(dir)) {
76
+ mkdirSync(dir, { recursive: true });
77
+ }
78
+ writeFileSync(absPath, newContent, 'utf8');
79
+ filesWritten.push(op.path);
80
+ }
81
+ return { filesWritten, filesSkipped, warnings: [...plan.warnings] };
82
+ }
83
+ // ---------------------------------------------------------------------------
84
+ // Dry-Run Executor
85
+ // ---------------------------------------------------------------------------
86
+ /**
87
+ * Simulate applying an install plan without writing to the filesystem.
88
+ *
89
+ * Computes the same content resolution as `executePlan()` to determine which
90
+ * files would be written or skipped, but never creates directories or writes files.
91
+ *
92
+ * @param plan - The install plan to simulate.
93
+ * @param rootDir - Absolute path to the project root.
94
+ * @returns Report of what would be written, skipped, and warnings.
95
+ */
96
+ export function dryRunPlan(plan, rootDir) {
97
+ const filesWritten = [];
98
+ const filesSkipped = [];
99
+ for (const op of plan.ops) {
100
+ const absPath = join(rootDir, op.path);
101
+ const newContent = resolveContent(op, rootDir);
102
+ const existingContent = readExisting(absPath);
103
+ if (existingContent === newContent) {
104
+ filesSkipped.push(op.path);
105
+ }
106
+ else {
107
+ filesWritten.push(op.path);
108
+ }
109
+ }
110
+ return { filesWritten, filesSkipped, warnings: [...plan.warnings] };
111
+ }
112
+ //# sourceMappingURL=install-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-plan.js","sourceRoot":"","sources":["../../src/compile/install-plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Skill/guidance loaders with context placeholder resolution.
3
+ *
4
+ * - `loadSkills()` loads universal skill definitions from a directory.
5
+ * - `parseSkillFile()` parses a single skill file (YAML frontmatter + markdown body).
6
+ * - `resolvePlaceholders()` resolves `{{context:<doc>}}` and `{{guidance:<layer>}}` placeholders.
7
+ * - `loadGuidanceLayers()` loads guidance layers registered in `index.yaml`.
8
+ *
9
+ * Requirements: 2.1, 2.6, 1.8, 16.11
10
+ */
11
+ import type { Skill, GuidanceLayer } from '../core/types.js';
12
+ /**
13
+ * Parse a single skill file (YAML frontmatter delimited by `---` + markdown body).
14
+ *
15
+ * @param content - Raw file content.
16
+ * @param filePath - Path to the file (used in error messages).
17
+ * @returns Parsed `Skill` object.
18
+ * @throws If frontmatter is missing or invalid.
19
+ */
20
+ export declare function parseSkillFile(content: string, filePath: string): Skill;
21
+ /**
22
+ * Load all skill definitions from a directory.
23
+ *
24
+ * Reads all `.md` files in the given directory and parses them as skill files.
25
+ *
26
+ * @param skillsDir - Absolute path to the skills directory.
27
+ * @returns Array of parsed `Skill` objects.
28
+ */
29
+ export declare function loadSkills(skillsDir: string): Skill[];
30
+ /**
31
+ * Resolve `{{context:<doc-name>}}` placeholders in a string.
32
+ *
33
+ * - Small targets (≤ 2KB): inline the content directly.
34
+ * - Larger targets: emit a read-instruction reference.
35
+ * - Unresolvable: produce a warning and leave an `<!-- aidlc:unresolved <ref> -->` marker.
36
+ *
37
+ * @param body - The string containing placeholders.
38
+ * @param contextDir - Absolute path to the `.aidlc/context/` directory.
39
+ * @returns Object with resolved string and any warnings produced.
40
+ */
41
+ export declare function resolvePlaceholders(body: string, contextDir: string): {
42
+ resolved: string;
43
+ warnings: string[];
44
+ };
45
+ /**
46
+ * Resolve `{{guidance:<layer-name>}}` placeholders in a string using loaded guidance layers.
47
+ *
48
+ * @param body - The string containing placeholders.
49
+ * @param layers - Already-loaded guidance layers to resolve against.
50
+ * @returns Object with resolved string and any warnings produced.
51
+ */
52
+ export declare function resolveGuidancePlaceholders(body: string, layers: GuidanceLayer[]): {
53
+ resolved: string;
54
+ warnings: string[];
55
+ };
56
+ /** Result of loading guidance layers from disk. */
57
+ export interface LoadedGuidance {
58
+ layers: GuidanceLayer[];
59
+ warnings: string[];
60
+ }
61
+ /**
62
+ * Load guidance layers from `.aidlc/guidance/` using `index.yaml` for registration.
63
+ *
64
+ * Loading rules (Req 16.10, 16.11):
65
+ * - Active = registered in index.yaml AND present on disk.
66
+ * - Registered but missing → warning, other layers still load.
67
+ * - Present but unregistered → silently inactive.
68
+ *
69
+ * @param guidanceDir - Absolute path to the `.aidlc/guidance/` directory.
70
+ * @returns Loaded layers and any warnings.
71
+ */
72
+ export declare function loadGuidanceLayers(guidanceDir: string): LoadedGuidance;
73
+ /**
74
+ * Parse a guidance layer file (YAML frontmatter + markdown body).
75
+ *
76
+ * @param content - Raw file content.
77
+ * @param filePath - Path for error messages.
78
+ * @returns Parsed guidance layer, or null on failure.
79
+ */
80
+ export declare function parseGuidanceFile(content: string, filePath: string): GuidanceLayer | null;
81
+ //# sourceMappingURL=loaders.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loaders.d.ts","sourceRoot":"","sources":["../../src/compile/loaders.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,KAAK,EAAE,KAAK,EAAa,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAmBxE;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,CA0DvE;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,EAAE,CAerD;AAMD;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,GACjB;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAqB1C;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,aAAa,EAAE,GACtB;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAgB1C;AAiCD,mDAAmD;AACnD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,CA6DtE;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CA6CzF"}
@@ -0,0 +1,293 @@
1
+ /**
2
+ * Skill/guidance loaders with context placeholder resolution.
3
+ *
4
+ * - `loadSkills()` loads universal skill definitions from a directory.
5
+ * - `parseSkillFile()` parses a single skill file (YAML frontmatter + markdown body).
6
+ * - `resolvePlaceholders()` resolves `{{context:<doc>}}` and `{{guidance:<layer>}}` placeholders.
7
+ * - `loadGuidanceLayers()` loads guidance layers registered in `index.yaml`.
8
+ *
9
+ * Requirements: 2.1, 2.6, 1.8, 16.11
10
+ */
11
+ import { readFileSync, readdirSync, existsSync, statSync } from 'node:fs';
12
+ import { join, basename, extname } from 'node:path';
13
+ import { parse as parseYaml } from 'yaml';
14
+ // ---------------------------------------------------------------------------
15
+ // Constants
16
+ // ---------------------------------------------------------------------------
17
+ /** Maximum size (bytes) for inline placeholder resolution. Larger files get a read-instruction. */
18
+ const INLINE_THRESHOLD_BYTES = 2048;
19
+ /** Regex matching `{{context:<doc-name>}}` placeholders. */
20
+ const CONTEXT_PLACEHOLDER_RE = /\{\{context:([^}]+)\}\}/g;
21
+ /** Regex matching `{{guidance:<layer-name>}}` placeholders. */
22
+ const GUIDANCE_PLACEHOLDER_RE = /\{\{guidance:([^}]+)\}\}/g;
23
+ // ---------------------------------------------------------------------------
24
+ // Skill loader
25
+ // ---------------------------------------------------------------------------
26
+ /**
27
+ * Parse a single skill file (YAML frontmatter delimited by `---` + markdown body).
28
+ *
29
+ * @param content - Raw file content.
30
+ * @param filePath - Path to the file (used in error messages).
31
+ * @returns Parsed `Skill` object.
32
+ * @throws If frontmatter is missing or invalid.
33
+ */
34
+ export function parseSkillFile(content, filePath) {
35
+ const lines = content.split('\n');
36
+ // Expect first line to be '---'
37
+ if (lines[0]?.trim() !== '---') {
38
+ throw new Error(`${filePath}: missing YAML frontmatter delimiter`);
39
+ }
40
+ // Find closing '---'
41
+ let endIndex = -1;
42
+ for (let i = 1; i < lines.length; i++) {
43
+ if (lines[i]?.trim() === '---') {
44
+ endIndex = i;
45
+ break;
46
+ }
47
+ }
48
+ if (endIndex === -1) {
49
+ throw new Error(`${filePath}: unclosed YAML frontmatter`);
50
+ }
51
+ const frontmatterRaw = lines.slice(1, endIndex).join('\n');
52
+ const body = lines.slice(endIndex + 1).join('\n').replace(/^\n/, '');
53
+ let meta;
54
+ try {
55
+ meta = parseYaml(frontmatterRaw);
56
+ }
57
+ catch (err) {
58
+ throw new Error(`${filePath}: invalid YAML frontmatter: ${err.message}`);
59
+ }
60
+ if (typeof meta !== 'object' || meta === null) {
61
+ throw new Error(`${filePath}: frontmatter must be a YAML mapping`);
62
+ }
63
+ const m = meta;
64
+ if (!m.name || typeof m.name !== 'string') {
65
+ throw new Error(`${filePath}: frontmatter missing required field 'name'`);
66
+ }
67
+ if (!m.description || typeof m.description !== 'string') {
68
+ throw new Error(`${filePath}: frontmatter missing required field 'description'`);
69
+ }
70
+ if (!m.phase || typeof m.phase !== 'string') {
71
+ throw new Error(`${filePath}: frontmatter missing required field 'phase'`);
72
+ }
73
+ const skillMeta = {
74
+ name: m.name,
75
+ description: m.description,
76
+ phase: m.phase,
77
+ ...(m.trigger && typeof m.trigger === 'string' ? { trigger: m.trigger } : {}),
78
+ ...(m.priority && typeof m.priority === 'number' ? { priority: m.priority } : {}),
79
+ ...(m.native_mode_hint && typeof m.native_mode_hint === 'object'
80
+ ? { native_mode_hint: m.native_mode_hint }
81
+ : {}),
82
+ };
83
+ return { meta: skillMeta, body };
84
+ }
85
+ /**
86
+ * Load all skill definitions from a directory.
87
+ *
88
+ * Reads all `.md` files in the given directory and parses them as skill files.
89
+ *
90
+ * @param skillsDir - Absolute path to the skills directory.
91
+ * @returns Array of parsed `Skill` objects.
92
+ */
93
+ export function loadSkills(skillsDir) {
94
+ if (!existsSync(skillsDir)) {
95
+ return [];
96
+ }
97
+ const entries = readdirSync(skillsDir).filter((f) => f.endsWith('.md')).sort();
98
+ const skills = [];
99
+ for (const entry of entries) {
100
+ const filePath = join(skillsDir, entry);
101
+ const content = readFileSync(filePath, 'utf8');
102
+ skills.push(parseSkillFile(content, filePath));
103
+ }
104
+ return skills;
105
+ }
106
+ // ---------------------------------------------------------------------------
107
+ // Context placeholder resolver
108
+ // ---------------------------------------------------------------------------
109
+ /**
110
+ * Resolve `{{context:<doc-name>}}` placeholders in a string.
111
+ *
112
+ * - Small targets (≤ 2KB): inline the content directly.
113
+ * - Larger targets: emit a read-instruction reference.
114
+ * - Unresolvable: produce a warning and leave an `<!-- aidlc:unresolved <ref> -->` marker.
115
+ *
116
+ * @param body - The string containing placeholders.
117
+ * @param contextDir - Absolute path to the `.aidlc/context/` directory.
118
+ * @returns Object with resolved string and any warnings produced.
119
+ */
120
+ export function resolvePlaceholders(body, contextDir) {
121
+ const warnings = [];
122
+ const resolved = body.replace(CONTEXT_PLACEHOLDER_RE, (_match, docName) => {
123
+ const filePath = resolveContextFile(contextDir, docName);
124
+ if (!filePath) {
125
+ warnings.push(`unresolved context placeholder: {{context:${docName}}}`);
126
+ return `<!-- aidlc:unresolved context:${docName} -->`;
127
+ }
128
+ const stat = statSync(filePath);
129
+ if (stat.size <= INLINE_THRESHOLD_BYTES) {
130
+ return readFileSync(filePath, 'utf8');
131
+ }
132
+ // Larger files: emit a read-instruction reference
133
+ return `<!-- aidlc:read ${filePath} -->`;
134
+ });
135
+ return { resolved, warnings };
136
+ }
137
+ /**
138
+ * Resolve `{{guidance:<layer-name>}}` placeholders in a string using loaded guidance layers.
139
+ *
140
+ * @param body - The string containing placeholders.
141
+ * @param layers - Already-loaded guidance layers to resolve against.
142
+ * @returns Object with resolved string and any warnings produced.
143
+ */
144
+ export function resolveGuidancePlaceholders(body, layers) {
145
+ const warnings = [];
146
+ const layerMap = new Map(layers.map((l) => [l.name, l]));
147
+ const resolved = body.replace(GUIDANCE_PLACEHOLDER_RE, (_match, layerName) => {
148
+ const layer = layerMap.get(layerName);
149
+ if (!layer) {
150
+ warnings.push(`unresolved guidance placeholder: {{guidance:${layerName}}}`);
151
+ return `<!-- aidlc:unresolved guidance:${layerName} -->`;
152
+ }
153
+ return layer.body;
154
+ });
155
+ return { resolved, warnings };
156
+ }
157
+ /**
158
+ * Resolve a context doc name to a file path.
159
+ * Tries exact match first, then with common extensions.
160
+ */
161
+ function resolveContextFile(contextDir, docName) {
162
+ if (!existsSync(contextDir)) {
163
+ return null;
164
+ }
165
+ // Try exact match
166
+ const exactPath = join(contextDir, docName);
167
+ if (existsSync(exactPath) && statSync(exactPath).isFile()) {
168
+ return exactPath;
169
+ }
170
+ // Try with common extensions
171
+ const extensions = ['.md', '.yaml', '.yml', '.txt', '.json'];
172
+ for (const ext of extensions) {
173
+ const withExt = join(contextDir, docName + ext);
174
+ if (existsSync(withExt) && statSync(withExt).isFile()) {
175
+ return withExt;
176
+ }
177
+ }
178
+ return null;
179
+ }
180
+ /**
181
+ * Load guidance layers from `.aidlc/guidance/` using `index.yaml` for registration.
182
+ *
183
+ * Loading rules (Req 16.10, 16.11):
184
+ * - Active = registered in index.yaml AND present on disk.
185
+ * - Registered but missing → warning, other layers still load.
186
+ * - Present but unregistered → silently inactive.
187
+ *
188
+ * @param guidanceDir - Absolute path to the `.aidlc/guidance/` directory.
189
+ * @returns Loaded layers and any warnings.
190
+ */
191
+ export function loadGuidanceLayers(guidanceDir) {
192
+ const warnings = [];
193
+ const layers = [];
194
+ const indexPath = join(guidanceDir, 'index.yaml');
195
+ if (!existsSync(indexPath)) {
196
+ return { layers, warnings };
197
+ }
198
+ let indexRaw;
199
+ try {
200
+ indexRaw = readFileSync(indexPath, 'utf8');
201
+ }
202
+ catch {
203
+ warnings.push(`unable to read guidance index: ${indexPath}`);
204
+ return { layers, warnings };
205
+ }
206
+ let index;
207
+ try {
208
+ index = parseYaml(indexRaw);
209
+ }
210
+ catch {
211
+ warnings.push(`invalid YAML in guidance index: ${indexPath}`);
212
+ return { layers, warnings };
213
+ }
214
+ if (typeof index !== 'object' || index === null || !('layers' in index)) {
215
+ warnings.push(`guidance index missing 'layers' field: ${indexPath}`);
216
+ return { layers, warnings };
217
+ }
218
+ const entries = index.layers;
219
+ if (!Array.isArray(entries)) {
220
+ warnings.push(`guidance index 'layers' must be an array: ${indexPath}`);
221
+ return { layers, warnings };
222
+ }
223
+ for (const entry of entries) {
224
+ if (typeof entry !== 'object' || entry === null)
225
+ continue;
226
+ const e = entry;
227
+ const name = typeof e.name === 'string' ? e.name : null;
228
+ const file = typeof e.file === 'string' ? e.file : null;
229
+ if (!name || !file)
230
+ continue;
231
+ const filePath = join(guidanceDir, file);
232
+ if (!existsSync(filePath)) {
233
+ warnings.push(`registered guidance layer '${name}' not found: ${filePath}`);
234
+ continue;
235
+ }
236
+ const content = readFileSync(filePath, 'utf8');
237
+ const parsed = parseGuidanceFile(content, filePath);
238
+ if (parsed) {
239
+ layers.push(parsed);
240
+ }
241
+ else {
242
+ warnings.push(`failed to parse guidance layer: ${filePath}`);
243
+ }
244
+ }
245
+ return { layers, warnings };
246
+ }
247
+ /**
248
+ * Parse a guidance layer file (YAML frontmatter + markdown body).
249
+ *
250
+ * @param content - Raw file content.
251
+ * @param filePath - Path for error messages.
252
+ * @returns Parsed guidance layer, or null on failure.
253
+ */
254
+ export function parseGuidanceFile(content, filePath) {
255
+ const lines = content.split('\n');
256
+ // Check for frontmatter
257
+ if (lines[0]?.trim() !== '---') {
258
+ // No frontmatter — try to use filename as name
259
+ return {
260
+ name: basename(filePath, extname(filePath)),
261
+ description: '',
262
+ body: content,
263
+ };
264
+ }
265
+ // Find closing '---'
266
+ let endIndex = -1;
267
+ for (let i = 1; i < lines.length; i++) {
268
+ if (lines[i]?.trim() === '---') {
269
+ endIndex = i;
270
+ break;
271
+ }
272
+ }
273
+ if (endIndex === -1) {
274
+ return null;
275
+ }
276
+ const frontmatterRaw = lines.slice(1, endIndex).join('\n');
277
+ const body = lines.slice(endIndex + 1).join('\n').replace(/^\n/, '');
278
+ let meta;
279
+ try {
280
+ meta = parseYaml(frontmatterRaw);
281
+ }
282
+ catch {
283
+ return null;
284
+ }
285
+ if (typeof meta !== 'object' || meta === null) {
286
+ return null;
287
+ }
288
+ const m = meta;
289
+ const name = typeof m.name === 'string' ? m.name : basename(filePath, extname(filePath));
290
+ const description = typeof m.description === 'string' ? m.description : '';
291
+ return { name, description, body };
292
+ }
293
+ //# sourceMappingURL=loaders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loaders.js","sourceRoot":"","sources":["../../src/compile/loaders.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Managed-block merger for AIDLC install pipeline.
3
+ *
4
+ * Merges content into a file using delimited blocks:
5
+ * <!-- aidlc:begin <blockId> -->
6
+ * ...content...
7
+ * <!-- aidlc:end <blockId> -->
8
+ *
9
+ * Preserves all bytes outside managed blocks. Idempotent — applying
10
+ * the same content twice yields the same result. Exactly one block
11
+ * per blockId in the output; never duplicates.
12
+ *
13
+ * @module
14
+ */
15
+ /**
16
+ * Build the begin delimiter for a given block ID.
17
+ */
18
+ export declare function beginDelimiter(blockId: string): string;
19
+ /**
20
+ * Build the end delimiter for a given block ID.
21
+ */
22
+ export declare function endDelimiter(blockId: string): string;
23
+ /**
24
+ * Merge a managed block into file content.
25
+ *
26
+ * @param existing - Current file content (or empty string if file doesn't exist)
27
+ * @param blockId - Unique block identifier
28
+ * @param content - New content to place between delimiters
29
+ * @returns The merged file content
30
+ */
31
+ export declare function mergeBlock(existing: string, blockId: string, content: string): string;
32
+ //# sourceMappingURL=merger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merger.d.ts","sourceRoot":"","sources":["../../src/compile/merger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CA8BrF"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Managed-block merger for AIDLC install pipeline.
3
+ *
4
+ * Merges content into a file using delimited blocks:
5
+ * <!-- aidlc:begin <blockId> -->
6
+ * ...content...
7
+ * <!-- aidlc:end <blockId> -->
8
+ *
9
+ * Preserves all bytes outside managed blocks. Idempotent — applying
10
+ * the same content twice yields the same result. Exactly one block
11
+ * per blockId in the output; never duplicates.
12
+ *
13
+ * @module
14
+ */
15
+ /**
16
+ * Build the begin delimiter for a given block ID.
17
+ */
18
+ export function beginDelimiter(blockId) {
19
+ return `<!-- aidlc:begin ${blockId} -->`;
20
+ }
21
+ /**
22
+ * Build the end delimiter for a given block ID.
23
+ */
24
+ export function endDelimiter(blockId) {
25
+ return `<!-- aidlc:end ${blockId} -->`;
26
+ }
27
+ /**
28
+ * Merge a managed block into file content.
29
+ *
30
+ * @param existing - Current file content (or empty string if file doesn't exist)
31
+ * @param blockId - Unique block identifier
32
+ * @param content - New content to place between delimiters
33
+ * @returns The merged file content
34
+ */
35
+ export function mergeBlock(existing, blockId, content) {
36
+ const begin = beginDelimiter(blockId);
37
+ const end = endDelimiter(blockId);
38
+ // Build the full delimited block
39
+ const block = `${begin}\n${content}\n${end}`;
40
+ // Look for existing block markers
41
+ const beginIdx = existing.indexOf(begin);
42
+ const endIdx = existing.indexOf(end);
43
+ if (beginIdx !== -1 && endIdx !== -1 && endIdx > beginIdx) {
44
+ // Replace the existing block (inclusive of delimiters)
45
+ const endOfEndMarker = endIdx + end.length;
46
+ const before = existing.slice(0, beginIdx);
47
+ const after = existing.slice(endOfEndMarker);
48
+ return before + block + after;
49
+ }
50
+ // Block not found — append
51
+ if (existing === '') {
52
+ return block;
53
+ }
54
+ // Ensure a newline separator before appending
55
+ if (existing.endsWith('\n')) {
56
+ return existing + '\n' + block;
57
+ }
58
+ return existing + '\n\n' + block;
59
+ }
60
+ //# sourceMappingURL=merger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merger.js","sourceRoot":"","sources":["../../src/compile/merger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,OAAO,oBAAoB,OAAO,MAAM,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,OAAO,kBAAkB,OAAO,MAAM,CAAC;AACzC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,QAAgB,EAAE,OAAe,EAAE,OAAe;IAC3E,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAElC,iCAAiC;IACjC,MAAM,KAAK,GAAG,GAAG,KAAK,KAAK,OAAO,KAAK,GAAG,EAAE,CAAC;IAE7C,kCAAkC;IAClC,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAErC,IAAI,QAAQ,KAAK,CAAC,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC,IAAI,MAAM,GAAG,QAAQ,EAAE,CAAC;QAC1D,uDAAuD;QACvD,MAAM,cAAc,GAAG,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;QAC3C,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAC7C,OAAO,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;IAChC,CAAC;IAED,2BAA2B;IAC3B,IAAI,QAAQ,KAAK,EAAE,EAAE,CAAC;QACpB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,8CAA8C;IAC9C,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,OAAO,QAAQ,GAAG,IAAI,GAAG,KAAK,CAAC;IACjC,CAAC;IAED,OAAO,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;AACnC,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Gate evaluation with exit-code semantics for CI/CD integration.
3
+ *
4
+ * `evaluateGate()` checks whether a phase passes its gate:
5
+ * - Exit 0 (pass: true) iff phase status is 'complete'.
6
+ * - Otherwise, returns structured data naming missing artifacts and unsatisfied criteria.
7
+ *
8
+ * Requirements: 9.1, 9.6
9
+ */
10
+ import type { PhaseState, WorkflowTemplate } from './types.js';
11
+ /**
12
+ * Gate check result for CI/CD integration.
13
+ */
14
+ export interface GateCheckResult {
15
+ /** True if the phase is complete (exit code 0). */
16
+ pass: boolean;
17
+ /** Phase name checked. */
18
+ phase: string;
19
+ /** Missing artifacts (empty if pass). */
20
+ missingArtifacts: string[];
21
+ /** Unsatisfied exit criteria descriptions (empty if pass). */
22
+ unsatisfiedCriteria: string[];
23
+ }
24
+ /**
25
+ * Evaluate whether a phase passes its gate check.
26
+ *
27
+ * Exit 0 (pass: true) iff the phase status is 'complete'.
28
+ * Otherwise, returns structured data naming what's missing (Req 9.6).
29
+ *
30
+ * @param phaseName - Name of the phase to check.
31
+ * @param phaseStates - Map of phase name → PhaseState for the instance.
32
+ * @param template - The resolved workflow template defining required artifacts.
33
+ * @returns A GateCheckResult indicating pass/fail with structured details.
34
+ */
35
+ export declare function evaluateGate(phaseName: string, phaseStates: Map<string, PhaseState>, template: WorkflowTemplate): GateCheckResult;
36
+ //# sourceMappingURL=gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../src/core/gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAiB,MAAM,YAAY,CAAC;AAM9E;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,mDAAmD;IACnD,IAAI,EAAE,OAAO,CAAC;IACd,0BAA0B;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,8DAA8D;IAC9D,mBAAmB,EAAE,MAAM,EAAE,CAAC;CAC/B;AAMD;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,EACpC,QAAQ,EAAE,gBAAgB,GACzB,eAAe,CAiCjB"}