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,236 @@
1
+ /**
2
+ * solveOS Brief Anchor — OpenCode plugin.
3
+ *
4
+ * Periodically reminds the AI agent to check work against the Plan Brief
5
+ * during the Build phase. Triggers after every N tool calls (configurable),
6
+ * injecting a reminder to verify alignment with success criteria and
7
+ * out-of-scope boundaries.
8
+ *
9
+ * Implements the solveOS principle: "The brief is your compass."
10
+ *
11
+ * Installed to: .opencode/plugins/solveos-brief-anchor.ts
12
+ * Events: tool.execute.after
13
+ */
14
+ import { readFileSync } from "node:fs";
15
+ import { join } from "node:path";
16
+ // ---------------------------------------------------------------------------
17
+ // Helpers
18
+ // ---------------------------------------------------------------------------
19
+ const SOLVEOS_DIR = ".solveos";
20
+ const DEFAULT_INTERVAL = 10;
21
+ /**
22
+ * Read .solveos/config.json from the project directory.
23
+ * Returns null if not found or unparseable.
24
+ */
25
+ function readSolveosConfig(projectDir) {
26
+ try {
27
+ const raw = readFileSync(join(projectDir, SOLVEOS_DIR, "config.json"), "utf-8");
28
+ return JSON.parse(raw);
29
+ }
30
+ catch {
31
+ return null;
32
+ }
33
+ }
34
+ /**
35
+ * Read current cycle state from .solveos/STATE.md frontmatter.
36
+ * Returns the current_state string or null.
37
+ */
38
+ function readCurrentState(projectDir) {
39
+ try {
40
+ const raw = readFileSync(join(projectDir, SOLVEOS_DIR, "STATE.md"), "utf-8");
41
+ const fmMatch = raw.match(/^---\n([\s\S]*?)\n---/);
42
+ if (!fmMatch)
43
+ return null;
44
+ const data = JSON.parse(fmMatch[1]);
45
+ return data.current_state;
46
+ }
47
+ catch {
48
+ return null;
49
+ }
50
+ }
51
+ /**
52
+ * Read the Plan Brief from .solveos/BRIEF.md.
53
+ * Returns the raw content or null.
54
+ */
55
+ function readBrief(projectDir) {
56
+ try {
57
+ return readFileSync(join(projectDir, SOLVEOS_DIR, "BRIEF.md"), "utf-8");
58
+ }
59
+ catch {
60
+ return null;
61
+ }
62
+ }
63
+ /**
64
+ * Extract success criteria from a Plan Brief markdown string.
65
+ * Looks for `- [ ] criterion` lines under ## Success Criteria.
66
+ */
67
+ export function extractSuccessCriteria(brief) {
68
+ const criteria = [];
69
+ const lines = brief.split("\n");
70
+ let inSection = false;
71
+ for (const line of lines) {
72
+ if (line.startsWith("## Success Criteria")) {
73
+ inSection = true;
74
+ continue;
75
+ }
76
+ if (inSection && line.startsWith("## ")) {
77
+ break; // Next section
78
+ }
79
+ if (inSection) {
80
+ const match = line.match(/^- \[[ x]\] (.+)$/);
81
+ if (match) {
82
+ criteria.push(match[1]);
83
+ }
84
+ }
85
+ }
86
+ return criteria;
87
+ }
88
+ /**
89
+ * Extract out-of-scope items from a Plan Brief markdown string.
90
+ */
91
+ export function extractOutOfScope(brief) {
92
+ const items = [];
93
+ const lines = brief.split("\n");
94
+ let inSection = false;
95
+ for (const line of lines) {
96
+ if (line.startsWith("## Out of Scope")) {
97
+ inSection = true;
98
+ continue;
99
+ }
100
+ if (inSection && line.startsWith("## ")) {
101
+ break;
102
+ }
103
+ if (inSection) {
104
+ const match = line.match(/^- (.+)$/);
105
+ if (match) {
106
+ items.push(match[1]);
107
+ }
108
+ }
109
+ }
110
+ return items;
111
+ }
112
+ /**
113
+ * Check if the hook is enabled via config.
114
+ */
115
+ function isEnabled(config) {
116
+ if (!config?.hooks)
117
+ return true; // enabled by default
118
+ return config.hooks.brief_anchor !== false;
119
+ }
120
+ /**
121
+ * Get the tool call interval from config.
122
+ */
123
+ function getInterval(config) {
124
+ return config?.hooks?.brief_anchor_interval ?? DEFAULT_INTERVAL;
125
+ }
126
+ // ---------------------------------------------------------------------------
127
+ // Reminder message
128
+ // ---------------------------------------------------------------------------
129
+ /**
130
+ * Generate a brief anchor reminder with the actual criteria and boundaries.
131
+ */
132
+ export function generateReminder(criteria, outOfScope) {
133
+ const criteriaList = criteria.length > 0
134
+ ? criteria.map((c, i) => ` ${i + 1}. ${c}`).join("\n")
135
+ : " (no criteria found — check .solveos/BRIEF.md)";
136
+ const oosLine = outOfScope.length > 0
137
+ ? `\n**Out of scope:** ${outOfScope.join(", ")}`
138
+ : "";
139
+ return `
140
+ ---
141
+ **solveOS Brief Anchor** — alignment check
142
+
143
+ Pause and verify your current work:
144
+
145
+ **Success Criteria:**
146
+ ${criteriaList}
147
+ ${oosLine}
148
+
149
+ **Ask yourself:**
150
+ 1. Does my current task connect to one of these criteria?
151
+ 2. Am I within scope?
152
+ 3. Am I approaching a rabbit hole?
153
+
154
+ If any answer is wrong, stop and recalibrate before continuing.
155
+ ---
156
+ `.trim();
157
+ }
158
+ /**
159
+ * Generate a minimal reminder when no brief is found.
160
+ */
161
+ export function generateMinimalReminder() {
162
+ return `
163
+ ---
164
+ **solveOS Brief Anchor** — alignment check
165
+
166
+ No Plan Brief found at \`.solveos/BRIEF.md\`. Consider running \`/solveos:plan\` to create one.
167
+
168
+ If you have a brief, verify your current work still aligns with the plan's success criteria and out-of-scope boundaries.
169
+ ---
170
+ `.trim();
171
+ }
172
+ export function createAnchorState() {
173
+ return {
174
+ toolCallCount: 0,
175
+ sessionId: null,
176
+ };
177
+ }
178
+ /**
179
+ * Check if a reminder should be emitted based on current tool call count.
180
+ */
181
+ export function shouldRemind(state, interval) {
182
+ return state.toolCallCount > 0 && state.toolCallCount % interval === 0;
183
+ }
184
+ // ---------------------------------------------------------------------------
185
+ // Plugin export
186
+ // ---------------------------------------------------------------------------
187
+ /**
188
+ * The OpenCode plugin export.
189
+ *
190
+ * Subscribes to tool.execute.after events to count tool calls during Build.
191
+ * At configurable intervals, logs a brief anchor reminder.
192
+ */
193
+ export const SolveosBriefAnchor = async (ctx) => {
194
+ const config = readSolveosConfig(ctx.worktree || ctx.directory);
195
+ if (!isEnabled(config)) {
196
+ return {}; // Hook disabled — no event subscriptions
197
+ }
198
+ const interval = getInterval(config);
199
+ const state = createAnchorState();
200
+ return {
201
+ "tool.execute.after": async (input, _output) => {
202
+ // Check if we're in a Build phase
203
+ const projectDir = ctx.worktree || ctx.directory;
204
+ const currentState = readCurrentState(projectDir);
205
+ if (currentState !== "BUILDING")
206
+ return;
207
+ // Reset state if session changed
208
+ const sessionId = input.sessionID ?? null;
209
+ if (sessionId && sessionId !== state.sessionId) {
210
+ state.toolCallCount = 0;
211
+ state.sessionId = sessionId;
212
+ }
213
+ state.toolCallCount++;
214
+ if (shouldRemind(state, interval)) {
215
+ const brief = readBrief(projectDir);
216
+ let message;
217
+ if (brief) {
218
+ const criteria = extractSuccessCriteria(brief);
219
+ const outOfScope = extractOutOfScope(brief);
220
+ message = generateReminder(criteria, outOfScope);
221
+ }
222
+ else {
223
+ message = generateMinimalReminder();
224
+ }
225
+ await ctx.client.app.log({
226
+ body: {
227
+ service: "solveos-brief-anchor",
228
+ level: "info",
229
+ message,
230
+ },
231
+ });
232
+ }
233
+ },
234
+ };
235
+ };
236
+ //# sourceMappingURL=brief-anchor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brief-anchor.js","sourceRoot":"","sources":["../../src/hooks/brief-anchor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * solveOS Context Monitor — OpenCode plugin.
3
+ *
4
+ * Monitors context window utilization during Build phase execution.
5
+ * When message count exceeds a configurable threshold (proxy for context usage),
6
+ * warns the user and suggests spawning a fresh sub-agent for remaining work.
7
+ *
8
+ * This prevents the quality degradation that happens as context fills
9
+ * with accumulated state — inspired by GSD's approach of keeping the
10
+ * orchestrator at 30-40% utilization.
11
+ *
12
+ * Installed to: .opencode/plugins/solveos-context-monitor.ts
13
+ * Events: message.updated
14
+ */
15
+ /**
16
+ * Context monitor plugin state — tracks message count per session.
17
+ * Resets when a new session starts.
18
+ */
19
+ interface MonitorState {
20
+ messageCount: number;
21
+ warned60: boolean;
22
+ warned80: boolean;
23
+ sessionId: string | null;
24
+ }
25
+ /**
26
+ * Create a fresh monitor state.
27
+ */
28
+ export declare function createMonitorState(): MonitorState;
29
+ /**
30
+ * Check if a warning should be emitted based on current message count.
31
+ * Returns the warning message or null.
32
+ */
33
+ export declare function checkContextUsage(state: MonitorState, threshold: number): {
34
+ warning: string | null;
35
+ level: "60" | "80" | null;
36
+ };
37
+ /**
38
+ * The OpenCode plugin export.
39
+ *
40
+ * Subscribes to message.updated events to track context usage.
41
+ * When thresholds are crossed, logs a warning via the client.
42
+ */
43
+ export declare const SolveosContextMonitor: (ctx: {
44
+ directory: string;
45
+ worktree: string;
46
+ client: {
47
+ app: {
48
+ log: (opts: {
49
+ body: {
50
+ service: string;
51
+ level: string;
52
+ message: string;
53
+ };
54
+ }) => Promise<void>;
55
+ };
56
+ };
57
+ }) => Promise<{
58
+ event?: undefined;
59
+ } | {
60
+ event: ({ event }: {
61
+ event: {
62
+ type: string;
63
+ properties?: {
64
+ sessionID?: string;
65
+ };
66
+ };
67
+ }) => Promise<void>;
68
+ }>;
69
+ export {};
70
+ //# sourceMappingURL=context-monitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-monitor.d.ts","sourceRoot":"","sources":["../../src/hooks/context-monitor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AA0GH;;;GAGG;AACH,UAAU,YAAY;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,CAOjD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,MAAM,GAChB;IAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;CAAE,CAevD;AAED;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,GAAU,KAAK;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE;QAAE,GAAG,EAAE;YAAE,GAAG,EAAE,CAAC,IAAI,EAAE;gBAAE,IAAI,EAAE;oBAAE,OAAO,EAAE,MAAM,CAAC;oBAAC,KAAK,EAAE,MAAM,CAAC;oBAAC,OAAO,EAAE,MAAM,CAAA;iBAAE,CAAA;aAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;SAAE,CAAA;KAAE,CAAC;CAClH;;;uBAW4B;QAAE,KAAK,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,UAAU,CAAC,EAAE;gBAAE,SAAS,CAAC,EAAE,MAAM,CAAA;aAAE,CAAA;SAAE,CAAA;KAAE;EA+B5F,CAAC"}
@@ -0,0 +1,166 @@
1
+ /**
2
+ * solveOS Context Monitor — OpenCode plugin.
3
+ *
4
+ * Monitors context window utilization during Build phase execution.
5
+ * When message count exceeds a configurable threshold (proxy for context usage),
6
+ * warns the user and suggests spawning a fresh sub-agent for remaining work.
7
+ *
8
+ * This prevents the quality degradation that happens as context fills
9
+ * with accumulated state — inspired by GSD's approach of keeping the
10
+ * orchestrator at 30-40% utilization.
11
+ *
12
+ * Installed to: .opencode/plugins/solveos-context-monitor.ts
13
+ * Events: message.updated
14
+ */
15
+ import { readFileSync } from "node:fs";
16
+ import { join } from "node:path";
17
+ // ---------------------------------------------------------------------------
18
+ // Helpers
19
+ // ---------------------------------------------------------------------------
20
+ const SOLVEOS_DIR = ".solveos";
21
+ const DEFAULT_THRESHOLD = 60;
22
+ /**
23
+ * Read .solveos/config.json from the project directory.
24
+ * Returns null if not found or unparseable.
25
+ */
26
+ function readSolveosConfig(projectDir) {
27
+ try {
28
+ const raw = readFileSync(join(projectDir, SOLVEOS_DIR, "config.json"), "utf-8");
29
+ return JSON.parse(raw);
30
+ }
31
+ catch {
32
+ return null;
33
+ }
34
+ }
35
+ /**
36
+ * Read current cycle state from .solveos/STATE.md frontmatter.
37
+ * Returns the current_state string or null.
38
+ */
39
+ function readCurrentState(projectDir) {
40
+ try {
41
+ const raw = readFileSync(join(projectDir, SOLVEOS_DIR, "STATE.md"), "utf-8");
42
+ const fmMatch = raw.match(/^---\n([\s\S]*?)\n---/);
43
+ if (!fmMatch)
44
+ return null;
45
+ const data = JSON.parse(fmMatch[1]);
46
+ return data.current_state;
47
+ }
48
+ catch {
49
+ return null;
50
+ }
51
+ }
52
+ /**
53
+ * Check if the hook is enabled via config.
54
+ */
55
+ function isEnabled(config) {
56
+ if (!config?.hooks)
57
+ return true; // enabled by default
58
+ return config.hooks.context_monitor !== false;
59
+ }
60
+ /**
61
+ * Get the message count threshold from config.
62
+ */
63
+ function getThreshold(config) {
64
+ return config?.hooks?.context_monitor_threshold ?? DEFAULT_THRESHOLD;
65
+ }
66
+ // ---------------------------------------------------------------------------
67
+ // Warning message templates
68
+ // ---------------------------------------------------------------------------
69
+ const WARNING_60 = `
70
+ ---
71
+ **solveOS Context Monitor** — context usage is growing.
72
+
73
+ You've exchanged a significant number of messages in this session. Context quality may start degrading.
74
+
75
+ **Recommendation:** Consider summarizing progress so far, then spawning a fresh sub-agent for the remaining work using a new subtask. Pass it:
76
+ 1. The Plan Brief (\`.solveos/BRIEF.md\`)
77
+ 2. A summary of what's been completed
78
+ 3. What remains to be done
79
+
80
+ This keeps each agent working with clean, focused context.
81
+ ---
82
+ `.trim();
83
+ const WARNING_80 = `
84
+ ---
85
+ **solveOS Context Monitor** — HIGH context usage.
86
+
87
+ This session has accumulated substantial context. Response quality is likely degrading — the AI may start forgetting earlier instructions, repeating itself, or making errors it wouldn't make with fresh context.
88
+
89
+ **Strong recommendation:** Wrap up the current unit of work and spawn a fresh sub-agent immediately. The Plan Brief and build summary will bring the new agent up to speed quickly.
90
+
91
+ Run \`/solveos:status\` to capture current state before transitioning.
92
+ ---
93
+ `.trim();
94
+ /**
95
+ * Create a fresh monitor state.
96
+ */
97
+ export function createMonitorState() {
98
+ return {
99
+ messageCount: 0,
100
+ warned60: false,
101
+ warned80: false,
102
+ sessionId: null,
103
+ };
104
+ }
105
+ /**
106
+ * Check if a warning should be emitted based on current message count.
107
+ * Returns the warning message or null.
108
+ */
109
+ export function checkContextUsage(state, threshold) {
110
+ const pct60 = Math.floor(threshold * 0.6);
111
+ const pct80 = Math.floor(threshold * 0.8);
112
+ if (state.messageCount >= pct80 && !state.warned80) {
113
+ state.warned80 = true;
114
+ return { warning: WARNING_80, level: "80" };
115
+ }
116
+ if (state.messageCount >= pct60 && !state.warned60) {
117
+ state.warned60 = true;
118
+ return { warning: WARNING_60, level: "60" };
119
+ }
120
+ return { warning: null, level: null };
121
+ }
122
+ /**
123
+ * The OpenCode plugin export.
124
+ *
125
+ * Subscribes to message.updated events to track context usage.
126
+ * When thresholds are crossed, logs a warning via the client.
127
+ */
128
+ export const SolveosContextMonitor = async (ctx) => {
129
+ const config = readSolveosConfig(ctx.worktree || ctx.directory);
130
+ if (!isEnabled(config)) {
131
+ return {}; // Hook disabled — no event subscriptions
132
+ }
133
+ const threshold = getThreshold(config);
134
+ const state = createMonitorState();
135
+ return {
136
+ event: async ({ event }) => {
137
+ // Only track message events
138
+ if (event.type !== "message.updated")
139
+ return;
140
+ // Check if we're in a Build phase
141
+ const currentState = readCurrentState(ctx.worktree || ctx.directory);
142
+ if (currentState !== "BUILDING")
143
+ return;
144
+ // Reset state if session changed
145
+ const sessionId = event.properties?.sessionID ?? null;
146
+ if (sessionId && sessionId !== state.sessionId) {
147
+ state.messageCount = 0;
148
+ state.warned60 = false;
149
+ state.warned80 = false;
150
+ state.sessionId = sessionId;
151
+ }
152
+ state.messageCount++;
153
+ const { warning } = checkContextUsage(state, threshold);
154
+ if (warning) {
155
+ await ctx.client.app.log({
156
+ body: {
157
+ service: "solveos-context-monitor",
158
+ level: "warn",
159
+ message: warning,
160
+ },
161
+ });
162
+ }
163
+ },
164
+ };
165
+ };
166
+ //# sourceMappingURL=context-monitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-monitor.js","sourceRoot":"","sources":["../../src/hooks/context-monitor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
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 type { Config, CycleStateData, PlanBrief } from "../types.js";
9
+ /**
10
+ * Check if a .solveos/ directory exists and is valid.
11
+ */
12
+ export declare function projectExists(projectDir: string): Promise<boolean>;
13
+ /**
14
+ * Create the .solveos/ directory structure.
15
+ * Safe to run multiple times — does not overwrite existing files.
16
+ */
17
+ export declare function initProject(projectDir: string): Promise<void>;
18
+ /**
19
+ * Read .solveos/config.json. Returns defaults for any missing fields.
20
+ */
21
+ export declare function readConfig(projectDir: string): Promise<Config>;
22
+ /**
23
+ * Write .solveos/config.json.
24
+ */
25
+ export declare function writeConfig(projectDir: string, config: Config): Promise<void>;
26
+ /**
27
+ * Read and parse .solveos/STATE.md.
28
+ * STATE.md uses a JSON frontmatter block between `---` markers.
29
+ */
30
+ export declare function readState(projectDir: string): Promise<CycleStateData | null>;
31
+ /**
32
+ * Write structured state to .solveos/STATE.md.
33
+ * Format: YAML-like frontmatter (JSON) between --- markers, then human-readable summary.
34
+ */
35
+ export declare function writeState(projectDir: string, state: CycleStateData): Promise<void>;
36
+ /**
37
+ * Read .solveos/BRIEF.md and return its raw content, or null if not found.
38
+ */
39
+ export declare function readBrief(projectDir: string): Promise<string | null>;
40
+ /**
41
+ * Write a Plan Brief to .solveos/BRIEF.md.
42
+ * Accepts either a PlanBrief object (rendered to markdown) or raw markdown string.
43
+ */
44
+ export declare function writeBrief(projectDir: string, brief: PlanBrief | string): Promise<void>;
45
+ /**
46
+ * Archive the current cycle to .solveos/history/cycle-{n}/.
47
+ * Copies BRIEF.md, STATE.md, and validations/ to the archive.
48
+ * Clears current BRIEF.md and validations/ after archiving.
49
+ */
50
+ export declare function archiveCycle(projectDir: string, cycleNumber: number): Promise<void>;
51
+ /**
52
+ * Write a research summary to .solveos/research/{topic}-research.md.
53
+ */
54
+ export declare function writeResearch(projectDir: string, topic: string, content: string): Promise<void>;
55
+ /**
56
+ * Write a validation artifact.
57
+ */
58
+ export declare function writeValidation(projectDir: string, filename: string, content: string): Promise<void>;
59
+ /**
60
+ * Write a review artifact.
61
+ */
62
+ export declare function writeReview(projectDir: string, filename: string, content: string): Promise<void>;
63
+ //# sourceMappingURL=artifacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifacts.d.ts","sourceRoot":"","sources":["../../src/lib/artifacts.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AA6CrE;;GAEG;AACH,wBAAsB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOxE;AAkBD;;;GAGG;AACH,wBAAsB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BnE;AAMD;;GAEG;AACH,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAcpE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGnF;AAMD;;;GAGG;AACH,wBAAsB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAQlF;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAIzF;AAgFD;;GAEG;AACH,wBAAsB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAO1E;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,SAAS,GAAG,MAAM,GACxB,OAAO,CAAC,IAAI,CAAC,CAIf;AAmED;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CA+Cf;AAMD;;GAEG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAIf;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAGf;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAGf"}