solveos-cli 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 (87) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +194 -0
  3. package/agents/solveos-build-validator.md +183 -0
  4. package/agents/solveos-debugger.md +226 -0
  5. package/agents/solveos-executor.md +187 -0
  6. package/agents/solveos-plan-validator.md +200 -0
  7. package/agents/solveos-planner.md +190 -0
  8. package/agents/solveos-researcher.md +152 -0
  9. package/agents/solveos-reviewer.md +263 -0
  10. package/commands/solveos/archive.md +106 -0
  11. package/commands/solveos/build.md +170 -0
  12. package/commands/solveos/fast.md +85 -0
  13. package/commands/solveos/new-cycle.md +165 -0
  14. package/commands/solveos/new.md +142 -0
  15. package/commands/solveos/next.md +86 -0
  16. package/commands/solveos/plan.md +139 -0
  17. package/commands/solveos/quick.md +109 -0
  18. package/commands/solveos/research.md +117 -0
  19. package/commands/solveos/review.md +198 -0
  20. package/commands/solveos/ship.md +129 -0
  21. package/commands/solveos/status.md +78 -0
  22. package/commands/solveos/validate-build.md +155 -0
  23. package/commands/solveos/validate-plan.md +115 -0
  24. package/dist/bin/install.d.ts +11 -0
  25. package/dist/bin/install.d.ts.map +1 -0
  26. package/dist/bin/install.js +158 -0
  27. package/dist/bin/install.js.map +1 -0
  28. package/dist/hooks/brief-anchor.d.ts +68 -0
  29. package/dist/hooks/brief-anchor.d.ts.map +1 -0
  30. package/dist/hooks/brief-anchor.js +236 -0
  31. package/dist/hooks/brief-anchor.js.map +1 -0
  32. package/dist/hooks/context-monitor.d.ts +70 -0
  33. package/dist/hooks/context-monitor.d.ts.map +1 -0
  34. package/dist/hooks/context-monitor.js +166 -0
  35. package/dist/hooks/context-monitor.js.map +1 -0
  36. package/dist/lib/artifacts.d.ts +63 -0
  37. package/dist/lib/artifacts.d.ts.map +1 -0
  38. package/dist/lib/artifacts.js +382 -0
  39. package/dist/lib/artifacts.js.map +1 -0
  40. package/dist/lib/config.d.ts +10 -0
  41. package/dist/lib/config.d.ts.map +1 -0
  42. package/dist/lib/config.js +29 -0
  43. package/dist/lib/config.js.map +1 -0
  44. package/dist/lib/runtime-adapters/claude-code.d.ts +18 -0
  45. package/dist/lib/runtime-adapters/claude-code.d.ts.map +1 -0
  46. package/dist/lib/runtime-adapters/claude-code.js +125 -0
  47. package/dist/lib/runtime-adapters/claude-code.js.map +1 -0
  48. package/dist/lib/runtime-adapters/cursor.d.ts +18 -0
  49. package/dist/lib/runtime-adapters/cursor.d.ts.map +1 -0
  50. package/dist/lib/runtime-adapters/cursor.js +113 -0
  51. package/dist/lib/runtime-adapters/cursor.js.map +1 -0
  52. package/dist/lib/runtime-adapters/gemini-cli.d.ts +18 -0
  53. package/dist/lib/runtime-adapters/gemini-cli.d.ts.map +1 -0
  54. package/dist/lib/runtime-adapters/gemini-cli.js +127 -0
  55. package/dist/lib/runtime-adapters/gemini-cli.js.map +1 -0
  56. package/dist/lib/runtime-adapters/opencode.d.ts +14 -0
  57. package/dist/lib/runtime-adapters/opencode.d.ts.map +1 -0
  58. package/dist/lib/runtime-adapters/opencode.js +109 -0
  59. package/dist/lib/runtime-adapters/opencode.js.map +1 -0
  60. package/dist/lib/runtime-detect.d.ts +22 -0
  61. package/dist/lib/runtime-detect.d.ts.map +1 -0
  62. package/dist/lib/runtime-detect.js +73 -0
  63. package/dist/lib/runtime-detect.js.map +1 -0
  64. package/dist/lib/security.d.ts +88 -0
  65. package/dist/lib/security.d.ts.map +1 -0
  66. package/dist/lib/security.js +230 -0
  67. package/dist/lib/security.js.map +1 -0
  68. package/dist/types.d.ts +224 -0
  69. package/dist/types.d.ts.map +1 -0
  70. package/dist/types.js +31 -0
  71. package/dist/types.js.map +1 -0
  72. package/dist/workflows/state-machine.d.ts +55 -0
  73. package/dist/workflows/state-machine.d.ts.map +1 -0
  74. package/dist/workflows/state-machine.js +271 -0
  75. package/dist/workflows/state-machine.js.map +1 -0
  76. package/dist/workflows/wave-executor.d.ts +112 -0
  77. package/dist/workflows/wave-executor.d.ts.map +1 -0
  78. package/dist/workflows/wave-executor.js +496 -0
  79. package/dist/workflows/wave-executor.js.map +1 -0
  80. package/package.json +58 -0
  81. package/templates/build-validation.md +82 -0
  82. package/templates/config-default.json +21 -0
  83. package/templates/plan-brief.md +106 -0
  84. package/templates/plan-validation-log.md +77 -0
  85. package/templates/post-ship-review.md +75 -0
  86. package/templates/pre-ship-review.md +56 -0
  87. package/templates/research-summary.md +30 -0
@@ -0,0 +1,382 @@
1
+ /**
2
+ * Artifact management for solveos-cli.
3
+ *
4
+ * Handles creating, reading, writing, and archiving files in the
5
+ * .solveos/ directory. All cycle state persists as markdown and JSON
6
+ * files — no databases, no cloud, no accounts.
7
+ */
8
+ import { readFile, writeFile, mkdir, cp, rm, access, readdir } from "node:fs/promises";
9
+ import { join, resolve } from "node:path";
10
+ import { DEFAULT_CONFIG } from "./config.js";
11
+ import { validatePath, sanitizeFilename } from "./security.js";
12
+ // ---------------------------------------------------------------------------
13
+ // Constants
14
+ // ---------------------------------------------------------------------------
15
+ const SOLVEOS_DIR = ".solveos";
16
+ const BRIEF_FILE = "BRIEF.md";
17
+ const STATE_FILE = "STATE.md";
18
+ const CONFIG_FILE = "config.json";
19
+ const SUBDIRS = [
20
+ "research",
21
+ "validations",
22
+ "reviews",
23
+ "history",
24
+ "notes",
25
+ ];
26
+ // ---------------------------------------------------------------------------
27
+ // Path Safety
28
+ // ---------------------------------------------------------------------------
29
+ /**
30
+ * Resolve a path within .solveos/ and validate it doesn't escape.
31
+ * Delegates to the security module's validatePath.
32
+ */
33
+ function safePath(projectDir, ...segments) {
34
+ const base = resolve(projectDir, SOLVEOS_DIR);
35
+ return validatePath(base, join(...segments));
36
+ }
37
+ /**
38
+ * Get the .solveos/ directory path for a project.
39
+ */
40
+ function solveosDir(projectDir) {
41
+ return resolve(projectDir, SOLVEOS_DIR);
42
+ }
43
+ // ---------------------------------------------------------------------------
44
+ // Existence Checks
45
+ // ---------------------------------------------------------------------------
46
+ /**
47
+ * Check if a .solveos/ directory exists and is valid.
48
+ */
49
+ export async function projectExists(projectDir) {
50
+ try {
51
+ await access(solveosDir(projectDir));
52
+ return true;
53
+ }
54
+ catch {
55
+ return false;
56
+ }
57
+ }
58
+ /**
59
+ * Check if a file exists.
60
+ */
61
+ async function fileExists(path) {
62
+ try {
63
+ await access(path);
64
+ return true;
65
+ }
66
+ catch {
67
+ return false;
68
+ }
69
+ }
70
+ // ---------------------------------------------------------------------------
71
+ // Project Initialization
72
+ // ---------------------------------------------------------------------------
73
+ /**
74
+ * Create the .solveos/ directory structure.
75
+ * Safe to run multiple times — does not overwrite existing files.
76
+ */
77
+ export async function initProject(projectDir) {
78
+ const base = solveosDir(projectDir);
79
+ // Create base directory and subdirectories
80
+ await mkdir(base, { recursive: true });
81
+ for (const sub of SUBDIRS) {
82
+ await mkdir(join(base, sub), { recursive: true });
83
+ }
84
+ // Write default config if it doesn't exist
85
+ const configPath = join(base, CONFIG_FILE);
86
+ if (!(await fileExists(configPath))) {
87
+ await writeFile(configPath, JSON.stringify(DEFAULT_CONFIG, null, 2) + "\n", "utf-8");
88
+ }
89
+ // Write initial STATE.md if it doesn't exist
90
+ const statePath = join(base, STATE_FILE);
91
+ if (!(await fileExists(statePath))) {
92
+ const initialState = {
93
+ current_state: "INIT",
94
+ cycle_number: 1,
95
+ gates_skipped: [],
96
+ gates_completed: [],
97
+ plan_validation_passes: 0,
98
+ blockers: [],
99
+ transitions_log: [],
100
+ created_at: new Date().toISOString(),
101
+ updated_at: new Date().toISOString(),
102
+ };
103
+ await writeState(projectDir, initialState);
104
+ }
105
+ }
106
+ // ---------------------------------------------------------------------------
107
+ // Configuration
108
+ // ---------------------------------------------------------------------------
109
+ /**
110
+ * Read .solveos/config.json. Returns defaults for any missing fields.
111
+ */
112
+ export async function readConfig(projectDir) {
113
+ const configPath = safePath(projectDir, CONFIG_FILE);
114
+ try {
115
+ const raw = await readFile(configPath, "utf-8");
116
+ const parsed = JSON.parse(raw);
117
+ return {
118
+ ...DEFAULT_CONFIG,
119
+ ...parsed,
120
+ gates: { ...DEFAULT_CONFIG.gates, ...parsed.gates },
121
+ hooks: { ...DEFAULT_CONFIG.hooks, ...parsed.hooks },
122
+ };
123
+ }
124
+ catch {
125
+ return { ...DEFAULT_CONFIG };
126
+ }
127
+ }
128
+ /**
129
+ * Write .solveos/config.json.
130
+ */
131
+ export async function writeConfig(projectDir, config) {
132
+ const configPath = safePath(projectDir, CONFIG_FILE);
133
+ await writeFile(configPath, JSON.stringify(config, null, 2) + "\n", "utf-8");
134
+ }
135
+ // ---------------------------------------------------------------------------
136
+ // State (STATE.md)
137
+ // ---------------------------------------------------------------------------
138
+ /**
139
+ * Read and parse .solveos/STATE.md.
140
+ * STATE.md uses a JSON frontmatter block between `---` markers.
141
+ */
142
+ export async function readState(projectDir) {
143
+ const statePath = safePath(projectDir, STATE_FILE);
144
+ try {
145
+ const raw = await readFile(statePath, "utf-8");
146
+ return parseStateMd(raw);
147
+ }
148
+ catch {
149
+ return null;
150
+ }
151
+ }
152
+ /**
153
+ * Write structured state to .solveos/STATE.md.
154
+ * Format: YAML-like frontmatter (JSON) between --- markers, then human-readable summary.
155
+ */
156
+ export async function writeState(projectDir, state) {
157
+ const statePath = safePath(projectDir, STATE_FILE);
158
+ const content = renderStateMd(state);
159
+ await writeFile(statePath, content, "utf-8");
160
+ }
161
+ /**
162
+ * Parse STATE.md content into CycleStateData.
163
+ */
164
+ function parseStateMd(content) {
165
+ const fmMatch = content.match(/^---\n([\s\S]*?)\n---/);
166
+ if (!fmMatch) {
167
+ throw new Error("STATE.md is missing frontmatter block");
168
+ }
169
+ return JSON.parse(fmMatch[1]);
170
+ }
171
+ /**
172
+ * Render CycleStateData to STATE.md markdown.
173
+ */
174
+ function renderStateMd(state) {
175
+ const json = JSON.stringify(state, null, 2);
176
+ const lines = [
177
+ "---",
178
+ json,
179
+ "---",
180
+ "",
181
+ `# Cycle ${state.cycle_number} — State`,
182
+ "",
183
+ `**Current State:** ${state.current_state}`,
184
+ `**Updated:** ${state.updated_at}`,
185
+ "",
186
+ ];
187
+ if (state.gates_completed.length > 0) {
188
+ lines.push("## Gates Completed");
189
+ for (const g of state.gates_completed) {
190
+ lines.push(`- [x] ${g}`);
191
+ }
192
+ lines.push("");
193
+ }
194
+ if (state.gates_skipped.length > 0) {
195
+ lines.push("## Gates Skipped");
196
+ for (const g of state.gates_skipped) {
197
+ lines.push(`- [~] ${g}`);
198
+ }
199
+ lines.push("");
200
+ }
201
+ if (state.plan_validation_passes > 0) {
202
+ lines.push(`**Plan Validation Passes:** ${state.plan_validation_passes}`);
203
+ lines.push("");
204
+ }
205
+ if (state.blockers.length > 0) {
206
+ lines.push("## Blockers");
207
+ for (const b of state.blockers) {
208
+ lines.push(`- ${b}`);
209
+ }
210
+ lines.push("");
211
+ }
212
+ if (state.transitions_log && state.transitions_log.length > 0) {
213
+ lines.push("## Transitions Log");
214
+ lines.push("");
215
+ lines.push("| # | From | To | At | Gate Skipped | Gate Completed |");
216
+ lines.push("|---|------|----|----|--------------|----------------|");
217
+ for (let i = 0; i < state.transitions_log.length; i++) {
218
+ const entry = state.transitions_log[i];
219
+ const skipped = entry.gate_skipped ?? "—";
220
+ const completed = entry.gate_completed ?? "—";
221
+ lines.push(`| ${i + 1} | ${entry.from} | ${entry.to} | ${entry.at} | ${skipped} | ${completed} |`);
222
+ }
223
+ lines.push("");
224
+ }
225
+ return lines.join("\n");
226
+ }
227
+ // ---------------------------------------------------------------------------
228
+ // Plan Brief (BRIEF.md)
229
+ // ---------------------------------------------------------------------------
230
+ /**
231
+ * Read .solveos/BRIEF.md and return its raw content, or null if not found.
232
+ */
233
+ export async function readBrief(projectDir) {
234
+ const briefPath = safePath(projectDir, BRIEF_FILE);
235
+ try {
236
+ return await readFile(briefPath, "utf-8");
237
+ }
238
+ catch {
239
+ return null;
240
+ }
241
+ }
242
+ /**
243
+ * Write a Plan Brief to .solveos/BRIEF.md.
244
+ * Accepts either a PlanBrief object (rendered to markdown) or raw markdown string.
245
+ */
246
+ export async function writeBrief(projectDir, brief) {
247
+ const briefPath = safePath(projectDir, BRIEF_FILE);
248
+ const content = typeof brief === "string" ? brief : renderBriefMd(brief);
249
+ await writeFile(briefPath, content, "utf-8");
250
+ }
251
+ /**
252
+ * Render a PlanBrief object to markdown matching the Plan Brief template.
253
+ */
254
+ function renderBriefMd(brief) {
255
+ const lines = [
256
+ "# Plan Brief",
257
+ "",
258
+ "## Problem",
259
+ "",
260
+ brief.problem,
261
+ "",
262
+ "## Audience",
263
+ "",
264
+ brief.audience,
265
+ "",
266
+ "## Goal",
267
+ "",
268
+ brief.goal,
269
+ "",
270
+ "## Appetite",
271
+ "",
272
+ brief.appetite,
273
+ "",
274
+ "## Constraints",
275
+ "",
276
+ ];
277
+ for (const c of brief.constraints) {
278
+ lines.push(`- ${c}`);
279
+ }
280
+ lines.push("");
281
+ lines.push("## Success Criteria");
282
+ lines.push("");
283
+ for (const sc of brief.success_criteria) {
284
+ lines.push(`- [ ] ${sc}`);
285
+ }
286
+ lines.push("");
287
+ lines.push("## Core Assumption");
288
+ lines.push("");
289
+ lines.push(brief.core_assumption);
290
+ lines.push("");
291
+ lines.push("## Rabbit Holes");
292
+ lines.push("");
293
+ for (const rh of brief.rabbit_holes) {
294
+ lines.push(`- ${rh}`);
295
+ }
296
+ lines.push("");
297
+ lines.push("## Out of Scope");
298
+ lines.push("");
299
+ for (const oos of brief.out_of_scope) {
300
+ lines.push(`- ${oos}`);
301
+ }
302
+ lines.push("");
303
+ return lines.join("\n");
304
+ }
305
+ // ---------------------------------------------------------------------------
306
+ // Cycle Archival
307
+ // ---------------------------------------------------------------------------
308
+ /**
309
+ * Archive the current cycle to .solveos/history/cycle-{n}/.
310
+ * Copies BRIEF.md, STATE.md, and validations/ to the archive.
311
+ * Clears current BRIEF.md and validations/ after archiving.
312
+ */
313
+ export async function archiveCycle(projectDir, cycleNumber) {
314
+ const base = solveosDir(projectDir);
315
+ const archiveDir = safePath(projectDir, "history", `cycle-${cycleNumber}`);
316
+ // Create archive directory
317
+ await mkdir(archiveDir, { recursive: true });
318
+ // Copy BRIEF.md if it exists
319
+ const briefPath = join(base, BRIEF_FILE);
320
+ if (await fileExists(briefPath)) {
321
+ await cp(briefPath, join(archiveDir, BRIEF_FILE));
322
+ }
323
+ // Copy STATE.md
324
+ const statePath = join(base, STATE_FILE);
325
+ if (await fileExists(statePath)) {
326
+ await cp(statePath, join(archiveDir, STATE_FILE));
327
+ }
328
+ // Copy validations/ directory
329
+ const validationsDir = join(base, "validations");
330
+ const archiveValidationsDir = join(archiveDir, "validations");
331
+ if (await fileExists(validationsDir)) {
332
+ try {
333
+ const files = await readdir(validationsDir);
334
+ if (files.length > 0) {
335
+ await cp(validationsDir, archiveValidationsDir, { recursive: true });
336
+ }
337
+ }
338
+ catch {
339
+ // validations/ may be empty, that's fine
340
+ }
341
+ }
342
+ // Clear current BRIEF.md (remove it)
343
+ if (await fileExists(briefPath)) {
344
+ await rm(briefPath);
345
+ }
346
+ // Clear validations/ contents
347
+ try {
348
+ const files = await readdir(validationsDir);
349
+ for (const file of files) {
350
+ await rm(join(validationsDir, file));
351
+ }
352
+ }
353
+ catch {
354
+ // Already empty or doesn't exist
355
+ }
356
+ }
357
+ // ---------------------------------------------------------------------------
358
+ // Research & Validation Artifact Helpers
359
+ // ---------------------------------------------------------------------------
360
+ /**
361
+ * Write a research summary to .solveos/research/{topic}-research.md.
362
+ */
363
+ export async function writeResearch(projectDir, topic, content) {
364
+ const filename = `${sanitizeFilename(topic)}-research.md`;
365
+ const filePath = safePath(projectDir, "research", filename);
366
+ await writeFile(filePath, content, "utf-8");
367
+ }
368
+ /**
369
+ * Write a validation artifact.
370
+ */
371
+ export async function writeValidation(projectDir, filename, content) {
372
+ const filePath = safePath(projectDir, "validations", sanitizeFilename(filename));
373
+ await writeFile(filePath, content, "utf-8");
374
+ }
375
+ /**
376
+ * Write a review artifact.
377
+ */
378
+ export async function writeReview(projectDir, filename, content) {
379
+ const filePath = safePath(projectDir, "reviews", sanitizeFilename(filename));
380
+ await writeFile(filePath, content, "utf-8");
381
+ }
382
+ //# sourceMappingURL=artifacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../src/lib/artifacts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Configuration loading and defaults for solveos-cli.
3
+ *
4
+ * Reads .solveos/config.json if it exists, merges with defaults,
5
+ * and returns a fully typed Config object.
6
+ */
7
+ import type { Config } from "../types.js";
8
+ /** Default configuration — matches templates/config-default.json. */
9
+ export declare const DEFAULT_CONFIG: Config;
10
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,qEAAqE;AACrE,eAAO,MAAM,cAAc,EAAE,MAoB5B,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Configuration loading and defaults for solveos-cli.
3
+ *
4
+ * Reads .solveos/config.json if it exists, merges with defaults,
5
+ * and returns a fully typed Config object.
6
+ */
7
+ /** Default configuration — matches templates/config-default.json. */
8
+ export const DEFAULT_CONFIG = {
9
+ mode: "interactive",
10
+ gates: {
11
+ research: true,
12
+ plan_validation: true,
13
+ build_validation: true,
14
+ review_pre_ship: true,
15
+ review_post_ship: true,
16
+ },
17
+ plan_validation_max_passes: 3,
18
+ granularity: "standard",
19
+ auto_advance: false,
20
+ domain: "software",
21
+ runtime: "auto",
22
+ hooks: {
23
+ context_monitor: true,
24
+ context_monitor_threshold: 60,
25
+ brief_anchor: true,
26
+ brief_anchor_interval: 10,
27
+ },
28
+ };
29
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,qEAAqE;AACrE,MAAM,CAAC,MAAM,cAAc,GAAW;IACpC,IAAI,EAAE,aAAa;IACnB,KAAK,EAAE;QACL,QAAQ,EAAE,IAAI;QACd,eAAe,EAAE,IAAI;QACrB,gBAAgB,EAAE,IAAI;QACtB,eAAe,EAAE,IAAI;QACrB,gBAAgB,EAAE,IAAI;KACvB;IACD,0BAA0B,EAAE,CAAC;IAC7B,WAAW,EAAE,UAAU;IACvB,YAAY,EAAE,KAAK;IACnB,MAAM,EAAE,UAAU;IAClB,OAAO,EAAE,MAAM;IACf,KAAK,EAAE;QACL,eAAe,EAAE,IAAI;QACrB,yBAAyB,EAAE,EAAE;QAC7B,YAAY,EAAE,IAAI;QAClB,qBAAqB,EAAE,EAAE;KAC1B;CACF,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Claude Code runtime adapter for solveos-cli.
3
+ *
4
+ * Handles detection and installation of commands, agents, and hooks
5
+ * into Claude Code's directory structure.
6
+ *
7
+ * Claude Code conventions:
8
+ * - Skills (commands): .claude/skills/<name>/SKILL.md -> /name
9
+ * - Agents: .claude/agents/<name>.md -> @name / auto-delegation
10
+ * - Hooks: .claude/settings.json -> hooks object
11
+ * - Legacy commands: .claude/commands/<name>.md -> /name (still works)
12
+ *
13
+ * We use the skills format as it's the current standard and takes
14
+ * precedence over legacy commands.
15
+ */
16
+ import type { RuntimeAdapter } from "../../types.js";
17
+ export declare const claudeCode: RuntimeAdapter;
18
+ //# sourceMappingURL=claude-code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../../src/lib/runtime-adapters/claude-code.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,gBAAgB,CAAC;AAuDnE,eAAO,MAAM,UAAU,EAAE,cAoExB,CAAC"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Claude Code runtime adapter for solveos-cli.
3
+ *
4
+ * Handles detection and installation of commands, agents, and hooks
5
+ * into Claude Code's directory structure.
6
+ *
7
+ * Claude Code conventions:
8
+ * - Skills (commands): .claude/skills/<name>/SKILL.md -> /name
9
+ * - Agents: .claude/agents/<name>.md -> @name / auto-delegation
10
+ * - Hooks: .claude/settings.json -> hooks object
11
+ * - Legacy commands: .claude/commands/<name>.md -> /name (still works)
12
+ *
13
+ * We use the skills format as it's the current standard and takes
14
+ * precedence over legacy commands.
15
+ */
16
+ import { mkdir, readdir, readFile, writeFile } from "node:fs/promises";
17
+ import { join, basename } from "node:path";
18
+ import { detectRuntime } from "../runtime-detect.js";
19
+ /**
20
+ * Transform OpenCode-style command frontmatter to Claude Code skill frontmatter.
21
+ *
22
+ * OpenCode: ---\ndescription: ...\n---
23
+ * Claude Code: ---\nname: solveos-{name}\ndescription: ...\ndisable-model-invocation: true\n---
24
+ *
25
+ * We set disable-model-invocation: true so skills are only invoked via
26
+ * explicit /solveos-{name} command (not auto-applied by the model).
27
+ */
28
+ function transformCommandToSkill(content, commandName) {
29
+ const skillName = `solveos-${commandName}`;
30
+ // Parse existing frontmatter
31
+ const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---\n/);
32
+ if (!frontmatterMatch) {
33
+ // No frontmatter — add skill frontmatter
34
+ return `---\nname: ${skillName}\ndescription: solveOS ${commandName} command\ndisable-model-invocation: true\n---\n\n${content}`;
35
+ }
36
+ const frontmatter = frontmatterMatch[1];
37
+ const body = content.slice(frontmatterMatch[0].length);
38
+ // Extract description from existing frontmatter
39
+ const descMatch = frontmatter.match(/^description:\s*(.+)$/m);
40
+ const description = descMatch ? descMatch[1].trim() : `solveOS ${commandName} command`;
41
+ // Build Claude Code skill frontmatter
42
+ return `---\nname: ${skillName}\ndescription: ${description}\ndisable-model-invocation: true\n---\n\n${body}`;
43
+ }
44
+ /**
45
+ * Transform OpenCode-style agent frontmatter to Claude Code agent frontmatter.
46
+ *
47
+ * OpenCode: ---\ndescription: ...\nmode: subagent\n---
48
+ * Claude Code: ---\nname: ...\ndescription: ...\n---
49
+ */
50
+ function transformAgentForClaudeCode(content, agentName) {
51
+ const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---\n/);
52
+ if (!frontmatterMatch) {
53
+ return `---\nname: ${agentName}\ndescription: solveOS ${agentName} agent\n---\n\n${content}`;
54
+ }
55
+ const frontmatter = frontmatterMatch[1];
56
+ const body = content.slice(frontmatterMatch[0].length);
57
+ // Extract description
58
+ const descMatch = frontmatter.match(/^description:\s*(.+)$/m);
59
+ const description = descMatch ? descMatch[1].trim() : `solveOS ${agentName} agent`;
60
+ return `---\nname: ${agentName}\ndescription: ${description}\n---\n\n${body}`;
61
+ }
62
+ export const claudeCode = {
63
+ async detect() {
64
+ const cwd = process.cwd();
65
+ const result = await detectRuntime(cwd);
66
+ if (result && result.runtime === "claude-code") {
67
+ return {
68
+ detected: true,
69
+ name: "Claude Code",
70
+ configPath: result.configPath,
71
+ };
72
+ }
73
+ return {
74
+ detected: false,
75
+ name: "Claude Code",
76
+ };
77
+ },
78
+ async installCommands(sourceDir) {
79
+ const cwd = process.cwd();
80
+ const skillsBase = join(cwd, ".claude", "skills");
81
+ // sourceDir is the commands/solveos/ directory
82
+ const files = await readdir(sourceDir);
83
+ for (const file of files) {
84
+ if (!file.endsWith(".md"))
85
+ continue;
86
+ const commandName = basename(file, ".md");
87
+ const sourcePath = join(sourceDir, file);
88
+ // Claude Code skills live in directories: .claude/skills/solveos-{name}/SKILL.md
89
+ const skillDir = join(skillsBase, `solveos-${commandName}`);
90
+ await mkdir(skillDir, { recursive: true });
91
+ const content = await readFile(sourcePath, "utf-8");
92
+ const transformed = transformCommandToSkill(content, commandName);
93
+ await writeFile(join(skillDir, "SKILL.md"), transformed, "utf-8");
94
+ }
95
+ },
96
+ async installAgents(sourceDir) {
97
+ const cwd = process.cwd();
98
+ const targetDir = join(cwd, ".claude", "agents");
99
+ await mkdir(targetDir, { recursive: true });
100
+ const files = await readdir(sourceDir);
101
+ for (const file of files) {
102
+ if (!file.endsWith(".md"))
103
+ continue;
104
+ const agentName = basename(file, ".md");
105
+ const sourcePath = join(sourceDir, file);
106
+ const content = await readFile(sourcePath, "utf-8");
107
+ const transformed = transformAgentForClaudeCode(content, agentName);
108
+ await writeFile(join(targetDir, file), transformed, "utf-8");
109
+ }
110
+ },
111
+ async installHooks(_sourceDir) {
112
+ // Claude Code hooks are configured in .claude/settings.json, not as
113
+ // standalone files. For now, we don't auto-configure hooks because
114
+ // Claude Code hooks use a different mechanism (shell commands, HTTP
115
+ // endpoints, or prompt-based handlers) than OpenCode's TypeScript plugins.
116
+ //
117
+ // Users can manually configure hooks in .claude/settings.json. The
118
+ // solveOS state files (.solveos/STATE.md, BRIEF.md) are still readable
119
+ // by any hook script the user configures.
120
+ //
121
+ // Future: generate a .claude/hooks/ directory with shell scripts that
122
+ // read solveOS state and provide context monitor / brief anchor functionality.
123
+ },
124
+ };
125
+ //# sourceMappingURL=claude-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../src/lib/runtime-adapters/claude-code.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Cursor runtime adapter for solveos-cli.
3
+ *
4
+ * Handles detection and installation of commands, agents, and hooks
5
+ * into Cursor's directory structure.
6
+ *
7
+ * Cursor conventions:
8
+ * - Skills (commands): .cursor/skills/<name>/SKILL.md -> /name
9
+ * - Agents: .cursor/agents/<name>.md -> auto-delegation
10
+ * - Hooks: .cursor/hooks.json -> event-based config
11
+ * - Rules: .cursor/rules/<name>.mdc -> contextual instructions
12
+ *
13
+ * Cursor also reads from .claude/ and .codex/ for cross-tool compatibility,
14
+ * but we install to .cursor/ for clarity and priority.
15
+ */
16
+ import type { RuntimeAdapter } from "../../types.js";
17
+ export declare const cursor: RuntimeAdapter;
18
+ //# sourceMappingURL=cursor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../../src/lib/runtime-adapters/cursor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,gBAAgB,CAAC;AA8CnE,eAAO,MAAM,MAAM,EAAE,cAiEpB,CAAC"}