cc-workspace 4.0.4 → 4.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/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Claude Code Multi-Workspace Orchestrator v4.0
1
+ # Claude Code Multi-Workspace Orchestrator v4.1.0
2
2
 
3
3
  A system to pilot multi-service projects from Claude Code.
4
4
  The orchestrator (Opus) never codes in repos. It clarifies, plans,
@@ -66,8 +66,10 @@ claude --agent team-lead
66
66
  npx cc-workspace update
67
67
  ```
68
68
 
69
- Updates global components (~/.claude/) if the package version is newer.
70
- Workspace files (workspace.md, constitution.md, plans/) are never overwritten.
69
+ Updates all components if the package version is newer:
70
+ - **Global**: skills, rules, agents in `~/.claude/`
71
+ - **Local** (if orchestrator/ found): hooks, settings.json, CLAUDE.md, templates, _TEMPLATE.md
72
+ - **Never overwritten**: workspace.md, constitution.md, plans/
71
73
 
72
74
  ### Diagnostic
73
75
 
@@ -164,7 +166,7 @@ detects if the target path is in a repo (presence of `.git/`).
164
166
 
165
167
  Protection layers:
166
168
  1. `disallowedTools: Bash` in agent frontmatter
167
- 2. `allowed-tools` whitelist in agent frontmatter
169
+ 2. `tools` whitelist in agent frontmatter (note: `allowed-tools` is the skill equivalent)
168
170
  3. `PreToolUse` path-aware hook in agent frontmatter
169
171
  4. `block-orchestrator-writes.sh` hook in .claude/hooks/
170
172
 
@@ -330,12 +332,24 @@ cc-workspace/
330
332
 
331
333
  ## Idempotence
332
334
 
333
- The setup is safe to re-run:
334
- - Does not overwrite `workspace.md` or `constitution.md` if already present
335
- - Always regenerates `service-profiles.md` (fresh scan)
336
- - Always regenerates `settings.json` and `block-orchestrator-writes.sh` (security)
337
- - Templates are always copied
338
- - Global components are only updated if the version is newer
335
+ Both `init` and `update` are safe to re-run:
336
+ - **Never overwritten**: `workspace.md`, `constitution.md`, `plans/*.md` (user content)
337
+ - **Always regenerated**: `settings.json`, `block-orchestrator-writes.sh` (security), `CLAUDE.md`, `_TEMPLATE.md`
338
+ - **Always copied**: hooks, templates
339
+ - **Always regenerated on init**: `service-profiles.md` (fresh scan)
340
+ - **Global components**: only updated if the version is newer (or `--force`)
341
+
342
+ ---
343
+
344
+ ## Changelog v4.0.5 -> v4.1.0
345
+
346
+ | # | Feature | Detail |
347
+ |---|---------|--------|
348
+ | 1 | **Atomic commits** | Plan template splits tasks into commit-sized units (~300 lines max). Teammates commit as they go, not a single giant commit at the end. |
349
+ | 2 | **Progress tracker** | Plan includes a progress tracker table: commits planned vs done per service, visible at a glance. |
350
+ | 3 | **Commit strategy in spawn templates** | All teammate templates (backend, frontend, infra) include a mandatory commit strategy section with layer-by-layer split guidelines. |
351
+ | 4 | **Commit granularity enforcement** | Team-lead checks commit count vs plan, flags giant commits (>400 lines), requires split before accepting a wave. |
352
+ | 5 | **Teammate commit reporting** | Teammates report commits made (hash + message) alongside files and tests. |
339
353
 
340
354
  ---
341
355
 
package/bin/cli.js CHANGED
@@ -324,7 +324,7 @@ You clarify, plan, delegate, track.
324
324
 
325
325
  ## Security
326
326
  - \`disallowedTools: Bash\` — no direct shell
327
- - \`allowed-tools\` : Read, Write, Edit, Glob, Grep, Task, Teammate, SendMessage
327
+ - \`tools\` : Read, Write, Edit, Glob, Grep, Task(implementer, Explore), Teammate, SendMessage
328
328
  - Hook \`PreToolUse\` path-aware: allows orchestrator/, blocks sibling repos
329
329
 
330
330
  > settings.json contains env vars + hooks registration.
@@ -399,7 +399,7 @@ function planTemplateContent() {
399
399
  ## Impacted services
400
400
  | Service | Impacted | Branch | Teammate | Status |
401
401
  |---------|----------|--------|----------|--------|
402
- | | yes/no | | | ⏳ |
402
+ | | yes/no | feature/[name] | | ⏳ |
403
403
 
404
404
  ## Waves
405
405
  - Wave 1: [producers]
@@ -407,12 +407,33 @@ function planTemplateContent() {
407
407
  - Wave 3: [infra]
408
408
 
409
409
  ## API contract
410
- [Exact shapes]
410
+ [Exact request/response shapes for each endpoint]
411
411
 
412
412
  ## Tasks
413
413
 
414
414
  ### [service]
415
+
416
+ #### Commit 1: [data layer — models, migrations, DTOs]
417
+ - ⏳ [task]
415
418
  - ⏳ [task]
419
+ > ~N files, ~N lines
420
+
421
+ #### Commit 2: [business logic — use cases, services]
422
+ - ⏳ [task]
423
+ > ~N files, ~N lines
424
+
425
+ #### Commit 3: [API/UI layer — controllers, routes, components]
426
+ - ⏳ [task]
427
+ > ~N files, ~N lines
428
+
429
+ #### Commit 4: [tests]
430
+ - ⏳ [task]
431
+ > ~N files, ~N lines
432
+
433
+ ## Progress tracker
434
+ | Service | Commits planned | Commits done | Tests | Status |
435
+ |---------|:-:|:-:|:-:|:-:|
436
+ | | N | 0 | ⏳ | ⏳ |
416
437
 
417
438
  ## QA
418
439
  - ⏳ Cross-service check
@@ -424,6 +445,80 @@ function planTemplateContent() {
424
445
  `;
425
446
  }
426
447
 
448
+ // ─── Update local orchestrator/ components ──────────────────
449
+ // Called by `update` when run from a workspace that contains orchestrator/
450
+ // or from inside orchestrator/ itself.
451
+ function updateLocal() {
452
+ const cwd = process.cwd();
453
+ // Detect if we're inside orchestrator/ or in the parent workspace
454
+ let orchDir;
455
+ if (fs.existsSync(path.join(cwd, "workspace.md"))) {
456
+ orchDir = cwd; // inside orchestrator/
457
+ } else if (fs.existsSync(path.join(cwd, "orchestrator", "workspace.md"))) {
458
+ orchDir = path.join(cwd, "orchestrator");
459
+ } else {
460
+ return false; // no local orchestrator found
461
+ }
462
+
463
+ step(`Updating local: ${c.dim}${orchDir}${c.reset}`);
464
+ let count = 0;
465
+
466
+ // ── Hooks (always overwrite — security critical) ──
467
+ const hooksDir = path.join(orchDir, ".claude", "hooks");
468
+ if (fs.existsSync(hooksDir)) {
469
+ generateBlockHook(hooksDir);
470
+ count++;
471
+ const hooksSrc = path.join(SKILLS_DIR, "hooks");
472
+ if (fs.existsSync(hooksSrc)) {
473
+ for (const f of fs.readdirSync(hooksSrc)) {
474
+ if (!f.endsWith(".sh") || f === "verify-cycle-complete.sh") continue;
475
+ copyFile(path.join(hooksSrc, f), path.join(hooksDir, f));
476
+ fs.chmodSync(path.join(hooksDir, f), 0o755);
477
+ count++;
478
+ }
479
+ }
480
+ ok(`${count} hooks updated`);
481
+ }
482
+
483
+ // ── settings.json (always regenerate — hook registration) ──
484
+ const settingsPath = path.join(orchDir, ".claude", "settings.json");
485
+ if (fs.existsSync(path.join(orchDir, ".claude"))) {
486
+ generateSettings(orchDir);
487
+ ok("settings.json regenerated");
488
+ }
489
+
490
+ // ── Templates (always overwrite — reference docs) ──
491
+ const templatesDir = path.join(SKILLS_DIR, "templates");
492
+ const localTemplates = path.join(orchDir, "templates");
493
+ if (fs.existsSync(templatesDir) && fs.existsSync(localTemplates)) {
494
+ let tplCount = 0;
495
+ for (const f of fs.readdirSync(templatesDir)) {
496
+ if (f.endsWith(".md")) {
497
+ copyFile(path.join(templatesDir, f), path.join(localTemplates, f));
498
+ tplCount++;
499
+ }
500
+ }
501
+ ok(`${tplCount} templates updated`);
502
+ }
503
+
504
+ // ── CLAUDE.md (always overwrite — generated file, not user content) ──
505
+ const claudeMd = path.join(orchDir, "CLAUDE.md");
506
+ fs.writeFileSync(claudeMd, claudeMdContent());
507
+ ok("CLAUDE.md updated");
508
+
509
+ // ── Plan template (always overwrite — structure only) ──
510
+ const planTpl = path.join(orchDir, "plans", "_TEMPLATE.md");
511
+ if (fs.existsSync(path.join(orchDir, "plans"))) {
512
+ fs.writeFileSync(planTpl, planTemplateContent());
513
+ ok("_TEMPLATE.md updated");
514
+ }
515
+
516
+ // ── NEVER touch: workspace.md, constitution.md, plans/*.md, service-profiles.md ──
517
+ info(`${c.dim}workspace.md, constitution.md, plans/ — preserved${c.reset}`);
518
+
519
+ return true;
520
+ }
521
+
427
522
  // ─── Setup workspace ────────────────────────────────────────
428
523
  function setupWorkspace(workspacePath, projectName) {
429
524
  const wsAbs = path.resolve(workspacePath);
@@ -685,10 +780,15 @@ switch (command) {
685
780
  const force = args.includes("--force");
686
781
  log(BANNER);
687
782
  const updated = installGlobals(force);
688
- if (!updated) {
783
+ const localUpdated = (updated || force) ? updateLocal() : false;
784
+ if (!updated && !force) {
689
785
  log(`\n ${c.dim}Already up to date. Use --force to reinstall.${c.reset}\n`);
690
786
  } else {
691
- log(`\n ${c.green}${c.bold}Update complete.${c.reset}\n`);
787
+ if (localUpdated) {
788
+ log(`\n ${c.green}${c.bold}Update complete (globals + local orchestrator/).${c.reset}\n`);
789
+ } else {
790
+ log(`\n ${c.green}${c.bold}Update complete (globals only — no local orchestrator/ found).${c.reset}\n`);
791
+ }
692
792
  }
693
793
  break;
694
794
  }
@@ -721,7 +821,9 @@ switch (command) {
721
821
  log(` Installs global skills/rules/agents if version is newer.`);
722
822
  log("");
723
823
  log(` ${c.cyan}npx cc-workspace update${c.reset} ${c.dim}[--force]${c.reset}`);
724
- log(` Update global components to this package version.`);
824
+ log(` Update global components (skills, rules, agents).`);
825
+ log(` Also updates local orchestrator/ if found (hooks, settings, CLAUDE.md, templates).`);
826
+ log(` Never overwrites: workspace.md, constitution.md, plans/.`);
725
827
  log("");
726
828
  log(` ${c.cyan}npx cc-workspace doctor${c.reset}`);
727
829
  log(` Check all components are installed and consistent.`);
@@ -7,9 +7,8 @@ description: >
7
7
  (Agent Teams teammates get automatic isolation).
8
8
  isolation: worktree
9
9
  model: sonnet
10
- allowed-tools: Read, Write, Edit, MultiEdit, Bash, Glob, Grep
10
+ tools: Read, Write, Edit, MultiEdit, Bash, Glob, Grep
11
11
  memory: project
12
- effort: medium
13
12
  maxTurns: 50
14
13
  ---
15
14
 
@@ -6,10 +6,9 @@ description: >
6
6
  quality. Never codes in repos — can write in orchestrator/.
7
7
  Triggered via claude --agent team-lead.
8
8
  model: opus
9
- allowed-tools: Read, Write, Edit, Glob, Grep, Task, Teammate, SendMessage
9
+ tools: Read, Write, Edit, Glob, Grep, Task(implementer, Explore), Teammate, SendMessage
10
10
  disallowedTools: Bash
11
11
  memory: project
12
- effort: high
13
12
  maxTurns: 200
14
13
  hooks:
15
14
  PreToolUse:
@@ -79,11 +78,11 @@ The workflow depends on the chosen mode:
79
78
  - **Mode D**: phases 1-2 then ONE teammate only, no waves
80
79
 
81
80
  1. CLARIFY — ask the missing questions (max 5, formulated as choices)
82
- 2. PLAN — write the plan in markdown, wait for approval
81
+ 2. PLAN — write the plan in markdown with commit-sized task units, wait for approval
83
82
  3. DISPATCH — send teammates in waves (API/data first, frontend next)
84
- 4. COLLECT — update the plan with results
83
+ 4. COLLECT — update the plan with results, verify commit granularity
85
84
  5. VERIFY — cross-service check then QA ruthless
86
- 6. REPORT — present the summary, propose fixes
85
+ 6. REPORT — present the summary with commit inventory, propose fixes
87
86
 
88
87
  ## Dispatch mechanism — Agent Teams
89
88
 
@@ -100,12 +99,22 @@ For lightweight read-only tasks (scans, checks), you can use Task
100
99
  with Explore subagents (Haiku) — faster and cheaper.
101
100
  Explore subagents are read-only, they do NOT need a worktree.
102
101
 
102
+ ## Commit granularity enforcement
103
+
104
+ When collecting teammate reports:
105
+ - **Check commit count vs plan** — the plan defines N commit units, the teammate must have N+ commits
106
+ - **Flag giant commits** — any commit >400 lines gets flagged in the session log
107
+ - **If a teammate made a single commit for all tasks**: ask them to split via SendMessage
108
+ before accepting the wave as complete
109
+ - **Progress tracker** in the plan must be updated after each teammate report
110
+
103
111
  ## What you NEVER do
104
112
  - Write code in sibling repos (that's the teammates' job)
105
113
  - Modify a file in a repo (delegate via Agent Teams)
106
114
  - Guess when you can ask
107
115
  - Forget to include the full constitution in spawn prompts
108
116
  - Forget UX standards for frontend teammates
117
+ - Accept a single giant commit covering multiple tasks — enforce atomic commits
109
118
  - Let the context grow (compact after each cycle)
110
119
  - Launch wave 2 before wave 1 has reported
111
120
 
@@ -6,9 +6,8 @@ description: >
6
6
  Interactively configures workspace.md and constitution.md if [UNCONFIGURED].
7
7
  Run once via: claude --agent workspace-init
8
8
  model: sonnet
9
- allowed-tools: Read, Write, Edit, Bash, Glob, Grep, Task
9
+ tools: Read, Write, Edit, Bash, Glob, Grep, Task(Explore)
10
10
  memory: project
11
- effort: medium
12
11
  maxTurns: 80
13
12
  ---
14
13
 
@@ -7,6 +7,7 @@ description: >
7
7
  or when a repo is detected without CLAUDE.md during setup.
8
8
  argument-hint: "[repo-path]"
9
9
  context: fork
10
+ agent: general-purpose
10
11
  disable-model-invocation: true
11
12
  model: haiku
12
13
  allowed-tools: Read, Write, Glob, Grep, Bash
@@ -8,6 +8,7 @@ description: >
8
8
  "cross-service", "aligned", "pre-merge".
9
9
  argument-hint: "[feature-name]"
10
10
  context: fork
11
+ agent: general-purpose
11
12
  disable-model-invocation: true
12
13
  allowed-tools: Read, Write, Glob, Grep, Task
13
14
  ---
@@ -8,6 +8,7 @@ description: >
8
8
  "capitalize", "lessons learned", "what did we learn", "improve docs".
9
9
  argument-hint: "[feature-name]"
10
10
  context: fork
11
+ agent: general-purpose
11
12
  disable-model-invocation: true
12
13
  model: haiku
13
14
  allowed-tools: Read, Write, Glob, Grep, Task
@@ -63,6 +63,23 @@ Create `./plans/{feature-name}.md` using `./plans/_TEMPLATE.md`.
63
63
  Include: context, clarification answers, services impacted, dependency waves,
64
64
  detailed tasks per service, API contract (exact shapes), and autonomous choices if applicable.
65
65
 
66
+ ### Commit planning (mandatory)
67
+
68
+ For EACH service, break tasks into **commit-sized units** (~300 lines max each):
69
+ - **Commit 1**: Data layer — models, migrations, DTOs, repositories
70
+ - **Commit 2**: Business logic — use cases, services, validation
71
+ - **Commit 3**: API/UI layer — controllers, routes, components, pages
72
+ - **Commit 4**: Tests for the above
73
+
74
+ Each commit unit in the plan must:
75
+ - Have a descriptive title (becomes the commit message)
76
+ - List the specific tasks it covers
77
+ - Estimate ~N files, ~N lines
78
+ - Be independently compilable and testable
79
+
80
+ The plan also includes a **progress tracker** table summarizing commits planned
81
+ vs done per service, visible at a glance.
82
+
66
83
  ### Dependency waves
67
84
 
68
85
  - **Wave 1**: Producers — API backend, data/analytics, auth (define contracts)
@@ -127,11 +144,13 @@ Never mix: one teammate per repo per wave. No two teammates editing the same rep
127
144
  ## Phase 4: Collect and update
128
145
 
129
146
  On each teammate report:
130
- 1. Update `./plans/{feature-name}.md` — statuses ✅ or ❌
131
- 2. Note dead code found
132
- 3. If a teammate failed → analyze, correct plan, re-dispatch
133
- 4. **Session log** entry: `[HH:MM] teammate-[service]: [status], [N] files, tests [pass/fail]`
134
- 5. If current wave donelaunch next wave
147
+ 1. Update `./plans/{feature-name}.md` — statuses ✅ or ❌ per commit unit
148
+ 2. Update the **progress tracker** table (commits done / planned)
149
+ 3. Note dead code found
150
+ 4. Verify commit count and sizes — flag if a teammate made a single giant commit
151
+ 5. If a teammate failedanalyze, correct plan, re-dispatch
152
+ 6. **Session log** entry: `[HH:MM] teammate-[service]: [status], [N] commits, [N] files, tests [pass/fail]`
153
+ 7. If current wave done → launch next wave
135
154
 
136
155
  ## Phase 5: Post-implementation
137
156
 
@@ -28,3 +28,6 @@ Reference file for dispatch-feature. Loaded on-demand when Claude needs reminder
28
28
  | Plan has vague tasks like "implement feature" | Each task should have a clear input→output | Rewrite plan with specific tasks |
29
29
  | API contract has `{}` placeholder | Frontend can't build types | Complete the contract shapes before wave 2 |
30
30
  | Two teammates on same repo in same wave | Git conflicts guaranteed | Split into separate waves |
31
+ | Giant commit (500+ lines) | PR unreadable, impossible to review | Split into atomic commits (~300 lines max) per logical unit |
32
+ | Single commit at the end | All-or-nothing, no partial rollback | Commit after each logical unit — data, logic, API, tests |
33
+ | Task without commit boundary | Teammate guesses the split | Plan must define commit units per task |
@@ -27,10 +27,23 @@ You are teammate-[service]. Read the CLAUDE.md in your repo first.
27
27
  3. Use the LSP tool for code navigation (go-to-definition, find-references)
28
28
  4. Run the existing test suite — report pass/fail
29
29
  5. List any dead code created or exposed by your changes
30
- 6. Commit on branch feature/[name] with conventional commits
30
+ 6. **Atomic commits** follow the commit plan below
31
31
  7. If you hit an architectural decision NOT covered by the plan: STOP and
32
32
  report the dilemma instead of guessing
33
- 8. Report back: files created/modified, tests pass/fail, dead code found, blockers
33
+ 8. Report back: files created/modified, tests pass/fail, dead code found,
34
+ commits made (hash + message), blockers
35
+
36
+ ## Commit strategy (mandatory)
37
+ - **One commit per logical unit** — each task in "Your tasks" = one commit minimum
38
+ - **Max ~300 lines per commit** — if a task produces more, split it:
39
+ 1. Data layer first (models, migrations, DTOs, repositories)
40
+ 2. Business logic (use cases, services, validation)
41
+ 3. API layer (controllers, routes, requests)
42
+ 4. Tests for the above
43
+ - **Commit message format**: `feat(domain): description` or `fix(domain): description`
44
+ - **Each commit must compile and pass tests** — no broken intermediate states
45
+ - **Commit as you go** — do NOT accumulate all changes for a single final commit
46
+ - Branch: `feature/[name]` — create it on your first commit
34
47
  ```
35
48
 
36
49
  ## Frontend teammate spawn template
@@ -57,9 +70,23 @@ You are teammate-[service]. Read the CLAUDE.md in your repo first.
57
70
  4. Every new component MUST handle 4 states: skeleton loader, empty+CTA, error+retry, success
58
71
  5. Run the existing test suite — report pass/fail
59
72
  6. List any dead code (unused components, composables, store actions, CSS)
60
- 7. Commit on branch feature/[name] with conventional commits
73
+ 7. **Atomic commits** follow the commit plan below
61
74
  8. If you hit an architectural decision NOT covered by the plan: STOP and escalate
62
- 9. Report back: files created/modified, tests pass/fail, dead code found, UX compliance, blockers
75
+ 9. Report back: files created/modified, tests pass/fail, dead code found,
76
+ UX compliance, commits made (hash + message), blockers
77
+
78
+ ## Commit strategy (mandatory)
79
+ - **One commit per logical unit** — each task = one commit minimum
80
+ - **Max ~300 lines per commit** — if a task produces more, split it:
81
+ 1. Types/interfaces and API service layer
82
+ 2. Store/composables (state management)
83
+ 3. Components (one commit per complex component)
84
+ 4. Page integration + routing
85
+ 5. Tests for the above
86
+ - **Commit message format**: `feat(domain): description` or `fix(domain): description`
87
+ - **Each commit must compile and pass tests** — no broken intermediate states
88
+ - **Commit as you go** — do NOT accumulate all changes for a single final commit
89
+ - Branch: `feature/[name]` — create it on your first commit
63
90
  ```
64
91
 
65
92
  ## Infra/Config teammate spawn template
@@ -78,13 +105,18 @@ You are teammate-[service]. Read the CLAUDE.md in your repo first.
78
105
  2. Implement the configuration changes following the full constitution
79
106
  3. Verify consistency with other services (env vars, routes, schemas)
80
107
  4. No code changes — only configuration
81
- 5. Commit on branch feature/[name]
82
- 6. If you hit an architectural decision NOT covered by the plan: STOP and escalate
83
- 7. Report back: files modified, consistency check results, blockers
108
+ 5. **Atomic commits** one commit per logical config change
109
+ 6. Commit message format: `chore(service): description`
110
+ 7. If you hit an architectural decision NOT covered by the plan: STOP and escalate
111
+ 8. Report back: files modified, consistency check results,
112
+ commits made (hash + message), blockers
113
+ - Branch: `feature/[name]`
84
114
  ```
85
115
 
86
116
  ## Explore/Haiku subagent template (read-only)
87
117
 
118
+ Use `Task` with `subagent_type: Explore` and `model: haiku` for lightweight scans.
119
+
88
120
  ```
89
121
  You are an explorer scanning [target]. Read-only — do NOT modify any files.
90
122
 
@@ -94,3 +126,11 @@ You are an explorer scanning [target]. Read-only — do NOT modify any files.
94
126
  ## Report format
95
127
  [what to extract and how to format the findings]
96
128
  ```
129
+
130
+ ## Failure handling
131
+
132
+ When a teammate reports back:
133
+ - **Test regression or missing file** (recoverable): fix plan, re-dispatch ONCE
134
+ - **Architectural decision not in plan** (blocking): STOP the wave, escalate to user
135
+ - **No report after extended time**: send a status request via SendMessage
136
+ - **Max re-dispatches per teammate per wave**: 2. After that, escalate to user.
@@ -7,6 +7,7 @@ description: >
7
7
  "prepare merge", "merge-prep", "ready to merge".
8
8
  argument-hint: "[feature-name]"
9
9
  context: fork
10
+ agent: general-purpose
10
11
  disable-model-invocation: true
11
12
  allowed-tools: Read, Write, Glob, Grep, Bash, Task
12
13
  ---
@@ -7,6 +7,7 @@ description: >
7
7
  Use when a plan was just written or user says "review plan", "vérifie le plan".
8
8
  argument-hint: "[plan-name.md]"
9
9
  context: fork
10
+ agent: Explore
10
11
  disable-model-invocation: true
11
12
  model: haiku
12
13
  allowed-tools: Read, Glob, Grep
@@ -5,6 +5,7 @@ description: >
5
5
  listed in workspace.md. Use when conventions changed, or user says
6
6
  "refresh profiles", "update profiles", "re-read CLAUDE.md files".
7
7
  context: fork
8
+ agent: Explore
8
9
  disable-model-invocation: true
9
10
  model: haiku
10
11
  allowed-tools: Read, Write, Glob, Grep
@@ -12,7 +12,7 @@ If you write code for a repo (not a markdown plan), you have failed — delegate
12
12
 
13
13
  ## Security layers (3 layers in agent frontmatter — no settings.json pollution)
14
14
  1. **Agent frontmatter**: `disallowedTools` — refused at model level
15
- 2. **Agent frontmatter**: `allowed-tools` — whitelist of permitted tools
15
+ 2. **Agent frontmatter**: `tools` — whitelist of permitted tools (note: `allowed-tools` is for skills only)
16
16
  3. **Agent hook**: `PreToolUse` in frontmatter — structured deny response
17
17
 
18
18
  ## Routing table
@@ -24,18 +24,6 @@ If you write code for a repo (not a markdown plan), you have failed — delegate
24
24
  | Explorers / cross-checks | **Haiku** | `model: haiku` in skill/agent frontmatter |
25
25
  | Plan review | **Haiku** | `model: haiku` in skill frontmatter |
26
26
 
27
- ## Effort levels
28
- | Role | Effort | Rationale |
29
- |------|--------|-----------|
30
- | Orchestrator (team-lead) | **high** | Complex planning, multi-step reasoning |
31
- | Implementation teammates | **medium** | Focused implementation, clear scope |
32
- | QA investigators | **medium** | Thorough but bounded analysis |
33
- | Explorers / cross-checks (Haiku) | **low** | Fast scans, read-only |
34
- | Plan review (Haiku) | **low** | Structural checks, no deep reasoning |
35
-
36
- Effort levels are set in agent frontmatter (`effort: high|medium|low|max`).
37
- Use `max` only for critical debugging or complex architectural decisions.
38
-
39
27
  ## Custom agent `implementer`
40
28
  For Task subagents that need to write code in an isolated worktree,
41
29
  use `@implementer` (frontmatter with `isolation: worktree`).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cc-workspace",
3
- "version": "4.0.4",
3
+ "version": "4.1.0",
4
4
  "description": "Claude Code multi-workspace orchestrator — skills, hooks, agents, and templates for multi-service projects",
5
5
  "bin": {
6
6
  "cc-workspace": "./bin/cli.js"