repo-harness 0.19.2 → 0.19.5
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.es.md +2 -2
- package/README.fr.md +2 -2
- package/README.ja.md +2 -2
- package/README.md +2 -2
- package/README.zh-CN.md +2 -2
- package/agents/fleet/explorer.md +2 -2
- package/agents/fleet/fast-worker.md +3 -3
- package/agents/fleet/root-cause-prover.md +2 -2
- package/assets/hooks/lib/workflow-state.sh +9 -1
- package/assets/reference-configs/external-tooling.md +36 -12
- package/assets/skill-version.json +2 -2
- package/assets/templates/helpers/archive-workflow.sh +3 -0
- package/assets/templates/helpers/check-agent-tooling.sh +1 -1
- package/assets/templates/helpers/contract-run.ts +8 -1
- package/assets/templates/helpers/ensure-task-workflow.sh +2 -2
- package/assets/templates/helpers/heartbeat-triage.sh +1 -1
- package/assets/templates/helpers/install-agent-fleet.sh +28 -42
- package/assets/templates/helpers/sprint-backlog.sh +2 -2
- package/assets/templates/helpers/verify-contract.sh +11 -1
- package/assets/templates/helpers/verify-sprint.sh +11 -1
- package/dist/hook-entry.js +3494 -3285
- package/dist/operator-ui/assets/index-BtBBFakS.css +1 -0
- package/dist/operator-ui/assets/index-CqlPK3N5.js +9 -0
- package/dist/operator-ui/index.html +2 -2
- package/package.json +12 -12
- package/scripts/akn00-native-execution-admission.ts +196 -0
- package/scripts/archive-workflow.sh +3 -0
- package/scripts/axr5-archctx-clean-room.ts +1 -1
- package/scripts/axr6-stop-host-cycle.ts +4 -4
- package/scripts/axr7-consumer-e2e.ts +2 -2
- package/scripts/check-agent-tooling.sh +1 -1
- package/scripts/check-tarball-install-smoke.sh +7 -0
- package/scripts/contract-run.ts +8 -1
- package/scripts/ensure-task-workflow.sh +2 -2
- package/scripts/heartbeat-triage.sh +1 -1
- package/scripts/install-agent-fleet.sh +28 -42
- package/scripts/lib/project-init-lib.sh +2 -2
- package/scripts/me2b-runtime-admission-canary.ts +45 -13
- package/scripts/skill-surface-select.ts +12 -3
- package/scripts/sprint-backlog.sh +2 -2
- package/scripts/sync-codex-installed-copies.sh +7 -26
- package/scripts/verify-contract.sh +11 -1
- package/scripts/verify-sprint.sh +11 -1
- package/src/cli/commands/architecture-projection.ts +3 -1
- package/src/cli/commands/capability-context.ts +11 -0
- package/src/cli/commands/fleet.ts +23 -1
- package/src/cli/commands/global-runtime.ts +33 -6
- package/src/cli/hook/mutation-observed.ts +3 -2
- package/src/cli/hook/stop-handler.ts +43 -15
- package/src/cli/hook-entry.ts +4 -0
- package/src/cli/index.ts +5 -2
- package/src/cli/installer/install-profile.ts +99 -7
- package/src/cli/installer/managed-entries.ts +2 -1
- package/src/cli/mcp/engineer-tools.ts +47 -0
- package/src/cli/mcp/oauth.ts +30 -23
- package/src/cli/mcp/server.ts +10 -2
- package/src/cli/mcp/tools.ts +2 -1
- package/src/cli/mcp/transports/http.ts +8 -1
- package/src/core/architecture/projection.ts +59 -4
- package/src/core/fleet/board.ts +53 -24
- package/src/core/fleet/task-inbox-layout.ts +12 -0
- package/src/core/fleet/task-reply.ts +280 -0
- package/src/core/hook-work-budget.ts +5 -0
- package/src/core/operator/automation-summary.ts +87 -0
- package/src/core/operator/collaboration-snapshot.ts +25 -9
- package/src/core/operator/decision-inventory.ts +96 -0
- package/src/core/operator/fleet-snapshot.ts +20 -4
- package/src/core/operator/observation-identity.ts +4 -0
- package/src/core/operator/organization-snapshot.ts +139 -0
- package/src/core/operator/planning-snapshot.ts +117 -0
- package/src/core/operator/repository-snapshot.ts +39 -0
- package/src/core/operator/task-activity.ts +135 -0
- package/src/core/operator/task-context.ts +117 -0
- package/src/core/operator/task-history.ts +56 -0
- package/src/core/refactor/policy.ts +1 -1
- package/src/core/state/artifact-parsers.ts +14 -2
- package/src/effects/architecture/archctx-provider.ts +79 -10
- package/src/effects/architecture/projection-acceptance.ts +173 -16
- package/src/effects/architecture/projection-continuation.ts +55 -0
- package/src/effects/architecture/projection-orchestrator.ts +9 -6
- package/src/effects/automation/budget-store.ts +2 -1
- package/src/effects/automation/campaign-step.ts +3 -3
- package/src/effects/collaboration/handoff-store.ts +3 -3
- package/src/effects/collaboration/signal-store.ts +3 -3
- package/src/effects/engineers/binding-store.ts +4 -12
- package/src/effects/engineers/claim-actor-store.ts +9 -9
- package/src/effects/engineers/principal-store.ts +10 -12
- package/src/effects/engineers/task-inbox.ts +65 -0
- package/src/effects/engineers/verified-context-store.ts +137 -3
- package/src/effects/evidence/atomic-append.ts +7 -0
- package/src/effects/evidence/attested-import.ts +2 -1
- package/src/effects/evidence/post-bash-importer.ts +2 -1
- package/src/effects/evidence/verify-producer.ts +2 -1
- package/src/effects/fleet/acquire.ts +19 -6
- package/src/effects/fleet/board.ts +14 -2
- package/src/effects/fleet/task-inbox-layout-migration.ts +417 -0
- package/src/effects/fleet/task-inbox-layout.ts +68 -0
- package/src/effects/fleet/task-inbox.ts +438 -36
- package/src/effects/operator/automation-summary.ts +146 -0
- package/src/effects/operator/collaboration-worker.ts +14 -8
- package/src/effects/operator/collaboration.ts +162 -50
- package/src/effects/operator/fleet-collector-process.ts +23 -6
- package/src/effects/operator/server.ts +395 -195
- package/src/effects/operator/task-activity.ts +46 -0
- package/src/effects/operator/task-context.ts +43 -0
- package/src/effects/operator/task-history.ts +105 -0
- package/src/effects/operator/task-read-process.ts +54 -0
- package/src/effects/publication/merge-readiness.ts +41 -9
- package/src/effects/refactor/recommendations.ts +2 -2
- package/src/effects/repo-registry.ts +3 -3
- package/src/effects/state/coordination-canonical-source.ts +4 -2
- package/src/effects/state/coordination-lease-store.ts +7 -19
- package/src/operator-web/App.tsx +295 -207
- package/src/operator-web/AutomationSummary.tsx +153 -0
- package/src/operator-web/OrganizationSummary.tsx +67 -0
- package/src/operator-web/PlanningView.tsx +53 -0
- package/src/operator-web/TaskEvidence.tsx +132 -0
- package/src/operator-web/TaskHistory.tsx +49 -0
- package/src/operator-web/fixture.ts +150 -17
- package/src/operator-web/i18n.ts +374 -4
- package/src/operator-web/repository-snapshot.ts +27 -0
- package/src/operator-web/styles.css +117 -9
- package/src/operator-web/task-activity.ts +11 -0
- package/src/operator-web/task-context.ts +11 -0
- package/src/operator-web/task-history.ts +12 -0
- package/src/operator-web/task-location.ts +30 -0
- package/src/operator-web/types.ts +111 -12
- package/src/operator-web/useObservationRefresh.ts +59 -0
- package/dist/operator-ui/assets/index-B8ckyb8w.js +0 -9
- package/dist/operator-ui/assets/index-BpvUpmy-.css +0 -1
- package/src/effects/operator/task-diff-worker.ts +0 -7
package/README.es.md
CHANGED
|
@@ -702,8 +702,8 @@ repositorio adopte la misma política.
|
|
|
702
702
|
|
|
703
703
|
## Versión actual
|
|
704
704
|
|
|
705
|
-
- Paquete npm: `repo-harness@0.19.
|
|
706
|
-
- Sello de workflow generado: `repo-harness@0.19.
|
|
705
|
+
- Paquete npm: `repo-harness@0.19.5`
|
|
706
|
+
- Sello de workflow generado: `repo-harness@0.19.5+template@0.19.5`
|
|
707
707
|
- Repositorio de GitHub: `Ancienttwo/repo-harness`
|
|
708
708
|
- Notas de versión e historial: [`docs/CHANGELOG.md`](docs/CHANGELOG.md)
|
|
709
709
|
|
package/README.fr.md
CHANGED
|
@@ -697,8 +697,8 @@ adopte la même policy.
|
|
|
697
697
|
|
|
698
698
|
## Release actuelle
|
|
699
699
|
|
|
700
|
-
- Package npm : `repo-harness@0.19.
|
|
701
|
-
- Generated workflow stamp : `repo-harness@0.19.
|
|
700
|
+
- Package npm : `repo-harness@0.19.5`
|
|
701
|
+
- Generated workflow stamp : `repo-harness@0.19.5+template@0.19.5`
|
|
702
702
|
- Dépôt GitHub : `Ancienttwo/repo-harness`
|
|
703
703
|
- Notes et historique de release : [`docs/CHANGELOG.md`](docs/CHANGELOG.md)
|
|
704
704
|
|
package/README.ja.md
CHANGED
|
@@ -694,8 +694,8 @@ commit script や hooks に組み込まないでください。
|
|
|
694
694
|
|
|
695
695
|
## 現在の Release
|
|
696
696
|
|
|
697
|
-
- npm package:`repo-harness@0.19.
|
|
698
|
-
- Generated workflow stamp:`repo-harness@0.19.
|
|
697
|
+
- npm package:`repo-harness@0.19.5`
|
|
698
|
+
- Generated workflow stamp:`repo-harness@0.19.5+template@0.19.5`
|
|
699
699
|
- GitHub repository:`Ancienttwo/repo-harness`
|
|
700
700
|
- Release notes and history:[`docs/CHANGELOG.md`](docs/CHANGELOG.md)
|
|
701
701
|
|
package/README.md
CHANGED
|
@@ -665,8 +665,8 @@ repo-harness commit scripts or hooks unless that repo adopts the same policy.
|
|
|
665
665
|
|
|
666
666
|
## Current Release
|
|
667
667
|
|
|
668
|
-
- npm package: `repo-harness@0.19.
|
|
669
|
-
- Generated workflow stamp: `repo-harness@0.19.
|
|
668
|
+
- npm package: `repo-harness@0.19.5`
|
|
669
|
+
- Generated workflow stamp: `repo-harness@0.19.5+template@0.19.5`
|
|
670
670
|
- GitHub repository: `Ancienttwo/repo-harness`
|
|
671
671
|
- Release notes and history: [`docs/CHANGELOG.md`](docs/CHANGELOG.md)
|
|
672
672
|
|
package/README.zh-CN.md
CHANGED
|
@@ -630,8 +630,8 @@ commit script 或 hook,除非目标仓库采用同样的 policy。
|
|
|
630
630
|
|
|
631
631
|
## 当前 Release
|
|
632
632
|
|
|
633
|
-
- npm package:`repo-harness@0.19.
|
|
634
|
-
- Generated workflow stamp:`repo-harness@0.19.
|
|
633
|
+
- npm package:`repo-harness@0.19.5`
|
|
634
|
+
- Generated workflow stamp:`repo-harness@0.19.5+template@0.19.5`
|
|
635
635
|
- GitHub repository:`Ancienttwo/repo-harness`
|
|
636
636
|
- Release notes 和 history:[`docs/CHANGELOG.md`](docs/CHANGELOG.md)
|
|
637
637
|
|
package/agents/fleet/explorer.md
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: explorer
|
|
3
|
-
description: Read-only codebase explorer on Sonnet at
|
|
3
|
+
description: Read-only codebase explorer on Sonnet at medium effort. Use to locate files, symbols, call paths, tests, uncertainties, and candidate affected surfaces before implementation or judgment. Returns `FINDINGS: COMPLETE/PARTIAL/BLOCKED` with file:line evidence; never edits, decides architecture, or judges acceptance — hand the map to fast-worker, deep-reasoner, or gatekeeper.
|
|
4
4
|
tools: ["Read", "Grep", "Glob", "Bash"]
|
|
5
5
|
model: sonnet
|
|
6
|
-
effort:
|
|
6
|
+
effort: medium
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
You are the read-only explorer. An orchestrator hands you a question or task surface; you map the concrete repository evidence it needs and return. You do not edit, decide architecture, or judge acceptance.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fast-worker
|
|
3
|
-
description: Fast execution worker on
|
|
4
|
-
model:
|
|
5
|
-
effort:
|
|
3
|
+
description: Fast execution worker on Sonnet at high effort. Use for well-scoped implementation, tests, refactoring, documentation, and mechanical changes; verifies with the project's real commands and returns `RESULT: DONE/PARTIAL/BLOCKED` with the evidence. Not for planning, architecture, or high-risk judgment — those go to deep-reasoner or stay with the orchestrator.
|
|
4
|
+
model: sonnet
|
|
5
|
+
effort: high
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
You are a fast execution worker. An orchestrator hands you well-scoped tasks — implementation, tests, refactoring, documentation, mechanical changes — and you execute them directly and return. You do not plan, decide architecture, or ship.
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: root-cause-prover
|
|
3
|
-
description: Bugfix diagnosis and pre-fix evidence specialist on Opus at
|
|
3
|
+
description: Bugfix diagnosis and pre-fix evidence specialist on Opus at xhigh effort. Use to prove a concrete root cause, reproduce it, add a candidate regression guard, and capture the existing four-field Root Cause Evidence shape before implementation; returns `DIAGNOSIS: CONFIRMED|LIKELY|BLOCKED`. It never fixes production source or changes the gate.
|
|
4
4
|
tools: ["Read", "Grep", "Glob", "Bash"]
|
|
5
5
|
model: opus
|
|
6
|
-
effort:
|
|
6
|
+
effort: xhigh
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
You are the bounded bugfix diagnosis and pre-fix evidence specialist. The orchestrator gives you an active bugfix contract in an isolated worktree; you prove or falsify the cause and prepare evidence for the existing gate. You never implement the production fix or reinterpret the gate.
|
|
@@ -1862,7 +1862,15 @@ workflow_contract_allows_path() {
|
|
|
1862
1862
|
esac
|
|
1863
1863
|
|
|
1864
1864
|
if [[ "$section" == "allowed_paths" && "$trimmed" =~ ^-[[:space:]]*(.+)$ ]]; then
|
|
1865
|
-
item="$
|
|
1865
|
+
item="${BASH_REMATCH[1]}"
|
|
1866
|
+
# Drop a YAML inline comment: `#` at the start or after whitespace, outside a leading quoted scalar.
|
|
1867
|
+
case "$item" in
|
|
1868
|
+
\"*\"*) item="\"$(printf '%s' "${item:1}" | cut -d'"' -f1)\"" ;;
|
|
1869
|
+
\'*\'*) item="'$(printf '%s' "${item:1}" | cut -d"'" -f1)'" ;;
|
|
1870
|
+
*) item="$(printf '%s' "$item" | sed -E 's/^#.*$//; s/[[:space:]]+#.*$//')" ;;
|
|
1871
|
+
esac
|
|
1872
|
+
item="$(workflow_strip_quotes "$item")"
|
|
1873
|
+
[[ -n "$item" ]] || continue
|
|
1866
1874
|
pattern="$item"
|
|
1867
1875
|
if [[ "$pattern" == */ ]]; then
|
|
1868
1876
|
[[ "$file_path" == "$pattern"* ]] && return 0
|
|
@@ -517,7 +517,7 @@ Minimal manifest shape:
|
|
|
517
517
|
"run_id": "20260629T023507Z-aibridge-screenshot",
|
|
518
518
|
"provider": {
|
|
519
519
|
"name": "aibridge",
|
|
520
|
-
"version": "1.
|
|
520
|
+
"version": "1.6.1"
|
|
521
521
|
},
|
|
522
522
|
"subject": {
|
|
523
523
|
"task_type": "unity.ui",
|
|
@@ -609,7 +609,7 @@ diff -qr ~/.agents/skills/geju ~/.codex/skills/geju
|
|
|
609
609
|
### CodeGraph
|
|
610
610
|
|
|
611
611
|
```bash
|
|
612
|
-
bun add -g @colbymchenry/codegraph@1.
|
|
612
|
+
bun add -g @colbymchenry/codegraph@1.6.1 && codegraph sync . && codegraph status .
|
|
613
613
|
```
|
|
614
614
|
|
|
615
615
|
## Agent Fleet
|
|
@@ -637,23 +637,26 @@ mapping.
|
|
|
637
637
|
|
|
638
638
|
| Source `model` | Codex `model` | Source `effort` | Codex `model_reasoning_effort` |
|
|
639
639
|
|---|---|---|---|
|
|
640
|
-
| `opus` | `gpt-
|
|
641
|
-
| `sonnet`, `haiku` | `gpt-
|
|
642
|
-
| `fable` | `gpt-
|
|
640
|
+
| `opus` | `gpt-6-astra` | `low`, `medium`, `high`, `xhigh`, `max` | same string, unchanged |
|
|
641
|
+
| `sonnet`, `haiku` | `gpt-6-luna` | `low`, `medium`, `high`, `xhigh`, `max` | same string, unchanged |
|
|
642
|
+
| `fable` | `gpt-6.1-sol` | `low`, `medium`, `high`, `xhigh`, `max` | same string, unchanged |
|
|
643
643
|
|
|
644
|
-
|
|
644
|
+
Seven per-agent target overrides are applied after tuple validation, on top of
|
|
645
645
|
the family row above, and are the only model/effort remaps in the generator:
|
|
646
|
-
`
|
|
647
|
-
`deep-
|
|
648
|
-
`gpt-6-
|
|
649
|
-
|
|
646
|
+
`explorer` (`sonnet`/`medium`) targets `gpt-6-luna` at `high` reasoning;
|
|
647
|
+
`deep-reasoner` (`opus`/`xhigh`) targets `gpt-6-astra` at `high` reasoning;
|
|
648
|
+
`fast-worker` (`sonnet`/`high`) targets `gpt-6.1-sol` at `medium` reasoning;
|
|
649
|
+
`deep-worker` (`opus`/`high`) targets `gpt-6.1-sol` at `high` reasoning;
|
|
650
|
+
`gatekeeper` (`opus`/`high`) targets `gpt-6-astra` at `medium` reasoning;
|
|
651
|
+
`root-cause-prover` (`opus`/`xhigh`) targets `gpt-6-astra` at `high` reasoning;
|
|
652
|
+
`harness-evaluator` (`opus`/`high`) targets `gpt-6-astra` at `medium` reasoning.
|
|
650
653
|
|
|
651
654
|
`fast-worker`, `deep-worker`, `root-cause-prover`, and `harness-evaluator`
|
|
652
655
|
receive `sandbox_mode = "workspace-write"`; every other role receives
|
|
653
656
|
`sandbox_mode = "read-only"`. Current assignments are explorer
|
|
654
|
-
(`sonnet/
|
|
657
|
+
(`sonnet/medium`), deep-reasoner (`opus/xhigh`), fast-worker (`sonnet/high`),
|
|
655
658
|
deep-worker (`opus/high`), gatekeeper (`opus/high`), root-cause-prover
|
|
656
|
-
(`opus/
|
|
659
|
+
(`opus/xhigh`), and harness-evaluator (`opus/high`). Root-cause-prover's prompt further limits
|
|
657
660
|
writes to bugfix evidence inside the active contract's allowed paths;
|
|
658
661
|
harness-evaluator runs existing skill/adoption surfaces only when both repo and
|
|
659
662
|
HOME pass the runner's disposable boundary: skills uses `--require-disposable`,
|
|
@@ -1007,6 +1010,27 @@ letter into its terminal job receipt, and is byte-idempotent on the same signal
|
|
|
1007
1010
|
and approval reference. `status --json` reports unresolved or invalid
|
|
1008
1011
|
acceptance evidence, and the strict architecture gate fails closed on either;
|
|
1009
1012
|
the command never chooses or infers an architecture decision.
|
|
1013
|
+
|
|
1014
|
+
For accepted apply, acceptance records an exact request intent before invoking
|
|
1015
|
+
ArchContext and the original result before running refresh actions. A retry
|
|
1016
|
+
with this pending evidence uses the provider's `projection-apply-readback-v1`
|
|
1017
|
+
capability. Readback returns the immutable committed receipt, original refresh
|
|
1018
|
+
signals, and a freshly verified current fixed point without changing provider
|
|
1019
|
+
delivery state. The same candidate, approval reference, request, and snapshot
|
|
1020
|
+
must still match. If the provider proves the exact request has no committed
|
|
1021
|
+
receipt, only an intent without a recorded result may retry apply; the provider
|
|
1022
|
+
checks the receipt again within its writer lock before writing. Errors and
|
|
1023
|
+
missing capabilities never authorize another apply.
|
|
1024
|
+
|
|
1025
|
+
To recover an older interrupted accept that has no local intent, run
|
|
1026
|
+
`repo-harness architecture-projection accept --recover --signal-id <sha256> --approval-reference <original-event-id> --json`.
|
|
1027
|
+
This explicit command only resumes a committed apply. It fails if the provider
|
|
1028
|
+
has no receipt, and never creates an apply or poisons a fresh candidate with an
|
|
1029
|
+
unrecoverable intent. Adoption recovery is unsupported and fails closed; it is
|
|
1030
|
+
not converted into apply. Pending evidence remains content-bound local runtime
|
|
1031
|
+
state after completion; the final acceptance receipt is the resolution authority.
|
|
1032
|
+
The readback capability must be present in both the packaged CLI and its daemon;
|
|
1033
|
+
installing a new CLI alone does not upgrade a running daemon.
|
|
1010
1034
|
If a candidate's exact reason set is only `verified-flow-proof-changed`, use
|
|
1011
1035
|
`repo-harness architecture-projection reconcile --signal-id <sha256> --json`
|
|
1012
1036
|
after refreshing the configured CodeGraph index. Reconciliation runs the same
|
|
@@ -491,6 +491,9 @@ rewrite_archive_projection_file() {
|
|
|
491
491
|
awk \
|
|
492
492
|
-v source_path="${archive_projection_sources[$index]}" \
|
|
493
493
|
-v destination_path="${archive_projection_destinations[$index]}" '
|
|
494
|
+
# Executable acceptance criteria are frozen authority, not navigation.
|
|
495
|
+
/^## / { verification_plan = ($0 ~ /^## Verification Plan[[:space:]]*$/) }
|
|
496
|
+
verification_plan { print; next }
|
|
494
497
|
{
|
|
495
498
|
remaining = $0
|
|
496
499
|
rendered = ""
|
|
@@ -1071,7 +1071,7 @@ function readAgentFleetSource(agent) {
|
|
|
1071
1071
|
return { status: "read", path: sourcePath, hash: source.hash };
|
|
1072
1072
|
}
|
|
1073
1073
|
|
|
1074
|
-
// Read-only mirror of install-
|
|
1074
|
+
// Read-only mirror of install-profile.ts's readAgentFleetUserManagedReceipt(): this
|
|
1075
1075
|
// checker never writes ~/.repo-harness/agent-fleet-user-managed.json, it only
|
|
1076
1076
|
// consults it so an operator-accepted customized file is not misreported as
|
|
1077
1077
|
// drift. Any malformation invalidates the whole receipt (fail-closed) rather
|
|
@@ -337,7 +337,14 @@ function parseList(block: string, key: string): string[] {
|
|
|
337
337
|
if (!inList) continue;
|
|
338
338
|
if (/^\S/.test(line) || /^\s+[a-zA-Z0-9_-]+:/.test(line)) break;
|
|
339
339
|
const match = line.match(/^\s*-\s*(.+)$/);
|
|
340
|
-
if (match)
|
|
340
|
+
if (!match) continue;
|
|
341
|
+
let value = match[1].trim();
|
|
342
|
+
const quote = value[0];
|
|
343
|
+
const close = quote === '"' || quote === "'" ? value.indexOf(quote, 1) : -1;
|
|
344
|
+
// Drop a YAML inline comment: `#` at the start or after whitespace, outside a leading quoted scalar.
|
|
345
|
+
value = close > 0 ? value.slice(0, close + 1) : value.replace(/(^|\s+)#.*$/, "").trim();
|
|
346
|
+
value = value.replace(/^["']|["']$/g, "");
|
|
347
|
+
if (value.length > 0) values.push(value);
|
|
341
348
|
}
|
|
342
349
|
return values;
|
|
343
350
|
}
|
|
@@ -1016,8 +1016,8 @@ ARCHITECTURE_INDEX_EOF
|
|
|
1016
1016
|
"provider": "archctx",
|
|
1017
1017
|
"proposal_author": "local",
|
|
1018
1018
|
"stages": {
|
|
1019
|
-
"scan": { "provider_version": "0.
|
|
1020
|
-
"verify": { "provider_version": "0.
|
|
1019
|
+
"scan": { "provider_version": "0.6.1", "required_features": ["module-statistics-v1", "refactor-assessment-v1", "recommendation-v3"] },
|
|
1020
|
+
"verify": { "provider_version": "0.6.1", "required_features": ["refactor-resolution-v1"] }
|
|
1021
1021
|
},
|
|
1022
1022
|
"workflow_routing": {
|
|
1023
1023
|
"module_refactor": "work_package",
|
|
@@ -179,7 +179,7 @@ run_workflow_check() {
|
|
|
179
179
|
if [[ "$status" -eq 0 ]]; then
|
|
180
180
|
add_entry "workflow-check" "pass" "check-task-workflow.sh --strict passed" "$output"
|
|
181
181
|
else
|
|
182
|
-
summary="$(
|
|
182
|
+
summary="$(first_line <<<"$output")"
|
|
183
183
|
add_entry "workflow-check" "fail" "${summary:-check-task-workflow.sh --strict failed}" "$output"
|
|
184
184
|
fi
|
|
185
185
|
}
|
|
@@ -16,8 +16,14 @@ bun_version_is_supported() {
|
|
|
16
16
|
|
|
17
17
|
RUNTIME_BIN=""
|
|
18
18
|
BUN_VERSION=""
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
# A caller that already validated its Bun hands it over explicitly; only a
|
|
20
|
+
# standalone invocation discovers Bun by name.
|
|
21
|
+
if [[ -n "${REPO_HARNESS_BUN_BIN:-}" ]]; then
|
|
22
|
+
BUN_CANDIDATES=("$REPO_HARNESS_BUN_BIN")
|
|
23
|
+
else
|
|
24
|
+
BUN_CANDIDATES=("$(command -v bun 2>/dev/null || true)" "${HOME}/.bun/bin/bun")
|
|
25
|
+
fi
|
|
26
|
+
for candidate in "${BUN_CANDIDATES[@]}"; do
|
|
21
27
|
[[ -n "$candidate" && -x "$candidate" ]] || continue
|
|
22
28
|
candidate_version="$("$candidate" --version 2>/dev/null || true)"
|
|
23
29
|
[[ -n "$BUN_VERSION" ]] || BUN_VERSION="$candidate_version"
|
|
@@ -105,11 +111,16 @@ const MANAGED_AGENTS = ["explorer", "deep-reasoner", "fast-worker", "deep-worker
|
|
|
105
111
|
const WRITABLE_AGENTS = new Set(["fast-worker", "deep-worker", "root-cause-prover", "harness-evaluator"]);
|
|
106
112
|
const CLAUDE_TARGET_DIR = path.join(HOME, ".claude", "agents");
|
|
107
113
|
const CODEX_TARGET_DIR = path.join(HOME, ".codex", "agents");
|
|
108
|
-
const USER_MANAGED_RECEIPT_PATH = path.join(HOME, ".repo-harness", "agent-fleet-user-managed.json");
|
|
109
114
|
const SOURCE_DIR = process.env.REPO_HARNESS_AGENT_FLEET_SOURCE_DIR;
|
|
110
|
-
const {
|
|
115
|
+
const {
|
|
116
|
+
readInstalledProfile,
|
|
117
|
+
managedInstallSurfaceIsCurrent,
|
|
118
|
+
agentFleetUserManagedReceiptPath,
|
|
119
|
+
readAgentFleetUserManagedReceipt,
|
|
120
|
+
} = require(
|
|
111
121
|
path.join(SOURCE_DIR, "../../src/cli/installer/install-profile.ts"),
|
|
112
122
|
);
|
|
123
|
+
const USER_MANAGED_RECEIPT_PATH = agentFleetUserManagedReceiptPath({ ...process.env, HOME });
|
|
113
124
|
const installedProfile = readInstalledProfile();
|
|
114
125
|
|
|
115
126
|
// A generated persona carries role identity only. The anti-extras execution
|
|
@@ -136,19 +147,23 @@ function buildFamilyEffortMap(sourceLabel, targetModel, targetLabel) {
|
|
|
136
147
|
}
|
|
137
148
|
|
|
138
149
|
const MODEL_EFFORT_MAP = {
|
|
139
|
-
opus: buildFamilyEffortMap("Opus", "gpt-
|
|
140
|
-
sonnet: buildFamilyEffortMap("Sonnet", "gpt-
|
|
141
|
-
haiku: buildFamilyEffortMap("Haiku", "gpt-
|
|
142
|
-
fable: buildFamilyEffortMap("Fable", "gpt-
|
|
150
|
+
opus: buildFamilyEffortMap("Opus", "gpt-6-astra", "GPT-6 Astra"),
|
|
151
|
+
sonnet: buildFamilyEffortMap("Sonnet", "gpt-6-luna", "GPT-6 Luna"),
|
|
152
|
+
haiku: buildFamilyEffortMap("Haiku", "gpt-6-luna", "GPT-6 Luna"),
|
|
153
|
+
fable: buildFamilyEffortMap("Fable", "gpt-6.1-sol", "GPT-6.1 Sol"),
|
|
143
154
|
};
|
|
144
155
|
|
|
145
156
|
// Per-agent Codex target overrides — the only model/effort remaps in the fleet.
|
|
146
|
-
//
|
|
147
|
-
//
|
|
157
|
+
// Every role carries an explicit target so Codex model/effort never drift with
|
|
158
|
+
// the Claude-side family default.
|
|
148
159
|
const AGENT_TARGET_OVERRIDES = {
|
|
149
|
-
|
|
150
|
-
"deep-
|
|
160
|
+
explorer: { model: "gpt-6-luna", effort: "high", targetDescription: "GPT-6 Luna at high reasoning" },
|
|
161
|
+
"deep-reasoner": { model: "gpt-6-astra", effort: "high", targetDescription: "GPT-6 Astra at high reasoning" },
|
|
162
|
+
"fast-worker": { model: "gpt-6.1-sol", effort: "medium", targetDescription: "GPT-6.1 Sol at medium reasoning" },
|
|
163
|
+
"deep-worker": { model: "gpt-6.1-sol", effort: "high", targetDescription: "GPT-6.1 Sol at high reasoning" },
|
|
151
164
|
gatekeeper: { model: "gpt-6-astra", effort: "medium", targetDescription: "GPT-6 Astra at medium reasoning" },
|
|
165
|
+
"root-cause-prover": { model: "gpt-6-astra", effort: "high", targetDescription: "GPT-6 Astra at high reasoning" },
|
|
166
|
+
"harness-evaluator": { model: "gpt-6-astra", effort: "medium", targetDescription: "GPT-6 Astra at medium reasoning" },
|
|
152
167
|
};
|
|
153
168
|
|
|
154
169
|
function readSource(agent) {
|
|
@@ -305,33 +320,6 @@ function validateUserManagedCodex(agent, content) {
|
|
|
305
320
|
}
|
|
306
321
|
}
|
|
307
322
|
|
|
308
|
-
function loadUserManagedReceipt(allowedPaths) {
|
|
309
|
-
if (!fs.existsSync(USER_MANAGED_RECEIPT_PATH)) return { ok: true, hashes: new Map() };
|
|
310
|
-
try {
|
|
311
|
-
const parsed = JSON.parse(fs.readFileSync(USER_MANAGED_RECEIPT_PATH, "utf8"));
|
|
312
|
-
if (
|
|
313
|
-
parsed?.protocol !== 1
|
|
314
|
-
|| parsed?.authority !== "user-managed-agent-fleet"
|
|
315
|
-
|| !Array.isArray(parsed.files)
|
|
316
|
-
) return { ok: false, hashes: new Map() };
|
|
317
|
-
const hashes = new Map();
|
|
318
|
-
for (const entry of parsed.files) {
|
|
319
|
-
if (
|
|
320
|
-
!entry
|
|
321
|
-
|| typeof entry.path !== "string"
|
|
322
|
-
|| !allowedPaths.has(entry.path)
|
|
323
|
-
|| typeof entry.sha256 !== "string"
|
|
324
|
-
|| !/^sha256:[a-f0-9]{64}$/.test(entry.sha256)
|
|
325
|
-
|| hashes.has(entry.path)
|
|
326
|
-
) return { ok: false, hashes: new Map() };
|
|
327
|
-
hashes.set(entry.path, entry.sha256);
|
|
328
|
-
}
|
|
329
|
-
return { ok: true, hashes };
|
|
330
|
-
} catch (_error) {
|
|
331
|
-
return { ok: false, hashes: new Map() };
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
|
|
335
323
|
function writeUserManagedReceipt(files) {
|
|
336
324
|
fs.mkdirSync(path.dirname(USER_MANAGED_RECEIPT_PATH), { recursive: true });
|
|
337
325
|
const receipt = {
|
|
@@ -426,8 +414,6 @@ const targets = prepared.flatMap(({ agent, source, parsed, mapped }) => {
|
|
|
426
414
|
},
|
|
427
415
|
];
|
|
428
416
|
});
|
|
429
|
-
const allowedTargetPaths = new Set(targets.map((target) => target.path));
|
|
430
|
-
|
|
431
417
|
if (acceptUserManaged) {
|
|
432
418
|
const acceptedFiles = [];
|
|
433
419
|
let invalid = false;
|
|
@@ -462,7 +448,7 @@ if (acceptUserManaged) {
|
|
|
462
448
|
|
|
463
449
|
const receipt = force
|
|
464
450
|
? { ok: true, hashes: new Map() }
|
|
465
|
-
:
|
|
451
|
+
: readAgentFleetUserManagedReceipt({ ...process.env, HOME });
|
|
466
452
|
if (!receipt.ok) {
|
|
467
453
|
console.log("[fleet] user-managed receipt: invalid");
|
|
468
454
|
process.exit(1);
|
|
@@ -486,7 +486,7 @@ backlog_counts() {
|
|
|
486
486
|
|
|
487
487
|
next_pending_row() {
|
|
488
488
|
local file="$1"
|
|
489
|
-
backlog_rows "$file" | awk -F '\t' '$2 == "[ ]" { print;
|
|
489
|
+
backlog_rows "$file" | awk -F '\t' '!found && $2 == "[ ]" { print; found = 1 }'
|
|
490
490
|
}
|
|
491
491
|
|
|
492
492
|
# Mint one persisted task id: 32 random bytes rendered as lowercase hex. A task
|
|
@@ -1043,7 +1043,7 @@ cmd_start_task() {
|
|
|
1043
1043
|
echo "sprint-backlog: task reference '$task_ref' is ambiguous (${match_count} backlog rows match); fix duplicate indices or task names first" >&2
|
|
1044
1044
|
exit 1
|
|
1045
1045
|
fi
|
|
1046
|
-
target_row="$(backlog_rows "$sprint_file" | TASK_REF="$task_ref" awk -F '\t' '$1 == ENVIRON["TASK_REF"] || $3 == ENVIRON["TASK_REF"] { print;
|
|
1046
|
+
target_row="$(backlog_rows "$sprint_file" | TASK_REF="$task_ref" awk -F '\t' '!found && ($1 == ENVIRON["TASK_REF"] || $3 == ENVIRON["TASK_REF"]) { print; found = 1 }')"
|
|
1047
1047
|
|
|
1048
1048
|
local target_index target_status target_task target_mode target_acceptance
|
|
1049
1049
|
target_index="$(printf '%s' "$target_row" | cut -f1)"
|
|
@@ -190,8 +190,18 @@ contract_allowed_paths() {
|
|
|
190
190
|
in_paths && /^[[:space:]]*-[[:space:]]*/ {
|
|
191
191
|
line = $0
|
|
192
192
|
sub(/^[[:space:]]*-[[:space:]]*/, "", line)
|
|
193
|
+
# Drop a YAML inline comment: `#` at the start or after whitespace, outside a leading quoted scalar.
|
|
194
|
+
q = substr(line, 1, 1)
|
|
195
|
+
close_at = (q == "\"" || q == "'\''") ? index(substr(line, 2), q) : 0
|
|
196
|
+
if (close_at > 0) {
|
|
197
|
+
line = substr(line, 1, close_at + 1)
|
|
198
|
+
} else {
|
|
199
|
+
sub(/^#.*$/, "", line)
|
|
200
|
+
sub(/[[:space:]]+#.*$/, "", line)
|
|
201
|
+
}
|
|
193
202
|
gsub(/^["'\''`]+|["'\''`]+$/, "", line)
|
|
194
|
-
|
|
203
|
+
line = trim(line)
|
|
204
|
+
if (line != "") print line
|
|
195
205
|
}
|
|
196
206
|
'
|
|
197
207
|
}
|
|
@@ -193,8 +193,18 @@ contract_allowed_paths() {
|
|
|
193
193
|
in_paths && /^[[:space:]]*-[[:space:]]*/ {
|
|
194
194
|
line = $0
|
|
195
195
|
sub(/^[[:space:]]*-[[:space:]]*/, "", line)
|
|
196
|
+
# Drop a YAML inline comment: `#` at the start or after whitespace, outside a leading quoted scalar.
|
|
197
|
+
q = substr(line, 1, 1)
|
|
198
|
+
close_at = (q == "\"" || q == "'\''") ? index(substr(line, 2), q) : 0
|
|
199
|
+
if (close_at > 0) {
|
|
200
|
+
line = substr(line, 1, close_at + 1)
|
|
201
|
+
} else {
|
|
202
|
+
sub(/^#.*$/, "", line)
|
|
203
|
+
sub(/[[:space:]]+#.*$/, "", line)
|
|
204
|
+
}
|
|
196
205
|
gsub(/^["'\''`]+|["'\''`]+$/, "", line)
|
|
197
|
-
|
|
206
|
+
line = trim(line)
|
|
207
|
+
if (line != "") print line
|
|
198
208
|
}
|
|
199
209
|
'
|
|
200
210
|
}
|