company-skill 4.6.6 → 4.6.8

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/README.md CHANGED
@@ -2,10 +2,27 @@
2
2
 
3
3
  [![npm](https://img.shields.io/npm/v/company-skill)](https://www.npmjs.com/package/company-skill) [![npm downloads](https://img.shields.io/npm/dw/company-skill)](https://www.npmjs.com/package/company-skill) [![CI](https://github.com/jagmarques/company-skill/actions/workflows/check.yml/badge.svg)](https://github.com/jagmarques/company-skill/actions/workflows/check.yml) [![license](https://img.shields.io/npm/l/company-skill)](LICENSE)
4
4
 
5
- **The agent company that can't stop until the work is verified done.**
5
+ **The agent company that can't stop until the work is verified done**
6
6
 
7
7
  Your agent stops when it feels done. This makes it stop only when the work is actually done.
8
8
 
9
+ company-skill is a Claude Code skill for multi-agent orchestration. It runs your agents as a company with a verification gate, so a `/company` run cannot stop until every acceptance criterion is reproduced.
10
+
11
+ ## What it is
12
+
13
+ You give it a goal. It splits the work across sub-agents, runs them in dependency waves, and keeps going across cycles until the result is proven instead of just claimed. It runs unattended. Each cycle re-runs every check, a reviewer attacks anything marked passing, and a stop guard blocks exit while any criterion still fails. Sub-agents get scoped delegation contracts rather than the whole problem. A digest writer compresses each finished cycle so the orchestrator stays under its context window, and work is split across models to keep cost down. Nothing is done until it is verified.
14
+
15
+ ## Who it's for
16
+
17
+ Reach for it when "looks done" is not good enough and you want the loop to finish the job on its own:
18
+
19
+ - Build a REST API and prove the tests pass before it stops.
20
+ - Run an overnight refactor that won't quit half-done.
21
+ - Ship a feature where every acceptance criterion is reproduced, not asserted.
22
+ - Hand off a long task and come back to verified output instead of a half-finished draft.
23
+
24
+ Compared to a single agent or a plain prompt loop, the difference is the gate. A single agent stops when it decides it is finished. A company of agents keeps running, re-checking its own claims each cycle, until the evidence is there. It does not invent work outside the goal, and it tells you plainly when it is blocked.
25
+
9
26
  <p align="center">
10
27
  <img src="assets/dashboard.png" alt="Company dashboard showing org tree, context gauge, active agents, and criteria" width="900">
11
28
  <br>
@@ -33,12 +50,15 @@ Optionally define your team first in `COMPANY.md` (skip it and a minimal company
33
50
 
34
51
  Every criterion starts failing. Workers run in dependency waves under delegation contracts. At the end of each cycle, the Internal Reviewer re-runs every VERIFY-WITH command and the Devil's Advocate attacks everything marked passing. The stop guard physically blocks exit until every criterion has `passes: true` with reproduced evidence. Once done, `STATUS.md` and a `playbook.md` update are written for the next session.
35
52
 
36
- ```
37
- GOAL -> THINK -> EXECUTE (parallel waves) -> VERIFY -> Done?
38
- | |
39
- COMPRESS STATUS.md
40
- |
41
- THINK (next cycle)
53
+ ```mermaid
54
+ flowchart TD
55
+ GOAL --> THINK
56
+ THINK --> EXECUTE["EXECUTE (parallel waves)"]
57
+ EXECUTE --> VERIFY
58
+ VERIFY -->|all criteria pass| DONE["Done (STATUS.md + playbook)"]
59
+ VERIFY -->|not done| COMPRESS
60
+ COMPRESS --> NEXT["THINK (next cycle)"]
61
+ NEXT --> EXECUTE
42
62
  ```
43
63
 
44
64
  **Roles:** CEO orchestrator, Internal Reviewer, Devil's Advocate, Digest Writer. The orchestrator reads `COMPANY.md`, activates only the roles the goal needs, and writes delegation contracts in dependency order. Workers append FINDING + SOURCE lines to findings files. The Digest Writer compresses each finished cycle into the next cycle's briefing so the orchestrator never carries raw worker output in its own context.
@@ -52,43 +72,90 @@ The dashboard starts automatically when you run `/company` and prints its URL in
52
72
  http://127.0.0.1:7421 <- your session's link, printed at startup and in the status bar
53
73
  ```
54
74
 
75
+ A per-session identity header sits at the top: the project, the session id, the active model, and an "All projects" link to the cross-project roll-up.
76
+
55
77
  What you see, panel by panel:
56
78
 
57
- **Context fill** - the live fill percentage, computed with the same formula the context-guard uses. When the session hits the restart threshold (default 50%), the bar shows "restart due" so you can see the gate before it fires. A toggle in the dashboard controls the auto-restart per session.
79
+ **Context fill** - the live fill percentage, computed with the same formula the context-guard uses. When the session hits the restart threshold (default 50%), the gauge marks the gate before it fires. Next to it sits an Apple-style auto-restart pill, locked on - the restart block is always enforced and the toggle cannot turn it off.
58
80
 
59
- **Delegation tree** - SVG tree of orchestrator, department leads, and workers, with org-chart context filled from COMPANY.md. Click any node to expand its current task and status. Zoom with +/- buttons or the mouse wheel. Drag to pan. Fullscreen button expands it. Zero external JS libraries.
81
+ **Delegation tree** - SVG tree of orchestrator, department leads, and workers, with org-chart context filled from COMPANY.md. Click any node to expand its current task and status. Zoom only with the pill-shaped +/- buttons, or use the expand button to blow the tree up to fill the screen and the contract button to bring it back. Drag to pan. A refresh resets the tree to its default view. Zero external JS libraries.
82
+
83
+ **Cycles and memory** - a savings card that shows human cycle and memory counts plus the dollars saved by model tiering and prompt caching, each marked approximate.
60
84
 
61
85
  **Active agents** - centered live table of every agent the orchestrator has spawned this session, with model, status, and token count.
62
86
 
63
87
  **Criteria** - compact progress view with a click-to-expand toggle for the full pass/fail list and reproduced evidence.
64
88
 
89
+ **All projects** - the "All projects" link near the session header opens `/all`, a cross-project roll-up. It reads `~/.claude/company-dashboards.json`, a small index every dashboard writes itself into, and shows aggregate cost, tokens, and cache reuse grouped by project. It lists only dashboards seen in the last 5 minutes, costs come from ccusage and are notional on a subscription plan, and a session whose usage row is missing shows `?` rather than zero. Each row links back to that session's own dashboard.
90
+
65
91
  The dashboard binds 127.0.0.1 only, reads local files, and sends nothing anywhere. Override the port with `COMPANY_DASHBOARD_PORT`.
66
92
 
93
+ **You get this automatically.** Installing company-skill (npm or the install script) copies `dashboard.js` and `statusline.js` alongside the rest of the skill. Running `/company` then starts the dashboard for you and prints its localhost URL at startup and in the status line. No extra setup.
94
+
95
+ ### Status line
96
+
97
+ `scripts/statusline.js` appends a labelled link to the per-session dashboard so the URL is one glance away on every turn. The appended segment is `📊 company dashboard <url>`.
98
+
99
+ With no status line of your own configured, it also renders the model and context fill. The context fill draws as a progress bar using Claude's native used_percentage so the number matches the session indicator, so the full line reads:
100
+
101
+ ```
102
+ Opus 4.8 (1M context) | [████░░░░░░] 25% | 📊 company dashboard http://127.0.0.1:7421
103
+ ```
104
+
105
+ If you already have a status line, the setup step stores your prior command in `.company/statusline-base.json` and runs it first. Your line leads, the script appends only the link, and it does not re-print model or context since your own line owns those:
106
+
107
+ ```
108
+ <your status line> | 📊 company dashboard http://127.0.0.1:7421
109
+ ```
110
+
111
+
112
+ ## Unattended auto-restart loop
113
+
114
+ `scripts/company-autoloop.js` runs `/company` unattended across many sessions. It restarts into a fresh context automatically when a work session approaches the context threshold, so a long goal keeps going without a human pasting the restart prompt each time.
115
+
116
+ A script is needed because a fully unattended fresh-context restart cannot be done with Claude Code native features alone. Hooks cannot run `/clear` or start a fresh turn, a Stop-hook block keeps the same context, and auto-compaction only summarizes. The supervisor is the external driver that owns the restart decision. This is the validated finding.
117
+
118
+ Each turn runs a headless `claude -p` session while the supervisor watches the session context fill. At the threshold it drives `/company restart` to emit the `NEXT.md` continuation, then launches a fresh session seeded from it.
119
+
120
+ ```bash
121
+ node scripts/company-autoloop.js --max-turns 100 "/company GOAL: <your goal>"
122
+ ```
123
+
124
+ Key flags and env:
125
+
126
+ - `--project-dir <path>` the project the run targets (default: current dir)
127
+ - `--company-dir <path>` override the `.company` dir (default: `<project-dir>/.company`)
128
+ - `--max-turns <n>` hard cap on work turns across all sessions (default: 100)
129
+ - `--restart-timeout-secs <n>` max wait for the restart markers (default: 420)
130
+ - `COMPANY_CONTEXT_THRESHOLD` fill fraction or percent that triggers a restart (default: 0.50, set a low value for testing)
131
+
132
+ It runs with `--permission-mode bypassPermissions` for the autonomy an unattended loop needs. The threshold is configurable, so you can drop it low to exercise the restart path during testing.
133
+
67
134
 
68
135
  ## Cost and quality
69
136
 
70
137
  Multi-agent orchestration buys quality with tokens. /company's answer to the token cost: spend strong-model tokens only where they buy quality, and report the bill every cycle.
71
138
 
72
- **Tiered model delegation.** Each delegation contract carries a `MODEL: cheap|mid|strong` tag. The orchestrator maps the tag to a model at spawn time. Effort scales with both ROI and stakes - high-stakes or high-value work gets heavier spawn. Override every sub-agent with `CLAUDE_CODE_SUBAGENT_MODEL` at launch, or write `FORCE_BEST` into `.company/MODEL_POLICY` mid-run.
139
+ **Tiered model delegation** - each delegation contract carries a `MODEL: cheap|mid|strong` tag. The orchestrator maps the tag to a model at spawn time. Effort scales with both ROI and stakes - high-stakes or high-value work gets heavier spawn. Override every sub-agent with `CLAUDE_CODE_SUBAGENT_MODEL` at launch, or write `FORCE_BEST` into `.company/MODEL_POLICY` mid-run.
73
140
 
74
- **Per-cycle cost reporting.** Every cycle produces a `COST:` line in the briefing and a `cycles/cycle-{N}-cost.json` artifact.
141
+ **Per-cycle cost reporting** - every cycle produces a `COST:` line in the briefing and a `cycles/cycle-{N}-cost.json` artifact.
75
142
 
76
- **Prompt caching.** Agent prompts are laid out stable-first so repeated spawns hit a shared cache prefix.
143
+ **Prompt caching** - agent prompts are laid out stable-first so repeated spawns hit a shared cache prefix.
77
144
 
78
- **Fable 5 / adaptive thinking.** On models that support adaptive thinking (Fable 5 and later), the orchestrator and verify layers run with thinking enabled. No `budget_tokens` param - reflection depth is model-controlled.
145
+ **Fable 5 / adaptive thinking** - on models that support adaptive thinking (Fable 5 and later), the orchestrator and verify layers run with thinking enabled. No `budget_tokens` param - reflection depth is model-controlled.
79
146
 
80
147
 
81
148
  ## Key features
82
149
 
83
- **Stop guard** - blocks session exit until every criterion has `passes: true` and reproduced evidence. Malformed state blocks rather than fails open. Deleting a hard criterion blocks instead of unlocking. [34-check test](tests/stop-guard.test.js).
150
+ **Stop guard** - blocks session exit until every criterion has `passes: true` and reproduced evidence. Malformed state blocks rather than fails open. Deleting a hard criterion blocks instead of unlocking. [42-check test](tests/stop-guard.test.js).
84
151
 
85
- **Context-fill guard** - a second Stop hook forces `/company restart` once context reaches the threshold (default 50%). Reads the model id from the transcript to detect the context window. Per-session auto-restart toggle in the dashboard. [37-check test](tests/context-guard.test.js).
152
+ **Context-fill guard** - a second Stop hook forces `/company restart` once context reaches the threshold (default 50%). Reads the model id from the transcript to detect the context window. The restart block is always on and the dashboard shows it as a locked Apple-style pill toggle. [63-check test](tests/context-guard.test.js).
86
153
 
87
- **Delegation contracts** - a task does not exist without a filled contract. `check-contracts.js` rejects missing fields, vacuous VERIFY-WITH commands, invalid MODEL tiers, and cyclic dependencies. [17-check test](tests/check-contracts.test.js).
154
+ **Delegation contracts** - a task does not exist without a filled contract. `check-contracts.js` rejects missing fields, vacuous VERIFY-WITH commands, invalid MODEL tiers, and cyclic dependencies. [29-check test](tests/check-contracts.test.js).
88
155
 
89
- **Multi-level verification.** The Internal Reviewer re-runs every VERIFY-WITH command independently. The Devil's Advocate attacks everything marked passing. For criteria tagged `stakes: "high"` in `criteria.json` (irreversible action, security surface, or public-facing claim), the critic runs in three fresh contexts with distinct lenses - correctness, security, reproducibility - and unanimous ACCEPT is required. Normal criteria keep the single critic. The completeness probe enumerates every surface the GOAL names and auto-rejects any unchecked one.
156
+ **Multi-level verification** - the Internal Reviewer re-runs every VERIFY-WITH command independently. The Devil's Advocate attacks everything marked passing. For criteria tagged `stakes: "high"` in `criteria.json` (irreversible action, security surface, or public-facing claim), the critic runs in three fresh contexts with distinct lenses - correctness, security, reproducibility - and unanimous ACCEPT is required. Normal criteria keep the single critic. The completeness probe enumerates every surface the GOAL names and auto-rejects any unchecked one.
90
157
 
91
- **Design judge-panel.** For criteria tagged `kind: design`, the lead may emit up to three contracts from materially different angles plus one synthesis contract, reserved for genuine design forks.
158
+ **Design judge-panel** - for criteria tagged `kind: design`, the lead may emit up to three contracts from materially different angles plus one synthesis contract, reserved for genuine design forks.
92
159
 
93
160
  **Git isolation** - workers never push to main and never merge. Every code change lands as a draft PR. The merge gate is yours.
94
161
 
@@ -96,7 +163,7 @@ Multi-agent orchestration buys quality with tokens. /company's answer to the tok
96
163
 
97
164
  **Codebase graph** - on repos with >200 tracked files, `scripts/codegraph.js` builds a commit-keyed ranked symbol map into `.company/codegraph/` for lead prompts.
98
165
 
99
- **Status-line link** - `scripts/statusline.js` appends the per-session dashboard URL to the Claude Code status bar, enforced idempotently on every `/company` run.
166
+ **Status-line link** - `scripts/statusline.js` appends a labelled `📊 company dashboard <url>` segment to the Claude Code status bar, enforced idempotently on every `/company` run. The link resolves in any session through a cwd-independent global registry, with an `/all` fallback. It chains any status line you already have and never re-prints model or context when one is present. See [Status line](#status-line).
100
167
 
101
168
 
102
169
  ## Commands
@@ -128,7 +195,7 @@ State lives in `./.company/` (relocate with `COMPANY_DIR`):
128
195
 
129
196
  ## Examples
130
197
 
131
- [`startup.md`](examples/startup.md), [`research-lab.md`](examples/research-lab.md), [`dev-team.md`](examples/dev-team.md), [`nexusquant.md`](examples/nexusquant.md).
198
+ [`startup.md`](examples/startup.md), [`research-lab.md`](examples/research-lab.md), [`dev-team.md`](examples/dev-team.md).
132
199
 
133
200
 
134
201
  ## Contributing
@@ -48,7 +48,7 @@ function parseThreshold() {
48
48
  return v > 1 ? v / 100 : v;
49
49
  }
50
50
 
51
- // Hard ceiling: the toggle CANNOT suppress a block at or above this level.
51
+ // Hard ceiling: a higher informational level that changes the block wording only.
52
52
  // Default 0.80. Overridable via COMPANY_CONTEXT_HARD_CEILING (fraction or percent).
53
53
  // If the parsed value is below the soft threshold, it is clamped up to the threshold.
54
54
  function parseHardCeiling(threshold) {
@@ -171,40 +171,30 @@ const fill = used / contextWindow;
171
171
 
172
172
  if (fill < threshold) process.exit(0);
173
173
 
174
- // Per-session toggle: read .company/context-guard-config.json for this session.
175
- // Shape: { "sessions": { "<id>": { "enforceRestart": true|false } } }
176
- // Default (no file, no entry, parse error) = enforceRestart: true (safe default).
177
- // If enforceRestart === false for this session, and fill is BELOW the hard ceiling,
178
- // the toggle suppresses the soft-threshold block. At or above the hard ceiling the
179
- // toggle has no effect and we fall through to block unconditionally.
180
- if (sessionId && fill < hardCeiling) {
181
- const cfgPath = path.join(companyDir, 'context-guard-config.json');
182
- try {
183
- const cfgRaw = fs.readFileSync(cfgPath, 'utf8');
184
- const cfg = JSON.parse(cfgRaw);
185
- if (cfg && typeof cfg === 'object' &&
186
- cfg.sessions && typeof cfg.sessions === 'object' &&
187
- cfg.sessions[sessionId] && typeof cfg.sessions[sessionId] === 'object' &&
188
- cfg.sessions[sessionId].enforceRestart === false) {
189
- // Toggle is OFF and below the hard ceiling: allow through without blocking
190
- process.exit(0);
191
- }
192
- // Any other value (true, missing, or unknown) falls through to block
193
- } catch (e) {
194
- // File missing or parse error: treat as enforceRestart=true (safe default)
195
- }
196
- }
174
+ // At or above the soft threshold the restart block is UNCONDITIONAL.
175
+ // No per-session suppression exists: the enforceRestart toggle was removed because
176
+ // a session at or above the threshold must always restart (founder-firm invariant).
177
+ // The hard ceiling only changes the wording of the block, never whether it fires.
197
178
 
198
179
  // Fill is at or above threshold. Check the de-loop state file before blocking.
199
- // De-loop state is SESSION-SCOPED: stored as JSON { "sessionId": "<id>", "tokens": <n> }.
180
+ // De-loop state is SESSION-SCOPED JSON { "sessionId", "tokens", "releasedAtTokens"? }.
200
181
  // A state file from a different session (or a legacy bare-number file) is treated as
201
182
  // no prior fire for this session (lastFiredTokens = -1). This prevents a prior
202
183
  // session's high-water mark from suppressing a first-fire in a fresh session.
203
184
  // Within a session: first fire blocks + writes { sessionId, tokens }; subsequent stops
204
185
  // with grown tokens require the debate artifact; a token DROP re-arms unconditionally.
186
+ // Once a debate is honored the release is STICKY: releasedAtTokens records the fill at
187
+ // which the restart was released so re-stops at the same fill stay quiet (no re-demand
188
+ // loop), mirroring how CANCEL is persistent.
205
189
  const stateFile = path.join(companyDir, '.context-guard-state');
206
190
 
191
+ // Margin (5% of the context window) of new accumulation past the released high-water
192
+ // before a fresh restart demand is legitimate again. Below this, the session is treated
193
+ // as already released at this fill and the guard stays quiet.
194
+ const RELEASE_MARGIN_TOKENS = Math.round(contextWindow * 0.05);
195
+
207
196
  let lastFiredTokens = -1;
197
+ let releasedAtTokens = -1;
208
198
  try {
209
199
  const raw = fs.readFileSync(stateFile, 'utf8').trim();
210
200
  // Attempt JSON parse first (session-scoped format).
@@ -219,10 +209,30 @@ try {
219
209
  typeof parsed.tokens === 'number') {
220
210
  // State belongs to the current session: honor it.
221
211
  lastFiredTokens = parsed.tokens;
212
+ if (typeof parsed.releasedAtTokens === 'number') releasedAtTokens = parsed.releasedAtTokens;
222
213
  }
223
214
  // Null sessionId either side, legacy bare-number, or different session: treat as fresh.
224
215
  } catch (e) {}
225
216
 
217
+ // Sticky release: a restart already honored at releasedAtTokens silences the guard for
218
+ // re-stops at the same-or-similar fill. Only a meaningful rise past the margin re-arms.
219
+ if (releasedAtTokens >= 0) {
220
+ if (used <= releasedAtTokens + RELEASE_MARGIN_TOKENS) process.exit(0);
221
+ // Fill rose meaningfully above the released high-water: genuine new accumulation.
222
+ // Re-arm by recording a fresh first-fire at this fill and block once.
223
+ try { fs.writeFileSync(stateFile, JSON.stringify({ sessionId: sessionId, tokens: used })); } catch (e) {}
224
+ const sessionTagRearm = sessionId ? ' [session ' + sessionId + ']' : '';
225
+ const pctRearm = Math.round(fill * 100);
226
+ console.log(JSON.stringify({
227
+ decision: 'block',
228
+ reason: '[COMPANY] Context at ' + pctRearm + '% (grew past the prior restart point). ' +
229
+ 'Run /company restart NOW: quiesce in-flight agents, commit their work as draft PRs, ' +
230
+ 'refresh STATUS/NEXT, run the restart debate gate, and emit the verified continuation prompt. ' +
231
+ 'This is enforced, not advisory - do not continue new work.' + sessionTagRearm,
232
+ }));
233
+ process.exit(0);
234
+ }
235
+
226
236
  if (lastFiredTokens >= 0) {
227
237
  // Fired once already this session. Re-arm unconditionally when tokens dropped below
228
238
  // the fire count (a genuine context reset happened). Otherwise gate on the debate artifact.
@@ -253,8 +263,13 @@ if (lastFiredTokens >= 0) {
253
263
  } catch (e) {}
254
264
 
255
265
  if (artifactFresh) {
256
- // Debate recorded. Allow the stop and re-arm for the next cycle.
257
- try { fs.writeFileSync(stateFile, JSON.stringify({ sessionId: sessionId, tokens: -1 })); } catch (e) {}
266
+ // Debate recorded. Allow the stop and record a STICKY release at this fill so the
267
+ // next stop at the same-or-similar fill does not re-demand the debate in a loop.
268
+ try {
269
+ fs.writeFileSync(stateFile, JSON.stringify({
270
+ sessionId: sessionId, tokens: used, releasedAtTokens: used,
271
+ }));
272
+ } catch (e) {}
258
273
  // Best-effort: remove the consumed artifact so a stale one cannot release
259
274
  // a future fire. Failure is ignored (artifact absence is also safe).
260
275
  try { fs.unlinkSync(artifactPath); } catch (e) {}
@@ -287,7 +302,7 @@ const sessionTag = sessionId ? ' [session ' + sessionId + ']' : '';
287
302
  const atHardCeiling = fill >= hardCeiling;
288
303
  const reason = atHardCeiling
289
304
  ? '[COMPANY] Context at ' + pct + '% (>= ' + ceilPct + '% HARD CEILING). ' +
290
- 'The per-session enforceRestart toggle CANNOT suppress this restart. ' +
305
+ 'This restart is always enforced and cannot be suppressed per-session. ' +
291
306
  'Run /company restart NOW: quiesce in-flight agents, commit their work as draft PRs, ' +
292
307
  'refresh STATUS/NEXT, run the restart debate gate, and emit the verified continuation prompt.' +
293
308
  sessionTag
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "company-skill",
3
- "version": "4.6.6",
3
+ "version": "4.6.8",
4
4
  "description": "Goal-driven multi-employee company for Claude Code. Give it a goal, it runs until done.",
5
5
  "bin": {
6
6
  "company-skill": "./bin/install.js"
@@ -22,6 +22,7 @@
22
22
  "scripts/check-contracts.js",
23
23
  "scripts/check-findings.js",
24
24
  "scripts/restart-debate.js",
25
+ "scripts/company-autoloop.js",
25
26
  "scripts/dashboard.js",
26
27
  "scripts/secret-scan.js",
27
28
  "scripts/reset-company-guard.js",
@@ -35,7 +36,22 @@
35
36
  "README.md",
36
37
  "LICENSE"
37
38
  ],
38
- "keywords": ["claude-code", "skill", "multi-agent", "company", "orchestration", "model-agnostic", "autonomous-agents", "stop-hook", "agent-orchestration", "ai-agents", "fable", "claude-fable", "mythos", "claude-mythos"],
39
+ "keywords": [
40
+ "claude-code",
41
+ "skill",
42
+ "multi-agent",
43
+ "company",
44
+ "orchestration",
45
+ "model-agnostic",
46
+ "autonomous-agents",
47
+ "stop-hook",
48
+ "agent-orchestration",
49
+ "ai-agents",
50
+ "fable",
51
+ "claude-fable",
52
+ "mythos",
53
+ "claude-mythos"
54
+ ],
39
55
  "author": "jagmarques",
40
56
  "license": "MIT",
41
57
  "repository": {