@jaggerxtrm/specialists 3.4.4 → 3.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.
Files changed (34) hide show
  1. package/README.md +1 -0
  2. package/config/hooks/specialists-session-start.mjs +13 -28
  3. package/config/presets.json +26 -0
  4. package/config/skills/specialists-creator/SKILL.md +323 -145
  5. package/config/skills/specialists-creator/scripts/scaffold-specialist.ts +228 -0
  6. package/config/skills/using-specialists/SKILL.md +641 -183
  7. package/config/specialists/debugger.specialist.json +74 -0
  8. package/config/specialists/executor.specialist.json +117 -0
  9. package/config/specialists/explorer.specialist.json +82 -0
  10. package/config/specialists/memory-processor.specialist.json +64 -0
  11. package/config/specialists/node-coordinator.specialist.json +315 -0
  12. package/config/specialists/overthinker.specialist.json +65 -0
  13. package/config/specialists/parallel-review.specialist.json +65 -0
  14. package/config/specialists/planner.specialist.json +93 -0
  15. package/config/specialists/researcher.specialist.json +64 -0
  16. package/config/specialists/reviewer.specialist.json +60 -0
  17. package/config/specialists/specialists-creator.specialist.json +68 -0
  18. package/config/specialists/sync-docs.specialist.json +80 -0
  19. package/config/specialists/test-runner.specialist.json +67 -0
  20. package/config/specialists/xt-merge.specialist.json +60 -0
  21. package/dist/index.js +9242 -2331
  22. package/package.json +5 -3
  23. package/config/specialists/debugger.specialist.yaml +0 -121
  24. package/config/specialists/executor.specialist.yaml +0 -257
  25. package/config/specialists/explorer.specialist.yaml +0 -85
  26. package/config/specialists/memory-processor.specialist.yaml +0 -154
  27. package/config/specialists/overthinker.specialist.yaml +0 -76
  28. package/config/specialists/parallel-review.specialist.yaml +0 -75
  29. package/config/specialists/planner.specialist.yaml +0 -94
  30. package/config/specialists/reviewer.specialist.yaml +0 -142
  31. package/config/specialists/specialists-creator.specialist.yaml +0 -90
  32. package/config/specialists/sync-docs.specialist.yaml +0 -68
  33. package/config/specialists/test-runner.specialist.yaml +0 -65
  34. package/config/specialists/xt-merge.specialist.yaml +0 -159
package/README.md CHANGED
@@ -81,6 +81,7 @@ specialists doctor
81
81
  | xtrm / worktree integration | [docs/worktree.md](docs/worktree.md) |
82
82
  | RPC mode notes | [docs/pi-rpc.md](docs/pi-rpc.md) |
83
83
  | Pi subprocess isolation and extensions | [docs/pi-session.md](docs/pi-session.md) |
84
+ | NodeSupervisor architecture, node lifecycle, and `sp node` CLI | [docs/nodes.md](docs/nodes.md) |
84
85
 
85
86
  ## Project structure
86
87
 
@@ -1,7 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  // specialists-session-start — Claude Code SessionStart hook
3
3
  // Injects specialists context at the start of every session:
4
- // • using-specialists skill (behavioral delegation guide)
5
4
  // • Active background jobs (if any)
6
5
  // • Available specialists list
7
6
  // • Key CLI commands reminder
@@ -11,25 +10,13 @@
11
10
 
12
11
  import { existsSync, readdirSync, readFileSync } from 'node:fs';
13
12
  import { join } from 'node:path';
14
-
13
+ import { homedir } from 'node:os';
15
14
 
16
15
  const cwd = process.env.CLAUDE_PROJECT_DIR ?? process.cwd();
16
+ const HOME = homedir();
17
17
  const jobsDir = join(cwd, '.specialists', 'jobs');
18
18
  const lines = [];
19
19
 
20
- // ── 0. using-specialists skill ─────────────────────────────────────────────
21
- // Inject the behavioral delegation guide so Claude knows when and how to
22
- // use specialists without waiting for the user to ask.
23
- const skillPath = join(cwd, '.specialists', 'default', 'skills', 'using-specialists', 'SKILL.md');
24
- if (existsSync(skillPath)) {
25
- const raw = readFileSync(skillPath, 'utf-8');
26
- // Strip YAML frontmatter (--- ... ---) if present
27
- const content = raw.startsWith('---')
28
- ? raw.replace(/^---[\s\S]*?---\n?/, '').trimStart()
29
- : raw;
30
- lines.push(content);
31
- }
32
-
33
20
  // ── 1. Active background jobs ──────────────────────────────────────────────
34
21
  if (existsSync(jobsDir)) {
35
22
  let entries = [];
@@ -72,20 +59,21 @@ function readSpecialistNames(dir) {
72
59
  }
73
60
  }
74
61
 
75
- const defaultNames = readSpecialistNames(join(cwd, '.specialists', 'default', 'specialists'));
76
- const userNames = readSpecialistNames(join(cwd, '.specialists', 'user', 'specialists'));
62
+ const projectNames = readSpecialistNames(join(cwd, 'specialists'));
63
+ const userNames = readSpecialistNames(join(HOME, '.agents', 'specialists'));
77
64
 
78
- // User takes precedence on name collision; merge and sort
79
- const allNames = [...new Set([...userNames, ...defaultNames])].sort();
65
+ // Merge, deduplicate, sort
66
+ const allNames = [...new Set([...projectNames, ...userNames])].sort();
80
67
 
81
68
  if (allNames.length > 0) {
82
69
  lines.push('## Specialists — Available');
83
70
  lines.push('');
84
- if (defaultNames.length > 0) {
85
- lines.push(`default (${defaultNames.length}): ${defaultNames.join(', ')}`);
71
+ if (projectNames.length > 0) {
72
+ lines.push(`project (${projectNames.length}): ${projectNames.join(', ')}`);
86
73
  }
87
74
  if (userNames.length > 0) {
88
- const extraUser = userNames.filter(n => !defaultNames.includes(n));
75
+ // Only show user-scope names not already in project
76
+ const extraUser = userNames.filter(n => !projectNames.includes(n));
89
77
  if (extraUser.length > 0) {
90
78
  lines.push(`user (${extraUser.length}): ${extraUser.join(', ')}`);
91
79
  }
@@ -99,8 +87,7 @@ lines.push('');
99
87
  lines.push('```');
100
88
  lines.push('specialists list # discover available specialists');
101
89
  lines.push('specialists run <name> --prompt "..." # run foreground (streams output)');
102
- lines.push('process start "specialists run <name> --prompt "..."" name="sp-<name>" # async via process extension');
103
- lines.push('specialists run <name> --prompt "..." # foreground stream');
90
+ lines.push('specialists run <name> --prompt "..." # run; job ID prints on stderr');
104
91
  lines.push('specialists feed <job-id> --follow # tail live events');
105
92
  lines.push('specialists result <job-id> # read final output');
106
93
  lines.push('specialists status # system health');
@@ -113,8 +100,6 @@ lines.push('MCP tools: use_specialist (foreground only)');
113
100
  if (lines.length === 0) process.exit(0);
114
101
 
115
102
  process.stdout.write(JSON.stringify({
116
- hookSpecificOutput: {
117
- hookEventName: 'SessionStart',
118
- additionalSystemPrompt: lines.join('\n'),
119
- },
103
+ type: 'inject',
104
+ content: lines.join('\n'),
120
105
  }) + '\n');
@@ -0,0 +1,26 @@
1
+ {
2
+ "cheap": {
3
+ "description": "Low-cost, fast responses — best for exploration and simple tasks",
4
+ "fields": {
5
+ "specialist.execution.model": "dashscope/qwen3.5-plus",
6
+ "specialist.execution.thinking_level": "off",
7
+ "specialist.execution.stall_timeout_ms": 60000
8
+ }
9
+ },
10
+ "medium": {
11
+ "description": "Balanced cost/quality — good default for most tasks",
12
+ "fields": {
13
+ "specialist.execution.model": "anthropic/claude-sonnet-4-6",
14
+ "specialist.execution.thinking_level": "low",
15
+ "specialist.execution.stall_timeout_ms": 120000
16
+ }
17
+ },
18
+ "power": {
19
+ "description": "Maximum capability — complex implementation and reasoning",
20
+ "fields": {
21
+ "specialist.execution.model": "openai-codex/gpt-5.4",
22
+ "specialist.execution.thinking_level": "high",
23
+ "specialist.execution.stall_timeout_ms": 300000
24
+ }
25
+ }
26
+ }