llm-orchestrator 1.0.5 → 1.0.6

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "llm-orchestrator",
3
3
  "description": "Write /task once — it plans the work, shards it across parallel subagents, gates every phase and verifies before claiming done. Claude Code, Codex, OpenCode, Kilo.",
4
- "version": "1.0.5",
4
+ "version": "1.0.6",
5
5
  "author": {
6
6
  "name": "Bogdan-Gabriel Torcescu",
7
7
  "url": "https://www.linkedin.com/in/bogdantorcescu/"
package/README.md CHANGED
@@ -282,7 +282,7 @@ Same five steps for every harness; only the skills root and the reload differ.
282
282
  node bin/llm-orchestrator.mjs install --project /path/to/app --harness <harness>
283
283
  ```
284
284
  3. **Apply** the same command with `--apply`. Re-running is idempotent; a file you edited by hand is reported as a conflict, never overwritten.
285
- 4. **Add project bindings** to `/path/to/app/AGENTS.md` (template below, or run `init --apply` to append it automatically when the section is missing). The core reads this section on every task; without it the core still runs with its generic matrix.
285
+ 4. **Add project bindings** to `/path/to/app/AGENTS.md` (template below, or run `init --apply` to append it automatically when the section is missing). `install` reports `bindings.present` and, when false, the exact `init --apply` command. The core reads this section on every task; without it the core still runs with its generic matrix.
286
286
  5. **Verify and reload**: `node bin/llm-orchestrator.mjs doctor --project /path/to/app --harness <harness>` must list every mandatory core tool as `present` (or as a declared gap with an install hint). Then reload the harness session so the skill catalog is refreshed.
287
287
 
288
288
  `node bin/llm-orchestrator.mjs init --project /path/to/app` runs steps 2, 4 (report only) and 5 together, before you commit to a harness — it proposes `--harness` from what it detects, shows the same dry-run plan, and lists exactly which of the 8 mandatory tools are missing with an install command for each.
package/bin/install.mjs CHANGED
@@ -39,7 +39,15 @@ try {
39
39
  if (options.apply && options.linkClaude && (!result.conflicts || result.conflicts.length === 0) && options.harnesses.includes('claude')) {
40
40
  claudeSymlink = await linkClaudeSkillsRoot(options.skillsRoot);
41
41
  }
42
- process.stdout.write(`${JSON.stringify({...result, files: result.files?.map(({absolutePath, content, ...file}) => file), ...(claudeSymlink ? {claudeSymlink} : {})}, null, 2)}\n`);
42
+ // `install` never writes the project bindings section only `init --apply`
43
+ // does — so say so here, or a user who only ever runs `install` never learns
44
+ // the section exists and the core runs on its generic matrix forever.
45
+ const {agentsMdHasBindings, cliInvocation, BINDINGS_HEADING} = await import('../lib/first-run.mjs');
46
+ const bindingsPresent = await agentsMdHasBindings(options.project);
47
+ const bindings = bindingsPresent
48
+ ? {present: true}
49
+ : {present: false, section: BINDINGS_HEADING, next: `${cliInvocation()} init --project ${options.project} --apply`};
50
+ process.stdout.write(`${JSON.stringify({...result, files: result.files?.map(({absolutePath, content, ...file}) => file), ...(claudeSymlink ? {claudeSymlink} : {}), bindings}, null, 2)}\n`);
43
51
  if (result.conflicts?.length) process.exitCode = 2;
44
52
  }
45
53
  } catch (error) {
package/lib/first-run.mjs CHANGED
@@ -197,7 +197,7 @@ Generic rules live in \`orchestrate-core\`; this section only adds or tightens.
197
197
  **Agent defaults:** \`<role>\` → \`<tier>\` (W T0–T1 / S T2 / S T3 / X T3 …).
198
198
  `;
199
199
 
200
- async function agentsMdHasBindings(project) {
200
+ export async function agentsMdHasBindings(project) {
201
201
  try {
202
202
  const text = await readFile(join(project, 'AGENTS.md'), 'utf8');
203
203
  return text.includes(BINDINGS_HEADING);
@@ -215,8 +215,10 @@ async function agentsMdHasBindings(project) {
215
215
  * clone, the bare bin name when installed from npm (global or `npx`).
216
216
  */
217
217
  export function cliInvocation(argv = process.argv) {
218
+ // The unified CLI forwards by rewriting argv[1] to the subcommand script, so
219
+ // any script under this checkout's bin/ counts as "run from the clone".
218
220
  const script = argv[1] ? resolve(argv[1]) : '';
219
- const fromClone = script === resolve(process.cwd(), 'bin', 'llm-orchestrator.mjs');
221
+ const fromClone = script.startsWith(resolve(process.cwd(), 'bin') + '/');
220
222
  return fromClone ? 'node bin/llm-orchestrator.mjs' : 'llm-orchestrator';
221
223
  }
222
224
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "llm-orchestrator",
3
- "version": "1.0.5",
3
+ "version": "1.0.6",
4
4
  "description": "Write /task once — it plans the work, shards it across parallel subagents, gates every phase and verifies before claiming done. Claude Code, Codex, OpenCode, Kilo.",
5
5
  "type": "module",
6
6
  "engines": {