@sulhadin/orchestrator 3.1.2 → 3.1.4

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 +14 -8
  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 +2 -2
  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,9 @@ 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
+ * - .orchestra.md files = legacy system files → skip (backward compat)
235
+ * - remaining entries = user files → preserved
235
236
  */
236
237
  function smartMergeDir(backupPath, restorePath, templateDirPath) {
237
238
  const templateFiles = fs.existsSync(templateDirPath)
@@ -241,17 +242,22 @@ function smartMergeDir(backupPath, restorePath, templateDirPath) {
241
242
  let restored = 0;
242
243
 
243
244
  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) {
247
- const srcFile = path.join(backupPath, file);
245
+ // Skip system entries: in template OR legacy .orchestra.md files
246
+ if (templateFiles.includes(file) || file.endsWith(".orchestra.md")) continue;
247
+
248
+ const srcFile = path.join(backupPath, file);
249
+ try {
250
+ const stat = fs.lstatSync(srcFile);
248
251
  const destFile = path.join(restorePath, file);
249
- if (fs.statSync(srcFile).isDirectory()) {
252
+ if (stat.isDirectory()) {
250
253
  copyDirRecursive(srcFile, destFile);
251
- } else {
254
+ } else if (stat.isFile()) {
252
255
  fs.copyFileSync(srcFile, destFile);
253
256
  }
257
+ // Skip broken symlinks and other non-regular entries
254
258
  restored++;
259
+ } catch {
260
+ // Entry inaccessible — skip silently
255
261
  }
256
262
  }
257
263
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sulhadin/orchestrator",
3
- "version": "3.1.2",
3
+ "version": "3.1.4",
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.2",
4
+ "version": "3.1.4",
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` |
@@ -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 |