@sulhadin/orchestrator 3.1.1 → 3.1.3

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 (25) hide show
  1. package/bin/build-template.js +9 -2
  2. package/bin/index.js +4 -5
  3. package/package.json +1 -1
  4. package/template/.claude-plugin/plugin.json +1 -1
  5. package/template/.orchestra/README.md +2 -2
  6. package/template/.orchestra/roles/orchestrator.md +1 -1
  7. package/template/.orchestra/roles/product-manager.md +4 -4
  8. package/template/CLAUDE.md +1 -1
  9. package/template/agents/conductor.md +1 -1
  10. package/template/commands/help.md +1 -1
  11. package/template/rules/role-boundaries.orchestra.md +1 -1
  12. /package/template/skills/{accessibility.orchestra.md → accessibility/SKILL.md} +0 -0
  13. /package/template/skills/{auth-setup.orchestra.md → auth-setup/SKILL.md} +0 -0
  14. /package/template/skills/{best-practices.orchestra.md → best-practices/SKILL.md} +0 -0
  15. /package/template/skills/{code-optimizer.orchestra.md → code-optimizer/SKILL.md} +0 -0
  16. /package/template/skills/{core-web-vitals.orchestra.md → core-web-vitals/SKILL.md} +0 -0
  17. /package/template/skills/{crud-api.orchestra.md → crud-api/SKILL.md} +0 -0
  18. /package/template/skills/{debug.orchestra.md → debug/SKILL.md} +0 -0
  19. /package/template/skills/{deployment.orchestra.md → deployment/SKILL.md} +0 -0
  20. /package/template/skills/{frontend-design.orchestra.md → frontend-design/SKILL.md} +0 -0
  21. /package/template/skills/{fullstack-infrastructure.orchestra.md → fullstack-infrastructure/SKILL.md} +0 -0
  22. /package/template/skills/{react-best-practices.orchestra.md → react-best-practices/SKILL.md} +0 -0
  23. /package/template/skills/{review.orchestra.md → review/SKILL.md} +0 -0
  24. /package/template/skills/{testing.orchestra.md → testing/SKILL.md} +0 -0
  25. /package/template/skills/{web-quality-audit.orchestra.md → web-quality-audit/SKILL.md} +0 -0
@@ -14,6 +14,9 @@ const DEV_ONLY_AGENTS = new Set([
14
14
  "repo-deep-analyzer.md",
15
15
  ]);
16
16
 
17
+ // Dev-only skills that should NOT be published to users
18
+ const DEV_ONLY_SKILLS = new Set(["ship"]);
19
+
17
20
  // Plugin manifest
18
21
  const PLUGIN_MANIFEST = {
19
22
  name: "orchestra",
@@ -31,7 +34,11 @@ const SYSTEM_PATHS = [
31
34
  { src: ".claude/agents", dest: "agents", filter: (f) => !DEV_ONLY_AGENTS.has(f) },
32
35
  { src: ".claude/commands/orchestra", dest: "commands" },
33
36
  { src: ".claude/rules", dest: "rules", filter: (f) => f.endsWith(".orchestra.md") },
34
- { src: ".claude/skills", dest: "skills", filter: (f) => f.endsWith(".orchestra.md") },
37
+ { src: ".claude/skills", dest: "skills", filter: (f) => {
38
+ if (DEV_ONLY_SKILLS.has(f)) return false;
39
+ const skillDir = path.join(rootDir, ".claude/skills", f);
40
+ return fs.statSync(skillDir).isDirectory() && fs.existsSync(path.join(skillDir, "SKILL.md"));
41
+ }},
35
42
  { src: ".orchestra/roles", dest: ".orchestra/roles" },
36
43
  { src: ".orchestra/blueprints", dest: ".orchestra/blueprints" },
37
44
  { src: ".orchestra/config.yml", dest: ".orchestra/config.yml" },
@@ -75,7 +82,7 @@ function copyRecursive(src, dest, filter = null) {
75
82
  if (fs.existsSync(fullEntryDest)) fs.unlinkSync(fullEntryDest);
76
83
  fs.symlinkSync(linkTarget, fullEntryDest);
77
84
  } else if (entry.isDirectory()) {
78
- copyRecursive(entrySrc, entryDest, filter);
85
+ copyRecursive(entrySrc, entryDest);
79
86
  } else {
80
87
  fs.copyFileSync(fullEntrySrc, fullEntryDest);
81
88
  }
package/bin/index.js CHANGED
@@ -230,8 +230,8 @@ function extractOrchestraSection(content) {
230
230
 
231
231
  /**
232
232
  * Smart merge for user directories (skills, rules, blueprints):
233
- * - .orchestra.md files = system files → always updated from template
234
- * - other .md files = user files → preserved
233
+ * - entries present in template = system files → always updated from template
234
+ * - entries not in template = user files → preserved
235
235
  */
236
236
  function smartMergeDir(backupPath, restorePath, templateDirPath) {
237
237
  const templateFiles = fs.existsSync(templateDirPath)
@@ -241,9 +241,8 @@ function smartMergeDir(backupPath, restorePath, templateDirPath) {
241
241
  let restored = 0;
242
242
 
243
243
  for (const file of backupFiles) {
244
- // User-created files: not in template AND not .orchestra.md
245
- const isOrchestraFile = file.endsWith(".orchestra.md");
246
- if (!templateFiles.includes(file) && !isOrchestraFile) {
244
+ // User-created entries: not in template preserve
245
+ if (!templateFiles.includes(file)) {
247
246
  const srcFile = path.join(backupPath, file);
248
247
  const destFile = path.join(restorePath, file);
249
248
  if (fs.statSync(srcFile).isDirectory()) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sulhadin/orchestrator",
3
- "version": "3.1.1",
3
+ "version": "3.1.3",
4
4
  "description": "AI Team Orchestration System — multi-role coordination for Claude Code",
5
5
  "bin": "bin/index.js",
6
6
  "scripts": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "orchestra",
3
3
  "description": "AI Team Orchestration — multi-role coordination with milestones, phases, and quality gates for Claude Code",
4
- "version": "3.1.1",
4
+ "version": "3.1.3",
5
5
  "author": {
6
6
  "name": "Sulhadin Öney"
7
7
  },
@@ -262,7 +262,7 @@ No role may create, edit, delete, or modify these files:
262
262
  - `.orchestra/blueprints/`
263
263
  - `.claude/agents/conductor.md`, `.claude/agents/reviewer.md`
264
264
  - `.claude/rules/*.orchestra.md`
265
- - `.claude/skills/*.orchestra.md`
265
+ - `.claude/skills/*/SKILL.md`
266
266
  - `.claude/commands/orchestra/`
267
267
  - `CLAUDE.md`
268
268
  - `docs/`
@@ -288,7 +288,7 @@ Each role has exclusive write access to specific directories:
288
288
 
289
289
  | Role | Owns (can write) | Reads |
290
290
  |------|-------------------|-------|
291
- | orchestrator | `.orchestra/roles/*`, `.orchestra/config.yml`, `.orchestra/README.md`, `.orchestra/blueprints/`, `CLAUDE.md`, `.claude/agents/`, `.claude/skills/*.orchestra.md`, `.claude/rules/*.orchestra.md`, `.claude/commands/orchestra/`, `.orchestra/knowledge.md`, `docs/` | Everything |
291
+ | orchestrator | `.orchestra/roles/*`, `.orchestra/config.yml`, `.orchestra/README.md`, `.orchestra/blueprints/`, `CLAUDE.md`, `.claude/agents/`, `.claude/skills/*/SKILL.md`, `.claude/rules/*.orchestra.md`, `.claude/commands/orchestra/`, `.orchestra/knowledge.md`, `docs/` | Everything |
292
292
  | product-manager | `.orchestra/milestones/*` (prd.md, milestone.md, grooming.md, phases) | Everything |
293
293
  | architect | `.orchestra/milestones/*/rfc.md`, `.orchestra/milestones/*/architecture.md`, `.orchestra/milestones/*/adrs/*`, project configs | Everything |
294
294
  | backend-engineer | Defined by PM in phase scope (typically `src/`, `tests/`, `migrations/`) | `.orchestra/milestones/*/phases/*` |
@@ -21,7 +21,7 @@ You are NOT above the system — you ARE the system.
21
21
  | Edit CLAUDE.md | `CLAUDE.md` |
22
22
  | Edit conductor/reviewer agents | `.claude/agents/conductor.md`, `.claude/agents/reviewer.md` |
23
23
  | Create/edit rules | `.claude/rules/*.orchestra.md` |
24
- | Create/edit skills | `.claude/skills/*.orchestra.md` |
24
+ | Create/edit skills | `.claude/skills/*/SKILL.md` |
25
25
  | Create/edit blueprints | `.orchestra/blueprints/*.md` |
26
26
  | Create/edit commands | `.claude/commands/orchestra/*.md` |
27
27
  | Edit knowledge log | `.orchestra/knowledge.md` |
@@ -75,11 +75,11 @@ summary: {2-3 sentences}
75
75
  ```
76
76
 
77
77
  **Process:**
78
- 1. If **approved** → proceed, milestone is ready for conductor
78
+ 1. If **approved** → proceed, milestone is ready
79
79
  2. If **changes-requested** → PM reads issues, fixes milestone files, re-launches reviewer
80
80
  3. After max rounds with no blocking issues → proceed with suggestions logged in grooming.md
81
81
  4. After max rounds with blocking issues still open → escalate to user, do NOT proceed
82
- 5. Present verdict to user before finalizing
82
+ 5. Present verdict to user. When ready, tell them: "You can run `/orchestra:start` in a second terminal to begin execution."
83
83
 
84
84
  ### milestone.md Format
85
85
 
@@ -103,8 +103,8 @@ role: backend-engineer | frontend-engineer | architect | adaptive
103
103
  status: pending | in-progress | done | failed
104
104
  order: 1
105
105
  complexity: standard # trivial | quick | standard | complex — conductor uses this for model selection
106
- skills: []
107
- depends_on: []
106
+ skills: [] # list .claude/skills/, assign relevant ones by name
107
+ depends_on: []
108
108
  ---
109
109
 
110
110
  ## Objective
@@ -44,7 +44,7 @@ Role IDs: orchestrator, product-manager, architect, backend-engineer, frontend-e
44
44
  - Two-terminal model: PM plans in one terminal, conductor executes in another
45
45
  - Each role writes only to its ownership scope (defined in role file)
46
46
  - Rules (`.claude/rules/*.orchestra.md`) auto-loaded. Skills loaded per phase.
47
- - **PROTECTED:** Non-Orchestrator roles NEVER modify `.orchestra/roles/`, `.orchestra/config.yml`, `.orchestra/README.md`, `.orchestra/blueprints/`, `.claude/agents/`, `.claude/rules/*.orchestra.md`, `.claude/skills/*.orchestra.md`, `.claude/commands/orchestra/`, `CLAUDE.md`, or `docs/`.
47
+ - **PROTECTED:** Non-Orchestrator roles NEVER modify `.orchestra/roles/`, `.orchestra/config.yml`, `.orchestra/README.md`, `.orchestra/blueprints/`, `.claude/agents/`, `.claude/rules/*.orchestra.md`, `.claude/skills/*/SKILL.md`, `.claude/commands/orchestra/`, `CLAUDE.md`, or `docs/`.
48
48
 
49
49
  ## Development
50
50
 
@@ -76,7 +76,7 @@ Cache role/skills content in conductor context — don't re-read for consecutive
76
76
  phases with the same role.
77
77
 
78
78
  1. Read `.orchestra/roles/{role}.md` → role_content (skip if same role as previous phase)
79
- 2. Read skill files from phase → skills_content (skip already-read skills)
79
+ 2. Read skill files from phase `.claude/skills/{name}/SKILL.md` → skills_content (skip already-read skills)
80
80
  3. Read phase file → phase_content
81
81
  4. Extract verification commands from config.yml (read once at startup, reuse)
82
82
  5. Read codebase map from context.md (if exists) → codebase_map
@@ -40,7 +40,7 @@ CONFIG:
40
40
 
41
41
  FILES:
42
42
  .claude/agents/ Conductor + Reviewer agents
43
- .claude/skills/*.orchestra.md Domain checklists (auth, CRUD, deploy, etc.)
43
+ .claude/skills/*/SKILL.md Domain checklists (auth, CRUD, deploy, etc.)
44
44
  .claude/rules/*.orchestra.md Discipline rules (verification, commit format, etc.)
45
45
  .claude/commands/orchestra/ Orchestra commands
46
46
  .orchestra/roles/ Role identities (one file per role)
@@ -6,7 +6,7 @@ Before writing ANY file, check your role's ownership scope.
6
6
 
7
7
  | Role | Can Write | Everything Else |
8
8
  |------|-----------|----------------|
9
- | Orchestrator | `.orchestra/roles/`, `.orchestra/config.yml`, `.orchestra/README.md`, `.orchestra/blueprints/`, `.claude/agents/`, `.claude/rules/*.orchestra.md`, `.claude/skills/*.orchestra.md`, `.claude/commands/orchestra/`, `CLAUDE.md`, `docs/` | Refuse |
9
+ | Orchestrator | `.orchestra/roles/`, `.orchestra/config.yml`, `.orchestra/README.md`, `.orchestra/blueprints/`, `.claude/agents/`, `.claude/rules/*.orchestra.md`, `.claude/skills/*/SKILL.md`, `.claude/commands/orchestra/`, `CLAUDE.md`, `docs/` | Refuse |
10
10
  | PM | `.orchestra/milestones/*` (prd, milestone, grooming, phases) | Refuse |
11
11
  | Conductor | `.orchestra/milestones/*/context.md`, `.orchestra/knowledge.md` (append) | Refuse |
12
12
  | Backend/Frontend/Architect/Adaptive | Only what phase `scope:` defines | Refuse |