solo-cto-agent 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG +46 -0
- package/LICENSE +21 -0
- package/README.md +409 -0
- package/bin/cli.js +177 -0
- package/docs/demo.svg +14 -0
- package/docs/skill-slimming.md +76 -0
- package/failure-catalog.json +62 -0
- package/failure-catalog.schema.json +26 -0
- package/package.json +29 -0
- package/skills/build/SKILL.md +377 -0
- package/skills/craft/SKILL.md +258 -0
- package/skills/memory/SKILL.md +234 -0
- package/skills/orchestrate/SKILL.md +141 -0
- package/skills/review/SKILL.md +195 -0
- package/skills/ship/SKILL.md +282 -0
- package/skills/spark/SKILL.md +269 -0
- package/templates/context.md +29 -0
- package/templates/project.md +38 -0
package/CHANGELOG
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.5.1
|
|
4
|
+
|
|
5
|
+
* added skill slimming docs (references/ pattern with measured results)
|
|
6
|
+
* fixed BOM encoding in CONTRIBUTING
|
|
7
|
+
* fixed corrupted FAQ section in README
|
|
8
|
+
* cleaned up README: removed duplicate sections, consolidated post-install guide
|
|
9
|
+
* updated ROADMAP with v0.5.0 completion and v0.6.0 plan
|
|
10
|
+
|
|
11
|
+
## 0.5.0
|
|
12
|
+
|
|
13
|
+
* added CLI init/status commands for npm distribution
|
|
14
|
+
* added demo asset, architecture diagram, and updated Quick Start
|
|
15
|
+
* expanded CONTRIBUTING and templates
|
|
16
|
+
|
|
17
|
+
## 0.4.0
|
|
18
|
+
|
|
19
|
+
* added package.json and basic test tooling
|
|
20
|
+
* added failure-catalog.json and schema validation
|
|
21
|
+
* added CI test workflow for PRs
|
|
22
|
+
* added ROADMAP.md
|
|
23
|
+
|
|
24
|
+
## 0.3.0
|
|
25
|
+
|
|
26
|
+
* added .cursorrules for Cursor IDE support
|
|
27
|
+
* added .windsurfrules for Windsurf (Cascade) support
|
|
28
|
+
* added .github/copilot-instructions.md for GitHub Copilot support
|
|
29
|
+
* all three rule files share the same CTO philosophy, adapted to each tool's format
|
|
30
|
+
|
|
31
|
+
## 0.2.0
|
|
32
|
+
|
|
33
|
+
* rewrote README to sound more human and less sales-heavy
|
|
34
|
+
* improved `setup.sh` toward safer repeat installs and updates
|
|
35
|
+
* softened over-strong automation claims in `build`
|
|
36
|
+
* clarified `craft` as intentionally opinionated
|
|
37
|
+
* tightened `review` wording
|
|
38
|
+
* added contribution guidance
|
|
39
|
+
* added example files for practical usage
|
|
40
|
+
|
|
41
|
+
## 0.1.0
|
|
42
|
+
|
|
43
|
+
* initial public release
|
|
44
|
+
* added build, ship, craft, spark, review, and memory skills
|
|
45
|
+
* added setup script
|
|
46
|
+
* added templates for context and project state
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 seunghunbae-3svs
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
# solo-cto-agent
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/solo-cto-agent)
|
|
4
|
+
[](https://github.com/seunghunbae-3svs/solo-cto-agent/actions/workflows/package-validate.yml)
|
|
5
|
+
[](https://github.com/seunghunbae-3svs/solo-cto-agent/actions/workflows/test.yml)
|
|
6
|
+
[](https://github.com/seunghunbae-3svs/solo-cto-agent/actions/workflows/changelog.yml)
|
|
7
|
+
[](LICENSE)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
I made this because I got tired of using AI coding tools that were good at writing code, but still left me doing all the messy CTO work around it.
|
|
11
|
+
|
|
12
|
+
The hard part was rarely "write the feature." It was everything around the feature:
|
|
13
|
+
|
|
14
|
+
* catching missing env vars before a deploy breaks
|
|
15
|
+
* not re-explaining the same stack every new session
|
|
16
|
+
* stopping error loops before they waste half an hour
|
|
17
|
+
* getting honest pushback on ideas instead of empty encouragement
|
|
18
|
+
* cleaning up UI that looks obviously AI-generated
|
|
19
|
+
|
|
20
|
+
This repo is my attempt to package those habits into a small set of reusable skills. It is not magic. It is not a replacement for judgment. It is just a better operating system for the kind of AI agent I wanted to work with.
|
|
21
|
+
|
|
22
|
+
## What this is
|
|
23
|
+
|
|
24
|
+
`solo-cto-agent` is an opinionated skill pack for solo founders, indie hackers, and small teams using AI coding agents in their build workflow.
|
|
25
|
+
|
|
26
|
+
Primary workflow: Cowork + Codex.
|
|
27
|
+
It was built around Claude Code & OpenAI Codex but the core rules also work in Cursor, Windsurf, and GitHub Copilot. The repo includes native config files where needed.
|
|
28
|
+
|
|
29
|
+
The point is simple:
|
|
30
|
+
|
|
31
|
+
* less repetitive setup work
|
|
32
|
+
* less context loss between sessions
|
|
33
|
+
* less AI slop in code and design
|
|
34
|
+
* more useful criticism before you commit to bad ideas
|
|
35
|
+
* more initiative from the agent on low-risk work
|
|
36
|
+
|
|
37
|
+
## What changes in practice
|
|
38
|
+
|
|
39
|
+
This is the difference I wanted in day-to-day use:
|
|
40
|
+
|
|
41
|
+
| Without this | With this |
|
|
42
|
+
| -------------------------------------------- | -------------------------------------------------------------- |
|
|
43
|
+
| Same build error over and over | Circuit breaker stops the loop and summarizes the likely cause |
|
|
44
|
+
| "Please add this manually to your dashboard" | Agent checks setup earlier and asks once when needed |
|
|
45
|
+
| New session, same explanation again | Important decisions get reused |
|
|
46
|
+
| Rounded-blue-gradient AI UI | Design checks push for more intentional output |
|
|
47
|
+
| "Looks good to me" feedback | Review forces actual criticism |
|
|
48
|
+
| Agent asks permission for every tiny step | Low-risk work gets done without constant back-and-forth |
|
|
49
|
+
|
|
50
|
+
## Who this is for
|
|
51
|
+
|
|
52
|
+
This repo is probably useful if you:
|
|
53
|
+
|
|
54
|
+
* build mostly alone or with a very small team
|
|
55
|
+
* already use Claude, Codex, Cursor, Windsurf, or Copilot in your workflow
|
|
56
|
+
* want the agent to take more initiative
|
|
57
|
+
* care about startup execution, not just code completion
|
|
58
|
+
* are okay with opinionated defaults
|
|
59
|
+
|
|
60
|
+
It is probably not a good fit if you:
|
|
61
|
+
|
|
62
|
+
* work in a tightly locked-down enterprise environment
|
|
63
|
+
* do not want agents touching files or setup
|
|
64
|
+
* want every action manually approved
|
|
65
|
+
* prefer a neutral framework-agnostic starter pack with very conservative defaults
|
|
66
|
+
|
|
67
|
+
## What's inside
|
|
68
|
+
|
|
69
|
+
```text
|
|
70
|
+
solo-cto-agent/
|
|
71
|
+
├── autopilot.md
|
|
72
|
+
├── .cursorrules ← Cursor picks this up automatically
|
|
73
|
+
├── .windsurfrules ← Windsurf (Cascade) picks this up automatically
|
|
74
|
+
├── .github/
|
|
75
|
+
│ └── copilot-instructions.md ← GitHub Copilot workspace instructions
|
|
76
|
+
├── skills/
|
|
77
|
+
│ ├── build/
|
|
78
|
+
│ │ └── SKILL.md
|
|
79
|
+
│ ├── ship/
|
|
80
|
+
│ │ └── SKILL.md
|
|
81
|
+
│ ├── craft/
|
|
82
|
+
│ │ └── SKILL.md
|
|
83
|
+
│ ├── spark/
|
|
84
|
+
│ │ └── SKILL.md
|
|
85
|
+
│ ├── review/
|
|
86
|
+
│ │ └── SKILL.md
|
|
87
|
+
│ └── memory/
|
|
88
|
+
│ └── SKILL.md
|
|
89
|
+
└── templates/
|
|
90
|
+
├── project.md
|
|
91
|
+
└── context.md
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## 5-Minute Quick Start
|
|
95
|
+
|
|
96
|
+
Three steps, under two minutes:
|
|
97
|
+
|
|
98
|
+
1) Install the CLI
|
|
99
|
+
```bash
|
|
100
|
+
npx solo-cto-agent init
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
2) Configure your stack
|
|
104
|
+
```text
|
|
105
|
+
Open ~/.claude/skills/solo-cto-agent/SKILL.md
|
|
106
|
+
Replace the {{YOUR_*}} placeholders
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
3) Verify
|
|
110
|
+
```bash
|
|
111
|
+
solo-cto-agent status
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Expected output looks like:
|
|
115
|
+
```text
|
|
116
|
+
solo-cto-agent status
|
|
117
|
+
- SKILL.md: OK
|
|
118
|
+
- failure-catalog.json: OK
|
|
119
|
+
- error patterns: 8
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## Demo
|
|
123
|
+
|
|
124
|
+

|
|
125
|
+
|
|
126
|
+
## Architecture
|
|
127
|
+
|
|
128
|
+
```mermaid
|
|
129
|
+
graph LR
|
|
130
|
+
A[Error Detected] --> B[failure-catalog.json]
|
|
131
|
+
B --> C[Pattern Match]
|
|
132
|
+
C --> D[Auto-Fix Applied]
|
|
133
|
+
D --> E[Build Verified]
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## Install
|
|
137
|
+
|
|
138
|
+
### npm (recommended)
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
npm install -g solo-cto-agent
|
|
142
|
+
solo-cto-agent init
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### Quick install (Claude Code)
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
curl -sSL https://raw.githubusercontent.com/seunghunbae-3svs/solo-cto-agent/main/setup.sh | bash
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Manual install
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
git clone https://github.com/seunghunbae-3svs/solo-cto-agent.git
|
|
155
|
+
cp -r solo-cto-agent/skills/* ~/.claude/skills/
|
|
156
|
+
cat solo-cto-agent/autopilot.md >> ~/.claude/CLAUDE.md
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### Only want one skill?
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
cp -r solo-cto-agent/skills/build ~/.claude/skills/
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
Then open the skill file and replace the placeholders with your actual stack. Example:
|
|
166
|
+
|
|
167
|
+
```text
|
|
168
|
+
{{YOUR_OS}} -> macOS / Windows / Linux
|
|
169
|
+
{{YOUR_EDITOR}} -> Cursor / VSCode / etc.
|
|
170
|
+
{{YOUR_DEPLOY}} -> Vercel / Railway / Netlify / etc.
|
|
171
|
+
{{YOUR_FRAMEWORK}} -> Next.js / Remix / SvelteKit / etc.
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### Using with Cowork + Codex
|
|
175
|
+
|
|
176
|
+
Codex is a first-class target. Use the SKILL.md files directly as your instruction source. No extra Codex-specific files are required.
|
|
177
|
+
|
|
178
|
+
### Using with Codex, Cursor, Windsurf, or Copilot
|
|
179
|
+
|
|
180
|
+
If you use Codex, Cursor, Windsurf, or GitHub Copilot instead of (or alongside) Claude, the repo includes native rule files:
|
|
181
|
+
|
|
182
|
+
* `.cursorrules` - Cursor reads this from your project root automatically
|
|
183
|
+
* `.windsurfrules` - Windsurf (Cascade) reads this from your project root automatically
|
|
184
|
+
* `.github/copilot-instructions.md` - GitHub Copilot reads this as workspace-level instructions
|
|
185
|
+
|
|
186
|
+
Just copy the files you need into your project:
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
cp solo-cto-agent/.cursorrules ./
|
|
190
|
+
cp solo-cto-agent/.windsurfrules ./
|
|
191
|
+
cp -r solo-cto-agent/.github ./
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
These files contain the same CTO philosophy as the Claude skills - autonomy levels, build discipline, design standards, review rules - adapted to each tool's format. They are not watered-down versions. They are the same operating system, just in a different config file.
|
|
195
|
+
|
|
196
|
+
## How I use autonomy
|
|
197
|
+
|
|
198
|
+
Most agent workflows feel too timid in the wrong places and too reckless in the dangerous ones. So I split behavior into 3 levels.
|
|
199
|
+
|
|
200
|
+
### L1 - just do it
|
|
201
|
+
|
|
202
|
+
Small, low-risk work should not need approval. Examples:
|
|
203
|
+
|
|
204
|
+
* fixing typos
|
|
205
|
+
* creating obvious files
|
|
206
|
+
* loading context
|
|
207
|
+
* choosing an output format
|
|
208
|
+
* doing routine search or setup checks
|
|
209
|
+
|
|
210
|
+
### L2 - do it, then explain
|
|
211
|
+
|
|
212
|
+
If something is a bit ambiguous but still low-risk, the agent makes the best assumption, does the work, and tells me what it assumed. That is usually better than spending 10 messages clarifying something that could have been resolved in one pass.
|
|
213
|
+
|
|
214
|
+
### L3 - ask first
|
|
215
|
+
|
|
216
|
+
Some things still need explicit approval:
|
|
217
|
+
|
|
218
|
+
* production deploys
|
|
219
|
+
* schema changes
|
|
220
|
+
* cost-increasing decisions
|
|
221
|
+
* anything sent under my name
|
|
222
|
+
* actions that could cause irreversible damage
|
|
223
|
+
|
|
224
|
+
That split has worked much better for me than asking permission every 30 seconds.
|
|
225
|
+
|
|
226
|
+
## Skills
|
|
227
|
+
|
|
228
|
+
### build
|
|
229
|
+
|
|
230
|
+
This is the one I use most. Its job is to reduce the annoying parts of implementation work:
|
|
231
|
+
|
|
232
|
+
* check prerequisites before coding
|
|
233
|
+
* catch missing env vars, packages, migrations, or config earlier
|
|
234
|
+
* keep scope from drifting
|
|
235
|
+
* stop repeated error loops
|
|
236
|
+
* keep build and deploy problems from bouncing back to the user too quickly
|
|
237
|
+
|
|
238
|
+
The core idea is simple:
|
|
239
|
+
|
|
240
|
+
> do more of the setup thinking before writing code, not after something fails.
|
|
241
|
+
|
|
242
|
+
### ship
|
|
243
|
+
|
|
244
|
+
The job is not done when the code is written. It is done when the deploy works.
|
|
245
|
+
|
|
246
|
+
This skill treats deploy failures as part of the work:
|
|
247
|
+
|
|
248
|
+
* monitor the build
|
|
249
|
+
* read the logs
|
|
250
|
+
* try reasonable fixes
|
|
251
|
+
* stop when a circuit breaker is hit
|
|
252
|
+
* escalate clearly instead of spiraling
|
|
253
|
+
|
|
254
|
+
### craft
|
|
255
|
+
|
|
256
|
+
This exists because AI-generated UI often has a very obvious look. Too many gradients. Too much rounded everything. Too many generic SaaS defaults that look "fine" but still feel cheap.
|
|
257
|
+
|
|
258
|
+
This skill is an opinionated design filter:
|
|
259
|
+
|
|
260
|
+
* typography rules
|
|
261
|
+
* color discipline
|
|
262
|
+
* spacing consistency
|
|
263
|
+
* motion sanity
|
|
264
|
+
* anti-slop checks
|
|
265
|
+
|
|
266
|
+
It does not guarantee great design, but it helps avoid lazy AI design.
|
|
267
|
+
|
|
268
|
+
### spark
|
|
269
|
+
|
|
270
|
+
For idea work, I wanted something better than "this market is huge."
|
|
271
|
+
|
|
272
|
+
This skill takes an early idea and forces it through structure:
|
|
273
|
+
|
|
274
|
+
* market scan
|
|
275
|
+
* competitors
|
|
276
|
+
* unit economics
|
|
277
|
+
* scenarios
|
|
278
|
+
* risk framing
|
|
279
|
+
* PRD direction
|
|
280
|
+
|
|
281
|
+
Useful when an idea is still vague but you need something more testable.
|
|
282
|
+
|
|
283
|
+
### review
|
|
284
|
+
|
|
285
|
+
This skill is intentionally not friendly. It looks at a plan from three perspectives:
|
|
286
|
+
|
|
287
|
+
* investor
|
|
288
|
+
* target user
|
|
289
|
+
* smart competitor
|
|
290
|
+
|
|
291
|
+
The point is to expose weak points early, not to make the founder feel good.
|
|
292
|
+
|
|
293
|
+
### memory
|
|
294
|
+
|
|
295
|
+
This is for reducing repeat explanation and preserving useful context.
|
|
296
|
+
|
|
297
|
+
Not everything needs to be remembered forever. But decisions, repeated failure patterns, and project context should not disappear every session.
|
|
298
|
+
|
|
299
|
+
## Skill slimming
|
|
300
|
+
|
|
301
|
+
When skills grow past 150 lines, most of that weight is reference data the agent doesn't need on every activation. The `references/` pattern splits hot-path logic from cold-path data, cutting token costs by 58-79% per skill without losing functionality.
|
|
302
|
+
|
|
303
|
+
See [docs/skill-slimming.md](docs/skill-slimming.md) for the pattern, measured results, and how to apply it.
|
|
304
|
+
|
|
305
|
+
## Design principles
|
|
306
|
+
|
|
307
|
+
### Agent does the work, user makes decisions
|
|
308
|
+
|
|
309
|
+
If the agent can reasonably figure something out, it should do that. The user should spend time on judgment calls, not repetitive setup.
|
|
310
|
+
|
|
311
|
+
### Risks before strengths
|
|
312
|
+
|
|
313
|
+
Good review starts with what is broken, vague, or contradictory. Praise comes after that.
|
|
314
|
+
|
|
315
|
+
### Facts over vibes
|
|
316
|
+
|
|
317
|
+
If a number appears, it should have a source, a formula, or a clear label like:
|
|
318
|
+
|
|
319
|
+
* `[confirmed]`
|
|
320
|
+
* `[estimated]`
|
|
321
|
+
* `[unverified]`
|
|
322
|
+
|
|
323
|
+
### Pre-scan, don't surprise
|
|
324
|
+
|
|
325
|
+
A lot of agent frustration comes from late discovery: missing env vars, missing package installs, missing DB changes, missing credentials. This pack tries to catch those earlier.
|
|
326
|
+
|
|
327
|
+
### Keep the loop bounded
|
|
328
|
+
|
|
329
|
+
If the same problem keeps happening, stop and report clearly. An agent that loops forever is worse than one that asks for help.
|
|
330
|
+
|
|
331
|
+
## What this is not
|
|
332
|
+
|
|
333
|
+
This is not:
|
|
334
|
+
|
|
335
|
+
* a hosted product
|
|
336
|
+
* a full framework
|
|
337
|
+
* a universal standard for agent behavior
|
|
338
|
+
* a replacement for technical judgment
|
|
339
|
+
|
|
340
|
+
It is just a set of operating rules that worked well enough for me to package and share.
|
|
341
|
+
|
|
342
|
+
## Recommended first use
|
|
343
|
+
|
|
344
|
+
If you want to try this without changing your whole workflow:
|
|
345
|
+
|
|
346
|
+
1. install only `build` and `review`
|
|
347
|
+
2. replace the stack placeholders
|
|
348
|
+
3. use them on one real feature or bug
|
|
349
|
+
4. see whether the agent becomes more useful or just more opinionated
|
|
350
|
+
|
|
351
|
+
That is the easiest way to tell whether this fits how you work.
|
|
352
|
+
|
|
353
|
+
## License
|
|
354
|
+
|
|
355
|
+
MIT - fork it, modify it, ship it.
|
|
356
|
+
|
|
357
|
+
|
|
358
|
+
---
|
|
359
|
+
|
|
360
|
+
## Post-install verification
|
|
361
|
+
|
|
362
|
+
After installation, verify the pack works:
|
|
363
|
+
|
|
364
|
+
1. Check skills exist in your agent directory (e.g. `~/.claude/skills`)
|
|
365
|
+
2. Confirm each skill has valid frontmatter (`---` block)
|
|
366
|
+
3. Run a simple prompt like "Use build to fix a TypeScript error"
|
|
367
|
+
4. Run `bash scripts/validate.sh` to check file integrity
|
|
368
|
+
5. Confirm no auto-merge or deploy happens without approval
|
|
369
|
+
|
|
370
|
+
If something fails, re-run `setup.sh --update` and check again.
|
|
371
|
+
|
|
372
|
+
|
|
373
|
+
---
|
|
374
|
+
|
|
375
|
+
## Sample output
|
|
376
|
+
|
|
377
|
+
**Build (preflight + fix)**
|
|
378
|
+
```
|
|
379
|
+
[build] pre-scan: missing env vars: STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET
|
|
380
|
+
[build] request: please provide the 2 keys above before proceeding
|
|
381
|
+
[build] applied: fixed prisma client mismatch
|
|
382
|
+
[build] build: npm run build -> OK
|
|
383
|
+
[build] report: 3 files changed, 1 risk flagged, rollback path noted
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
**Review + rework**
|
|
387
|
+
```
|
|
388
|
+
[review] Codex: REQUEST_CHANGES (blocker: missing RLS policy)
|
|
389
|
+
[review] Claude: APPROVE (nits: copy, spacing)
|
|
390
|
+
[rework] round 1/2 -> fixed RLS policy + added tests
|
|
391
|
+
[decision] recommendation: HOLD until preview verified
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
|
|
395
|
+
---
|
|
396
|
+
|
|
397
|
+
## FAQ
|
|
398
|
+
|
|
399
|
+
**Q: Do I need all six skills?**
|
|
400
|
+
A: No. Start with `build` and `review`. Add the others if you find yourself wanting them. Each skill is independent.
|
|
401
|
+
|
|
402
|
+
**Q: Why does the agent stop retrying after 3 attempts?**
|
|
403
|
+
A: Infinite loops waste more time than they save. If something fails 3 times, the agent summarizes what it knows and hands control back to you.
|
|
404
|
+
|
|
405
|
+
**Q: Why is the design skill so opinionated?**
|
|
406
|
+
A: Because default AI output tends toward the same rounded-gradient look. The rules push for more intentional choices. Override whatever doesn't fit your taste.
|
|
407
|
+
|
|
408
|
+
**Q: Does this work in Cursor/Windsurf?**
|
|
409
|
+
A: Yes. The repo includes native config files for each. The core philosophy is the same across all tools.
|
package/bin/cli.js
ADDED
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/* eslint-disable no-console */
|
|
3
|
+
const fs = require("fs");
|
|
4
|
+
const path = require("path");
|
|
5
|
+
const os = require("os");
|
|
6
|
+
const https = require("https");
|
|
7
|
+
|
|
8
|
+
const ROOT = path.resolve(__dirname, "..");
|
|
9
|
+
const DEFAULT_CATALOG = path.join(ROOT, "failure-catalog.json");
|
|
10
|
+
|
|
11
|
+
function printHelp() {
|
|
12
|
+
console.log(`solo-cto-agent
|
|
13
|
+
|
|
14
|
+
Usage:
|
|
15
|
+
solo-cto-agent init [--force]
|
|
16
|
+
solo-cto-agent status
|
|
17
|
+
solo-cto-agent --help
|
|
18
|
+
|
|
19
|
+
Commands:
|
|
20
|
+
init scaffold ~/.claude/skills/solo-cto-agent
|
|
21
|
+
status check skill health and error catalog
|
|
22
|
+
`);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function ensureDir(dir) {
|
|
26
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function writeFileIfMissing(filePath, content, force) {
|
|
30
|
+
if (fs.existsSync(filePath) && !force) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
fs.writeFileSync(filePath, content, "utf8");
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function initCommand(force) {
|
|
38
|
+
const targetDir = path.join(os.homedir(), ".claude", "skills", "solo-cto-agent");
|
|
39
|
+
ensureDir(targetDir);
|
|
40
|
+
|
|
41
|
+
// Copy failure-catalog.json
|
|
42
|
+
const targetCatalog = path.join(targetDir, "failure-catalog.json");
|
|
43
|
+
const catalogContent = fs.readFileSync(DEFAULT_CATALOG, "utf8");
|
|
44
|
+
const catalogWritten = writeFileIfMissing(targetCatalog, catalogContent, force);
|
|
45
|
+
|
|
46
|
+
// Create starter SKILL.md
|
|
47
|
+
const targetSkill = path.join(targetDir, "SKILL.md");
|
|
48
|
+
const starter = `---
|
|
49
|
+
name: solo-cto-agent
|
|
50
|
+
description: "Project-specific CTO skill pack. Replace placeholders with real stack info."
|
|
51
|
+
user-invocable: true
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
# Project Stack
|
|
55
|
+
|
|
56
|
+
OS: {{YOUR_OS}}
|
|
57
|
+
Editor: {{YOUR_EDITOR}}
|
|
58
|
+
Deploy: {{YOUR_DEPLOY}}
|
|
59
|
+
DB: {{YOUR_DB}}
|
|
60
|
+
Framework: {{YOUR_FRAMEWORK}}
|
|
61
|
+
Style: {{YOUR_STYLE}}
|
|
62
|
+
|
|
63
|
+
# Notes
|
|
64
|
+
- Replace placeholders above with real values.
|
|
65
|
+
- Keep this file updated as the stack changes.
|
|
66
|
+
`;
|
|
67
|
+
const skillWritten = writeFileIfMissing(targetSkill, starter, force);
|
|
68
|
+
|
|
69
|
+
console.log("✅ solo-cto-agent initialized");
|
|
70
|
+
console.log(`- target: ${targetDir}`);
|
|
71
|
+
console.log(`- failure-catalog: ${catalogWritten ? "created" : "exists"}`);
|
|
72
|
+
console.log(`- SKILL.md: ${skillWritten ? "created" : "exists"}`);
|
|
73
|
+
console.log("\nNext:");
|
|
74
|
+
console.log("1) Open SKILL.md and replace placeholders");
|
|
75
|
+
console.log("2) Add this skill path to your agent config if needed");
|
|
76
|
+
console.log("3) Run: solo-cto-agent status");
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function readCatalogCount(catalogPath) {
|
|
80
|
+
try {
|
|
81
|
+
const data = JSON.parse(fs.readFileSync(catalogPath, "utf8"));
|
|
82
|
+
if (Array.isArray(data.items)) return data.items.length;
|
|
83
|
+
return 0;
|
|
84
|
+
} catch {
|
|
85
|
+
return 0;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function getLatestCiStatus(repo, token) {
|
|
90
|
+
return new Promise((resolve) => {
|
|
91
|
+
if (!repo || !token) {
|
|
92
|
+
resolve({ status: "unavailable", conclusion: "missing token or repo" });
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const options = {
|
|
97
|
+
hostname: "api.github.com",
|
|
98
|
+
path: `/repos/${repo}/actions/runs?per_page=1`,
|
|
99
|
+
headers: {
|
|
100
|
+
"User-Agent": "solo-cto-agent",
|
|
101
|
+
Authorization: `Bearer ${token}`,
|
|
102
|
+
Accept: "application/vnd.github+json",
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
https
|
|
107
|
+
.get(options, (res) => {
|
|
108
|
+
let data = "";
|
|
109
|
+
res.on("data", (chunk) => (data += chunk));
|
|
110
|
+
res.on("end", () => {
|
|
111
|
+
try {
|
|
112
|
+
const json = JSON.parse(data);
|
|
113
|
+
const run = json.workflow_runs && json.workflow_runs[0];
|
|
114
|
+
if (!run) return resolve({ status: "unavailable", conclusion: "no runs" });
|
|
115
|
+
resolve({ status: run.status || "unknown", conclusion: run.conclusion || "unknown" });
|
|
116
|
+
} catch (e) {
|
|
117
|
+
resolve({ status: "unavailable", conclusion: "parse error" });
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
})
|
|
121
|
+
.on("error", () => resolve({ status: "unavailable", conclusion: "request failed" }));
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
async function statusCommand() {
|
|
126
|
+
const targetDir = path.join(os.homedir(), ".claude", "skills", "solo-cto-agent");
|
|
127
|
+
const skillPath = path.join(targetDir, "SKILL.md");
|
|
128
|
+
const catalogPath = path.join(targetDir, "failure-catalog.json");
|
|
129
|
+
|
|
130
|
+
const skillOk = fs.existsSync(skillPath);
|
|
131
|
+
const catalogOk = fs.existsSync(catalogPath);
|
|
132
|
+
const count = catalogOk ? readCatalogCount(catalogPath) : 0;
|
|
133
|
+
|
|
134
|
+
console.log("solo-cto-agent status");
|
|
135
|
+
console.log(`- SKILL.md: ${skillOk ? "OK" : "MISSING"}`);
|
|
136
|
+
console.log(`- failure-catalog.json: ${catalogOk ? "OK" : "MISSING"}`);
|
|
137
|
+
console.log(`- error patterns: ${count}`);
|
|
138
|
+
|
|
139
|
+
const repo = process.env.GITHUB_REPOSITORY;
|
|
140
|
+
const token = process.env.GITHUB_TOKEN || process.env.GH_TOKEN;
|
|
141
|
+
const ci = await getLatestCiStatus(repo, token);
|
|
142
|
+
console.log(`- last CI: ${ci.status} (${ci.conclusion})`);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
async function main() {
|
|
146
|
+
const args = process.argv.slice(2);
|
|
147
|
+
const cmd = args[0];
|
|
148
|
+
|
|
149
|
+
if (!cmd || cmd === "--help" || cmd === "-h" || cmd === "help") {
|
|
150
|
+
printHelp();
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
if (cmd === "init") {
|
|
155
|
+
if (args.includes("--help") || args.includes("-h")) {
|
|
156
|
+
printHelp();
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
const force = args.includes("--force");
|
|
160
|
+
initCommand(force);
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
if (cmd === "status") {
|
|
165
|
+
if (args.includes("--help") || args.includes("-h")) {
|
|
166
|
+
printHelp();
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
await statusCommand();
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
printHelp();
|
|
174
|
+
process.exit(1);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
main();
|
package/docs/demo.svg
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="900" height="420" viewBox="0 0 900 420">
|
|
2
|
+
<rect width="900" height="420" fill="#0b0f16"/>
|
|
3
|
+
<rect x="20" y="20" width="860" height="380" rx="10" fill="#111827" stroke="#1f2937"/>
|
|
4
|
+
<text x="40" y="60" fill="#93c5fd" font-family="monospace" font-size="16">npx solo-cto-agent init</text>
|
|
5
|
+
<text x="40" y="90" fill="#10b981" font-family="monospace" font-size="14">✔ initialized ~/.claude/skills/solo-cto-agent</text>
|
|
6
|
+
<text x="40" y="120" fill="#10b981" font-family="monospace" font-size="14">✔ failure-catalog.json created</text>
|
|
7
|
+
<text x="40" y="150" fill="#10b981" font-family="monospace" font-size="14">✔ SKILL.md created</text>
|
|
8
|
+
|
|
9
|
+
<text x="40" y="200" fill="#93c5fd" font-family="monospace" font-size="16">solo-cto-agent status</text>
|
|
10
|
+
<text x="40" y="230" fill="#e5e7eb" font-family="monospace" font-size="14">- SKILL.md: OK</text>
|
|
11
|
+
<text x="40" y="255" fill="#e5e7eb" font-family="monospace" font-size="14">- failure-catalog.json: OK</text>
|
|
12
|
+
<text x="40" y="280" fill="#e5e7eb" font-family="monospace" font-size="14">- error patterns: 8</text>
|
|
13
|
+
<text x="40" y="305" fill="#e5e7eb" font-family="monospace" font-size="14">- last CI: unavailable (missing token or repo)</text>
|
|
14
|
+
</svg>
|