@kamilmarzynski/scifi 0.1.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 (257) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +232 -0
  3. package/dist/skills/sf-bug/manifest.d.ts +2 -0
  4. package/dist/skills/sf-bug/manifest.js +6 -0
  5. package/dist/skills/sf-bug/manifest.js.map +1 -0
  6. package/dist/skills/sf-change/manifest.d.ts +2 -0
  7. package/dist/skills/sf-change/manifest.js +6 -0
  8. package/dist/skills/sf-change/manifest.js.map +1 -0
  9. package/dist/skills/sf-code-review/manifest.d.ts +2 -0
  10. package/dist/skills/sf-code-review/manifest.js +5 -0
  11. package/dist/skills/sf-code-review/manifest.js.map +1 -0
  12. package/dist/skills/sf-continue/manifest.d.ts +2 -0
  13. package/dist/skills/sf-continue/manifest.js +6 -0
  14. package/dist/skills/sf-continue/manifest.js.map +1 -0
  15. package/dist/skills/sf-feature/manifest.d.ts +2 -0
  16. package/dist/skills/sf-feature/manifest.js +6 -0
  17. package/dist/skills/sf-feature/manifest.js.map +1 -0
  18. package/dist/skills/sf-fix/manifest.d.ts +2 -0
  19. package/dist/skills/sf-fix/manifest.js +6 -0
  20. package/dist/skills/sf-fix/manifest.js.map +1 -0
  21. package/dist/skills/sf-handover/manifest.d.ts +2 -0
  22. package/dist/skills/sf-handover/manifest.js +5 -0
  23. package/dist/skills/sf-handover/manifest.js.map +1 -0
  24. package/dist/skills/sf-implement/manifest.d.ts +2 -0
  25. package/dist/skills/sf-implement/manifest.js +6 -0
  26. package/dist/skills/sf-implement/manifest.js.map +1 -0
  27. package/dist/skills/sf-plan/manifest.d.ts +2 -0
  28. package/dist/skills/sf-plan/manifest.js +6 -0
  29. package/dist/skills/sf-plan/manifest.js.map +1 -0
  30. package/dist/skills/sf-plan-review/manifest.d.ts +2 -0
  31. package/dist/skills/sf-plan-review/manifest.js +5 -0
  32. package/dist/skills/sf-plan-review/manifest.js.map +1 -0
  33. package/dist/skills/sf-receiving-review/manifest.d.ts +2 -0
  34. package/dist/skills/sf-receiving-review/manifest.js +5 -0
  35. package/dist/skills/sf-receiving-review/manifest.js.map +1 -0
  36. package/dist/skills/sf-spec-review/manifest.d.ts +2 -0
  37. package/dist/skills/sf-spec-review/manifest.js +5 -0
  38. package/dist/skills/sf-spec-review/manifest.js.map +1 -0
  39. package/dist/skills/sf-tdd/manifest.d.ts +2 -0
  40. package/dist/skills/sf-tdd/manifest.js +5 -0
  41. package/dist/skills/sf-tdd/manifest.js.map +1 -0
  42. package/dist/skills/sf-verification/manifest.d.ts +2 -0
  43. package/dist/skills/sf-verification/manifest.js +5 -0
  44. package/dist/skills/sf-verification/manifest.js.map +1 -0
  45. package/dist/src/cli/commands/bug.d.ts +2 -0
  46. package/dist/src/cli/commands/bug.js +58 -0
  47. package/dist/src/cli/commands/bug.js.map +1 -0
  48. package/dist/src/cli/commands/finish.d.ts +2 -0
  49. package/dist/src/cli/commands/finish.js +43 -0
  50. package/dist/src/cli/commands/finish.js.map +1 -0
  51. package/dist/src/cli/commands/fix.d.ts +2 -0
  52. package/dist/src/cli/commands/fix.js +60 -0
  53. package/dist/src/cli/commands/fix.js.map +1 -0
  54. package/dist/src/cli/commands/init.d.ts +2 -0
  55. package/dist/src/cli/commands/init.js +92 -0
  56. package/dist/src/cli/commands/init.js.map +1 -0
  57. package/dist/src/cli/commands/list.d.ts +2 -0
  58. package/dist/src/cli/commands/list.js +52 -0
  59. package/dist/src/cli/commands/list.js.map +1 -0
  60. package/dist/src/cli/commands/plan-ready.d.ts +2 -0
  61. package/dist/src/cli/commands/plan-ready.js +27 -0
  62. package/dist/src/cli/commands/plan-ready.js.map +1 -0
  63. package/dist/src/cli/commands/plan.d.ts +2 -0
  64. package/dist/src/cli/commands/plan.js +43 -0
  65. package/dist/src/cli/commands/plan.js.map +1 -0
  66. package/dist/src/cli/commands/spec-ready.d.ts +2 -0
  67. package/dist/src/cli/commands/spec-ready.js +27 -0
  68. package/dist/src/cli/commands/spec-ready.js.map +1 -0
  69. package/dist/src/cli/commands/spec.d.ts +2 -0
  70. package/dist/src/cli/commands/spec.js +46 -0
  71. package/dist/src/cli/commands/spec.js.map +1 -0
  72. package/dist/src/cli/commands/start.d.ts +2 -0
  73. package/dist/src/cli/commands/start.js +27 -0
  74. package/dist/src/cli/commands/start.js.map +1 -0
  75. package/dist/src/cli/commands/status.d.ts +2 -0
  76. package/dist/src/cli/commands/status.js +62 -0
  77. package/dist/src/cli/commands/status.js.map +1 -0
  78. package/dist/src/cli/commands/task.d.ts +2 -0
  79. package/dist/src/cli/commands/task.js +64 -0
  80. package/dist/src/cli/commands/task.js.map +1 -0
  81. package/dist/src/cli/commands/worktree.d.ts +2 -0
  82. package/dist/src/cli/commands/worktree.js +33 -0
  83. package/dist/src/cli/commands/worktree.js.map +1 -0
  84. package/dist/src/cli/index.d.ts +3 -0
  85. package/dist/src/cli/index.js +106 -0
  86. package/dist/src/cli/index.js.map +1 -0
  87. package/dist/src/core/bugs/create.d.ts +13 -0
  88. package/dist/src/core/bugs/create.js +28 -0
  89. package/dist/src/core/bugs/create.js.map +1 -0
  90. package/dist/src/core/bugs/frontmatter.d.ts +7 -0
  91. package/dist/src/core/bugs/frontmatter.js +65 -0
  92. package/dist/src/core/bugs/frontmatter.js.map +1 -0
  93. package/dist/src/core/bugs/id.d.ts +1 -0
  94. package/dist/src/core/bugs/id.js +4 -0
  95. package/dist/src/core/bugs/id.js.map +1 -0
  96. package/dist/src/core/bugs/paths.d.ts +2 -0
  97. package/dist/src/core/bugs/paths.js +8 -0
  98. package/dist/src/core/bugs/paths.js.map +1 -0
  99. package/dist/src/core/bugs/types.d.ts +12 -0
  100. package/dist/src/core/bugs/types.js +3 -0
  101. package/dist/src/core/bugs/types.js.map +1 -0
  102. package/dist/src/core/fixes/create.d.ts +11 -0
  103. package/dist/src/core/fixes/create.js +43 -0
  104. package/dist/src/core/fixes/create.js.map +1 -0
  105. package/dist/src/core/fixes/frontmatter.d.ts +7 -0
  106. package/dist/src/core/fixes/frontmatter.js +50 -0
  107. package/dist/src/core/fixes/frontmatter.js.map +1 -0
  108. package/dist/src/core/fixes/id.d.ts +1 -0
  109. package/dist/src/core/fixes/id.js +4 -0
  110. package/dist/src/core/fixes/id.js.map +1 -0
  111. package/dist/src/core/fixes/list.d.ts +8 -0
  112. package/dist/src/core/fixes/list.js +43 -0
  113. package/dist/src/core/fixes/list.js.map +1 -0
  114. package/dist/src/core/fixes/paths.d.ts +2 -0
  115. package/dist/src/core/fixes/paths.js +9 -0
  116. package/dist/src/core/fixes/paths.js.map +1 -0
  117. package/dist/src/core/fixes/transition.d.ts +9 -0
  118. package/dist/src/core/fixes/transition.js +26 -0
  119. package/dist/src/core/fixes/transition.js.map +1 -0
  120. package/dist/src/core/fixes/types.d.ts +9 -0
  121. package/dist/src/core/fixes/types.js +2 -0
  122. package/dist/src/core/fixes/types.js.map +1 -0
  123. package/dist/src/core/init/config.d.ts +6 -0
  124. package/dist/src/core/init/config.js +18 -0
  125. package/dist/src/core/init/config.js.map +1 -0
  126. package/dist/src/core/init/install-skills.d.ts +8 -0
  127. package/dist/src/core/init/install-skills.js +14 -0
  128. package/dist/src/core/init/install-skills.js.map +1 -0
  129. package/dist/src/core/init/prompt-harness.d.ts +8 -0
  130. package/dist/src/core/init/prompt-harness.js +19 -0
  131. package/dist/src/core/init/prompt-harness.js.map +1 -0
  132. package/dist/src/core/init/scaffold.d.ts +5 -0
  133. package/dist/src/core/init/scaffold.js +91 -0
  134. package/dist/src/core/init/scaffold.js.map +1 -0
  135. package/dist/src/core/init/types.d.ts +5 -0
  136. package/dist/src/core/init/types.js +2 -0
  137. package/dist/src/core/init/types.js.map +1 -0
  138. package/dist/src/core/output/emit.d.ts +8 -0
  139. package/dist/src/core/output/emit.js +50 -0
  140. package/dist/src/core/output/emit.js.map +1 -0
  141. package/dist/src/core/output/errors.d.ts +14 -0
  142. package/dist/src/core/output/errors.js +36 -0
  143. package/dist/src/core/output/errors.js.map +1 -0
  144. package/dist/src/core/output/index.d.ts +4 -0
  145. package/dist/src/core/output/index.js +4 -0
  146. package/dist/src/core/output/index.js.map +1 -0
  147. package/dist/src/core/output/tty.d.ts +1 -0
  148. package/dist/src/core/output/tty.js +4 -0
  149. package/dist/src/core/output/tty.js.map +1 -0
  150. package/dist/src/core/package-root.d.ts +1 -0
  151. package/dist/src/core/package-root.js +18 -0
  152. package/dist/src/core/package-root.js.map +1 -0
  153. package/dist/src/core/skills/catalog.d.ts +6 -0
  154. package/dist/src/core/skills/catalog.js +69 -0
  155. package/dist/src/core/skills/catalog.js.map +1 -0
  156. package/dist/src/core/skills/harness/adapter.d.ts +15 -0
  157. package/dist/src/core/skills/harness/adapter.js +31 -0
  158. package/dist/src/core/skills/harness/adapter.js.map +1 -0
  159. package/dist/src/core/skills/harness/claude-code.d.ts +2 -0
  160. package/dist/src/core/skills/harness/claude-code.js +37 -0
  161. package/dist/src/core/skills/harness/claude-code.js.map +1 -0
  162. package/dist/src/core/skills/harness/register-defaults.d.ts +1 -0
  163. package/dist/src/core/skills/harness/register-defaults.js +4 -0
  164. package/dist/src/core/skills/harness/register-defaults.js.map +1 -0
  165. package/dist/src/core/skills/harness/registry.d.ts +3 -0
  166. package/dist/src/core/skills/harness/registry.js +22 -0
  167. package/dist/src/core/skills/harness/registry.js.map +1 -0
  168. package/dist/src/core/skills/types.d.ts +18 -0
  169. package/dist/src/core/skills/types.js +9 -0
  170. package/dist/src/core/skills/types.js.map +1 -0
  171. package/dist/src/core/slugify.d.ts +2 -0
  172. package/dist/src/core/slugify.js +13 -0
  173. package/dist/src/core/slugify.js.map +1 -0
  174. package/dist/src/core/specs/create.d.ts +11 -0
  175. package/dist/src/core/specs/create.js +35 -0
  176. package/dist/src/core/specs/create.js.map +1 -0
  177. package/dist/src/core/specs/id.d.ts +1 -0
  178. package/dist/src/core/specs/id.js +4 -0
  179. package/dist/src/core/specs/id.js.map +1 -0
  180. package/dist/src/core/specs/lifecycle.d.ts +17 -0
  181. package/dist/src/core/specs/lifecycle.js +97 -0
  182. package/dist/src/core/specs/lifecycle.js.map +1 -0
  183. package/dist/src/core/specs/list.d.ts +6 -0
  184. package/dist/src/core/specs/list.js +43 -0
  185. package/dist/src/core/specs/list.js.map +1 -0
  186. package/dist/src/core/specs/metadata.d.ts +3 -0
  187. package/dist/src/core/specs/metadata.js +13 -0
  188. package/dist/src/core/specs/metadata.js.map +1 -0
  189. package/dist/src/core/specs/paths.d.ts +3 -0
  190. package/dist/src/core/specs/paths.js +13 -0
  191. package/dist/src/core/specs/paths.js.map +1 -0
  192. package/dist/src/core/specs/plan-session.d.ts +18 -0
  193. package/dist/src/core/specs/plan-session.js +24 -0
  194. package/dist/src/core/specs/plan-session.js.map +1 -0
  195. package/dist/src/core/specs/transition.d.ts +8 -0
  196. package/dist/src/core/specs/transition.js +33 -0
  197. package/dist/src/core/specs/transition.js.map +1 -0
  198. package/dist/src/core/specs/types.d.ts +17 -0
  199. package/dist/src/core/specs/types.js +8 -0
  200. package/dist/src/core/specs/types.js.map +1 -0
  201. package/dist/src/core/specs/worktree.d.ts +10 -0
  202. package/dist/src/core/specs/worktree.js +32 -0
  203. package/dist/src/core/specs/worktree.js.map +1 -0
  204. package/dist/src/core/tasks/frontmatter.d.ts +7 -0
  205. package/dist/src/core/tasks/frontmatter.js +53 -0
  206. package/dist/src/core/tasks/frontmatter.js.map +1 -0
  207. package/dist/src/core/tasks/list.d.ts +2 -0
  208. package/dist/src/core/tasks/list.js +18 -0
  209. package/dist/src/core/tasks/list.js.map +1 -0
  210. package/dist/src/core/tasks/paths.d.ts +2 -0
  211. package/dist/src/core/tasks/paths.js +11 -0
  212. package/dist/src/core/tasks/paths.js.map +1 -0
  213. package/dist/src/core/tasks/transition.d.ts +8 -0
  214. package/dist/src/core/tasks/transition.js +30 -0
  215. package/dist/src/core/tasks/transition.js.map +1 -0
  216. package/dist/src/core/tasks/types.d.ts +8 -0
  217. package/dist/src/core/tasks/types.js +2 -0
  218. package/dist/src/core/tasks/types.js.map +1 -0
  219. package/package.json +67 -0
  220. package/skills/sf-bug/DISPATCH-CODE-REVIEW.md +22 -0
  221. package/skills/sf-bug/body.md +117 -0
  222. package/skills/sf-bug/manifest.ts +8 -0
  223. package/skills/sf-change/body.md +178 -0
  224. package/skills/sf-change/manifest.ts +8 -0
  225. package/skills/sf-code-review/body.md +155 -0
  226. package/skills/sf-code-review/manifest.ts +7 -0
  227. package/skills/sf-continue/body.md +90 -0
  228. package/skills/sf-continue/manifest.ts +8 -0
  229. package/skills/sf-feature/ADR-TEMPLATE.md +16 -0
  230. package/skills/sf-feature/DISPATCH-SPEC-REVIEW.md +16 -0
  231. package/skills/sf-feature/SPEC-TEMPLATE.md +37 -0
  232. package/skills/sf-feature/body.md +145 -0
  233. package/skills/sf-feature/manifest.ts +8 -0
  234. package/skills/sf-fix/DISPATCH-CODE-REVIEW.md +25 -0
  235. package/skills/sf-fix/body.md +174 -0
  236. package/skills/sf-fix/manifest.ts +8 -0
  237. package/skills/sf-handover/body.md +67 -0
  238. package/skills/sf-handover/manifest.ts +7 -0
  239. package/skills/sf-implement/DISPATCH-CODE-REVIEW.md +19 -0
  240. package/skills/sf-implement/DISPATCH-HANDOVER.md +19 -0
  241. package/skills/sf-implement/DISPATCH-IMPLEMENTER.md +36 -0
  242. package/skills/sf-implement/body.md +147 -0
  243. package/skills/sf-implement/manifest.ts +8 -0
  244. package/skills/sf-plan/ADR-TEMPLATE.md +16 -0
  245. package/skills/sf-plan/DESIGN-TEMPLATE.md +54 -0
  246. package/skills/sf-plan/DISPATCH-PLAN-REVIEW.md +17 -0
  247. package/skills/sf-plan/TASK-TEMPLATE.md +30 -0
  248. package/skills/sf-plan/body.md +162 -0
  249. package/skills/sf-plan/manifest.ts +8 -0
  250. package/skills/sf-plan-review/body.md +90 -0
  251. package/skills/sf-plan-review/manifest.ts +7 -0
  252. package/skills/sf-receiving-review/body.md +73 -0
  253. package/skills/sf-receiving-review/manifest.ts +7 -0
  254. package/skills/sf-spec-review/body.md +83 -0
  255. package/skills/sf-spec-review/manifest.ts +7 -0
  256. package/skills/sf-tdd/body.md +120 -0
  257. package/skills/sf-tdd/manifest.ts +7 -0
@@ -0,0 +1,6 @@
1
+ import type { HarnessId } from '../skills/harness/adapter.js';
2
+ export interface WriteConfigOptions {
3
+ readonly projectRoot: string;
4
+ readonly harness: HarnessId;
5
+ }
6
+ export declare function writeConfig(options: WriteConfigOptions): Promise<void>;
@@ -0,0 +1,18 @@
1
+ import { writeFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ export async function writeConfig(options) {
4
+ const configPath = join(options.projectRoot, 'docs', 'scifi', '.scifi', 'config.json');
5
+ const document = JSON.stringify({ version: 1, harness: options.harness });
6
+ await writeFile(configPath, document, {
7
+ encoding: 'utf8',
8
+ flag: 'wx',
9
+ }).catch((error) => {
10
+ if (error instanceof Error &&
11
+ 'code' in error &&
12
+ error.code === 'EEXIST') {
13
+ return;
14
+ }
15
+ throw error;
16
+ });
17
+ }
18
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../src/core/init/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAQjC,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAA2B;IAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;IAEvF,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAE1E,MAAM,SAAS,CAAC,UAAU,EAAE,QAAQ,EAAE;QACpC,QAAQ,EAAE,MAAM;QAChB,IAAI,EAAE,IAAI;KACX,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QAC1B,IACE,KAAK,YAAY,KAAK;YACtB,MAAM,IAAI,KAAK;YACd,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAClD,CAAC;YACD,OAAO;QACT,CAAC;QAED,MAAM,KAAK,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,8 @@
1
+ import '../skills/harness/register-defaults.js';
2
+ import type { HarnessId } from '../skills/harness/adapter.js';
3
+ export interface InstallSkillsOptions {
4
+ readonly projectRoot: string;
5
+ readonly harness: HarnessId;
6
+ readonly packageRoot: string;
7
+ }
8
+ export declare function installSkills(options: InstallSkillsOptions): Promise<string[]>;
@@ -0,0 +1,14 @@
1
+ import { join } from 'node:path';
2
+ import { loadCatalog } from '../skills/catalog.js';
3
+ import '../skills/harness/register-defaults.js';
4
+ import { getAdapter } from '../skills/harness/registry.js';
5
+ export async function installSkills(options) {
6
+ const adapter = getAdapter(options.harness);
7
+ const bundles = await loadCatalog({
8
+ bodiesRoot: join(options.packageRoot, 'skills'),
9
+ manifestsRoot: join(options.packageRoot, 'dist', 'skills'),
10
+ });
11
+ await adapter.install(bundles, options.projectRoot);
12
+ return bundles.map((bundle) => bundle.manifest.id);
13
+ }
14
+ //# sourceMappingURL=install-skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-skills.js","sourceRoot":"","sources":["../../../../src/core/init/install-skills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,wCAAwC,CAAC;AAEhD,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAQ3D,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAA6B;IAC/D,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC;QAChC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC;QAC/C,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC;KAC3D,CAAC,CAAC;IAEH,MAAM,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAEpD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AACrD,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type HarnessId } from '../skills/harness/adapter.js';
2
+ export type HarnessAsk = (choices: readonly HarnessId[]) => Promise<string>;
3
+ export interface ResolveHarnessOptions {
4
+ readonly flag: string | undefined;
5
+ readonly yes: boolean;
6
+ readonly ask: HarnessAsk;
7
+ }
8
+ export declare function resolveHarness(options: ResolveHarnessOptions): Promise<HarnessId>;
@@ -0,0 +1,19 @@
1
+ import { InvalidHarnessError, isHarnessId, KNOWN_HARNESS_IDS, } from '../skills/harness/adapter.js';
2
+ const DEFAULT_HARNESS = 'claude-code';
3
+ export async function resolveHarness(options) {
4
+ if (options.flag !== undefined) {
5
+ return validate(options.flag);
6
+ }
7
+ if (options.yes) {
8
+ return DEFAULT_HARNESS;
9
+ }
10
+ const picked = await options.ask(KNOWN_HARNESS_IDS);
11
+ return validate(picked);
12
+ }
13
+ function validate(value) {
14
+ if (!isHarnessId(value)) {
15
+ throw new InvalidHarnessError(value);
16
+ }
17
+ return value;
18
+ }
19
+ //# sourceMappingURL=prompt-harness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-harness.js","sourceRoot":"","sources":["../../../../src/core/init/prompt-harness.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,mBAAmB,EACnB,WAAW,EACX,iBAAiB,GAClB,MAAM,8BAA8B,CAAC;AAUtC,MAAM,eAAe,GAAc,aAAa,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAA8B;IACjE,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACpD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa;IAC7B,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { InitOptions } from './types.js';
2
+ /**
3
+ * Create the baseline scifi directories and bootstrap documents.
4
+ */
5
+ export declare function scaffoldInit(options: InitOptions): Promise<void>;
@@ -0,0 +1,91 @@
1
+ import { mkdir, stat, writeFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ /**
4
+ * Create the baseline scifi directories and bootstrap documents.
5
+ */
6
+ export async function scaffoldInit(options) {
7
+ const { projectRoot } = options;
8
+ const specsRoot = join(projectRoot, 'docs', 'scifi');
9
+ const scaffoldDirectories = buildScaffoldDirectories(specsRoot);
10
+ const bootstrapDocuments = buildBootstrapDocuments(specsRoot);
11
+ await validateScaffoldDirectoryPaths(scaffoldDirectories);
12
+ await validateBootstrapDocumentPaths(bootstrapDocuments);
13
+ await Promise.all([
14
+ ...scaffoldDirectories.map((directory) => mkdir(directory.path, { recursive: true })),
15
+ ]);
16
+ await Promise.all(bootstrapDocuments.map((document) => writeBootstrapDocument(document.path, document.contents)));
17
+ }
18
+ function buildScaffoldDirectories(specsRoot) {
19
+ return [{ path: join(specsRoot, '.scifi') }, { path: join(specsRoot, 'specs') }];
20
+ }
21
+ function buildBootstrapDocuments(specsRoot) {
22
+ return [
23
+ {
24
+ path: join(specsRoot, 'CONTEXT.md'),
25
+ contents: buildContextDocument(),
26
+ },
27
+ ];
28
+ }
29
+ async function validateScaffoldDirectoryPaths(scaffoldDirectories) {
30
+ await Promise.all(scaffoldDirectories.map(async (directory) => {
31
+ const existingEntry = await stat(directory.path).catch((error) => {
32
+ if (isMissingPathError(error)) {
33
+ return null;
34
+ }
35
+ throw error;
36
+ });
37
+ if (existingEntry === null || existingEntry.isDirectory()) {
38
+ return;
39
+ }
40
+ throw new Error(`Cannot scaffold directory at ${directory.path}: path exists and is not a directory.`);
41
+ }));
42
+ }
43
+ async function validateBootstrapDocumentPaths(bootstrapDocuments) {
44
+ await Promise.all(bootstrapDocuments.map(async (document) => {
45
+ const existingEntry = await stat(document.path).catch((error) => {
46
+ if (isMissingPathError(error)) {
47
+ return null;
48
+ }
49
+ throw error;
50
+ });
51
+ if (existingEntry === null || existingEntry.isFile()) {
52
+ return;
53
+ }
54
+ throw new Error(`Cannot scaffold bootstrap document at ${document.path}: path exists and is not a regular file.`);
55
+ }));
56
+ }
57
+ async function writeBootstrapDocument(filePath, contents) {
58
+ await writeFile(filePath, contents, { encoding: 'utf8', flag: 'wx' }).catch(async (error) => {
59
+ if (isPathAlreadyPresentError(error)) {
60
+ const existingEntry = await stat(filePath);
61
+ if (existingEntry.isFile()) {
62
+ return;
63
+ }
64
+ throw new Error(`Cannot scaffold bootstrap document at ${filePath}: path exists and is not a regular file.`, { cause: error });
65
+ }
66
+ throw error;
67
+ });
68
+ }
69
+ function isPathAlreadyPresentError(error) {
70
+ return error instanceof Error && 'code' in error && error.code === 'EEXIST';
71
+ }
72
+ function isMissingPathError(error) {
73
+ return error instanceof Error && 'code' in error && error.code === 'ENOENT';
74
+ }
75
+ function buildContextDocument() {
76
+ return `# CONTEXT.md
77
+
78
+ > Project glossary. Every term used in specs must be defined here.
79
+ > If a term is missing during a spec session, define it and update this file.
80
+
81
+ ## Terms
82
+
83
+ <!-- Template:
84
+ ### TermName
85
+ **Definition:** One clear sentence.
86
+ **Distinct from:** Other terms it might be confused with.
87
+ **Used in:** Links to specs where it appears.
88
+ -->
89
+ `;
90
+ }
91
+ //# sourceMappingURL=scaffold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../../../src/core/init/scaffold.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { HarnessId } from '../skills/harness/adapter.js';
2
+ export interface InitOptions {
3
+ readonly projectRoot: string;
4
+ readonly harness?: HarnessId;
5
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/core/init/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ interface OptionReader {
2
+ opts(): Record<string, unknown>;
3
+ }
4
+ export declare function jsonMode(command: OptionReader): boolean;
5
+ export declare function emitSuccess<T>(data: T, json: boolean, humanLines: string | readonly string[]): void;
6
+ export declare function emitList<T>(rows: readonly T[], json: boolean, humanLines: readonly string[]): void;
7
+ export declare function emitError(error: unknown, json: boolean): void;
8
+ export {};
@@ -0,0 +1,50 @@
1
+ import { stderr, stdout } from 'node:process';
2
+ import { toScifiError } from './errors.js';
3
+ export function jsonMode(command) {
4
+ return command.opts().json === true;
5
+ }
6
+ function ensureTrailingNewline(text) {
7
+ return text.endsWith('\n') ? text : `${text}\n`;
8
+ }
9
+ export function emitSuccess(data, json, humanLines) {
10
+ if (json) {
11
+ stdout.write(`${JSON.stringify({ ok: true, data })}\n`);
12
+ return;
13
+ }
14
+ const text = Array.isArray(humanLines) ? humanLines.join('\n') : humanLines;
15
+ stdout.write(ensureTrailingNewline(text));
16
+ }
17
+ export function emitList(rows, json, humanLines) {
18
+ if (json) {
19
+ for (const row of rows) {
20
+ stdout.write(`${JSON.stringify(row)}\n`);
21
+ }
22
+ return;
23
+ }
24
+ for (const line of humanLines) {
25
+ stdout.write(ensureTrailingNewline(line));
26
+ }
27
+ }
28
+ export function emitError(error, json) {
29
+ const sf = toScifiError(error);
30
+ if (json) {
31
+ const payload = {
32
+ ok: false,
33
+ error: {
34
+ code: sf.code,
35
+ message: sf.message,
36
+ ...(sf.hint !== undefined && { hint: sf.hint }),
37
+ ...(sf.details !== undefined && { details: sf.details }),
38
+ },
39
+ };
40
+ stderr.write(`${JSON.stringify(payload)}\n`);
41
+ }
42
+ else {
43
+ stderr.write(`${sf.code}: ${sf.message}\n`);
44
+ if (sf.hint !== undefined) {
45
+ stderr.write(`Hint: ${sf.hint}\n`);
46
+ }
47
+ }
48
+ process.exitCode = sf.exitCode;
49
+ }
50
+ //# sourceMappingURL=emit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit.js","sourceRoot":"","sources":["../../../../src/core/output/emit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAM3C,MAAM,UAAU,QAAQ,CAAC,OAAqB;IAC5C,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC;AACtC,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAY;IACzC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,IAAO,EACP,IAAa,EACb,UAAsC;IAEtC,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC;QACxD,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,UAAqB,CAAC;IACxF,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,QAAQ,CACtB,IAAkB,EAClB,IAAa,EACb,UAA6B;IAE7B,IAAI,IAAI,EAAE,CAAC;QACT,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO;IACT,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAc,EAAE,IAAa;IACrD,MAAM,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAE/B,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,OAAO,GAAG;YACd,EAAE,EAAE,KAAK;YACT,KAAK,EAAE;gBACL,IAAI,EAAE,EAAE,CAAC,IAAI;gBACb,OAAO,EAAE,EAAE,CAAC,OAAO;gBACnB,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;gBAC/C,GAAG,CAAC,EAAE,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC;aACzD;SACF,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,OAAO,IAAI,CAAC,CAAC;QAC5C,IAAI,EAAE,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,OAAO,CAAC,QAAQ,GAAG,EAAE,CAAC,QAAQ,CAAC;AACjC,CAAC"}
@@ -0,0 +1,14 @@
1
+ export type ErrorCode = 'INVALID_ARGUMENT' | 'NOT_FOUND' | 'CONFLICT' | 'PRECONDITION_FAILED' | 'INTERNAL';
2
+ export interface ScifiErrorOptions {
3
+ hint?: string;
4
+ details?: unknown;
5
+ cause?: unknown;
6
+ }
7
+ export declare class ScifiError extends Error {
8
+ readonly code: ErrorCode;
9
+ readonly hint?: string;
10
+ readonly details?: unknown;
11
+ constructor(code: ErrorCode, message: string, options?: ScifiErrorOptions);
12
+ get exitCode(): number;
13
+ }
14
+ export declare function toScifiError(error: unknown): ScifiError;
@@ -0,0 +1,36 @@
1
+ const EXIT_CODES = {
2
+ INVALID_ARGUMENT: 2,
3
+ NOT_FOUND: 3,
4
+ PRECONDITION_FAILED: 4,
5
+ CONFLICT: 5,
6
+ INTERNAL: 1,
7
+ };
8
+ export class ScifiError extends Error {
9
+ code;
10
+ hint;
11
+ details;
12
+ constructor(code, message, options = {}) {
13
+ super(message, options.cause !== undefined ? { cause: options.cause } : undefined);
14
+ this.name = 'ScifiError';
15
+ this.code = code;
16
+ if (options.hint !== undefined) {
17
+ this.hint = options.hint;
18
+ }
19
+ if (options.details !== undefined) {
20
+ this.details = options.details;
21
+ }
22
+ }
23
+ get exitCode() {
24
+ return EXIT_CODES[this.code];
25
+ }
26
+ }
27
+ export function toScifiError(error) {
28
+ if (error instanceof ScifiError) {
29
+ return error;
30
+ }
31
+ const message = error instanceof Error && error.message.length > 0
32
+ ? error.message
33
+ : 'scifi failed with an unexpected error.';
34
+ return new ScifiError('INTERNAL', message, { cause: error });
35
+ }
36
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../src/core/output/errors.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,GAA8B;IAC5C,gBAAgB,EAAE,CAAC;IACnB,SAAS,EAAE,CAAC;IACZ,mBAAmB,EAAE,CAAC;IACtB,QAAQ,EAAE,CAAC;IACX,QAAQ,EAAE,CAAC;CACZ,CAAC;AAQF,MAAM,OAAO,UAAW,SAAQ,KAAK;IAC1B,IAAI,CAAY;IAChB,IAAI,CAAU;IACd,OAAO,CAAW;IAE3B,YAAY,IAAe,EAAE,OAAe,EAAE,UAA6B,EAAE;QAC3E,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACnF,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAC3B,CAAC;QACD,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAClC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QACjC,CAAC;IACH,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,OAAO,GACX,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;QAChD,CAAC,CAAC,KAAK,CAAC,OAAO;QACf,CAAC,CAAC,wCAAwC,CAAC;IAE/C,OAAO,IAAI,UAAU,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;AAC/D,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { emitError, emitList, emitSuccess, jsonMode } from './emit.js';
2
+ export type { ErrorCode, ScifiErrorOptions } from './errors.js';
3
+ export { ScifiError, toScifiError } from './errors.js';
4
+ export { isInteractive } from './tty.js';
@@ -0,0 +1,4 @@
1
+ export { emitError, emitList, emitSuccess, jsonMode } from './emit.js';
2
+ export { ScifiError, toScifiError } from './errors.js';
3
+ export { isInteractive } from './tty.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/output/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAEvE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function isInteractive(): boolean;
@@ -0,0 +1,4 @@
1
+ export function isInteractive() {
2
+ return Boolean(process.stdout.isTTY && process.stdin.isTTY);
3
+ }
4
+ //# sourceMappingURL=tty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tty.js","sourceRoot":"","sources":["../../../../src/core/output/tty.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,aAAa;IAC3B,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC9D,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function findPackageRoot(startUrl: string | URL): string;
@@ -0,0 +1,18 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { dirname, join } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ export function findPackageRoot(startUrl) {
5
+ const startPath = fileURLToPath(startUrl);
6
+ let dir = dirname(startPath);
7
+ while (true) {
8
+ if (existsSync(join(dir, 'package.json'))) {
9
+ return dir;
10
+ }
11
+ const parent = dirname(dir);
12
+ if (parent === dir) {
13
+ throw new Error(`No package.json found above ${startPath}`);
14
+ }
15
+ dir = parent;
16
+ }
17
+ }
18
+ //# sourceMappingURL=package-root.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-root.js","sourceRoot":"","sources":["../../../src/core/package-root.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,eAAe,CAAC,QAAsB;IACpD,MAAM,SAAS,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC1C,IAAI,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAE7B,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;YAC1C,OAAO,GAAG,CAAC;QACb,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,+BAA+B,SAAS,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { type SkillBundle } from './types.js';
2
+ export interface LoadCatalogOptions {
3
+ readonly bodiesRoot: string;
4
+ readonly manifestsRoot: string;
5
+ }
6
+ export declare function loadCatalog(options: LoadCatalogOptions): Promise<SkillBundle[]>;
@@ -0,0 +1,69 @@
1
+ import { readdir, readFile, stat } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { pathToFileURL } from 'node:url';
4
+ import { skillManifestSchema, } from './types.js';
5
+ const NON_ASSET_FILES = new Set(['body.md', 'manifest.ts', 'manifest.js']);
6
+ export async function loadCatalog(options) {
7
+ const entries = await readdir(options.bodiesRoot, { withFileTypes: true });
8
+ const directories = entries
9
+ .filter((entry) => entry.isDirectory())
10
+ .map((entry) => entry.name)
11
+ .sort();
12
+ const seenIds = new Set();
13
+ const bundles = [];
14
+ for (const folder of directories) {
15
+ const manifest = await loadManifest(join(options.manifestsRoot, folder, 'manifest.js'));
16
+ if (manifest.id !== folder) {
17
+ throw new Error(`manifest.id "${manifest.id}" does not match folder "${folder}"`);
18
+ }
19
+ if (seenIds.has(manifest.id)) {
20
+ throw new Error(`Duplicate skill id "${manifest.id}"`);
21
+ }
22
+ seenIds.add(manifest.id);
23
+ const bodyPath = join(options.bodiesRoot, folder, 'body.md');
24
+ await assertFileExists(bodyPath);
25
+ const body = await readFile(bodyPath, { encoding: 'utf8' });
26
+ const assets = await loadAssets(join(options.bodiesRoot, folder));
27
+ bundles.push({ manifest, body, assets });
28
+ }
29
+ return bundles;
30
+ }
31
+ async function loadAssets(skillDirectory) {
32
+ const entries = await readdir(skillDirectory, { withFileTypes: true });
33
+ const assetNames = entries
34
+ .filter((entry) => entry.isFile() && !NON_ASSET_FILES.has(entry.name))
35
+ .map((entry) => entry.name)
36
+ .sort();
37
+ const assets = [];
38
+ for (const name of assetNames) {
39
+ const contents = await readFile(join(skillDirectory, name), { encoding: 'utf8' });
40
+ assets.push({ name, contents });
41
+ }
42
+ return assets;
43
+ }
44
+ async function loadManifest(modulePath) {
45
+ await assertFileExists(modulePath);
46
+ const moduleUrl = pathToFileURL(modulePath).href;
47
+ const imported = (await import(moduleUrl));
48
+ if (imported.manifest === undefined) {
49
+ throw new Error(`manifest export missing from ${modulePath}`);
50
+ }
51
+ const result = skillManifestSchema.safeParse(imported.manifest);
52
+ if (!result.success) {
53
+ throw new Error(`Invalid manifest at ${modulePath}: ${result.error.issues
54
+ .map((issue) => `${issue.path.join('.') || '<root>'}: ${issue.message}`)
55
+ .join('; ')}`);
56
+ }
57
+ return result.data;
58
+ }
59
+ async function assertFileExists(path) {
60
+ await stat(path).catch((error) => {
61
+ if (error instanceof Error &&
62
+ 'code' in error &&
63
+ error.code === 'ENOENT') {
64
+ throw new Error(`Missing file: ${path}`);
65
+ }
66
+ throw error;
67
+ });
68
+ }
69
+ //# sourceMappingURL=catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../../../src/core/skills/catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { SkillBundle } from '../types.js';
2
+ export type HarnessId = 'claude-code' | 'opencode' | 'codex' | 'cursor' | 'agents-md';
3
+ export declare const KNOWN_HARNESS_IDS: readonly HarnessId[];
4
+ export interface HarnessAdapter {
5
+ readonly id: HarnessId;
6
+ install(bundles: readonly SkillBundle[], projectRoot: string): Promise<void>;
7
+ }
8
+ export declare class InvalidHarnessError extends Error {
9
+ constructor(value: string);
10
+ }
11
+ export declare class HarnessNotImplementedError extends Error {
12
+ readonly harness: HarnessId;
13
+ constructor(harness: HarnessId);
14
+ }
15
+ export declare function isHarnessId(value: string): value is HarnessId;
@@ -0,0 +1,31 @@
1
+ import { createRequire } from 'node:module';
2
+ import { join } from 'node:path';
3
+ import { findPackageRoot } from '../../package-root.js';
4
+ const require = createRequire(import.meta.url);
5
+ const packageJson = require(join(findPackageRoot(import.meta.url), 'package.json'));
6
+ const ISSUES_URL = typeof packageJson.bugs?.url === 'string' ? packageJson.bugs.url : 'https://github.com';
7
+ export const KNOWN_HARNESS_IDS = [
8
+ 'claude-code',
9
+ 'opencode',
10
+ 'codex',
11
+ 'cursor',
12
+ 'agents-md',
13
+ ];
14
+ export class InvalidHarnessError extends Error {
15
+ constructor(value) {
16
+ super(`Unknown harness "${value}". Expected one of: ${KNOWN_HARNESS_IDS.join(', ')}.`);
17
+ this.name = 'InvalidHarnessError';
18
+ }
19
+ }
20
+ export class HarnessNotImplementedError extends Error {
21
+ harness;
22
+ constructor(harness) {
23
+ super(`Harness "${harness}" is not implemented yet. Track progress at ${ISSUES_URL}.`);
24
+ this.harness = harness;
25
+ this.name = 'HarnessNotImplementedError';
26
+ }
27
+ }
28
+ export function isHarnessId(value) {
29
+ return KNOWN_HARNESS_IDS.includes(value);
30
+ }
31
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../../../src/core/skills/harness/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGxD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,cAAc,CAAC,CAEjF,CAAC;AAEF,MAAM,UAAU,GACd,OAAO,WAAW,CAAC,IAAI,EAAE,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,oBAAoB,CAAC;AAI1F,MAAM,CAAC,MAAM,iBAAiB,GAAyB;IACrD,aAAa;IACb,UAAU;IACV,OAAO;IACP,QAAQ;IACR,WAAW;CACZ,CAAC;AAOF,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,KAAa;QACvB,KAAK,CAAC,oBAAoB,KAAK,uBAAuB,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvF,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED,MAAM,OAAO,0BAA2B,SAAQ,KAAK;IACvB;IAA5B,YAA4B,OAAkB;QAC5C,KAAK,CAAC,YAAY,OAAO,+CAA+C,UAAU,GAAG,CAAC,CAAC;QAD7D,YAAO,GAAP,OAAO,CAAW;QAE5C,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;IAC3C,CAAC;CACF;AAED,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAQ,iBAAuC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAClE,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { HarnessAdapter } from './adapter.js';
2
+ export declare const claudeCodeAdapter: HarnessAdapter;
@@ -0,0 +1,37 @@
1
+ import { mkdir, writeFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { stringify } from 'yaml';
4
+ export const claudeCodeAdapter = {
5
+ id: 'claude-code',
6
+ async install(bundles, projectRoot) {
7
+ for (const bundle of bundles) {
8
+ const skillDirectory = join(projectRoot, '.claude', 'skills', bundle.manifest.id);
9
+ const targetPath = join(skillDirectory, 'SKILL.md');
10
+ const document = renderDocument(bundle);
11
+ await mkdir(skillDirectory, { recursive: true });
12
+ await writeFile(targetPath, document, { encoding: 'utf8' });
13
+ for (const asset of bundle.assets) {
14
+ await writeFile(join(skillDirectory, asset.name), asset.contents, { encoding: 'utf8' });
15
+ }
16
+ }
17
+ },
18
+ };
19
+ function renderDocument(bundle) {
20
+ const frontmatter = buildFrontmatter(bundle.manifest);
21
+ const serialized = stringify(frontmatter).trimEnd();
22
+ return `---\n${serialized}\n---\n${bundle.body}`;
23
+ }
24
+ function buildFrontmatter(manifest) {
25
+ const frontmatter = {
26
+ name: manifest.id,
27
+ description: manifest.description,
28
+ };
29
+ if (manifest.argumentHint !== undefined) {
30
+ frontmatter['argument-hint'] = manifest.argumentHint;
31
+ }
32
+ if (manifest.allowedTools !== undefined) {
33
+ frontmatter['allowed-tools'] = manifest.allowedTools.join(', ');
34
+ }
35
+ return frontmatter;
36
+ }
37
+ //# sourceMappingURL=claude-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../../../src/core/skills/harness/claude-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAIjC,MAAM,CAAC,MAAM,iBAAiB,GAAmB;IAC/C,EAAE,EAAE,aAAa;IACjB,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW;QAChC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAClF,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;YACpD,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;YAExC,MAAM,KAAK,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACjD,MAAM,SAAS,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;YAE5D,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClC,MAAM,SAAS,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;YAC1F,CAAC;QACH,CAAC;IACH,CAAC;CACF,CAAC;AAEF,SAAS,cAAc,CAAC,MAAmB;IACzC,MAAM,WAAW,GAAG,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACtD,MAAM,UAAU,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,CAAC;IAEpD,OAAO,QAAQ,UAAU,UAAU,MAAM,CAAC,IAAI,EAAE,CAAC;AACnD,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAuB;IAC/C,MAAM,WAAW,GAA4B;QAC3C,IAAI,EAAE,QAAQ,CAAC,EAAE;QACjB,WAAW,EAAE,QAAQ,CAAC,WAAW;KAClC,CAAC;IAEF,IAAI,QAAQ,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACxC,WAAW,CAAC,eAAe,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC;IACvD,CAAC;IAED,IAAI,QAAQ,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACxC,WAAW,CAAC,eAAe,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { claudeCodeAdapter } from './claude-code.js';
2
+ import { registerAdapter } from './registry.js';
3
+ registerAdapter(claudeCodeAdapter);
4
+ //# sourceMappingURL=register-defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-defaults.js","sourceRoot":"","sources":["../../../../../src/core/skills/harness/register-defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,eAAe,CAAC,iBAAiB,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type HarnessAdapter } from './adapter.js';
2
+ export declare function registerAdapter(adapter: HarnessAdapter): void;
3
+ export declare function getAdapter(id: string): HarnessAdapter;
@@ -0,0 +1,22 @@
1
+ import { HarnessNotImplementedError, InvalidHarnessError, isHarnessId, } from './adapter.js';
2
+ const registry = {
3
+ 'claude-code': 'not-implemented',
4
+ opencode: 'not-implemented',
5
+ codex: 'not-implemented',
6
+ cursor: 'not-implemented',
7
+ 'agents-md': 'not-implemented',
8
+ };
9
+ export function registerAdapter(adapter) {
10
+ registry[adapter.id] = adapter;
11
+ }
12
+ export function getAdapter(id) {
13
+ if (!isHarnessId(id)) {
14
+ throw new InvalidHarnessError(id);
15
+ }
16
+ const entry = registry[id];
17
+ if (entry === 'not-implemented') {
18
+ throw new HarnessNotImplementedError(id);
19
+ }
20
+ return entry;
21
+ }
22
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../../../src/core/skills/harness/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,0BAA0B,EAC1B,mBAAmB,EACnB,WAAW,GACZ,MAAM,cAAc,CAAC;AAItB,MAAM,QAAQ,GAAqC;IACjD,aAAa,EAAE,iBAAiB;IAChC,QAAQ,EAAE,iBAAiB;IAC3B,KAAK,EAAE,iBAAiB;IACxB,MAAM,EAAE,iBAAiB;IACzB,WAAW,EAAE,iBAAiB;CAC/B,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,OAAuB;IACrD,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAU;IACnC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,mBAAmB,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAE3B,IAAI,KAAK,KAAK,iBAAiB,EAAE,CAAC;QAChC,MAAM,IAAI,0BAA0B,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}