catalyst-os 2.0.3 → 3.0.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/.catalyst/bin/install.js +46 -0
- package/.catalyst/main/project-config.yaml +16 -0
- package/.catalyst/spec-structure.yaml +1 -1
- package/.catalyst/voice/README.md +78 -0
- package/.catalyst/voice/artifact.js +61 -0
- package/.catalyst/voice/meet-server.js +293 -0
- package/.catalyst/voice/meeting-diy.html +205 -0
- package/.catalyst/voice/meeting.html +198 -0
- package/.catalyst/voice/package.json +11 -0
- package/.claude/agents/arbiter.md +4 -2
- package/.claude/agents/curator.md +75 -0
- package/.claude/commands/audit-spec.md +1 -1
- package/.claude/commands/meet-spec.md +43 -0
- package/.claude/commands/seal-spec.md +16 -0
- package/.claude/skills/meet-spec/SKILL.md +112 -0
- package/.claude/skills/spec-approval/SKILL.md +8 -1
- package/.claude/skills/spec-validation/SKILL.md +5 -3
- package/.claude/skills/using-skills/SKILL.md +1 -0
- package/AGENTS.md +2 -1
- package/README.md +37 -1
- package/package.json +2 -1
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# Meet Spec
|
|
2
|
+
|
|
3
|
+
> **When to invoke:** When the user wants to shape a spec by holding a voice meeting.
|
|
4
|
+
> **Invoked by:** `/meet-spec` command.
|
|
5
|
+
> **Orchestrator:** Catalyst agent.
|
|
6
|
+
|
|
7
|
+
## Purpose
|
|
8
|
+
|
|
9
|
+
Run a local, browser-based voice meeting (ElevenLabs) where the user talks through a
|
|
10
|
+
feature. The meeting agent can investigate the codebase live. When the meeting ends,
|
|
11
|
+
write a structured, `/catalyze-spec`-ready notes artifact.
|
|
12
|
+
|
|
13
|
+
**This skill does NOT produce a spec.** It produces a meeting artifact. The user runs
|
|
14
|
+
`/catalyze-spec @<artifact>` afterwards, when they choose to.
|
|
15
|
+
|
|
16
|
+
## Output Location
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
.catalyst/meetings/YYYY-MM-DD-{slug}/
|
|
20
|
+
└── meeting.md # Summary + Decisions + Action Items + Open Questions + Research Findings + Transcript
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Modes
|
|
24
|
+
|
|
25
|
+
`voice.mode` in `project-config.yaml` picks how the meeting runs:
|
|
26
|
+
|
|
27
|
+
- **diy** (default, free) — the browser does speech (Web Speech API) and the brain is a
|
|
28
|
+
local `claude -p`, which reads the codebase/docs and searches the web natively. No
|
|
29
|
+
ElevenLabs, no API key, no per-minute cost. Needs Chrome and the `claude` CLI on PATH.
|
|
30
|
+
- **bundled** — ElevenLabs Conversational AI. Nicer voice, but billed per minute (BYOK).
|
|
31
|
+
Requires `elevenlabs_api_key` in `.catalyst/secrets.local.yaml`, `voice.agent_id` in
|
|
32
|
+
config, and an agent that has a `investigate_codebase` client tool. See the README.
|
|
33
|
+
|
|
34
|
+
`language` sets the spoken meeting language (e.g. `"tr"`); written artifacts stay English.
|
|
35
|
+
|
|
36
|
+
## Workflow
|
|
37
|
+
|
|
38
|
+
### Phase 0: Preflight (stop early if not ready)
|
|
39
|
+
|
|
40
|
+
1. Read `.catalyst/main/project-config.yaml`. If `voice.enabled` is not `true`, stop and
|
|
41
|
+
tell the user how to enable it. Do not proceed.
|
|
42
|
+
2. Check `node --version` is >= 18 and `.catalyst/voice/meet-server.js` exists; otherwise
|
|
43
|
+
stop and explain (re-install catalyst-os if the runtime is missing).
|
|
44
|
+
3. **Bundled mode only:** check `.catalyst/secrets.local.yaml` has a non-empty
|
|
45
|
+
`elevenlabs_api_key` and `voice.agent_id` is set. If missing, stop with setup
|
|
46
|
+
instructions — do NOT print or echo the key. In **diy** mode, skip this check entirely.
|
|
47
|
+
|
|
48
|
+
**On any failure: stop gracefully. Voice is optional; never break the rest of Catalyst.**
|
|
49
|
+
|
|
50
|
+
### Phase 1: Initialize meeting folder
|
|
51
|
+
|
|
52
|
+
1. Determine the topic from `$ARGUMENTS`; if empty, ask the user one short question.
|
|
53
|
+
2. Derive a kebab-case `{slug}` from the topic.
|
|
54
|
+
3. Create `.catalyst/meetings/YYYY-MM-DD-{slug}/` (today's date).
|
|
55
|
+
|
|
56
|
+
### Phase 2: Launch the meeting room
|
|
57
|
+
|
|
58
|
+
Start the local daemon in the background and open the browser. The server reads config
|
|
59
|
+
(and, in bundled mode, the key from `secrets.local.yaml`) itself — never pass the key on
|
|
60
|
+
the command line or env.
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
PORT=4399 \
|
|
64
|
+
MEETING_DIR=".catalyst/meetings/YYYY-MM-DD-{slug}" \
|
|
65
|
+
MEETING_TOPIC="{topic}" \
|
|
66
|
+
node .catalyst/voice/meet-server.js &
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Run it from the project root (so `claude -p` investigations resolve against this repo).
|
|
70
|
+
Then open `http://localhost:4399` (e.g. `open`, `xdg-open`, or `start`). Tell the user:
|
|
71
|
+
"The meeting room is open. Click **Start meeting**, talk it through, then click **End
|
|
72
|
+
meeting** when you're done."
|
|
73
|
+
|
|
74
|
+
### Phase 3: Wait for the artifact
|
|
75
|
+
|
|
76
|
+
Poll for `.catalyst/meetings/YYYY-MM-DD-{slug}/meeting.md`. It is written when the user
|
|
77
|
+
clicks **End meeting** (the server folds the transcript + live findings into the artifact
|
|
78
|
+
via a single `claude -p` summarization pass). When it appears, the meeting is over — the
|
|
79
|
+
server shuts itself down.
|
|
80
|
+
|
|
81
|
+
### Phase 4: Output
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
Meeting captured.
|
|
85
|
+
|
|
86
|
+
Artifact: .catalyst/meetings/YYYY-MM-DD-{slug}/meeting.md
|
|
87
|
+
├── Summary
|
|
88
|
+
├── Decisions
|
|
89
|
+
├── Action Items
|
|
90
|
+
├── Open Questions
|
|
91
|
+
├── Research Findings (live codebase investigations from the meeting)
|
|
92
|
+
└── Transcript
|
|
93
|
+
|
|
94
|
+
Next step — shape it into a spec when you're ready:
|
|
95
|
+
/catalyze-spec @.catalyst/meetings/YYYY-MM-DD-{slug}/meeting.md
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
**Do NOT auto-run `/catalyze-spec`.** The user references the artifact themselves.
|
|
99
|
+
|
|
100
|
+
## Notes
|
|
101
|
+
|
|
102
|
+
- **Live codebase access:** in **diy** mode every turn is a headless `claude -p` in this
|
|
103
|
+
repo, so the agent reads the codebase/docs and searches the web natively. In **bundled**
|
|
104
|
+
mode the ElevenLabs agent calls the `investigate_codebase` client tool, which the browser
|
|
105
|
+
relays to the daemon, which runs the same `claude -p`. Either way it loads Catalyst's
|
|
106
|
+
agents and can delegate to Seer/Scout.
|
|
107
|
+
- **Typed messages:** the meeting room has a text box; typed messages are sent as user
|
|
108
|
+
turns (handy when speech is misheard) and appear in the transcript.
|
|
109
|
+
- **Latency:** investigations take seconds; the meeting room shows a "thinking" indicator
|
|
110
|
+
while the agent says it is looking into it. This is expected meeting behavior.
|
|
111
|
+
- **Cost:** billed to the user's ElevenLabs account (~$0.10/min bundled). A 30-min meeting
|
|
112
|
+
is ~$3.
|
|
@@ -73,13 +73,20 @@ Update spec.md status to COMPLETE.
|
|
|
73
73
|
|
|
74
74
|
### Phase 7: Push & Pull Request
|
|
75
75
|
|
|
76
|
+
> **This phase is atomic — do NOT stop or ask for confirmation between push and PR creation.**
|
|
77
|
+
> If validation passed in Phase 1 and the commit succeeded in Phase 5, proceed straight through push → PR without pausing.
|
|
78
|
+
> Only halt if a git/gh command returns an error.
|
|
79
|
+
|
|
76
80
|
1. Read `git.development_branch` from `.catalyst/main/project-config.yaml` (e.g., `development`, `staging`)
|
|
77
81
|
2. Push the feature branch: `git push -u origin {branch-name}`
|
|
78
|
-
3.
|
|
82
|
+
3. **Immediately** create a PR targeting the development branch — do not wait for user input:
|
|
79
83
|
```
|
|
80
84
|
gh pr create --base {development_branch} --title "feat({scope}): {spec title}" --body "..."
|
|
81
85
|
```
|
|
82
86
|
4. Include spec summary, TDD stats, and file change counts in the PR body
|
|
87
|
+
5. Capture the returned PR URL for the final output
|
|
88
|
+
|
|
89
|
+
**Do not ask** "should I create a PR?" or "ready to push?" — the user already invoked `/seal-spec`, which is the explicit authorization for the full push + PR flow. Only pause if a command fails or the working tree is in an unexpected state.
|
|
83
90
|
|
|
84
91
|
### Phase 8: Self-Documentation
|
|
85
92
|
|
|
@@ -56,7 +56,7 @@ If TDD was skipped → REJECT and return to /forge-spec
|
|
|
56
56
|
TDD Check (sequential, must pass first)
|
|
57
57
|
|
|
|
58
58
|
v
|
|
59
|
-
[Enforcer + Sentinel + Inquisitor + Watcher] (all parallel)
|
|
59
|
+
[Enforcer + Sentinel + Inquisitor + Watcher + Curator] (all parallel)
|
|
60
60
|
|
|
|
61
61
|
v
|
|
62
62
|
Arbiter compiles results → validation.md
|
|
@@ -98,7 +98,9 @@ Spawn all Guardians in parallel:
|
|
|
98
98
|
- Secret scanning
|
|
99
99
|
- Input validation checks
|
|
100
100
|
|
|
101
|
-
**
|
|
101
|
+
**Curator** (Schema Integrity — only for specs touching database):
|
|
102
|
+
- READ-ONLY Guardian — audits the schema, never creates or modifies it
|
|
103
|
+
- (The Alchemist *builds* the schema during `/forge-spec`; Curator independently *verifies* it here)
|
|
102
104
|
- Query actual database schema for all tables the spec touches
|
|
103
105
|
- Verify column names in spec/code match real database columns
|
|
104
106
|
- Verify all foreign keys and constraints exist in the actual DB
|
|
@@ -147,7 +149,7 @@ If all validation passes, create handoff.md with:
|
|
|
147
149
|
- Secrets: status
|
|
148
150
|
- Inputs: status
|
|
149
151
|
|
|
150
|
-
### Schema Integrity (
|
|
152
|
+
### Schema Integrity (Curator) — if spec touches database
|
|
151
153
|
- Column names match: status
|
|
152
154
|
- Constraints verified: status
|
|
153
155
|
- API end-to-end trace: status
|
|
@@ -41,6 +41,7 @@ Skills tell you HOW. User instructions tell you WHAT.
|
|
|
41
41
|
|
|
42
42
|
| Skill | Path | Load when... |
|
|
43
43
|
|-------|------|-------------|
|
|
44
|
+
| **meet-spec** | `.claude/skills/meet-spec/SKILL.md` | `/meet-spec` — shaping a spec via a voice meeting (optional) |
|
|
44
45
|
| **spec-shaping** | `.claude/skills/spec-shaping/SKILL.md` | `/catalyze-spec` — shaping a new specification |
|
|
45
46
|
| **spec-challenge** | `.claude/skills/spec-challenge/SKILL.md` | `/challenge-spec` — interrogating a shaped spec branch by branch (optional) |
|
|
46
47
|
| **build-orchestration** | `.claude/skills/build-orchestration/SKILL.md` | `/forge-spec` — implementing a specification |
|
package/AGENTS.md
CHANGED
|
@@ -14,7 +14,7 @@ Quick reference for all agents and the skills they use.
|
|
|
14
14
|
|----------|--------------|
|
|
15
15
|
| Research phase | Oracle + Seer + Scout + Surveyor |
|
|
16
16
|
| Build phase | Smith x N + Shaper x M (multiple instances) |
|
|
17
|
-
| Validation phase | Inquisitor + Watcher + Sentinel |
|
|
17
|
+
| Validation phase | Inquisitor + Watcher + Sentinel + Curator (DB specs) |
|
|
18
18
|
|
|
19
19
|
### Run Sequentially (Has Dependencies)
|
|
20
20
|
|
|
@@ -94,6 +94,7 @@ All builders follow `test-driven-development`, `systematic-debugging`, `verifica
|
|
|
94
94
|
| [Sentinel](.claude/agents/sentinel.md) | E2E tests | — |
|
|
95
95
|
| [Inquisitor](.claude/agents/inquisitor.md) | Code review | — |
|
|
96
96
|
| [Watcher](.claude/agents/watcher.md) | Security audit | — |
|
|
97
|
+
| [Curator](.claude/agents/curator.md) | Schema-integrity audit (read-only DB) | `secret-scanning` |
|
|
97
98
|
|
|
98
99
|
---
|
|
99
100
|
|
package/README.md
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
```bash
|
|
10
10
|
npx catalyst-os # Install to your project
|
|
11
11
|
/catalyze-project # Initialize project foundation
|
|
12
|
+
/meet-spec "topic" # (optional) Talk it through -> meeting notes
|
|
12
13
|
/catalyze-spec "description" # Shape a feature specification
|
|
13
14
|
/challenge-spec @spec-name # (optional) Interrogate the spec branch by branch
|
|
14
15
|
/forge-spec @spec-name # Implement with TDD
|
|
@@ -44,6 +45,7 @@ Then run `/catalyze-project` to initialize — this detects your workspace type,
|
|
|
44
45
|
│ ├── agent-delegation/
|
|
45
46
|
│ ├── receiving-code-review/
|
|
46
47
|
│ ├── workspace-detection/
|
|
48
|
+
│ ├── meet-spec/
|
|
47
49
|
│ ├── spec-shaping/
|
|
48
50
|
│ ├── spec-challenge/
|
|
49
51
|
│ ├── build-orchestration/
|
|
@@ -57,6 +59,8 @@ Then run `/catalyze-project` to initialize — this detects your workspace type,
|
|
|
57
59
|
|
|
58
60
|
.catalyst/
|
|
59
61
|
├── main/ # Mission, roadmap, tech-stack, project-config
|
|
62
|
+
├── voice/ # /meet-spec meeting runtime (zero-dependency)
|
|
63
|
+
├── meetings/ # Meeting notes artifacts (generated, git-ignored)
|
|
60
64
|
├── specs/ # Active specifications
|
|
61
65
|
├── completed/ # Archived specs
|
|
62
66
|
└── library/ # Reusable patterns
|
|
@@ -103,6 +107,7 @@ Without this, skills are optional documentation. With it, they're mandatory proc
|
|
|
103
107
|
|
|
104
108
|
| Skill | Command | Purpose |
|
|
105
109
|
|-------|---------|---------|
|
|
110
|
+
| `meet-spec` | `/meet-spec` | Voice meeting → `/catalyze-spec`-ready notes (optional) |
|
|
106
111
|
| `spec-shaping` | `/catalyze-spec` | Shape feature requests into specifications |
|
|
107
112
|
| `spec-challenge` | `/challenge-spec` | Interrogate a shaped spec branch by branch (optional) |
|
|
108
113
|
| `build-orchestration` | `/forge-spec` | DAG-based TDD implementation |
|
|
@@ -143,7 +148,8 @@ Guardians (Quality)
|
|
|
143
148
|
├── Enforcer → Unit tests
|
|
144
149
|
├── Sentinel → E2E tests
|
|
145
150
|
├── Inquisitor → Code review
|
|
146
|
-
|
|
151
|
+
├── Watcher → Security
|
|
152
|
+
└── Curator → Schema integrity (DB, read-only)
|
|
147
153
|
```
|
|
148
154
|
|
|
149
155
|
### Agent Capabilities
|
|
@@ -167,6 +173,7 @@ Guardians (Quality)
|
|
|
167
173
|
| | Sentinel | Run E2E tests |
|
|
168
174
|
| | Inquisitor | Code review, linting |
|
|
169
175
|
| | Watcher | Security audit, dependency scan |
|
|
176
|
+
| | Curator | Schema-integrity audit (read-only DB) |
|
|
170
177
|
|
|
171
178
|
---
|
|
172
179
|
|
|
@@ -201,6 +208,7 @@ Guardians (Quality)
|
|
|
201
208
|
| Command | When to Use | Output |
|
|
202
209
|
|---------|-------------|--------|
|
|
203
210
|
| `/catalyze-project` | Start new project | mission.md, roadmap.md, tech-stack.md |
|
|
211
|
+
| `/meet-spec "topic"` | Shape a spec by talking it through (optional) | meeting.html + meeting.md |
|
|
204
212
|
| `/catalyze-spec "feature"` | New feature request | spec.md, research.md |
|
|
205
213
|
| `/challenge-spec @slug` | Stress-test the spec before forging (optional) | spec.md (patched), handoff.md (Challenge Log) |
|
|
206
214
|
| `/forge-spec @slug` | Implement feature | tasks.md (updated) |
|
|
@@ -218,6 +226,34 @@ Guardians (Quality)
|
|
|
218
226
|
|
|
219
227
|
---
|
|
220
228
|
|
|
229
|
+
## Voice Meetings (`/meet-spec`)
|
|
230
|
+
|
|
231
|
+
Shape a spec by **talking it through**. `/meet-spec` opens a local browser meeting room,
|
|
232
|
+
holds a spoken conversation, and writes a `/catalyze-spec`-ready notes artifact. The
|
|
233
|
+
agent can read the codebase, docs, and the web live during the meeting.
|
|
234
|
+
|
|
235
|
+
```
|
|
236
|
+
/meet-spec "realtime notifications" # opens the room → talk → End meeting
|
|
237
|
+
/catalyze-spec @.catalyst/meetings/YYYY-MM-DD-{slug}/meeting.md
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
Two modes (`voice.mode` in `project-config.yaml`):
|
|
241
|
+
|
|
242
|
+
| | **diy** (default) | **bundled** |
|
|
243
|
+
|---|---|---|
|
|
244
|
+
| Speech | Browser Web Speech API | ElevenLabs Conversational AI |
|
|
245
|
+
| Brain | Local `claude -p` | ElevenLabs agent (Claude LLM) |
|
|
246
|
+
| Cost | **Free** (uses your Claude) | Per-minute, BYOK key |
|
|
247
|
+
| Setup | None — just Chrome | API key + agent |
|
|
248
|
+
|
|
249
|
+
The room shows **live meeting notes** (left) beside the **chat history** (right). On
|
|
250
|
+
**End meeting** it saves both `meeting.html` (rendered, self-contained) and `meeting.md`
|
|
251
|
+
(canonical input for `/catalyze-spec`). Notes are written in English regardless of the
|
|
252
|
+
spoken language (`voice.language`, e.g. `"tr"`). Runtime lives in `.catalyst/voice/`
|
|
253
|
+
(zero npm dependencies). See `.catalyst/voice/README.md` for setup.
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
221
257
|
## Spec Folder Structure
|
|
222
258
|
|
|
223
259
|
```
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "catalyst-os",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.1",
|
|
4
4
|
"scripts": {
|
|
5
5
|
"postinstall": "node .catalyst/bin/install.js",
|
|
6
6
|
"validate": "node .catalyst/bin/validate-artifacts.js"
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
"AGENTS.md",
|
|
14
14
|
".claude",
|
|
15
15
|
".catalyst/bin",
|
|
16
|
+
".catalyst/voice",
|
|
16
17
|
".catalyst/spec-structure.yaml",
|
|
17
18
|
".catalyst/main/project-config.yaml"
|
|
18
19
|
],
|