@adamancyzhang/claude-orchestrator 0.3.3 → 0.4.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 +197 -269
- package/dist/cli/commands.d.ts +0 -10
- package/dist/cli/commands.js +1 -184
- package/dist/cli/commands.js.map +1 -1
- package/dist/config.d.ts +22 -0
- package/dist/config.js +23 -0
- package/dist/config.js.map +1 -1
- package/dist/executor/template.js +21 -3
- package/dist/executor/template.js.map +1 -1
- package/dist/index.js +9 -34
- package/dist/index.js.map +1 -1
- package/dist/leader/chain-router.d.ts +5 -1
- package/dist/leader/chain-router.js +90 -2
- package/dist/leader/chain-router.js.map +1 -1
- package/dist/leader/event-bus.d.ts +1 -1
- package/dist/leader/event-bus.js +1 -1
- package/dist/leader/event-bus.js.map +1 -1
- package/dist/leader/index.d.ts +7 -0
- package/dist/leader/index.js +5 -2
- package/dist/leader/index.js.map +1 -1
- package/dist/leader/merge-validator.d.ts +24 -0
- package/dist/leader/merge-validator.js +112 -0
- package/dist/leader/merge-validator.js.map +1 -0
- package/dist/leader/state.d.ts +17 -0
- package/dist/leader/state.js +48 -2
- package/dist/leader/state.js.map +1 -1
- package/dist/leader/tui.d.ts +2 -0
- package/dist/leader/tui.js +140 -16
- package/dist/leader/tui.js.map +1 -1
- package/dist/leader/watcher.js +12 -0
- package/dist/leader/watcher.js.map +1 -1
- package/dist/models/schemas.d.ts +15 -0
- package/dist/models/schemas.js +5 -0
- package/dist/models/schemas.js.map +1 -1
- package/dist/orchestrator/run.d.ts +6 -0
- package/dist/orchestrator/run.js +181 -0
- package/dist/orchestrator/run.js.map +1 -0
- package/dist/skills/claude-orchestrator/SKILL.md +75 -217
- package/dist/templates/agents/worker-accept.md +48 -0
- package/dist/templates/agents/worker-build.md +38 -0
- package/dist/templates/agents/worker-decompose.md +40 -0
- package/dist/templates/agents/worker-evaluate.md +49 -0
- package/dist/templates/agents/worker-plan.md +36 -0
- package/dist/templates/agents/worker-review.md +42 -0
- package/dist/templates/agents/worker-verify.md +44 -0
- package/dist/templates/claude-memory/personal-claude-accepter.md +17 -0
- package/dist/templates/claude-memory/personal-claude-builder.md +24 -0
- package/dist/templates/claude-memory/personal-claude-planner.md +22 -0
- package/dist/templates/claude-memory/personal-claude-reviewer.md +25 -0
- package/dist/templates/claude-memory/personal-claude-verifier.md +24 -0
- package/dist/templates/claude-memory/team-claude.md +61 -0
- package/dist/utils/logger.d.ts +1 -0
- package/dist/utils/logger.js +3 -0
- package/dist/utils/logger.js.map +1 -1
- package/dist/worker/child-runner.d.ts +12 -0
- package/dist/worker/child-runner.js +99 -0
- package/dist/worker/child-runner.js.map +1 -0
- package/dist/worker/child.d.ts +2 -0
- package/dist/worker/child.js +8 -0
- package/dist/worker/child.js.map +1 -0
- package/dist/worker/commit-checker.d.ts +20 -0
- package/dist/worker/commit-checker.js +87 -0
- package/dist/worker/commit-checker.js.map +1 -0
- package/dist/worker/watcher.d.ts +5 -1
- package/dist/worker/watcher.js +41 -4
- package/dist/worker/watcher.js.map +1 -1
- package/dist/worker/worktree-initializer.d.ts +10 -0
- package/dist/worker/worktree-initializer.js +235 -0
- package/dist/worker/worktree-initializer.js.map +1 -0
- package/package.json +2 -2
- package/dist/templates/worker-accept.md +0 -46
- package/dist/templates/worker-build.md +0 -45
- package/dist/templates/worker-decompose.md +0 -67
- package/dist/templates/worker-evaluate.md +0 -41
- package/dist/templates/worker-plan.md +0 -43
- package/dist/templates/worker-review.md +0 -46
- package/dist/templates/worker-verify.md +0 -47
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# {{name}} — Accepter
|
|
2
|
+
|
|
3
|
+
You are the final gate. You validate against business acceptance criteria and make the Go/No-Go decision. Read `.claude/skills/task-acceptance/SKILL.md` for your detailed process.
|
|
4
|
+
|
|
5
|
+
## Process
|
|
6
|
+
|
|
7
|
+
1. **Read Full Chain** — All four upstream artifacts from `.claude-orchestrator/docs/`: Planner blueprint, Builder traceability map, Verifier verification map, Reviewer judgment. Fallback: `{{task_doc_path}}`. If any is missing → cannot accept, report to Leader.
|
|
8
|
+
2. **Verify Against Acceptance Criteria** — For each criterion: does the deliverable exist? Are Verifier FAILUREs resolved? Are Reviewer CONCERNs addressed? Is evidence independently verifiable?
|
|
9
|
+
3. **Decide** — **GO**: All criteria met, zero issues. **NO-GO**: Any criterion unmet. No conditional pass.
|
|
10
|
+
4. **Sign** — Write acceptance report to `{{result_path}}` and `.claude-orchestrator/docs/{{name}}/YYYY-MM-DD/acceptance-report.md`. Update daily CLAUDE.md.
|
|
11
|
+
|
|
12
|
+
## Prohibited
|
|
13
|
+
|
|
14
|
+
- No conditional GO — zero issues is the only standard
|
|
15
|
+
- No re-verifying or re-reviewing — your job is business acceptance
|
|
16
|
+
- No accepting without all four upstream artifacts
|
|
17
|
+
- No scattering documents outside `.claude-orchestrator/docs/{{name}}/YYYY-MM-DD/`
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# {{name}} — Builder
|
|
2
|
+
|
|
3
|
+
You produce verifiable results according to the Planner's blueprint. Read `.claude/skills/task-execution/SKILL.md` for your detailed process. Use `.claude/skills/task-traceability/SKILL.md` as the foundational traceability layer.
|
|
4
|
+
|
|
5
|
+
## Process (Trace → Execute → Map → Evidence → Record)
|
|
6
|
+
|
|
7
|
+
1. **Trace** — Read the Planner's blueprint from `.claude-orchestrator/docs/{planner_name}/YYYY-MM-DD/blueprint.md`. Fallback: `{{task_doc_path}}`. Extract every implementable requirement as a checklist.
|
|
8
|
+
2. **Execute** — Implement each requirement. Follow the Plan's architecture. Document deviations with reasons.
|
|
9
|
+
3. **Map** — Build a traceability map: Plan Requirement → Implementation → Status (done/deviation/n/a).
|
|
10
|
+
4. **Evidence** — For each item: test results (paste actual output), verification steps, key decisions. Save to `.claude-orchestrator/docs/{{name}}/YYYY-MM-DD/evidence/`.
|
|
11
|
+
5. **Record** — Write traceability map to `{{result_path}}` and `.claude-orchestrator/docs/{{name}}/YYYY-MM-DD/traceability-map.md`. Update daily CLAUDE.md. Git commit.
|
|
12
|
+
|
|
13
|
+
## Output Standards
|
|
14
|
+
|
|
15
|
+
- Every implementation must trace to a Plan requirement
|
|
16
|
+
- Every completed item must have evidence (actual test output, not claims)
|
|
17
|
+
- Deviations documented with reasons
|
|
18
|
+
|
|
19
|
+
## Prohibited
|
|
20
|
+
|
|
21
|
+
- No implementation without a traceable Plan requirement
|
|
22
|
+
- No "code level already implemented" as evidence
|
|
23
|
+
- No architectural decisions (Planner's domain)
|
|
24
|
+
- No scattering documents outside `.claude-orchestrator/docs/{{name}}/YYYY-MM-DD/`
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# {{name}} — Planner
|
|
2
|
+
|
|
3
|
+
You define the blueprint that all downstream roles follow. Read `.claude/skills/task-planning/SKILL.md` for your detailed process. Use `.claude/skills/task-traceability/SKILL.md` as the foundational traceability layer.
|
|
4
|
+
|
|
5
|
+
## Process (Trace → Execute → Map → Evidence → Record)
|
|
6
|
+
|
|
7
|
+
1. **Trace** — Read the requirement. Extract goals, scope, constraints.
|
|
8
|
+
2. **Design** — Produce a blueprint: architecture, interfaces, data flow, concrete build steps with verifiable completion criteria. The Builder must implement from this alone.
|
|
9
|
+
3. **Map** — Link each build step to a requirement.
|
|
10
|
+
4. **Self-Check** — Can a Builder start from this? Are criteria objectively checkable? No vague descriptions.
|
|
11
|
+
5. **Record** — Write blueprint to `{{result_path}}` and `.claude-orchestrator/docs/{{name}}/YYYY-MM-DD/blueprint.md`. Update daily CLAUDE.md.
|
|
12
|
+
|
|
13
|
+
## Output Standards
|
|
14
|
+
|
|
15
|
+
- Every build step must have an objectively verifiable completion criterion (e.g., "curl -X POST /api/foo returns 201", not "works correctly")
|
|
16
|
+
- Blueprint must be self-contained — no external dependencies for understanding
|
|
17
|
+
|
|
18
|
+
## Prohibited
|
|
19
|
+
|
|
20
|
+
- No vague acceptance criteria
|
|
21
|
+
- No skipping Self-Check
|
|
22
|
+
- No scattering documents outside `.claude-orchestrator/docs/{{name}}/YYYY-MM-DD/`
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# {{name}} — Reviewer
|
|
2
|
+
|
|
3
|
+
You are the quality gate. You judge Plan + Build + Verify against Planner intent. Read `.claude/skills/task-review/SKILL.md` for your detailed process. Use `.claude/skills/task-traceability/SKILL.md` as the foundational traceability layer.
|
|
4
|
+
|
|
5
|
+
## Process (Trace → Execute → Map → Evidence → Record)
|
|
6
|
+
|
|
7
|
+
1. **Trace** — Read all three upstream artifacts from `.claude-orchestrator/docs/`: Planner blueprint, Builder traceability map, Verifier verification map. Fallback: `{{task_doc_path}}`. If any is missing → cannot review, report to Leader.
|
|
8
|
+
2. **Execute** — For each checklist item: ACCEPT, CONCERN (specify which link addresses it), or REJECT (fundamentally fails intent).
|
|
9
|
+
3. **Map** — Plan Intent → Build Result → Verify Finding → Review Judgment → Rationale.
|
|
10
|
+
4. **Evidence** — For CONCERN/REJECT: reference specific Plan requirement and Builder/Verifier finding.
|
|
11
|
+
5. **Record** — Write judgment to `{{result_path}}` and `.claude-orchestrator/docs/{{name}}/YYYY-MM-DD/review-judgment.md`. Update daily CLAUDE.md.
|
|
12
|
+
|
|
13
|
+
## Decision
|
|
14
|
+
|
|
15
|
+
- **PASS** — Ready for Accept
|
|
16
|
+
- **FEEDBACK** — Specific revisions needed (which link, what to fix)
|
|
17
|
+
- **REJECT** — Fundamentally fails, restart required
|
|
18
|
+
|
|
19
|
+
## Prohibited
|
|
20
|
+
|
|
21
|
+
- No reviewing without all three upstream artifacts
|
|
22
|
+
- No PASS with unresolved Verifier FAILUREs
|
|
23
|
+
- No implementation decisions (Builder's domain)
|
|
24
|
+
- No re-verification (trust but validate, don't redo)
|
|
25
|
+
- No scattering documents outside `.claude-orchestrator/docs/{{name}}/YYYY-MM-DD/`
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# {{name}} — Verifier
|
|
2
|
+
|
|
3
|
+
You independently check Builder output against Planner blueprint. Read `.claude/skills/task-verification/SKILL.md` for your detailed process. Use `.claude/skills/task-traceability/SKILL.md` as the foundational traceability layer.
|
|
4
|
+
|
|
5
|
+
## Process (Trace → Execute → Map → Evidence → Record)
|
|
6
|
+
|
|
7
|
+
1. **Trace** — Read Planner blueprint (`.claude-orchestrator/docs/{planner}/YYYY-MM-DD/blueprint.md`) and Builder traceability map (`.claude-orchestrator/docs/{builder}/YYYY-MM-DD/traceability-map.md`). Fallback: `{{task_doc_path}}`. If either is missing → BLOCKED, report to Leader.
|
|
8
|
+
2. **Execute** — For each Plan requirement: does Builder output exist? Does it meet criteria? Identify GAPs, FAILUREs, EXTRAs, DEVIATIONs.
|
|
9
|
+
3. **Map** — Plan Requirement → Builder Output → Verified → Status (PASS/GAP/FAILURE).
|
|
10
|
+
4. **Evidence** — For each finding: what you checked, actual output, expected vs actual. Save to `.claude-orchestrator/docs/{{name}}/YYYY-MM-DD/evidence/`.
|
|
11
|
+
5. **Record** — Write verification map to `{{result_path}}` and `.claude-orchestrator/docs/{{name}}/YYYY-MM-DD/verification-map.md`. Update daily CLAUDE.md.
|
|
12
|
+
|
|
13
|
+
## Output Standards
|
|
14
|
+
|
|
15
|
+
- Every Plan requirement accounted for (PASS, GAP, or FAILURE)
|
|
16
|
+
- Every finding backed by evidence, not opinion
|
|
17
|
+
- Clear recommendation: proceed or needs fixes
|
|
18
|
+
|
|
19
|
+
## Prohibited
|
|
20
|
+
|
|
21
|
+
- No verifying without reading both Plan and Build artifacts
|
|
22
|
+
- No "code level already implemented" as verification — run the tests yourself
|
|
23
|
+
- No architectural judgments (Reviewer's domain)
|
|
24
|
+
- No scattering documents outside `.claude-orchestrator/docs/{{name}}/YYYY-MM-DD/`
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Multi-Agent Orchestration Workspace
|
|
2
|
+
|
|
3
|
+
You are a Worker in a CLI-native multi-agent orchestration system. Work is coordinated through ZooKeeper-based message passing. The system follows the Plan → Build → Verify → Review → Accept responsibility chain.
|
|
4
|
+
|
|
5
|
+
## Team Roles
|
|
6
|
+
|
|
7
|
+
| Role | Responsibility | Skill |
|
|
8
|
+
|------|---------------|-------|
|
|
9
|
+
| **Planner** | Requirement analysis, blueprint design, task decomposition | `task-planning` |
|
|
10
|
+
| **Builder** | Implementation per blueprint, code changes, testing | `task-execution` |
|
|
11
|
+
| **Verifier** | Cross-check Builder output against Planner blueprint | `task-verification` |
|
|
12
|
+
| **Reviewer** | Chain-level quality gate, design consistency review | `task-review` |
|
|
13
|
+
| **Accepter** | Final sign-off against business acceptance criteria | `task-acceptance` |
|
|
14
|
+
|
|
15
|
+
All roles use `task-traceability` as the foundational traceability layer: Trace → Execute → Map → Evidence → Record.
|
|
16
|
+
|
|
17
|
+
## Documentation Directory
|
|
18
|
+
|
|
19
|
+
All work artifacts go under `.claude-orchestrator/docs/{your_name}/YYYY-MM-DD/`. Do not scatter documents elsewhere.
|
|
20
|
+
|
|
21
|
+
Each role's typical outputs:
|
|
22
|
+
|
|
23
|
+
| Role | Artifact |
|
|
24
|
+
|------|----------|
|
|
25
|
+
| Planner | `blueprint.md` |
|
|
26
|
+
| Builder | `traceability-map.md` + `evidence/` |
|
|
27
|
+
| Verifier | `verification-map.md` + `evidence/` |
|
|
28
|
+
| Reviewer | `review-judgment.md` |
|
|
29
|
+
| Accepter | `acceptance-report.md` |
|
|
30
|
+
|
|
31
|
+
## Daily Working Directory
|
|
32
|
+
|
|
33
|
+
Your daily directory is `.claude-orchestrator/docs/{your_name}/YYYY-MM-DD/`. Each daily directory must contain a `CLAUDE.md` as directory memory.
|
|
34
|
+
|
|
35
|
+
**Workflow:**
|
|
36
|
+
- **Start:** Navigate to today's directory. Read `CLAUDE.md` if it exists to restore context. Otherwise, create the directory and seed a fresh `CLAUDE.md`.
|
|
37
|
+
- **During:** After each sub-task, update `CLAUDE.md` with status.
|
|
38
|
+
- **End:** Record what was accomplished, what remains, and any blockers.
|
|
39
|
+
|
|
40
|
+
## Reading Upstream Artifacts
|
|
41
|
+
|
|
42
|
+
When your link depends on previous work:
|
|
43
|
+
|
|
44
|
+
| Your Link | Read From `.claude-orchestrator/docs/` |
|
|
45
|
+
|-----------|--------------------------------------|
|
|
46
|
+
| Build | `{planner_name}/YYYY-MM-DD/blueprint.md` |
|
|
47
|
+
| Verify | `{planner}/.../blueprint.md` + `{builder}/.../traceability-map.md` |
|
|
48
|
+
| Review | Planner + Builder + Verifier artifacts |
|
|
49
|
+
| Accept | All four upstream artifacts |
|
|
50
|
+
|
|
51
|
+
If an upstream artifact is missing, check `{{task_doc_path}}` as fallback. If still not found, report to Leader.
|
|
52
|
+
|
|
53
|
+
## Your Personal CLAUDE.md
|
|
54
|
+
|
|
55
|
+
Your role-specific rules are at `.claude-orchestrator/docs/{your_name}/CLAUDE.md`. Read it at the start of every session.
|
|
56
|
+
|
|
57
|
+
## Git Rules
|
|
58
|
+
|
|
59
|
+
- Commit after each completed task. One logical unit per commit.
|
|
60
|
+
- Commit message ends with your own name signature.
|
|
61
|
+
- Never amend published commits. Verify with `git status` before committing.
|
package/dist/utils/logger.d.ts
CHANGED
package/dist/utils/logger.js
CHANGED
|
@@ -9,6 +9,9 @@ export class Logger {
|
|
|
9
9
|
info(msg) {
|
|
10
10
|
console.log(`[${this.tag}] ${msg}`);
|
|
11
11
|
}
|
|
12
|
+
warn(msg) {
|
|
13
|
+
console.warn(`[${this.tag}] ${msg}`);
|
|
14
|
+
}
|
|
12
15
|
error(msg, err) {
|
|
13
16
|
const extra = err instanceof Error ? `: ${err.message}` : err !== undefined ? `: ${err}` : "";
|
|
14
17
|
console.error(`[${this.tag}] ${msg}${extra}`);
|
package/dist/utils/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,MAAM;IAMG;IALZ,MAAM,CAAC,YAAY,GAAG,KAAK,CAAC;IAEpC,MAAM,CAAC,WAAW,KAAW,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC;IAC1D,MAAM,CAAC,OAAO,KAAc,OAAO,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;IAEzD,YAAoB,GAAW;QAAX,QAAG,GAAH,GAAG,CAAQ;IAAG,CAAC;IAEnC,IAAI,CAAC,GAAW;QACd,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,GAAW,EAAE,GAAa;QAC9B,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9F,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,GAAG,KAAK,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,GAAW;QACf,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,aAAa,GAAG,EAAE,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,MAAM;IAMG;IALZ,MAAM,CAAC,YAAY,GAAG,KAAK,CAAC;IAEpC,MAAM,CAAC,WAAW,KAAW,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC;IAC1D,MAAM,CAAC,OAAO,KAAc,OAAO,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;IAEzD,YAAoB,GAAW;QAAX,QAAG,GAAH,GAAG,CAAQ;IAAG,CAAC;IAEnC,IAAI,CAAC,GAAW;QACd,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,CAAC,GAAW;QACd,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,GAAW,EAAE,GAAa;QAC9B,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9F,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,GAAG,KAAK,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,GAAW;QACf,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,aAAa,GAAG,EAAE,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface ChildConfig {
|
|
2
|
+
worktreePath: string;
|
|
3
|
+
name: string;
|
|
4
|
+
role: string;
|
|
5
|
+
instanceId: string;
|
|
6
|
+
branch: string;
|
|
7
|
+
zkHosts: string;
|
|
8
|
+
debug: boolean;
|
|
9
|
+
cliCommand: string;
|
|
10
|
+
cacheDir: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function startWorkerChild(config: ChildConfig): Promise<void>;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import * as path from "node:path";
|
|
2
|
+
import { ZkClient } from "../zk/client.js";
|
|
3
|
+
import { InstanceRegistry } from "../modules/registry.js";
|
|
4
|
+
import { HookEngine } from "../hooks/engine.js";
|
|
5
|
+
import { TemplateEngine } from "../executor/template.js";
|
|
6
|
+
import { ClaudeRunner } from "../executor/runner.js";
|
|
7
|
+
import { SelfEvaluator } from "./evaluator.js";
|
|
8
|
+
import { WorkerWatcher } from "./watcher.js";
|
|
9
|
+
import { CommitChecker } from "./commit-checker.js";
|
|
10
|
+
import { Logger } from "../utils/logger.js";
|
|
11
|
+
import { saveInstanceId } from "../config.js";
|
|
12
|
+
export async function startWorkerChild(config) {
|
|
13
|
+
const logger = new Logger(`Worker-${config.name}`);
|
|
14
|
+
// 1. Switch to worktree directory
|
|
15
|
+
process.chdir(config.worktreePath);
|
|
16
|
+
logger.info(`Working in ${config.worktreePath}`);
|
|
17
|
+
// 2. Connect to ZK
|
|
18
|
+
const zk = new ZkClient(config.zkHosts);
|
|
19
|
+
await zk.connect();
|
|
20
|
+
// 3. Register instance (EPHEMERAL) with worktree metadata
|
|
21
|
+
const registry = new InstanceRegistry(zk);
|
|
22
|
+
const instance = await registry.register(config.name, config.role, config.instanceId);
|
|
23
|
+
// Update instance with worktree metadata
|
|
24
|
+
try {
|
|
25
|
+
await zk.updateInstance(instance.id, {
|
|
26
|
+
...instance,
|
|
27
|
+
worktree_name: config.name,
|
|
28
|
+
worktree_path: config.worktreePath,
|
|
29
|
+
worktree_branch: config.branch,
|
|
30
|
+
pid: process.pid,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// Instance may have been deleted or session expired
|
|
35
|
+
}
|
|
36
|
+
saveInstanceId(instance.id);
|
|
37
|
+
// 4. Resolve leader instance ID for cache path
|
|
38
|
+
let leaderInstanceId = instance.id;
|
|
39
|
+
try {
|
|
40
|
+
const leaderData = await zk.getLeader();
|
|
41
|
+
if (leaderData?.instance_id) {
|
|
42
|
+
leaderInstanceId = leaderData.instance_id;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
// Leader not running yet, use own instance id
|
|
47
|
+
}
|
|
48
|
+
// 5. Initialize modules
|
|
49
|
+
const agentsDir = path.join(config.worktreePath, ".claude-orchestrator", "agents");
|
|
50
|
+
const runner = new ClaudeRunner(config.cliCommand, config.cacheDir, leaderInstanceId, config.worktreePath);
|
|
51
|
+
const templateEngine = new TemplateEngine(agentsDir);
|
|
52
|
+
const evaluator = new SelfEvaluator(templateEngine, runner, config.name, config.role);
|
|
53
|
+
const commitChecker = new CommitChecker(config.worktreePath, runner);
|
|
54
|
+
const hooks = new HookEngine();
|
|
55
|
+
const watcher = new WorkerWatcher(zk, instance.id, leaderInstanceId, hooks, templateEngine, runner, evaluator, commitChecker, config.worktreePath, config.branch);
|
|
56
|
+
// 6. Start watch loop (non-blocking after initial setup)
|
|
57
|
+
watcher.start().catch((err) => {
|
|
58
|
+
logger.error("Watcher error", err);
|
|
59
|
+
});
|
|
60
|
+
// 7. Start parent alive check
|
|
61
|
+
const parentCheck = startParentAliveCheck(watcher, zk);
|
|
62
|
+
// 8. Block until SIGINT or parent death
|
|
63
|
+
await new Promise((resolve) => {
|
|
64
|
+
process.on("SIGINT", () => {
|
|
65
|
+
clearInterval(parentCheck);
|
|
66
|
+
watcher.stop();
|
|
67
|
+
resolve();
|
|
68
|
+
});
|
|
69
|
+
process.on("SIGTERM", () => {
|
|
70
|
+
clearInterval(parentCheck);
|
|
71
|
+
watcher.stop();
|
|
72
|
+
resolve();
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
// 9. Cleanup
|
|
76
|
+
try {
|
|
77
|
+
await registry.unregister(instance.id);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Already gone
|
|
81
|
+
}
|
|
82
|
+
await zk.disconnect();
|
|
83
|
+
logger.info("Unregistered. Goodbye.");
|
|
84
|
+
}
|
|
85
|
+
function startParentAliveCheck(watcher, zk) {
|
|
86
|
+
const parentPid = process.ppid;
|
|
87
|
+
const timer = setInterval(() => {
|
|
88
|
+
try {
|
|
89
|
+
process.kill(parentPid, 0);
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
watcher.stop();
|
|
93
|
+
zk.disconnect();
|
|
94
|
+
process.exit(0);
|
|
95
|
+
}
|
|
96
|
+
}, 1000);
|
|
97
|
+
return timer;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=child-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"child-runner.js","sourceRoot":"","sources":["../../src/worker/child-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { startWorkerChild } from "./child-runner.js";
|
|
3
|
+
const config = JSON.parse(process.argv[2]);
|
|
4
|
+
startWorkerChild(config).catch((err) => {
|
|
5
|
+
console.error("Worker child fatal error:", err);
|
|
6
|
+
process.exit(1);
|
|
7
|
+
});
|
|
8
|
+
//# sourceMappingURL=child.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"child.js","sourceRoot":"","sources":["../../src/worker/child.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,gBAAgB,EAAoB,MAAM,mBAAmB,CAAC;AAEvE,MAAM,MAAM,GAAgB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACxD,gBAAgB,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACrC,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,CAAC,CAAC;IAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ClaudeRunner } from "../executor/runner.js";
|
|
2
|
+
export interface CommitResult {
|
|
3
|
+
sha: string;
|
|
4
|
+
message: string;
|
|
5
|
+
changedFiles: string[];
|
|
6
|
+
untrackedFiles: string[];
|
|
7
|
+
}
|
|
8
|
+
export declare class CommitChecker {
|
|
9
|
+
private worktreePath;
|
|
10
|
+
private runner;
|
|
11
|
+
private logger;
|
|
12
|
+
constructor(worktreePath: string, runner: ClaudeRunner);
|
|
13
|
+
check(taskContext: {
|
|
14
|
+
link: string;
|
|
15
|
+
taskTitle: string;
|
|
16
|
+
taskDescription: string;
|
|
17
|
+
}): Promise<CommitResult | null>;
|
|
18
|
+
private parseStatus;
|
|
19
|
+
private generateCommitMessage;
|
|
20
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import { execSync } from "node:child_process";
|
|
3
|
+
import { Logger } from "../utils/logger.js";
|
|
4
|
+
export class CommitChecker {
|
|
5
|
+
worktreePath;
|
|
6
|
+
runner;
|
|
7
|
+
logger = new Logger("CommitChecker");
|
|
8
|
+
constructor(worktreePath, runner) {
|
|
9
|
+
this.worktreePath = worktreePath;
|
|
10
|
+
this.runner = runner;
|
|
11
|
+
}
|
|
12
|
+
async check(taskContext) {
|
|
13
|
+
try {
|
|
14
|
+
const statusOutput = execSync("git status --porcelain", {
|
|
15
|
+
cwd: this.worktreePath,
|
|
16
|
+
encoding: "utf-8",
|
|
17
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
18
|
+
});
|
|
19
|
+
if (!statusOutput.trim()) {
|
|
20
|
+
this.logger.info("No changes to commit");
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
const { changed, untracked } = this.parseStatus(statusOutput);
|
|
24
|
+
const commitMsg = await this.generateCommitMessage(changed, untracked, taskContext);
|
|
25
|
+
execSync("git add -A", { cwd: this.worktreePath, stdio: "pipe" });
|
|
26
|
+
execSync(`git commit -m "${commitMsg.replace(/"/g, '\\"')}"`, {
|
|
27
|
+
cwd: this.worktreePath,
|
|
28
|
+
stdio: "pipe",
|
|
29
|
+
});
|
|
30
|
+
const sha = execSync("git rev-parse HEAD", {
|
|
31
|
+
cwd: this.worktreePath,
|
|
32
|
+
encoding: "utf-8",
|
|
33
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
34
|
+
}).trim();
|
|
35
|
+
this.logger.info(`Committed ${sha.slice(0, 7)}: ${commitMsg}`);
|
|
36
|
+
return { sha, message: commitMsg, changedFiles: changed, untrackedFiles: untracked };
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
this.logger.error("Commit check failed", err);
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
parseStatus(statusOutput) {
|
|
44
|
+
const changed = [];
|
|
45
|
+
const untracked = [];
|
|
46
|
+
for (const line of statusOutput.trim().split("\n")) {
|
|
47
|
+
if (!line)
|
|
48
|
+
continue;
|
|
49
|
+
const status = line.slice(0, 2);
|
|
50
|
+
const file = line.slice(3);
|
|
51
|
+
if (status === "??") {
|
|
52
|
+
untracked.push(file);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
changed.push(`${status.trim()} ${file}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return { changed, untracked };
|
|
59
|
+
}
|
|
60
|
+
async generateCommitMessage(changed, untracked, ctx) {
|
|
61
|
+
const prompt = [
|
|
62
|
+
"## Commit Task",
|
|
63
|
+
"",
|
|
64
|
+
"Changed files:",
|
|
65
|
+
...changed.map(f => ` ${f}`),
|
|
66
|
+
"",
|
|
67
|
+
"Untracked files:",
|
|
68
|
+
...untracked.map(f => ` ${f}`),
|
|
69
|
+
"",
|
|
70
|
+
`Task: ${ctx.taskTitle} (${ctx.link})`,
|
|
71
|
+
"",
|
|
72
|
+
"Generate a concise git commit message (single line, under 72 chars).",
|
|
73
|
+
"Output ONLY the commit message.",
|
|
74
|
+
].join("\n");
|
|
75
|
+
const uniqueKey = `commit-${Date.now().toString(36)}`;
|
|
76
|
+
const logPath = this.runner.logPath(uniqueKey);
|
|
77
|
+
await this.runner.run(prompt, logPath);
|
|
78
|
+
try {
|
|
79
|
+
const output = await fs.promises.readFile(logPath, "utf-8");
|
|
80
|
+
return output.trim().split("\n")[0].slice(0, 72);
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return `chore: auto-commit ${ctx.link} task`;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=commit-checker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit-checker.js","sourceRoot":"","sources":["../../src/worker/commit-checker.ts"],"names":[],"mappings":"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"}
|
package/dist/worker/watcher.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { HookEngine } from "../hooks/engine.js";
|
|
|
3
3
|
import { TemplateEngine } from "../executor/template.js";
|
|
4
4
|
import { ClaudeRunner } from "../executor/runner.js";
|
|
5
5
|
import { SelfEvaluator } from "./evaluator.js";
|
|
6
|
+
import { CommitChecker } from "./commit-checker.js";
|
|
6
7
|
export declare class WorkerWatcher {
|
|
7
8
|
private zk;
|
|
8
9
|
private instanceId;
|
|
@@ -11,12 +12,15 @@ export declare class WorkerWatcher {
|
|
|
11
12
|
private templateEngine;
|
|
12
13
|
private runner;
|
|
13
14
|
private evaluator;
|
|
15
|
+
private commitChecker;
|
|
16
|
+
private worktreePath;
|
|
17
|
+
private worktreeBranch;
|
|
14
18
|
private inFlight;
|
|
15
19
|
private instanceName;
|
|
16
20
|
private instanceRole;
|
|
17
21
|
private logger;
|
|
18
22
|
stopped: boolean;
|
|
19
|
-
constructor(zk: ZkClient, instanceId: string, leaderInstanceId: string, hooks: HookEngine, templateEngine: TemplateEngine, runner: ClaudeRunner, evaluator: SelfEvaluator);
|
|
23
|
+
constructor(zk: ZkClient, instanceId: string, leaderInstanceId: string, hooks: HookEngine, templateEngine: TemplateEngine, runner: ClaudeRunner, evaluator: SelfEvaluator, commitChecker?: CommitChecker | null, worktreePath?: string, worktreeBranch?: string);
|
|
20
24
|
start(): Promise<void>;
|
|
21
25
|
private watchLoop;
|
|
22
26
|
private processMessage;
|
package/dist/worker/watcher.js
CHANGED
|
@@ -11,12 +11,15 @@ export class WorkerWatcher {
|
|
|
11
11
|
templateEngine;
|
|
12
12
|
runner;
|
|
13
13
|
evaluator;
|
|
14
|
+
commitChecker;
|
|
15
|
+
worktreePath;
|
|
16
|
+
worktreeBranch;
|
|
14
17
|
inFlight = new Set();
|
|
15
18
|
instanceName = "";
|
|
16
19
|
instanceRole = "";
|
|
17
20
|
logger = new Logger("WorkerWatcher");
|
|
18
21
|
stopped = false;
|
|
19
|
-
constructor(zk, instanceId, leaderInstanceId, hooks, templateEngine, runner, evaluator) {
|
|
22
|
+
constructor(zk, instanceId, leaderInstanceId, hooks, templateEngine, runner, evaluator, commitChecker = null, worktreePath = "", worktreeBranch = "") {
|
|
20
23
|
this.zk = zk;
|
|
21
24
|
this.instanceId = instanceId;
|
|
22
25
|
this.leaderInstanceId = leaderInstanceId;
|
|
@@ -24,6 +27,9 @@ export class WorkerWatcher {
|
|
|
24
27
|
this.templateEngine = templateEngine;
|
|
25
28
|
this.runner = runner;
|
|
26
29
|
this.evaluator = evaluator;
|
|
30
|
+
this.commitChecker = commitChecker;
|
|
31
|
+
this.worktreePath = worktreePath;
|
|
32
|
+
this.worktreeBranch = worktreeBranch;
|
|
27
33
|
}
|
|
28
34
|
async start() {
|
|
29
35
|
const instData = await this.zk.getInstance(this.instanceId);
|
|
@@ -77,9 +83,12 @@ export class WorkerWatcher {
|
|
|
77
83
|
task_criteria: msg.task_criteria ?? "",
|
|
78
84
|
task_doc_path: msg.task_doc_path ?? "",
|
|
79
85
|
result_path: resultPath,
|
|
80
|
-
work_dir:
|
|
86
|
+
work_dir: this.worktreePath,
|
|
81
87
|
time: new Date().toISOString(),
|
|
82
88
|
content: msg.content,
|
|
89
|
+
worktree_path: this.worktreePath,
|
|
90
|
+
worktree_branch: this.worktreeBranch,
|
|
91
|
+
instance_id: this.instanceId,
|
|
83
92
|
})
|
|
84
93
|
: msg.content;
|
|
85
94
|
this.logger.info(`Message from ${fromLabel} (${msg.type}): ${msg.content.slice(0, 200)}`);
|
|
@@ -102,8 +111,17 @@ export class WorkerWatcher {
|
|
|
102
111
|
this.hooks.fire("worker_message_start", hookCtx);
|
|
103
112
|
const result = await this.runner.run(prompt, logPath);
|
|
104
113
|
this.hooks.fire("worker_message_end", { ...hookCtx, logPath, exitCode: result.code });
|
|
114
|
+
// Auto-commit changes for chain-link tasks
|
|
115
|
+
let commitResult = null;
|
|
116
|
+
if (link !== "_generic" && this.commitChecker) {
|
|
117
|
+
commitResult = await this.commitChecker.check({
|
|
118
|
+
link,
|
|
119
|
+
taskTitle: msg.task_title ?? link,
|
|
120
|
+
taskDescription: msg.task_description ?? msg.content,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
105
123
|
if (link !== "_generic") {
|
|
106
|
-
await this.sendCompletionReport(link, msg, resultPath, uniqueKey);
|
|
124
|
+
await this.sendCompletionReport(link, msg, resultPath, uniqueKey, commitResult);
|
|
107
125
|
}
|
|
108
126
|
try {
|
|
109
127
|
msg.read = true;
|
|
@@ -115,7 +133,7 @@ export class WorkerWatcher {
|
|
|
115
133
|
this.inFlight.delete(msgId);
|
|
116
134
|
this.logger.info(`Done. Log: ${logPath}`);
|
|
117
135
|
}
|
|
118
|
-
async sendCompletionReport(link, msg, resultPath, uniqueKey) {
|
|
136
|
+
async sendCompletionReport(link, msg, resultPath, uniqueKey, commitResult = null) {
|
|
119
137
|
try {
|
|
120
138
|
let reportContent;
|
|
121
139
|
let reportLink = link;
|
|
@@ -141,6 +159,24 @@ export class WorkerWatcher {
|
|
|
141
159
|
else {
|
|
142
160
|
reportContent = `Link: ${link}\nStatus: completed\nResult Path: ${resultPath}\nTask completed.`;
|
|
143
161
|
}
|
|
162
|
+
// Inject commit info into report content if available
|
|
163
|
+
if (commitResult) {
|
|
164
|
+
try {
|
|
165
|
+
const reportJson = JSON.parse(reportContent);
|
|
166
|
+
reportJson.commit = {
|
|
167
|
+
sha: commitResult.sha,
|
|
168
|
+
message: commitResult.message,
|
|
169
|
+
branch: this.worktreeBranch,
|
|
170
|
+
changed_files: commitResult.changedFiles,
|
|
171
|
+
untracked_files: commitResult.untrackedFiles,
|
|
172
|
+
};
|
|
173
|
+
reportContent = JSON.stringify(reportJson);
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
// Content is not JSON, append commit info
|
|
177
|
+
reportContent += `\nCommit: ${commitResult.sha.slice(0, 7)} - ${commitResult.message}`;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
144
180
|
await this.zk.createMessage(this.leaderInstanceId, {
|
|
145
181
|
type: "direct",
|
|
146
182
|
from_instance: this.instanceId,
|
|
@@ -152,6 +188,7 @@ export class WorkerWatcher {
|
|
|
152
188
|
read: false,
|
|
153
189
|
result_path: resultPath,
|
|
154
190
|
link: reportLink,
|
|
191
|
+
chain_id: msg.chain_id ?? null,
|
|
155
192
|
});
|
|
156
193
|
this.logger.info("Completion report sent.");
|
|
157
194
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/worker/watcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C,OAAO,EAAiB,WAAW,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/worker/watcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface WorktreeConfig {
|
|
2
|
+
name: string;
|
|
3
|
+
role: string;
|
|
4
|
+
worktreePath: string;
|
|
5
|
+
relativePath: string;
|
|
6
|
+
branch: string;
|
|
7
|
+
instanceId: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function getWorktreeBranch(name: string): string;
|
|
10
|
+
export declare function initializeWorktrees(projectRoot: string, workerCount: number): Promise<WorktreeConfig[]>;
|