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,155 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Validate build output against Plan Brief success criteria — catches gaps before shipping
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# /solveos:validate-build — Build Validation Gate
|
|
6
|
+
|
|
7
|
+
You are running the **Build Validation gate** of the solveOS cycle. This gate checks whether what was built actually matches what was planned. It catches the gap between intention and execution before it reaches users.
|
|
8
|
+
|
|
9
|
+
## Prerequisites
|
|
10
|
+
|
|
11
|
+
1. Check that `.solveos/` exists. If not: "No solveOS project found. Run `/solveos:new` first."
|
|
12
|
+
2. Read `.solveos/STATE.md`:
|
|
13
|
+
- Valid entry states: `BUILDING` (build in progress or complete) or `VALIDATING_BUILD` (re-entering after fixes)
|
|
14
|
+
- If state is `INIT` or `PLANNING`: "Nothing to validate yet. Run `/solveos:build` first."
|
|
15
|
+
- If state is `SHIPPED` or later: "This cycle is already shipped."
|
|
16
|
+
3. Read `.solveos/BRIEF.md` — especially the **success criteria**. These are what you're validating against.
|
|
17
|
+
- If no brief exists: "No Plan Brief found. Run `/solveos:plan` first."
|
|
18
|
+
4. Read `.solveos/config.json` to check if the build validation gate is enabled.
|
|
19
|
+
- If `gates.build_validation` is `false`: "The build validation gate is disabled in your config. You can still run it — do you want to proceed?"
|
|
20
|
+
5. Read any existing validation output from `.solveos/validations/build-validation.md` for context on previous validation attempts.
|
|
21
|
+
|
|
22
|
+
## Step 1: Gather Build Context
|
|
23
|
+
|
|
24
|
+
Before validating, understand what was built:
|
|
25
|
+
|
|
26
|
+
1. **Ask the user** to describe what was completed, or point to the relevant files/output:
|
|
27
|
+
> "What was built? Please describe the output or point me to the relevant files so I can validate against your Plan Brief."
|
|
28
|
+
|
|
29
|
+
2. **Read the build output** — examine the files, code, documents, or artifacts that were produced during the Build phase.
|
|
30
|
+
|
|
31
|
+
3. **Read any test results** — if tests were run, check their output.
|
|
32
|
+
|
|
33
|
+
4. **Read the Plan Brief success criteria** — enumerate each criterion that needs to be checked.
|
|
34
|
+
|
|
35
|
+
## Step 2: Validate Against the 3 Build Validation Questions
|
|
36
|
+
|
|
37
|
+
Invoke the **solveos-build-validator** agent behavior. Evaluate the build output against these three questions:
|
|
38
|
+
|
|
39
|
+
### Question 1: Does it work?
|
|
40
|
+
|
|
41
|
+
- Does the output function as intended, without critical failures?
|
|
42
|
+
- Can the primary use case be completed end-to-end?
|
|
43
|
+
- Are there crashes, errors, or broken paths?
|
|
44
|
+
- Does it handle expected inputs correctly?
|
|
45
|
+
|
|
46
|
+
### Question 2: Does it match the plan?
|
|
47
|
+
|
|
48
|
+
For **each success criterion** from the Plan Brief, assess:
|
|
49
|
+
|
|
50
|
+
| Criterion | Status | Notes |
|
|
51
|
+
|-----------|--------|-------|
|
|
52
|
+
| {criterion from BRIEF.md} | Pass / Fail / Partial | {what works, what doesn't} |
|
|
53
|
+
|
|
54
|
+
- **Pass:** Criterion fully met
|
|
55
|
+
- **Partial:** Criterion partially met — describe what's missing
|
|
56
|
+
- **Fail:** Criterion not met — describe what's wrong
|
|
57
|
+
|
|
58
|
+
Also check for **scope drift**:
|
|
59
|
+
- Was anything added that wasn't in the plan? (scope creep)
|
|
60
|
+
- Was anything cut from the plan? (scope reduction)
|
|
61
|
+
- Were there any modifications to the original scope? If so, were they justified?
|
|
62
|
+
|
|
63
|
+
### Question 3: Is it stable enough to ship?
|
|
64
|
+
|
|
65
|
+
- Are remaining issues known, bounded, and acceptable?
|
|
66
|
+
- Would the audience described in the Plan Brief have a good experience?
|
|
67
|
+
- Are there any time bombs (things that will break soon but work now)?
|
|
68
|
+
- Is technical debt bounded and documented?
|
|
69
|
+
|
|
70
|
+
## Step 3: Catalog Known Issues
|
|
71
|
+
|
|
72
|
+
For any issues found, catalog them:
|
|
73
|
+
|
|
74
|
+
| Issue | Severity | Decision |
|
|
75
|
+
|-------|----------|----------|
|
|
76
|
+
| {description} | Critical / High / Medium / Low | Fix now / Defer / Accept |
|
|
77
|
+
|
|
78
|
+
**Severity definitions:**
|
|
79
|
+
- **Critical:** Blocks the primary use case. Must fix before shipping.
|
|
80
|
+
- **High:** Significantly degrades experience. Should fix before shipping.
|
|
81
|
+
- **Medium:** Noticeable but not blocking. Can defer with documentation.
|
|
82
|
+
- **Low:** Minor polish. Safe to accept or defer.
|
|
83
|
+
|
|
84
|
+
**Decision guidance:**
|
|
85
|
+
- **Fix now:** Return to Build phase to address this before proceeding.
|
|
86
|
+
- **Defer:** Document as known issue, add to next cycle's backlog.
|
|
87
|
+
- **Accept:** Acceptable for the stated audience and appetite.
|
|
88
|
+
|
|
89
|
+
## Step 4: Write Build Validation Output
|
|
90
|
+
|
|
91
|
+
Write the results to `.solveos/validations/build-validation.md` using the Build Validation template format with all sections filled in.
|
|
92
|
+
|
|
93
|
+
If a previous `build-validation.md` exists (from a prior validation attempt), rename it to `build-validation-{n}.md` before writing the new one, so history is preserved.
|
|
94
|
+
|
|
95
|
+
## Step 5: Decide and Transition
|
|
96
|
+
|
|
97
|
+
Present the results to the user and recommend a routing decision. **The user decides — not you.**
|
|
98
|
+
|
|
99
|
+
### If all criteria pass (no critical/high issues):
|
|
100
|
+
|
|
101
|
+
> "Build validation passed. All success criteria are met.
|
|
102
|
+
>
|
|
103
|
+
> Options:
|
|
104
|
+
> 1. Run `/solveos:review` for a pre-ship review (recommended if enabled)
|
|
105
|
+
> 2. Run `/solveos:ship` to ship directly
|
|
106
|
+
>
|
|
107
|
+
> What would you like to do?"
|
|
108
|
+
|
|
109
|
+
Update `STATE.md`:
|
|
110
|
+
- Mark `BUILD_VALIDATION` as a completed gate
|
|
111
|
+
- Transition state based on user's choice (toward `REVIEWING_PRE` or `READY_TO_SHIP`)
|
|
112
|
+
- Update `updated_at`
|
|
113
|
+
|
|
114
|
+
### If issues found (needs iteration):
|
|
115
|
+
|
|
116
|
+
> "Build validation found {n} issues:
|
|
117
|
+
> - {critical/high count} require fixing before shipping
|
|
118
|
+
> - {medium/low count} can be deferred or accepted
|
|
119
|
+
>
|
|
120
|
+
> I recommend returning to Build to fix the critical/high issues.
|
|
121
|
+
>
|
|
122
|
+
> Options:
|
|
123
|
+
> 1. Run `/solveos:build` to fix the issues (returns to Build phase)
|
|
124
|
+
> 2. Accept the issues and proceed to Review/Ship (document as known issues)
|
|
125
|
+
>
|
|
126
|
+
> What would you like to do?"
|
|
127
|
+
|
|
128
|
+
Update `STATE.md`:
|
|
129
|
+
- If returning to Build: transition to `BUILDING`
|
|
130
|
+
- If accepting and proceeding: mark `BUILD_VALIDATION` as completed with accepted issues noted
|
|
131
|
+
- Update `updated_at`
|
|
132
|
+
|
|
133
|
+
### If major plan gaps found (needs re-planning):
|
|
134
|
+
|
|
135
|
+
> "Build validation found fundamental gaps between the plan and the output:
|
|
136
|
+
> - {gap description}
|
|
137
|
+
>
|
|
138
|
+
> The issue isn't the build — it's the plan. I recommend:
|
|
139
|
+
> 1. Run `/solveos:plan` to revise the Plan Brief
|
|
140
|
+
> 2. Accept the deviation and proceed with what was built
|
|
141
|
+
>
|
|
142
|
+
> What would you like to do?"
|
|
143
|
+
|
|
144
|
+
Update `STATE.md`:
|
|
145
|
+
- If re-planning: transition to `PLANNING`
|
|
146
|
+
- Add the fundamental gap to blockers
|
|
147
|
+
- Update `updated_at`
|
|
148
|
+
|
|
149
|
+
## Important Rules
|
|
150
|
+
|
|
151
|
+
- **Check every success criterion individually** — don't summarize. Each criterion gets its own Pass / Fail / Partial assessment.
|
|
152
|
+
- **Be specific about failures** — "tests fail" is not actionable; "the `calculateTotal` function returns NaN for empty arrays because it doesn't handle the edge case" is actionable.
|
|
153
|
+
- **Scope drift is not automatically bad** — justified additions are fine if documented. Unjustified scope creep or silent scope reduction is a problem.
|
|
154
|
+
- **The human decides the routing** — present options and a recommendation, but never auto-transition.
|
|
155
|
+
- **Severity matters for routing** — critical issues block shipping; low issues don't. Don't treat all issues equally.
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Validate the Plan Brief before building — catches ambiguity early
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# /solveos:validate-plan — Plan Validation Gate
|
|
6
|
+
|
|
7
|
+
You are running the **Plan Validation gate** of the solveOS cycle. This gate catches plan ambiguity before it becomes expensive build errors. Ambiguity in the brief becomes guesswork during build.
|
|
8
|
+
|
|
9
|
+
## Prerequisites
|
|
10
|
+
|
|
11
|
+
1. Check that `.solveos/` exists. If not: "No solveOS project found. Run `/solveos:new` first."
|
|
12
|
+
2. Read `.solveos/STATE.md`:
|
|
13
|
+
- Valid entry states: `PLANNING` (plan complete, ready to validate) or `VALIDATING_PLAN` (re-entering after refinement)
|
|
14
|
+
- If state is `INIT`: "No plan to validate. Run `/solveos:plan` first."
|
|
15
|
+
3. Read `.solveos/BRIEF.md` — this is what you're validating.
|
|
16
|
+
- If no brief exists: "No Plan Brief found. Run `/solveos:plan` first."
|
|
17
|
+
4. Read `.solveos/config.json` for `plan_validation_max_passes` (default 3).
|
|
18
|
+
5. Read any existing validation logs from `.solveos/validations/plan-validation-*.md` for context on previous passes.
|
|
19
|
+
|
|
20
|
+
## Step 1: Check Pass Count
|
|
21
|
+
|
|
22
|
+
Read `plan_validation_passes` from `STATE.md`.
|
|
23
|
+
|
|
24
|
+
- If passes >= `plan_validation_max_passes`:
|
|
25
|
+
> "You've reached the maximum validation passes ({max}). The brief may need fundamental rethinking rather than incremental refinement.
|
|
26
|
+
>
|
|
27
|
+
> Options:
|
|
28
|
+
> 1. Run `/solveos:research` to investigate the problem space more deeply
|
|
29
|
+
> 2. Run `/solveos:build` to proceed with the current brief (accepting known gaps)
|
|
30
|
+
> 3. Start over with `/solveos:plan` from scratch"
|
|
31
|
+
|
|
32
|
+
Wait for the user's decision. Do not force another validation pass.
|
|
33
|
+
|
|
34
|
+
## Step 2: Validate Against the 3 Core Questions
|
|
35
|
+
|
|
36
|
+
Invoke the **solveos-plan-validator** agent behavior. Evaluate the Plan Brief against these three questions:
|
|
37
|
+
|
|
38
|
+
### Question 1: Is the problem correctly stated?
|
|
39
|
+
- Is this the actual problem, or a symptom of a deeper issue?
|
|
40
|
+
- Is the audience named specifically (not "users" or "everyone")?
|
|
41
|
+
- Could someone outside the project understand what's wrong?
|
|
42
|
+
- Is the problem free of embedded solutions?
|
|
43
|
+
|
|
44
|
+
### Question 2: Is the plan feasible?
|
|
45
|
+
- Can the goal be achieved within the stated constraints and appetite?
|
|
46
|
+
- Do the constraints conflict with each other?
|
|
47
|
+
- Is the appetite realistic for the stated goal?
|
|
48
|
+
- Are there hidden dependencies not listed in constraints?
|
|
49
|
+
|
|
50
|
+
### Question 3: Is it specific enough to build from?
|
|
51
|
+
- Could someone who didn't write the brief execute it and produce the same result?
|
|
52
|
+
- Would two people interpret the success criteria the same way?
|
|
53
|
+
- Are there ambiguous terms that need definition?
|
|
54
|
+
- Is every success criterion testable?
|
|
55
|
+
|
|
56
|
+
### Additional Checks
|
|
57
|
+
- **Are success criteria measurable and falsifiable?** (Can you construct a test for each one?)
|
|
58
|
+
- **What would you cut if scope had to be reduced by 50%?** (Forces prioritization)
|
|
59
|
+
- **What is the single biggest unacknowledged risk?** (Surfaces hidden assumptions)
|
|
60
|
+
|
|
61
|
+
## Step 3: Write Validation Log
|
|
62
|
+
|
|
63
|
+
Write the results to `.solveos/validations/plan-validation-{n}.md` where `{n}` is the current pass number (1, 2, 3...).
|
|
64
|
+
|
|
65
|
+
Use the Plan Validation Log template format with all sections filled in.
|
|
66
|
+
|
|
67
|
+
## Step 4: Decide and Transition
|
|
68
|
+
|
|
69
|
+
Based on the validation results:
|
|
70
|
+
|
|
71
|
+
### If gaps were found (needs refinement):
|
|
72
|
+
1. Present the specific gaps to the user:
|
|
73
|
+
> "I found {n} gaps in the Plan Brief:
|
|
74
|
+
> 1. {gap description} — suggested fix: {suggestion}
|
|
75
|
+
> 2. {gap description} — suggested fix: {suggestion}
|
|
76
|
+
>
|
|
77
|
+
> Run `/solveos:plan` to refine the brief, then `/solveos:validate-plan` again."
|
|
78
|
+
|
|
79
|
+
2. Update `STATE.md`:
|
|
80
|
+
- Transition back to `PLANNING` (for refinement)
|
|
81
|
+
- Increment `plan_validation_passes`
|
|
82
|
+
- Update `updated_at`
|
|
83
|
+
|
|
84
|
+
### If validated (ready to build):
|
|
85
|
+
1. Confirm:
|
|
86
|
+
> "Plan Brief validated — no critical gaps remain. The brief is specific enough to build from.
|
|
87
|
+
>
|
|
88
|
+
> Run `/solveos:build` to start executing."
|
|
89
|
+
|
|
90
|
+
2. Update `STATE.md`:
|
|
91
|
+
- Mark `PLAN_VALIDATION` as a completed gate
|
|
92
|
+
- Transition state toward `BUILDING`
|
|
93
|
+
- Update `updated_at`
|
|
94
|
+
|
|
95
|
+
### If needs escalation (fundamental issues):
|
|
96
|
+
1. Explain:
|
|
97
|
+
> "The Plan Brief has fundamental issues that incremental refinement won't fix:
|
|
98
|
+
> - {issue description}
|
|
99
|
+
>
|
|
100
|
+
> I recommend:
|
|
101
|
+
> 1. `/solveos:research` — investigate the problem space more deeply
|
|
102
|
+
> 2. `/solveos:plan` — start a fresh brief from scratch"
|
|
103
|
+
|
|
104
|
+
2. Update `STATE.md` with escalation note in blockers.
|
|
105
|
+
|
|
106
|
+
## Refining Loop Summary
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
Pass 1: Catches obvious gaps (vague goals, missing constraints, unmeasurable criteria)
|
|
110
|
+
Pass 2: Catches structural issues (goal/constraint conflicts, feasibility concerns)
|
|
111
|
+
Pass 3: Catches alignment gaps (two readers would interpret differently)
|
|
112
|
+
After max: Escalate (suggest research or fundamental rethink)
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Each pass builds on previous ones. Validation logs from earlier passes provide context for what was already caught and (hopefully) fixed.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* solveos-cli installer entry point.
|
|
4
|
+
*
|
|
5
|
+
* Usage: npx solveos-cli@latest [--runtime opencode|claude-code|cursor|gemini]
|
|
6
|
+
*
|
|
7
|
+
* Detects the active AI coding assistant, installs slash commands and agents,
|
|
8
|
+
* and initializes the .solveos/ project directory.
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=install.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/bin/install.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* solveos-cli installer entry point.
|
|
4
|
+
*
|
|
5
|
+
* Usage: npx solveos-cli@latest [--runtime opencode|claude-code|cursor|gemini]
|
|
6
|
+
*
|
|
7
|
+
* Detects the active AI coding assistant, installs slash commands and agents,
|
|
8
|
+
* and initializes the .solveos/ project directory.
|
|
9
|
+
*/
|
|
10
|
+
import { resolve, join, dirname } from "node:path";
|
|
11
|
+
import { fileURLToPath } from "node:url";
|
|
12
|
+
import { readdir } from "node:fs/promises";
|
|
13
|
+
import { detectRuntime } from "../lib/runtime-detect.js";
|
|
14
|
+
import { opencode } from "../lib/runtime-adapters/opencode.js";
|
|
15
|
+
import { claudeCode } from "../lib/runtime-adapters/claude-code.js";
|
|
16
|
+
import { cursor } from "../lib/runtime-adapters/cursor.js";
|
|
17
|
+
import { gemini } from "../lib/runtime-adapters/gemini-cli.js";
|
|
18
|
+
import { initProject, projectExists } from "../lib/artifacts.js";
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// Resolve package root (where commands/, agents/, templates/ live)
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
23
|
+
const __dirname = dirname(__filename);
|
|
24
|
+
// From dist/bin/install.js -> go up two levels to package root
|
|
25
|
+
const PACKAGE_ROOT = resolve(__dirname, "..", "..");
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
// Adapter registry
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
const ADAPTERS = {
|
|
30
|
+
opencode,
|
|
31
|
+
"claude-code": claudeCode,
|
|
32
|
+
cursor,
|
|
33
|
+
gemini,
|
|
34
|
+
};
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
// CLI argument parsing (minimal — no dep needed)
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
function parseArgs(argv) {
|
|
39
|
+
const runtimeIndex = argv.indexOf("--runtime");
|
|
40
|
+
if (runtimeIndex !== -1 && argv[runtimeIndex + 1]) {
|
|
41
|
+
return { runtime: argv[runtimeIndex + 1] };
|
|
42
|
+
}
|
|
43
|
+
return {};
|
|
44
|
+
}
|
|
45
|
+
// ---------------------------------------------------------------------------
|
|
46
|
+
// Main
|
|
47
|
+
// ---------------------------------------------------------------------------
|
|
48
|
+
async function main() {
|
|
49
|
+
const cwd = process.cwd();
|
|
50
|
+
const args = parseArgs(process.argv);
|
|
51
|
+
console.log("");
|
|
52
|
+
console.log(" solveos-cli — Install the solveOS framework");
|
|
53
|
+
console.log(" ─────────────────────────────────────────────");
|
|
54
|
+
console.log("");
|
|
55
|
+
// Step 1: Detect or select runtime
|
|
56
|
+
let runtimeName;
|
|
57
|
+
let runtimeDisplayName;
|
|
58
|
+
if (args.runtime) {
|
|
59
|
+
runtimeName = args.runtime;
|
|
60
|
+
runtimeDisplayName = args.runtime;
|
|
61
|
+
console.log(` Runtime: ${runtimeDisplayName} (from --runtime flag)`);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
const detected = await detectRuntime(cwd);
|
|
65
|
+
if (detected) {
|
|
66
|
+
runtimeName = detected.runtime;
|
|
67
|
+
runtimeDisplayName = detected.name;
|
|
68
|
+
console.log(` Detected runtime: ${runtimeDisplayName}`);
|
|
69
|
+
console.log(` Config: ${detected.configPath}`);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
console.log(" No supported AI coding assistant detected.");
|
|
73
|
+
console.log("");
|
|
74
|
+
console.log(" Supported runtimes:");
|
|
75
|
+
console.log(" - OpenCode (.opencode/ or opencode.json)");
|
|
76
|
+
console.log(" - Claude Code (.claude/ or CLAUDE.md)");
|
|
77
|
+
console.log(" - Cursor (.cursor/ or .cursorrules)");
|
|
78
|
+
console.log(" - Gemini CLI (.gemini/)");
|
|
79
|
+
console.log("");
|
|
80
|
+
console.log(" Use --runtime <name> to specify manually:");
|
|
81
|
+
console.log(" npx solveos-cli --runtime opencode");
|
|
82
|
+
console.log("");
|
|
83
|
+
process.exit(1);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
console.log("");
|
|
87
|
+
// Step 2: Get adapter
|
|
88
|
+
const adapter = ADAPTERS[runtimeName];
|
|
89
|
+
if (!adapter) {
|
|
90
|
+
console.log(` Runtime "${runtimeName}" is not yet supported.`);
|
|
91
|
+
console.log(" Currently supported: opencode, claude-code, cursor, gemini");
|
|
92
|
+
console.log("");
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
// Step 3: Install commands
|
|
96
|
+
const commandsDir = join(PACKAGE_ROOT, "commands", "solveos");
|
|
97
|
+
try {
|
|
98
|
+
const commandFiles = await readdir(commandsDir);
|
|
99
|
+
const mdFiles = commandFiles.filter((f) => f.endsWith(".md"));
|
|
100
|
+
console.log(` Installing ${mdFiles.length} commands...`);
|
|
101
|
+
await adapter.installCommands(commandsDir);
|
|
102
|
+
for (const f of mdFiles) {
|
|
103
|
+
console.log(` /solveos-${f.replace(".md", "")}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
console.log(` Warning: Could not install commands: ${err}`);
|
|
108
|
+
}
|
|
109
|
+
// Step 4: Install agents
|
|
110
|
+
const agentsDir = join(PACKAGE_ROOT, "agents");
|
|
111
|
+
try {
|
|
112
|
+
const agentFiles = await readdir(agentsDir);
|
|
113
|
+
const mdFiles = agentFiles.filter((f) => f.endsWith(".md"));
|
|
114
|
+
console.log(` Installing ${mdFiles.length} agents...`);
|
|
115
|
+
await adapter.installAgents(agentsDir);
|
|
116
|
+
for (const f of mdFiles) {
|
|
117
|
+
console.log(` @${f.replace(".md", "")}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
console.log(` Warning: Could not install agents: ${err}`);
|
|
122
|
+
}
|
|
123
|
+
// Step 5: Install hooks (stub for now)
|
|
124
|
+
await adapter.installHooks("");
|
|
125
|
+
// Step 6: Initialize .solveos/ project directory
|
|
126
|
+
console.log("");
|
|
127
|
+
if (await projectExists(cwd)) {
|
|
128
|
+
console.log(" .solveos/ directory already exists (preserving existing state)");
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
await initProject(cwd);
|
|
132
|
+
console.log(" Created .solveos/ directory");
|
|
133
|
+
}
|
|
134
|
+
// Step 7: Print quickstart guide
|
|
135
|
+
console.log("");
|
|
136
|
+
console.log(" ─────────────────────────────────────────────");
|
|
137
|
+
console.log(" Installation complete!");
|
|
138
|
+
console.log("");
|
|
139
|
+
console.log(" Available commands:");
|
|
140
|
+
console.log(" /solveos-new Start a new project or cycle");
|
|
141
|
+
console.log(" /solveos-plan Create a Plan Brief");
|
|
142
|
+
console.log(" /solveos-build Execute against the plan");
|
|
143
|
+
console.log(" /solveos-ship Ship and archive the cycle");
|
|
144
|
+
console.log(" /solveos-status Show current cycle status");
|
|
145
|
+
console.log(" /solveos-next Suggest the next step");
|
|
146
|
+
console.log("");
|
|
147
|
+
console.log(" Quick start:");
|
|
148
|
+
console.log(" 1. Run /solveos-new to initialize a project");
|
|
149
|
+
console.log(" 2. Run /solveos-plan to create your Plan Brief");
|
|
150
|
+
console.log(" 3. Run /solveos-build to execute");
|
|
151
|
+
console.log(" 4. Run /solveos-ship when done");
|
|
152
|
+
console.log("");
|
|
153
|
+
}
|
|
154
|
+
main().catch((err) => {
|
|
155
|
+
console.error("Installation failed:", err);
|
|
156
|
+
process.exit(1);
|
|
157
|
+
});
|
|
158
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/bin/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
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
|
+
/**
|
|
15
|
+
* Extract success criteria from a Plan Brief markdown string.
|
|
16
|
+
* Looks for `- [ ] criterion` lines under ## Success Criteria.
|
|
17
|
+
*/
|
|
18
|
+
export declare function extractSuccessCriteria(brief: string): string[];
|
|
19
|
+
/**
|
|
20
|
+
* Extract out-of-scope items from a Plan Brief markdown string.
|
|
21
|
+
*/
|
|
22
|
+
export declare function extractOutOfScope(brief: string): string[];
|
|
23
|
+
/**
|
|
24
|
+
* Generate a brief anchor reminder with the actual criteria and boundaries.
|
|
25
|
+
*/
|
|
26
|
+
export declare function generateReminder(criteria: string[], outOfScope: string[]): string;
|
|
27
|
+
/**
|
|
28
|
+
* Generate a minimal reminder when no brief is found.
|
|
29
|
+
*/
|
|
30
|
+
export declare function generateMinimalReminder(): string;
|
|
31
|
+
export interface AnchorState {
|
|
32
|
+
toolCallCount: number;
|
|
33
|
+
sessionId: string | null;
|
|
34
|
+
}
|
|
35
|
+
export declare function createAnchorState(): AnchorState;
|
|
36
|
+
/**
|
|
37
|
+
* Check if a reminder should be emitted based on current tool call count.
|
|
38
|
+
*/
|
|
39
|
+
export declare function shouldRemind(state: AnchorState, interval: number): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* The OpenCode plugin export.
|
|
42
|
+
*
|
|
43
|
+
* Subscribes to tool.execute.after events to count tool calls during Build.
|
|
44
|
+
* At configurable intervals, logs a brief anchor reminder.
|
|
45
|
+
*/
|
|
46
|
+
export declare const SolveosBriefAnchor: (ctx: {
|
|
47
|
+
directory: string;
|
|
48
|
+
worktree: string;
|
|
49
|
+
client: {
|
|
50
|
+
app: {
|
|
51
|
+
log: (opts: {
|
|
52
|
+
body: {
|
|
53
|
+
service: string;
|
|
54
|
+
level: string;
|
|
55
|
+
message: string;
|
|
56
|
+
};
|
|
57
|
+
}) => Promise<void>;
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
}) => Promise<{
|
|
61
|
+
"tool.execute.after"?: undefined;
|
|
62
|
+
} | {
|
|
63
|
+
"tool.execute.after": (input: {
|
|
64
|
+
tool: string;
|
|
65
|
+
sessionID?: string;
|
|
66
|
+
}, _output: unknown) => Promise<void>;
|
|
67
|
+
}>;
|
|
68
|
+
//# sourceMappingURL=brief-anchor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brief-anchor.d.ts","sourceRoot":"","sources":["../../src/hooks/brief-anchor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAoEH;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAsB9D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAsBzD;AAqBD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,CA2BjF;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAUhD;AAMD,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,wBAAgB,iBAAiB,IAAI,WAAW,CAK/C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE1E;AAMD;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,GAAU,KAAK;IAC5C,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;;;kCAYY;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,WAClC,OAAO;EAsCrB,CAAC"}
|