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.
- package/LICENSE +21 -0
- package/README.md +194 -0
- package/agents/solveos-build-validator.md +183 -0
- package/agents/solveos-debugger.md +226 -0
- package/agents/solveos-executor.md +187 -0
- package/agents/solveos-plan-validator.md +200 -0
- package/agents/solveos-planner.md +190 -0
- package/agents/solveos-researcher.md +152 -0
- package/agents/solveos-reviewer.md +263 -0
- package/commands/solveos/archive.md +106 -0
- package/commands/solveos/build.md +170 -0
- package/commands/solveos/fast.md +85 -0
- package/commands/solveos/new-cycle.md +165 -0
- package/commands/solveos/new.md +142 -0
- package/commands/solveos/next.md +86 -0
- package/commands/solveos/plan.md +139 -0
- package/commands/solveos/quick.md +109 -0
- package/commands/solveos/research.md +117 -0
- package/commands/solveos/review.md +198 -0
- package/commands/solveos/ship.md +129 -0
- package/commands/solveos/status.md +78 -0
- package/commands/solveos/validate-build.md +155 -0
- package/commands/solveos/validate-plan.md +115 -0
- package/dist/bin/install.d.ts +11 -0
- package/dist/bin/install.d.ts.map +1 -0
- package/dist/bin/install.js +158 -0
- package/dist/bin/install.js.map +1 -0
- package/dist/hooks/brief-anchor.d.ts +68 -0
- package/dist/hooks/brief-anchor.d.ts.map +1 -0
- package/dist/hooks/brief-anchor.js +236 -0
- package/dist/hooks/brief-anchor.js.map +1 -0
- package/dist/hooks/context-monitor.d.ts +70 -0
- package/dist/hooks/context-monitor.d.ts.map +1 -0
- package/dist/hooks/context-monitor.js +166 -0
- package/dist/hooks/context-monitor.js.map +1 -0
- package/dist/lib/artifacts.d.ts +63 -0
- package/dist/lib/artifacts.d.ts.map +1 -0
- package/dist/lib/artifacts.js +382 -0
- package/dist/lib/artifacts.js.map +1 -0
- package/dist/lib/config.d.ts +10 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +29 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/runtime-adapters/claude-code.d.ts +18 -0
- package/dist/lib/runtime-adapters/claude-code.d.ts.map +1 -0
- package/dist/lib/runtime-adapters/claude-code.js +125 -0
- package/dist/lib/runtime-adapters/claude-code.js.map +1 -0
- package/dist/lib/runtime-adapters/cursor.d.ts +18 -0
- package/dist/lib/runtime-adapters/cursor.d.ts.map +1 -0
- package/dist/lib/runtime-adapters/cursor.js +113 -0
- package/dist/lib/runtime-adapters/cursor.js.map +1 -0
- package/dist/lib/runtime-adapters/gemini-cli.d.ts +18 -0
- package/dist/lib/runtime-adapters/gemini-cli.d.ts.map +1 -0
- package/dist/lib/runtime-adapters/gemini-cli.js +127 -0
- package/dist/lib/runtime-adapters/gemini-cli.js.map +1 -0
- package/dist/lib/runtime-adapters/opencode.d.ts +14 -0
- package/dist/lib/runtime-adapters/opencode.d.ts.map +1 -0
- package/dist/lib/runtime-adapters/opencode.js +109 -0
- package/dist/lib/runtime-adapters/opencode.js.map +1 -0
- package/dist/lib/runtime-detect.d.ts +22 -0
- package/dist/lib/runtime-detect.d.ts.map +1 -0
- package/dist/lib/runtime-detect.js +73 -0
- package/dist/lib/runtime-detect.js.map +1 -0
- package/dist/lib/security.d.ts +88 -0
- package/dist/lib/security.d.ts.map +1 -0
- package/dist/lib/security.js +230 -0
- package/dist/lib/security.js.map +1 -0
- package/dist/types.d.ts +224 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +31 -0
- package/dist/types.js.map +1 -0
- package/dist/workflows/state-machine.d.ts +55 -0
- package/dist/workflows/state-machine.d.ts.map +1 -0
- package/dist/workflows/state-machine.js +271 -0
- package/dist/workflows/state-machine.js.map +1 -0
- package/dist/workflows/wave-executor.d.ts +112 -0
- package/dist/workflows/wave-executor.d.ts.map +1 -0
- package/dist/workflows/wave-executor.js +496 -0
- package/dist/workflows/wave-executor.js.map +1 -0
- package/package.json +58 -0
- package/templates/build-validation.md +82 -0
- package/templates/config-default.json +21 -0
- package/templates/plan-brief.md +106 -0
- package/templates/plan-validation-log.md +77 -0
- package/templates/post-ship-review.md +75 -0
- package/templates/pre-ship-review.md +56 -0
- 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"}
|