@telora/daemon 0.19.43 → 0.19.74
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/build-info.json +8 -3
- package/dist/assembly-engine.d.ts +9 -0
- package/dist/assembly-engine.d.ts.map +1 -1
- package/dist/assembly-engine.js.map +1 -1
- package/dist/audit-hooks.js +1 -1
- package/dist/audit-shape.d.ts +103 -0
- package/dist/audit-shape.d.ts.map +1 -0
- package/dist/audit-shape.js +81 -0
- package/dist/audit-shape.js.map +1 -0
- package/dist/branch-status.js +2 -2
- package/dist/branch-status.js.map +1 -1
- package/dist/ci-sensor-loop.d.ts +47 -0
- package/dist/ci-sensor-loop.d.ts.map +1 -0
- package/dist/ci-sensor-loop.js +116 -0
- package/dist/ci-sensor-loop.js.map +1 -0
- package/dist/ci-status-git.d.ts +52 -0
- package/dist/ci-status-git.d.ts.map +1 -0
- package/dist/ci-status-git.js +86 -0
- package/dist/ci-status-git.js.map +1 -0
- package/dist/ci-status.d.ts +122 -0
- package/dist/ci-status.d.ts.map +1 -0
- package/dist/ci-status.js +114 -0
- package/dist/ci-status.js.map +1 -0
- package/dist/cli/connect/agents.d.ts +24 -0
- package/dist/cli/connect/agents.d.ts.map +1 -0
- package/dist/cli/connect/agents.js +65 -0
- package/dist/cli/connect/agents.js.map +1 -0
- package/dist/cli/connect/claude.d.ts +31 -0
- package/dist/cli/connect/claude.d.ts.map +1 -0
- package/dist/cli/connect/claude.js +104 -0
- package/dist/cli/connect/claude.js.map +1 -0
- package/dist/cli/connect/cline.d.ts +37 -0
- package/dist/cli/connect/cline.d.ts.map +1 -0
- package/dist/cli/connect/cline.js +115 -0
- package/dist/cli/connect/cline.js.map +1 -0
- package/dist/cli/connect/codex.d.ts +44 -0
- package/dist/cli/connect/codex.d.ts.map +1 -0
- package/dist/cli/connect/codex.js +111 -0
- package/dist/cli/connect/codex.js.map +1 -0
- package/dist/cli/connect/ide.d.ts +69 -0
- package/dist/cli/connect/ide.d.ts.map +1 -0
- package/dist/cli/connect/ide.js +134 -0
- package/dist/cli/connect/ide.js.map +1 -0
- package/dist/cli/connect/scaffolding.d.ts +31 -0
- package/dist/cli/connect/scaffolding.d.ts.map +1 -0
- package/dist/cli/connect/scaffolding.js +52 -0
- package/dist/cli/connect/scaffolding.js.map +1 -0
- package/dist/cli/connect/shared.d.ts +30 -0
- package/dist/cli/connect/shared.d.ts.map +1 -0
- package/dist/cli/connect/shared.js +11 -0
- package/dist/cli/connect/shared.js.map +1 -0
- package/dist/cli/connect.d.ts +9 -210
- package/dist/cli/connect.d.ts.map +1 -1
- package/dist/cli/connect.js +10 -526
- package/dist/cli/connect.js.map +1 -1
- package/dist/cli/open.js +2 -2
- package/dist/completion/event.d.ts +3 -0
- package/dist/completion/event.d.ts.map +1 -1
- package/dist/completion/event.js +44 -9
- package/dist/completion/event.js.map +1 -1
- package/dist/completion/merge-phase.d.ts +3 -0
- package/dist/completion/merge-phase.d.ts.map +1 -1
- package/dist/completion/merge-phase.js +35 -3
- package/dist/completion/merge-phase.js.map +1 -1
- package/dist/completion/read-only-pristine.d.ts +1 -1
- package/dist/completion/read-only-pristine.d.ts.map +1 -1
- package/dist/completion/read-only-pristine.js +1 -1
- package/dist/completion/read-only-pristine.js.map +1 -1
- package/dist/completion/review-exit-phase.d.ts +30 -3
- package/dist/completion/review-exit-phase.d.ts.map +1 -1
- package/dist/completion/review-exit-phase.js +203 -15
- package/dist/completion/review-exit-phase.js.map +1 -1
- package/dist/completion/status-advance-phase.js +1 -1
- package/dist/completion/status-advance-phase.js.map +1 -1
- package/dist/completion/team-completion.d.ts.map +1 -1
- package/dist/completion/team-completion.js +22 -2
- package/dist/completion/team-completion.js.map +1 -1
- package/dist/completion/team-lifecycle.js +1 -1
- package/dist/completion/terminated-work-reconcile.js +1 -1
- package/dist/completion/terminated-work-reconcile.js.map +1 -1
- package/dist/condition-evaluators.d.ts +41 -2
- package/dist/condition-evaluators.d.ts.map +1 -1
- package/dist/condition-evaluators.js +37 -288
- package/dist/condition-evaluators.js.map +1 -1
- package/dist/context-audit.d.ts +1 -1
- package/dist/context-audit.d.ts.map +1 -1
- package/dist/context-lock.d.ts +1 -1
- package/dist/context-lock.d.ts.map +1 -1
- package/dist/control-state.d.ts +2 -2
- package/dist/control-state.d.ts.map +1 -1
- package/dist/control-state.js +4 -3
- package/dist/control-state.js.map +1 -1
- package/dist/daemon-process.d.ts +1 -1
- package/dist/daemon-process.d.ts.map +1 -1
- package/dist/delivery-advance-block.d.ts +1 -1
- package/dist/delivery-advance-block.d.ts.map +1 -1
- package/dist/delivery-advance-block.js +1 -1
- package/dist/delivery-advance-block.js.map +1 -1
- package/dist/delivery-lifecycle.js +1 -1
- package/dist/delivery-reconciler-shadow.d.ts +1 -1
- package/dist/delivery-reconciler-shadow.d.ts.map +1 -1
- package/dist/delivery-reconciler-shadow.js +1 -1
- package/dist/delivery-reconciler-shadow.js.map +1 -1
- package/dist/delivery-reconciler.d.ts +1 -0
- package/dist/delivery-reconciler.d.ts.map +1 -1
- package/dist/delivery-reconciler.js +6 -0
- package/dist/delivery-reconciler.js.map +1 -1
- package/dist/directive-executor.js +1 -1
- package/dist/directive-executor.js.map +1 -1
- package/dist/drift-eval-loop.d.ts.map +1 -1
- package/dist/drift-eval-loop.js +6 -14
- package/dist/drift-eval-loop.js.map +1 -1
- package/dist/escalations.d.ts +1 -1
- package/dist/escalations.d.ts.map +1 -1
- package/dist/escalations.js +1 -1
- package/dist/escalations.js.map +1 -1
- package/dist/evaluation-context.d.ts +2 -33
- package/dist/evaluation-context.d.ts.map +1 -1
- package/dist/evaluation-context.js +2 -56
- package/dist/evaluation-context.js.map +1 -1
- package/dist/focus-engine.d.ts +14 -5
- package/dist/focus-engine.d.ts.map +1 -1
- package/dist/focus-engine.js +35 -289
- package/dist/focus-engine.js.map +1 -1
- package/dist/focus-executor.d.ts +10 -791
- package/dist/focus-executor.d.ts.map +1 -1
- package/dist/focus-executor.js +42 -1566
- package/dist/focus-executor.js.map +1 -1
- package/dist/focus-lifecycle.js +2 -2
- package/dist/focus-lifecycle.js.map +1 -1
- package/dist/focus-loop-registry.d.ts +52 -0
- package/dist/focus-loop-registry.d.ts.map +1 -0
- package/dist/focus-loop-registry.js +328 -0
- package/dist/focus-loop-registry.js.map +1 -0
- package/dist/focus-merge.d.ts +1 -1
- package/dist/focus-merge.d.ts.map +1 -1
- package/dist/focus-merge.js +3 -3
- package/dist/focus-merge.js.map +1 -1
- package/dist/focus-phase.d.ts +4 -0
- package/dist/focus-phase.d.ts.map +1 -1
- package/dist/focus-phase.js +3 -3
- package/dist/focus-phase.js.map +1 -1
- package/dist/focus-stage-lifecycle/planning-release.d.ts +197 -0
- package/dist/focus-stage-lifecycle/planning-release.d.ts.map +1 -0
- package/dist/focus-stage-lifecycle/planning-release.js +312 -0
- package/dist/focus-stage-lifecycle/planning-release.js.map +1 -0
- package/dist/focus-stage-lifecycle/review-convergence.d.ts +133 -0
- package/dist/focus-stage-lifecycle/review-convergence.d.ts.map +1 -0
- package/dist/focus-stage-lifecycle/review-convergence.js +235 -0
- package/dist/focus-stage-lifecycle/review-convergence.js.map +1 -0
- package/dist/focus-stage-lifecycle/wedge-watchdog.d.ts +133 -0
- package/dist/focus-stage-lifecycle/wedge-watchdog.d.ts.map +1 -0
- package/dist/focus-stage-lifecycle/wedge-watchdog.js +365 -0
- package/dist/focus-stage-lifecycle/wedge-watchdog.js.map +1 -0
- package/dist/focus-stage-lifecycle.d.ts +22 -403
- package/dist/focus-stage-lifecycle.d.ts.map +1 -1
- package/dist/focus-stage-lifecycle.js +26 -798
- package/dist/focus-stage-lifecycle.js.map +1 -1
- package/dist/{git-activity.d.ts → git/activity.d.ts} +1 -1
- package/dist/git/activity.d.ts.map +1 -0
- package/dist/{git-activity.js → git/activity.js} +2 -2
- package/dist/git/activity.js.map +1 -0
- package/dist/{git-branch.d.ts → git/branch.d.ts} +2 -2
- package/dist/git/branch.d.ts.map +1 -0
- package/dist/{git-branch.js → git/branch.js} +2 -2
- package/dist/git/branch.js.map +1 -0
- package/dist/{git-fetch.d.ts → git/fetch.d.ts} +2 -2
- package/dist/git/fetch.d.ts.map +1 -0
- package/dist/{git-fetch.js → git/fetch.js} +1 -1
- package/dist/git/fetch.js.map +1 -0
- package/dist/{git-genesis.d.ts → git/genesis.d.ts} +3 -3
- package/dist/git/genesis.d.ts.map +1 -0
- package/dist/{git-genesis.js → git/genesis.js} +5 -5
- package/dist/git/genesis.js.map +1 -0
- package/dist/git/index.d.ts +36 -0
- package/dist/git/index.d.ts.map +1 -0
- package/dist/git/index.js +36 -0
- package/dist/git/index.js.map +1 -0
- package/dist/{git-integration.d.ts → git/integration.d.ts} +2 -2
- package/dist/git/integration.d.ts.map +1 -0
- package/dist/{git-integration.js → git/integration.js} +4 -4
- package/dist/git/integration.js.map +1 -0
- package/dist/{git-merge-helpers.d.ts → git/merge-helpers.d.ts} +3 -3
- package/dist/git/merge-helpers.d.ts.map +1 -0
- package/dist/{git-merge-helpers.js → git/merge-helpers.js} +3 -3
- package/dist/git/merge-helpers.js.map +1 -0
- package/dist/{git-merge-lock.d.ts → git/merge-lock.d.ts} +1 -1
- package/dist/git/merge-lock.d.ts.map +1 -0
- package/dist/{git-merge-lock.js → git/merge-lock.js} +1 -1
- package/dist/git/merge-lock.js.map +1 -0
- package/dist/{git-merge-strategies.d.ts → git/merge-strategies.d.ts} +2 -2
- package/dist/git/merge-strategies.d.ts.map +1 -0
- package/dist/{git-merge-strategies.js → git/merge-strategies.js} +3 -3
- package/dist/git/merge-strategies.js.map +1 -0
- package/dist/{git-merge.d.ts → git/merge.d.ts} +4 -4
- package/dist/git/merge.d.ts.map +1 -0
- package/dist/{git-merge.js → git/merge.js} +4 -4
- package/dist/git/merge.js.map +1 -0
- package/dist/{git-state-detector.d.ts → git/state-detector.d.ts} +2 -2
- package/dist/git/state-detector.d.ts.map +1 -0
- package/dist/{git-state-detector.js → git/state-detector.js} +7 -7
- package/dist/git/state-detector.js.map +1 -0
- package/dist/{git-types.d.ts → git/types.d.ts} +2 -2
- package/dist/git/types.d.ts.map +1 -0
- package/dist/{git-types.js → git/types.js} +1 -1
- package/dist/git/types.js.map +1 -0
- package/dist/{git-utils.d.ts → git/utils.d.ts} +1 -1
- package/dist/git/utils.d.ts.map +1 -0
- package/dist/{git-utils.js → git/utils.js} +2 -2
- package/dist/git/utils.js.map +1 -0
- package/dist/git.d.ts +5 -5
- package/dist/git.d.ts.map +1 -1
- package/dist/git.js +10 -10
- package/dist/git.js.map +1 -1
- package/dist/guard-engine.d.ts +3 -2
- package/dist/guard-engine.d.ts.map +1 -1
- package/dist/guard-engine.js +2 -2
- package/dist/guard-engine.js.map +1 -1
- package/dist/install-probe-tick.d.ts +63 -0
- package/dist/install-probe-tick.d.ts.map +1 -0
- package/dist/install-probe-tick.js +137 -0
- package/dist/install-probe-tick.js.map +1 -0
- package/dist/install-probe.d.ts +115 -0
- package/dist/install-probe.d.ts.map +1 -0
- package/dist/install-probe.js +197 -0
- package/dist/install-probe.js.map +1 -0
- package/dist/listener-auto-advance.d.ts.map +1 -1
- package/dist/listener-auto-advance.js +51 -9
- package/dist/listener-auto-advance.js.map +1 -1
- package/dist/listener.d.ts.map +1 -1
- package/dist/listener.js +15 -7
- package/dist/listener.js.map +1 -1
- package/dist/{loop-context-audit-pass.d.ts → loops/context-audit-pass.d.ts} +4 -4
- package/dist/loops/context-audit-pass.d.ts.map +1 -0
- package/dist/{loop-context-audit-pass.js → loops/context-audit-pass.js} +7 -7
- package/dist/loops/context-audit-pass.js.map +1 -0
- package/dist/{loop-engine-types.d.ts → loops/engine-types.d.ts} +1 -1
- package/dist/loops/engine-types.d.ts.map +1 -0
- package/dist/{loop-engine-types.js → loops/engine-types.js} +1 -1
- package/dist/loops/engine-types.js.map +1 -0
- package/dist/{loop-engine.d.ts → loops/engine.d.ts} +6 -6
- package/dist/loops/engine.d.ts.map +1 -0
- package/dist/{loop-engine.js → loops/engine.js} +13 -13
- package/dist/loops/engine.js.map +1 -0
- package/dist/{loop-event-bus.d.ts → loops/event-bus.d.ts} +1 -1
- package/dist/loops/event-bus.d.ts.map +1 -0
- package/dist/{loop-event-bus.js → loops/event-bus.js} +1 -1
- package/dist/loops/event-bus.js.map +1 -0
- package/dist/loops/index.d.ts +33 -0
- package/dist/loops/index.d.ts.map +1 -0
- package/dist/loops/index.js +32 -0
- package/dist/loops/index.js.map +1 -0
- package/dist/{loop-llm-client.d.ts → loops/llm-client.d.ts} +3 -3
- package/dist/loops/llm-client.d.ts.map +1 -0
- package/dist/{loop-llm-client.js → loops/llm-client.js} +3 -3
- package/dist/loops/llm-client.js.map +1 -0
- package/dist/{loop-llm-flag.d.ts → loops/llm-flag.d.ts} +1 -1
- package/dist/loops/llm-flag.d.ts.map +1 -0
- package/dist/{loop-llm-flag.js → loops/llm-flag.js} +1 -1
- package/dist/loops/llm-flag.js.map +1 -0
- package/dist/{loop-operational-block.d.ts → loops/operational-block.d.ts} +1 -1
- package/dist/loops/operational-block.d.ts.map +1 -0
- package/dist/{loop-operational-block.js → loops/operational-block.js} +1 -1
- package/dist/loops/operational-block.js.map +1 -0
- package/dist/{loop-prompt-builder.d.ts → loops/prompt-builder.d.ts} +2 -2
- package/dist/loops/prompt-builder.d.ts.map +1 -0
- package/dist/{loop-prompt-builder.js → loops/prompt-builder.js} +1 -1
- package/dist/loops/prompt-builder.js.map +1 -0
- package/dist/{loop-variance.d.ts → loops/variance.d.ts} +1 -1
- package/dist/loops/variance.d.ts.map +1 -0
- package/dist/{loop-variance.js → loops/variance.js} +1 -1
- package/dist/loops/variance.js.map +1 -0
- package/dist/merge-back-loop.d.ts.map +1 -1
- package/dist/merge-back-loop.js +4 -3
- package/dist/merge-back-loop.js.map +1 -1
- package/dist/merge-detector.js +2 -2
- package/dist/merge-detector.js.map +1 -1
- package/dist/{nexus-endpoint-clearance.d.ts → nexus/endpoint-clearance.d.ts} +2 -2
- package/dist/nexus/endpoint-clearance.d.ts.map +1 -0
- package/dist/{nexus-endpoint-clearance.js → nexus/endpoint-clearance.js} +2 -2
- package/dist/nexus/endpoint-clearance.js.map +1 -0
- package/dist/{nexus-escalation-bridge.d.ts → nexus/escalation-bridge.d.ts} +1 -1
- package/dist/nexus/escalation-bridge.d.ts.map +1 -0
- package/dist/{nexus-escalation-bridge.js → nexus/escalation-bridge.js} +2 -2
- package/dist/nexus/escalation-bridge.js.map +1 -0
- package/dist/{nexus-incoming.d.ts → nexus/incoming.d.ts} +2 -2
- package/dist/nexus/incoming.d.ts.map +1 -0
- package/dist/{nexus-incoming.js → nexus/incoming.js} +2 -2
- package/dist/nexus/incoming.js.map +1 -0
- package/dist/nexus/index.d.ts +20 -0
- package/dist/nexus/index.d.ts.map +1 -0
- package/dist/nexus/index.js +20 -0
- package/dist/nexus/index.js.map +1 -0
- package/dist/{nexus-intake-spawn.d.ts → nexus/intake-spawn.d.ts} +3 -3
- package/dist/nexus/intake-spawn.d.ts.map +1 -0
- package/dist/{nexus-intake-spawn.js → nexus/intake-spawn.js} +1 -1
- package/dist/nexus/intake-spawn.js.map +1 -0
- package/dist/{nexus-intake.d.ts → nexus/intake.d.ts} +2 -2
- package/dist/nexus/intake.d.ts.map +1 -0
- package/dist/{nexus-intake.js → nexus/intake.js} +4 -4
- package/dist/nexus/intake.js.map +1 -0
- package/dist/{nexus-return.d.ts → nexus/return.d.ts} +3 -3
- package/dist/nexus/return.d.ts.map +1 -0
- package/dist/{nexus-return.js → nexus/return.js} +4 -4
- package/dist/nexus/return.js.map +1 -0
- package/dist/otlp/index.d.ts +19 -0
- package/dist/otlp/index.d.ts.map +1 -0
- package/dist/otlp/index.js +19 -0
- package/dist/otlp/index.js.map +1 -0
- package/dist/{otlp-log-parser.d.ts → otlp/log-parser.d.ts} +2 -2
- package/dist/otlp/log-parser.d.ts.map +1 -0
- package/dist/{otlp-log-parser.js → otlp/log-parser.js} +5 -6
- package/dist/otlp/log-parser.js.map +1 -0
- package/dist/{otlp-metric-parser.d.ts → otlp/metric-parser.d.ts} +2 -2
- package/dist/otlp/metric-parser.d.ts.map +1 -0
- package/dist/{otlp-metric-parser.js → otlp/metric-parser.js} +4 -5
- package/dist/otlp/metric-parser.js.map +1 -0
- package/dist/{otlp-port-manager.d.ts → otlp/port-manager.d.ts} +1 -1
- package/dist/otlp/port-manager.d.ts.map +1 -0
- package/dist/{otlp-port-manager.js → otlp/port-manager.js} +1 -1
- package/dist/otlp/port-manager.js.map +1 -0
- package/dist/{otlp-receiver.d.ts → otlp/receiver.d.ts} +2 -2
- package/dist/otlp/receiver.d.ts.map +1 -0
- package/dist/{otlp-receiver.js → otlp/receiver.js} +5 -33
- package/dist/otlp/receiver.js.map +1 -0
- package/dist/{otlp-types.d.ts → otlp/types.d.ts} +1 -9
- package/dist/otlp/types.d.ts.map +1 -0
- package/dist/{otlp-types.js → otlp/types.js} +1 -27
- package/dist/otlp/types.js.map +1 -0
- package/dist/pipeline-config.d.ts +1 -1
- package/dist/{prd-controller.d.ts → prd/controller.d.ts} +7 -7
- package/dist/prd/controller.d.ts.map +1 -0
- package/dist/{prd-controller.js → prd/controller.js} +11 -11
- package/dist/prd/controller.js.map +1 -0
- package/dist/{prd-divergence.d.ts → prd/divergence.d.ts} +2 -2
- package/dist/prd/divergence.d.ts.map +1 -0
- package/dist/{prd-divergence.js → prd/divergence.js} +1 -1
- package/dist/prd/divergence.js.map +1 -0
- package/dist/{prd-focus-pushdown.d.ts → prd/focus-pushdown.d.ts} +2 -2
- package/dist/prd/focus-pushdown.d.ts.map +1 -0
- package/dist/{prd-focus-pushdown.js → prd/focus-pushdown.js} +3 -3
- package/dist/prd/focus-pushdown.js.map +1 -0
- package/dist/{prd-frontier.d.ts → prd/frontier.d.ts} +2 -2
- package/dist/prd/frontier.d.ts.map +1 -0
- package/dist/{prd-frontier.js → prd/frontier.js} +1 -1
- package/dist/prd/frontier.js.map +1 -0
- package/dist/prd/index.d.ts +26 -0
- package/dist/prd/index.d.ts.map +1 -0
- package/dist/prd/index.js +25 -0
- package/dist/prd/index.js.map +1 -0
- package/dist/{prd-steward.d.ts → prd/steward.d.ts} +4 -4
- package/dist/prd/steward.d.ts.map +1 -0
- package/dist/{prd-steward.js → prd/steward.js} +4 -4
- package/dist/prd/steward.js.map +1 -0
- package/dist/{prd-viability.d.ts → prd/viability.d.ts} +2 -2
- package/dist/prd/viability.d.ts.map +1 -0
- package/dist/{prd-viability.js → prd/viability.js} +1 -1
- package/dist/prd/viability.js.map +1 -0
- package/dist/product-scaffold.js +2 -2
- package/dist/product-scaffold.js.map +1 -1
- package/dist/prompt-sections/persona-sections.d.ts +32 -0
- package/dist/prompt-sections/persona-sections.d.ts.map +1 -1
- package/dist/prompt-sections/persona-sections.js +78 -2
- package/dist/prompt-sections/persona-sections.js.map +1 -1
- package/dist/queries/context-lock-queries.js +1 -1
- package/dist/queries/context-lock-queries.js.map +1 -1
- package/dist/queries/deliveries.d.ts +31 -0
- package/dist/queries/deliveries.d.ts.map +1 -1
- package/dist/queries/deliveries.js +5 -0
- package/dist/queries/deliveries.js.map +1 -1
- package/dist/queries/focuses.d.ts +17 -0
- package/dist/queries/focuses.d.ts.map +1 -1
- package/dist/queries/focuses.js +27 -0
- package/dist/queries/focuses.js.map +1 -1
- package/dist/queries/schemas.d.ts +8 -0
- package/dist/queries/schemas.d.ts.map +1 -1
- package/dist/queries/schemas.js +16 -0
- package/dist/queries/schemas.js.map +1 -1
- package/dist/reality-pole.js +1 -1
- package/dist/resolvers/git-diff-against-base.d.ts.map +1 -1
- package/dist/resolvers/git-diff-against-base.js +4 -1
- package/dist/resolvers/git-diff-against-base.js.map +1 -1
- package/dist/resolvers/prd-context.js +1 -1
- package/dist/sensor-sweep.js +1 -1
- package/dist/spawn/model-routing.d.ts +277 -0
- package/dist/spawn/model-routing.d.ts.map +1 -0
- package/dist/spawn/model-routing.js +464 -0
- package/dist/spawn/model-routing.js.map +1 -0
- package/dist/spawn/process-spawn.d.ts +128 -0
- package/dist/spawn/process-spawn.d.ts.map +1 -0
- package/dist/spawn/process-spawn.js +378 -0
- package/dist/spawn/process-spawn.js.map +1 -0
- package/dist/spawn/prompt-assembly.d.ts +143 -0
- package/dist/spawn/prompt-assembly.d.ts.map +1 -0
- package/dist/spawn/prompt-assembly.js +263 -0
- package/dist/spawn/prompt-assembly.js.map +1 -0
- package/dist/spawn/shared.d.ts +72 -0
- package/dist/spawn/shared.d.ts.map +1 -0
- package/dist/spawn/shared.js +14 -0
- package/dist/spawn/shared.js.map +1 -0
- package/dist/spawn/spawn-decision.d.ts +189 -0
- package/dist/spawn/spawn-decision.d.ts.map +1 -0
- package/dist/spawn/spawn-decision.js +361 -0
- package/dist/spawn/spawn-decision.js.map +1 -0
- package/dist/spawn/worktree-session.d.ts +105 -0
- package/dist/spawn/worktree-session.d.ts.map +1 -0
- package/dist/spawn/worktree-session.js +216 -0
- package/dist/spawn/worktree-session.js.map +1 -0
- package/dist/spawner/lifecycle.js +2 -2
- package/dist/spawner/lifecycle.js.map +1 -1
- package/dist/spawner/resolution.js +1 -1
- package/dist/stall-detector-config.d.ts +4 -0
- package/dist/stall-detector-config.d.ts.map +1 -1
- package/dist/stall-detector-config.js +6 -0
- package/dist/stall-detector-config.js.map +1 -1
- package/dist/state-cascade.js +1 -1
- package/dist/state-cascade.js.map +1 -1
- package/dist/team-prompt-base.d.ts +1 -1
- package/dist/team-prompt-base.d.ts.map +1 -1
- package/dist/team-prompt-base.js +1 -1
- package/dist/team-prompt-base.js.map +1 -1
- package/dist/trigger-executor.d.ts +5 -9
- package/dist/trigger-executor.d.ts.map +1 -1
- package/dist/trigger-executor.js +14 -36
- package/dist/trigger-executor.js.map +1 -1
- package/dist/types/focus.d.ts +13 -0
- package/dist/types/focus.d.ts.map +1 -1
- package/dist/types/workflow.d.ts +1 -3
- package/dist/types/workflow.d.ts.map +1 -1
- package/dist/unified-engine-lifecycle.js +1 -1
- package/dist/unified-init.d.ts +3 -3
- package/dist/unified-init.d.ts.map +1 -1
- package/dist/unified-init.js +9 -25
- package/dist/unified-init.js.map +1 -1
- package/dist/unified-shell.d.ts +3 -3
- package/dist/unified-shell.js +4 -4
- package/dist/unified-shell.js.map +1 -1
- package/dist/verification-engine.d.ts.map +1 -1
- package/dist/verification-engine.js +15 -0
- package/dist/verification-engine.js.map +1 -1
- package/dist/{worktree-focus.d.ts → worktree/focus.d.ts} +2 -2
- package/dist/worktree/focus.d.ts.map +1 -0
- package/dist/{worktree-focus.js → worktree/focus.js} +7 -7
- package/dist/worktree/focus.js.map +1 -0
- package/dist/worktree/index.d.ts +16 -0
- package/dist/worktree/index.d.ts.map +1 -0
- package/dist/worktree/index.js +16 -0
- package/dist/worktree/index.js.map +1 -0
- package/dist/{worktree-safety.d.ts → worktree/safety.d.ts} +1 -1
- package/dist/worktree/safety.d.ts.map +1 -0
- package/dist/{worktree-safety.js → worktree/safety.js} +2 -2
- package/dist/worktree/safety.js.map +1 -0
- package/dist/{worktree-state.d.ts → worktree/state.d.ts} +1 -1
- package/dist/worktree/state.d.ts.map +1 -0
- package/dist/{worktree-state.js → worktree/state.js} +6 -6
- package/dist/worktree/state.js.map +1 -0
- package/dist/worktree.d.ts +1 -1
- package/dist/worktree.js +5 -5
- package/dist/worktree.js.map +1 -1
- package/package.json +5 -4
- package/dist/git-activity.d.ts.map +0 -1
- package/dist/git-activity.js.map +0 -1
- package/dist/git-branch.d.ts.map +0 -1
- package/dist/git-branch.js.map +0 -1
- package/dist/git-fetch.d.ts.map +0 -1
- package/dist/git-fetch.js.map +0 -1
- package/dist/git-genesis.d.ts.map +0 -1
- package/dist/git-genesis.js.map +0 -1
- package/dist/git-integration.d.ts.map +0 -1
- package/dist/git-integration.js.map +0 -1
- package/dist/git-merge-helpers.d.ts.map +0 -1
- package/dist/git-merge-helpers.js.map +0 -1
- package/dist/git-merge-lock.d.ts.map +0 -1
- package/dist/git-merge-lock.js.map +0 -1
- package/dist/git-merge-strategies.d.ts.map +0 -1
- package/dist/git-merge-strategies.js.map +0 -1
- package/dist/git-merge.d.ts.map +0 -1
- package/dist/git-merge.js.map +0 -1
- package/dist/git-state-detector.d.ts.map +0 -1
- package/dist/git-state-detector.js.map +0 -1
- package/dist/git-types.d.ts.map +0 -1
- package/dist/git-types.js.map +0 -1
- package/dist/git-utils.d.ts.map +0 -1
- package/dist/git-utils.js.map +0 -1
- package/dist/loop-context-audit-pass.d.ts.map +0 -1
- package/dist/loop-context-audit-pass.js.map +0 -1
- package/dist/loop-engine-types.d.ts.map +0 -1
- package/dist/loop-engine-types.js.map +0 -1
- package/dist/loop-engine.d.ts.map +0 -1
- package/dist/loop-engine.js.map +0 -1
- package/dist/loop-event-bus.d.ts.map +0 -1
- package/dist/loop-event-bus.js.map +0 -1
- package/dist/loop-llm-client.d.ts.map +0 -1
- package/dist/loop-llm-client.js.map +0 -1
- package/dist/loop-llm-flag.d.ts.map +0 -1
- package/dist/loop-llm-flag.js.map +0 -1
- package/dist/loop-operational-block.d.ts.map +0 -1
- package/dist/loop-operational-block.js.map +0 -1
- package/dist/loop-prompt-builder.d.ts.map +0 -1
- package/dist/loop-prompt-builder.js.map +0 -1
- package/dist/loop-variance.d.ts.map +0 -1
- package/dist/loop-variance.js.map +0 -1
- package/dist/nexus-endpoint-clearance.d.ts.map +0 -1
- package/dist/nexus-endpoint-clearance.js.map +0 -1
- package/dist/nexus-escalation-bridge.d.ts.map +0 -1
- package/dist/nexus-escalation-bridge.js.map +0 -1
- package/dist/nexus-incoming.d.ts.map +0 -1
- package/dist/nexus-incoming.js.map +0 -1
- package/dist/nexus-intake-spawn.d.ts.map +0 -1
- package/dist/nexus-intake-spawn.js.map +0 -1
- package/dist/nexus-intake.d.ts.map +0 -1
- package/dist/nexus-intake.js.map +0 -1
- package/dist/nexus-return.d.ts.map +0 -1
- package/dist/nexus-return.js.map +0 -1
- package/dist/otlp-log-parser.d.ts.map +0 -1
- package/dist/otlp-log-parser.js.map +0 -1
- package/dist/otlp-metric-parser.d.ts.map +0 -1
- package/dist/otlp-metric-parser.js.map +0 -1
- package/dist/otlp-port-manager.d.ts.map +0 -1
- package/dist/otlp-port-manager.js.map +0 -1
- package/dist/otlp-receiver.d.ts.map +0 -1
- package/dist/otlp-receiver.js.map +0 -1
- package/dist/otlp-types.d.ts.map +0 -1
- package/dist/otlp-types.js.map +0 -1
- package/dist/prd-controller.d.ts.map +0 -1
- package/dist/prd-controller.js.map +0 -1
- package/dist/prd-divergence.d.ts.map +0 -1
- package/dist/prd-divergence.js.map +0 -1
- package/dist/prd-focus-pushdown.d.ts.map +0 -1
- package/dist/prd-focus-pushdown.js.map +0 -1
- package/dist/prd-frontier.d.ts.map +0 -1
- package/dist/prd-frontier.js.map +0 -1
- package/dist/prd-steward.d.ts.map +0 -1
- package/dist/prd-steward.js.map +0 -1
- package/dist/prd-viability.d.ts.map +0 -1
- package/dist/prd-viability.js.map +0 -1
- package/dist/worktree-focus.d.ts.map +0 -1
- package/dist/worktree-focus.js.map +0 -1
- package/dist/worktree-safety.d.ts.map +0 -1
- package/dist/worktree-safety.js.map +0 -1
- package/dist/worktree-state.d.ts.map +0 -1
- package/dist/worktree-state.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ci-status-git.js","sourceRoot":"","sources":["../src/ci-status-git.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CI run-status model + merge-gate decision -- Review Gate Hardening (Reconnect
|
|
3
|
+
* CI to the loop).
|
|
4
|
+
*
|
|
5
|
+
* CI is the loop's only clean-environment instrument. The f1 defect merged three
|
|
6
|
+
* integration->main waves while `npm ci` was structurally broken because the
|
|
7
|
+
* daemon never waited on a green CI run. This module owns the SOURCE-AGNOSTIC
|
|
8
|
+
* pieces of the reconnection:
|
|
9
|
+
* - `CiRunStatus`: the normalized status a SHA's CI run can be in. Every
|
|
10
|
+
* concrete source (Gitea commit-status API, a git-notes status the CI
|
|
11
|
+
* workflow writes, ...) maps onto this enum, so the decision + sensor logic
|
|
12
|
+
* below never depend on which source is wired.
|
|
13
|
+
* - `resolveCiMergeGate`: the pure integration->main merge decision (green ->
|
|
14
|
+
* proceed, pending/red -> hold, unknown -> proceed). This is the AC's
|
|
15
|
+
* test-target for the green-wait.
|
|
16
|
+
* - `CiStatusReader`: the injected seam that READS a SHA's status. Its concrete
|
|
17
|
+
* implementation (the credential-dependent Gitea call) is deliberately NOT
|
|
18
|
+
* here -- it is provided by the caller. With no reader configured, the gate
|
|
19
|
+
* never activates and the merge proceeds exactly as before (safe default).
|
|
20
|
+
*
|
|
21
|
+
* Keeping this module pure + reader-injected means the decision and sensor logic
|
|
22
|
+
* are fully unit-testable without a live registry, and the one part that needs an
|
|
23
|
+
* infra/credential decision (the concrete reader) is a single, isolated seam.
|
|
24
|
+
*
|
|
25
|
+
* @module ci-status
|
|
26
|
+
*/
|
|
27
|
+
import type { DaemonConfig } from './types.js';
|
|
28
|
+
/**
|
|
29
|
+
* Normalized CI run status for a SHA.
|
|
30
|
+
* - green -- a CI run for this SHA completed successfully.
|
|
31
|
+
* - pending -- a run exists but has not finished (queued / running).
|
|
32
|
+
* - red -- a run for this SHA finished failed.
|
|
33
|
+
* - unknown -- no status could be determined (no run found, no reader
|
|
34
|
+
* configured, or the source was unreachable). Treated as
|
|
35
|
+
* non-blocking so a missing/unavailable signal never wedges merges.
|
|
36
|
+
*/
|
|
37
|
+
export type CiRunStatus = 'green' | 'pending' | 'red' | 'unknown';
|
|
38
|
+
/** The integration->main merge-gate decision derived from a SHA's CI status. */
|
|
39
|
+
export interface CiMergeGateDecision {
|
|
40
|
+
/** Whether the integration->main merge may proceed now. */
|
|
41
|
+
proceed: boolean;
|
|
42
|
+
/** The status the decision was derived from. */
|
|
43
|
+
status: CiRunStatus;
|
|
44
|
+
/** Human-readable reason (logged; surfaced in the session exit suffix). */
|
|
45
|
+
reason: string;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Pure merge-gate decision: should integration->main proceed given the merged
|
|
49
|
+
* SHA's CI status? FAIL-CLOSED (Jeremy decision 2026-07-05): only an explicit
|
|
50
|
+
* green proceeds; everything else HOLDS.
|
|
51
|
+
*
|
|
52
|
+
* green -> proceed (the clean-environment instrument is satisfied).
|
|
53
|
+
* pending -> HOLD (a run is in flight; wait for it to finish before merging).
|
|
54
|
+
* red -> HOLD (do not merge a red SHA to main).
|
|
55
|
+
* unknown -> HOLD (no determinable green status == not green; a missing or
|
|
56
|
+
* unreadable status ref must not let an unverified SHA reach main).
|
|
57
|
+
*
|
|
58
|
+
* NOTE: this fail-closed model only engages when a CI status READER is wired
|
|
59
|
+
* into the merge path. With no reader configured the merge path SKIPS the gate
|
|
60
|
+
* entirely (runCiMergeToMain), so a focus with CI enabled but no status source
|
|
61
|
+
* is unaffected -- the fail-closed hold applies once a reader exists and reports
|
|
62
|
+
* a non-green (or absent) status for the merged SHA.
|
|
63
|
+
*/
|
|
64
|
+
export declare function resolveCiMergeGate(status: CiRunStatus): CiMergeGateDecision;
|
|
65
|
+
/**
|
|
66
|
+
* Classify a git-native CI status from the set of `refs/ci-status/<sha>/<state>`
|
|
67
|
+
* ref names published for a SHA. The STATE is encoded in the ref NAME (immutable
|
|
68
|
+
* per-SHA), so no object content read is needed. FAIL-CLOSED: an empty set or an
|
|
69
|
+
* unrecognized suffix is 'unknown' (holds). A failure ref outranks a success ref
|
|
70
|
+
* (a red run must win if both somehow exist). Pure -- the caller supplies the
|
|
71
|
+
* ref names from a scoped `git ls-remote` / fetch.
|
|
72
|
+
*/
|
|
73
|
+
export declare function classifyGitNativeCiStatus(refNames: readonly string[]): CiRunStatus;
|
|
74
|
+
/** Parameters passed to a CI status reader. */
|
|
75
|
+
export interface CiStatusReadParams {
|
|
76
|
+
/** The SHA whose CI run status to read (the integration tip about to merge). */
|
|
77
|
+
sha: string;
|
|
78
|
+
/** The integration branch name (the ref CI runs against). */
|
|
79
|
+
integrationBranch: string;
|
|
80
|
+
/** Product-scoped daemon config (repoPath, remotes, per-product CI config). */
|
|
81
|
+
config: DaemonConfig;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Injected seam that reads a SHA's normalized CI run status. The concrete
|
|
85
|
+
* implementation -- a Gitea commit-status / actions-run API call, or a read of a
|
|
86
|
+
* status the CI workflow published over git -- is provided by the caller and is
|
|
87
|
+
* the ONE part gated on the infra/credential decision. A reader that cannot
|
|
88
|
+
* determine a status returns 'unknown' (never throws for a normal miss).
|
|
89
|
+
*/
|
|
90
|
+
export type CiStatusReader = (params: CiStatusReadParams) => Promise<CiRunStatus>;
|
|
91
|
+
/**
|
|
92
|
+
* Read the published `refs/ci-status/<sha>/<state>` ref names for a SHA from the
|
|
93
|
+
* remote, over the daemon's existing git-over-SSH channel. Scoped + branch-sync-
|
|
94
|
+
* neutral BY CONSTRUCTION: it queries ONLY the disjoint `refs/ci-status/*`
|
|
95
|
+
* namespace (never `refs/heads/*`), writes nothing locally (ls-remote is a
|
|
96
|
+
* read-only remote query -- no FETCH_HEAD, no local ref update), so it cannot
|
|
97
|
+
* move integration/main or perturb the merge-back. Returns [] on any git error
|
|
98
|
+
* (fail-closed -> classifies to 'unknown' -> holds). Injected so the reader is
|
|
99
|
+
* unit-testable without a live remote.
|
|
100
|
+
*/
|
|
101
|
+
export type CiStatusRefLister = (sha: string, config: DaemonConfig) => string[];
|
|
102
|
+
/**
|
|
103
|
+
* Build the git-native CI status reader. Composes the scoped ref lister with the
|
|
104
|
+
* pure classifier. FAIL-CLOSED throughout: any git failure or absent ref yields
|
|
105
|
+
* 'unknown', which the merge gate holds on.
|
|
106
|
+
*/
|
|
107
|
+
/** The action the CI-result sensor should take for the integration branch. */
|
|
108
|
+
export type CiSensorAction = 'file' | 'resolve' | 'none';
|
|
109
|
+
/**
|
|
110
|
+
* Pure CI-result sensor decision: given the integration tip's CI status and
|
|
111
|
+
* whether an open ci_run_red escalation already exists, decide whether to file a
|
|
112
|
+
* new escalation, resolve the open one, or do nothing.
|
|
113
|
+
*
|
|
114
|
+
* red + no open -> 'file' (a failing run becomes signal, once).
|
|
115
|
+
* green + open -> 'resolve' (the branch recovered; close the escalation).
|
|
116
|
+
* otherwise -> 'none' (red+open: already signalled; pending/unknown:
|
|
117
|
+
* nothing actionable -- do NOT resolve on
|
|
118
|
+
* unknown, that would hide an unresolved red).
|
|
119
|
+
*/
|
|
120
|
+
export declare function decideCiSensorAction(status: CiRunStatus, hasOpenRedEscalation: boolean): CiSensorAction;
|
|
121
|
+
export declare function createGitNativeCiStatusReader(lister: CiStatusRefLister): CiStatusReader;
|
|
122
|
+
//# sourceMappingURL=ci-status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ci-status.d.ts","sourceRoot":"","sources":["../src/ci-status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C;;;;;;;;GAQG;AACH,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,KAAK,GAAG,SAAS,CAAC;AAElE,gFAAgF;AAChF,MAAM,WAAW,mBAAmB;IAClC,2DAA2D;IAC3D,OAAO,EAAE,OAAO,CAAC;IACjB,gDAAgD;IAChD,MAAM,EAAE,WAAW,CAAC;IACpB,2EAA2E;IAC3E,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,GAAG,mBAAmB,CAY3E;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,WAAW,CAYlF;AAED,+CAA+C;AAC/C,MAAM,WAAW,kBAAkB;IACjC,gFAAgF;IAChF,GAAG,EAAE,MAAM,CAAC;IACZ,6DAA6D;IAC7D,iBAAiB,EAAE,MAAM,CAAC;IAC1B,+EAA+E;IAC/E,MAAM,EAAE,YAAY,CAAC;CACtB;AAED;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,kBAAkB,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;AAElF;;;;;;;;;GASG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,MAAM,EAAE,CAAC;AAEhF;;;;GAIG;AACH,8EAA8E;AAC9E,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;AAEzD;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,oBAAoB,EAAE,OAAO,GAAG,cAAc,CAIvG;AAED,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,iBAAiB,GAAG,cAAc,CAWvF"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CI run-status model + merge-gate decision -- Review Gate Hardening (Reconnect
|
|
3
|
+
* CI to the loop).
|
|
4
|
+
*
|
|
5
|
+
* CI is the loop's only clean-environment instrument. The f1 defect merged three
|
|
6
|
+
* integration->main waves while `npm ci` was structurally broken because the
|
|
7
|
+
* daemon never waited on a green CI run. This module owns the SOURCE-AGNOSTIC
|
|
8
|
+
* pieces of the reconnection:
|
|
9
|
+
* - `CiRunStatus`: the normalized status a SHA's CI run can be in. Every
|
|
10
|
+
* concrete source (Gitea commit-status API, a git-notes status the CI
|
|
11
|
+
* workflow writes, ...) maps onto this enum, so the decision + sensor logic
|
|
12
|
+
* below never depend on which source is wired.
|
|
13
|
+
* - `resolveCiMergeGate`: the pure integration->main merge decision (green ->
|
|
14
|
+
* proceed, pending/red -> hold, unknown -> proceed). This is the AC's
|
|
15
|
+
* test-target for the green-wait.
|
|
16
|
+
* - `CiStatusReader`: the injected seam that READS a SHA's status. Its concrete
|
|
17
|
+
* implementation (the credential-dependent Gitea call) is deliberately NOT
|
|
18
|
+
* here -- it is provided by the caller. With no reader configured, the gate
|
|
19
|
+
* never activates and the merge proceeds exactly as before (safe default).
|
|
20
|
+
*
|
|
21
|
+
* Keeping this module pure + reader-injected means the decision and sensor logic
|
|
22
|
+
* are fully unit-testable without a live registry, and the one part that needs an
|
|
23
|
+
* infra/credential decision (the concrete reader) is a single, isolated seam.
|
|
24
|
+
*
|
|
25
|
+
* @module ci-status
|
|
26
|
+
*/
|
|
27
|
+
/**
|
|
28
|
+
* Pure merge-gate decision: should integration->main proceed given the merged
|
|
29
|
+
* SHA's CI status? FAIL-CLOSED (Jeremy decision 2026-07-05): only an explicit
|
|
30
|
+
* green proceeds; everything else HOLDS.
|
|
31
|
+
*
|
|
32
|
+
* green -> proceed (the clean-environment instrument is satisfied).
|
|
33
|
+
* pending -> HOLD (a run is in flight; wait for it to finish before merging).
|
|
34
|
+
* red -> HOLD (do not merge a red SHA to main).
|
|
35
|
+
* unknown -> HOLD (no determinable green status == not green; a missing or
|
|
36
|
+
* unreadable status ref must not let an unverified SHA reach main).
|
|
37
|
+
*
|
|
38
|
+
* NOTE: this fail-closed model only engages when a CI status READER is wired
|
|
39
|
+
* into the merge path. With no reader configured the merge path SKIPS the gate
|
|
40
|
+
* entirely (runCiMergeToMain), so a focus with CI enabled but no status source
|
|
41
|
+
* is unaffected -- the fail-closed hold applies once a reader exists and reports
|
|
42
|
+
* a non-green (or absent) status for the merged SHA.
|
|
43
|
+
*/
|
|
44
|
+
export function resolveCiMergeGate(status) {
|
|
45
|
+
switch (status) {
|
|
46
|
+
case 'green':
|
|
47
|
+
return { proceed: true, status, reason: 'CI green for the merged SHA' };
|
|
48
|
+
case 'pending':
|
|
49
|
+
return { proceed: false, status, reason: 'CI run pending for the merged SHA -- holding integration->main until green' };
|
|
50
|
+
case 'red':
|
|
51
|
+
return { proceed: false, status, reason: 'CI red for the merged SHA -- holding integration->main (a red run must not reach main)' };
|
|
52
|
+
case 'unknown':
|
|
53
|
+
default:
|
|
54
|
+
return { proceed: false, status: 'unknown', reason: 'CI status unavailable for the merged SHA -- holding (fail-closed: unknown != green)' };
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Classify a git-native CI status from the set of `refs/ci-status/<sha>/<state>`
|
|
59
|
+
* ref names published for a SHA. The STATE is encoded in the ref NAME (immutable
|
|
60
|
+
* per-SHA), so no object content read is needed. FAIL-CLOSED: an empty set or an
|
|
61
|
+
* unrecognized suffix is 'unknown' (holds). A failure ref outranks a success ref
|
|
62
|
+
* (a red run must win if both somehow exist). Pure -- the caller supplies the
|
|
63
|
+
* ref names from a scoped `git ls-remote` / fetch.
|
|
64
|
+
*/
|
|
65
|
+
export function classifyGitNativeCiStatus(refNames) {
|
|
66
|
+
let sawGreen = false;
|
|
67
|
+
let sawPending = false;
|
|
68
|
+
for (const raw of refNames) {
|
|
69
|
+
const ref = raw.trim();
|
|
70
|
+
if (ref.endsWith('/failure') || ref.endsWith('/error') || ref.endsWith('/red'))
|
|
71
|
+
return 'red';
|
|
72
|
+
if (ref.endsWith('/success') || ref.endsWith('/green') || ref.endsWith('/passed'))
|
|
73
|
+
sawGreen = true;
|
|
74
|
+
else if (ref.endsWith('/pending') || ref.endsWith('/running') || ref.endsWith('/queued'))
|
|
75
|
+
sawPending = true;
|
|
76
|
+
}
|
|
77
|
+
if (sawGreen)
|
|
78
|
+
return 'green';
|
|
79
|
+
if (sawPending)
|
|
80
|
+
return 'pending';
|
|
81
|
+
return 'unknown';
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Pure CI-result sensor decision: given the integration tip's CI status and
|
|
85
|
+
* whether an open ci_run_red escalation already exists, decide whether to file a
|
|
86
|
+
* new escalation, resolve the open one, or do nothing.
|
|
87
|
+
*
|
|
88
|
+
* red + no open -> 'file' (a failing run becomes signal, once).
|
|
89
|
+
* green + open -> 'resolve' (the branch recovered; close the escalation).
|
|
90
|
+
* otherwise -> 'none' (red+open: already signalled; pending/unknown:
|
|
91
|
+
* nothing actionable -- do NOT resolve on
|
|
92
|
+
* unknown, that would hide an unresolved red).
|
|
93
|
+
*/
|
|
94
|
+
export function decideCiSensorAction(status, hasOpenRedEscalation) {
|
|
95
|
+
if (status === 'red' && !hasOpenRedEscalation)
|
|
96
|
+
return 'file';
|
|
97
|
+
if (status === 'green' && hasOpenRedEscalation)
|
|
98
|
+
return 'resolve';
|
|
99
|
+
return 'none';
|
|
100
|
+
}
|
|
101
|
+
export function createGitNativeCiStatusReader(lister) {
|
|
102
|
+
return async ({ sha, config }) => {
|
|
103
|
+
let refs = [];
|
|
104
|
+
try {
|
|
105
|
+
refs = lister(sha, config);
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
// Fail-closed: an unreachable/erroring remote must not report green.
|
|
109
|
+
refs = [];
|
|
110
|
+
}
|
|
111
|
+
return classifyGitNativeCiStatus(refs);
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=ci-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ci-status.js","sourceRoot":"","sources":["../src/ci-status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAyBH;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAmB;IACpD,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,OAAO;YACV,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,6BAA6B,EAAE,CAAC;QAC1E,KAAK,SAAS;YACZ,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,4EAA4E,EAAE,CAAC;QAC1H,KAAK,KAAK;YACR,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,wFAAwF,EAAE,CAAC;QACtI,KAAK,SAAS,CAAC;QACf;YACE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,qFAAqF,EAAE,CAAC;IAChJ,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,yBAAyB,CAAC,QAA2B;IACnE,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7F,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,QAAQ,GAAG,IAAI,CAAC;aAC9F,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,UAAU,GAAG,IAAI,CAAC;IAC9G,CAAC;IACD,IAAI,QAAQ;QAAE,OAAO,OAAO,CAAC;IAC7B,IAAI,UAAU;QAAE,OAAO,SAAS,CAAC;IACjC,OAAO,SAAS,CAAC;AACnB,CAAC;AAyCD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAmB,EAAE,oBAA6B;IACrF,IAAI,MAAM,KAAK,KAAK,IAAI,CAAC,oBAAoB;QAAE,OAAO,MAAM,CAAC;IAC7D,IAAI,MAAM,KAAK,OAAO,IAAI,oBAAoB;QAAE,OAAO,SAAS,CAAC;IACjE,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,MAAyB;IACrE,OAAO,KAAK,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE;QAC/B,IAAI,IAAI,GAAa,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,qEAAqE;YACrE,IAAI,GAAG,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,yBAAyB,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex/IDE harness config writer: the seeded `AGENTS.md` block. Extracted
|
|
3
|
+
* verbatim from `../connect.ts` and re-exported from there for import
|
|
4
|
+
* stability.
|
|
5
|
+
*/
|
|
6
|
+
import { type AgentsMdConnectionInvariant } from '../../templates/agents-md.js';
|
|
7
|
+
import type { ConnectIO } from './shared.js';
|
|
8
|
+
/**
|
|
9
|
+
* Write or merge a seeded `AGENTS.md` at the repo root (Codex harness).
|
|
10
|
+
*
|
|
11
|
+
* The exact analog of `writeOrMergeClaudeMd` for the Codex operator surface:
|
|
12
|
+
* AGENTS.md is Codex's CLAUDE.md-equivalent. Same merge semantics --
|
|
13
|
+
* - Fresh repo: writes the seeded block straight in.
|
|
14
|
+
* - Existing AGENTS.md without the Telora delimiters: appends a delimited
|
|
15
|
+
* block at the end; user content untouched.
|
|
16
|
+
* - Existing AGENTS.md WITH the delimiters: replaces only the delimited block.
|
|
17
|
+
*
|
|
18
|
+
* Idempotent at the filesystem level: when the computed content equals what is
|
|
19
|
+
* already on disk, NO write occurs (no spurious mtime bump, no git churn). The
|
|
20
|
+
* daemon re-invokes this on boot to self-heal the seed block, so the
|
|
21
|
+
* unchanged-common-case must not touch the file.
|
|
22
|
+
*/
|
|
23
|
+
export declare function writeOrMergeAgentsMd(repoPath: string, inv: AgentsMdConnectionInvariant, io: ConnectIO): void;
|
|
24
|
+
//# sourceMappingURL=agents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../../src/cli/connect/agents.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAIL,KAAK,2BAA2B,EACjC,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,2BAA2B,EAChC,EAAE,EAAE,SAAS,GACZ,IAAI,CA0CN"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex/IDE harness config writer: the seeded `AGENTS.md` block. Extracted
|
|
3
|
+
* verbatim from `../connect.ts` and re-exported from there for import
|
|
4
|
+
* stability.
|
|
5
|
+
*/
|
|
6
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
7
|
+
import { resolve } from 'node:path';
|
|
8
|
+
import { TELORA_AGENTS_MD_BEGIN, TELORA_AGENTS_MD_END, renderAgentsMd, } from '../../templates/agents-md.js';
|
|
9
|
+
/**
|
|
10
|
+
* Write or merge a seeded `AGENTS.md` at the repo root (Codex harness).
|
|
11
|
+
*
|
|
12
|
+
* The exact analog of `writeOrMergeClaudeMd` for the Codex operator surface:
|
|
13
|
+
* AGENTS.md is Codex's CLAUDE.md-equivalent. Same merge semantics --
|
|
14
|
+
* - Fresh repo: writes the seeded block straight in.
|
|
15
|
+
* - Existing AGENTS.md without the Telora delimiters: appends a delimited
|
|
16
|
+
* block at the end; user content untouched.
|
|
17
|
+
* - Existing AGENTS.md WITH the delimiters: replaces only the delimited block.
|
|
18
|
+
*
|
|
19
|
+
* Idempotent at the filesystem level: when the computed content equals what is
|
|
20
|
+
* already on disk, NO write occurs (no spurious mtime bump, no git churn). The
|
|
21
|
+
* daemon re-invokes this on boot to self-heal the seed block, so the
|
|
22
|
+
* unchanged-common-case must not touch the file.
|
|
23
|
+
*/
|
|
24
|
+
export function writeOrMergeAgentsMd(repoPath, inv, io) {
|
|
25
|
+
const path = resolve(repoPath, 'AGENTS.md');
|
|
26
|
+
const seedBlock = renderAgentsMd(inv);
|
|
27
|
+
if (!existsSync(path)) {
|
|
28
|
+
writeFileSync(path, seedBlock);
|
|
29
|
+
io.out(`Wrote ${path}.\n`);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const existing = readFileSync(path, 'utf-8');
|
|
33
|
+
const beginIdx = existing.indexOf(TELORA_AGENTS_MD_BEGIN);
|
|
34
|
+
let newContent;
|
|
35
|
+
let message;
|
|
36
|
+
if (beginIdx === -1) {
|
|
37
|
+
const sep = existing.endsWith('\n') ? '\n' : '\n\n';
|
|
38
|
+
newContent = existing + sep + seedBlock;
|
|
39
|
+
message = `Appended Telora seed block to ${path}.\n`;
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
const endIdx = existing.indexOf(TELORA_AGENTS_MD_END, beginIdx);
|
|
43
|
+
if (endIdx === -1) {
|
|
44
|
+
const sep = existing.endsWith('\n') ? '\n' : '\n\n';
|
|
45
|
+
newContent = existing + sep + seedBlock;
|
|
46
|
+
message = `Appended Telora seed block to ${path} (prior block was malformed).\n`;
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
const after = endIdx + TELORA_AGENTS_MD_END.length;
|
|
50
|
+
const trailingNewline = existing[after] === '\n' ? 1 : 0;
|
|
51
|
+
newContent =
|
|
52
|
+
existing.slice(0, beginIdx) +
|
|
53
|
+
seedBlock.trimEnd() +
|
|
54
|
+
'\n' +
|
|
55
|
+
existing.slice(after + trailingNewline);
|
|
56
|
+
message = `Refreshed Telora seed block in ${path}.\n`;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Idempotency guard: skip the write entirely when nothing would change.
|
|
60
|
+
if (newContent === existing)
|
|
61
|
+
return;
|
|
62
|
+
writeFileSync(path, newContent);
|
|
63
|
+
io.out(message);
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=agents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../../../src/cli/connect/agents.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,cAAc,GAEf,MAAM,8BAA8B,CAAC;AAGtC;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAAgB,EAChB,GAAgC,EAChC,EAAa;IAEb,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IAEtC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC/B,EAAE,CAAC,GAAG,CAAC,SAAS,IAAI,KAAK,CAAC,CAAC;QAC3B,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAE1D,IAAI,UAAkB,CAAC;IACvB,IAAI,OAAe,CAAC;IACpB,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;QACpD,UAAU,GAAG,QAAQ,GAAG,GAAG,GAAG,SAAS,CAAC;QACxC,OAAO,GAAG,iCAAiC,IAAI,KAAK,CAAC;IACvD,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC;QAChE,IAAI,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;YAClB,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;YACpD,UAAU,GAAG,QAAQ,GAAG,GAAG,GAAG,SAAS,CAAC;YACxC,OAAO,GAAG,iCAAiC,IAAI,iCAAiC,CAAC;QACnF,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,GAAG,MAAM,GAAG,oBAAoB,CAAC,MAAM,CAAC;YACnD,MAAM,eAAe,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACzD,UAAU;gBACR,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC;oBAC3B,SAAS,CAAC,OAAO,EAAE;oBACnB,IAAI;oBACJ,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,eAAe,CAAC,CAAC;YAC1C,OAAO,GAAG,kCAAkC,IAAI,KAAK,CAAC;QACxD,CAAC;IACH,CAAC;IAED,wEAAwE;IACxE,IAAI,UAAU,KAAK,QAAQ;QAAE,OAAO;IAEpC,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAChC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude harness config writers: the seeded `CLAUDE.md` block and the
|
|
3
|
+
* `<repo>/.claude/settings.json` permissions/hooks merge. Extracted verbatim
|
|
4
|
+
* from `../connect.ts` and re-exported from there for import stability.
|
|
5
|
+
*/
|
|
6
|
+
import type { ConnectIO } from './shared.js';
|
|
7
|
+
/**
|
|
8
|
+
* Write or merge a seeded `CLAUDE.md` at the repo root.
|
|
9
|
+
*
|
|
10
|
+
* - Fresh repo: writes the seeded block straight in.
|
|
11
|
+
* - Existing CLAUDE.md without the Telora delimiters: appends a delimited
|
|
12
|
+
* Telora block at the end. The user's content is untouched.
|
|
13
|
+
* - Existing CLAUDE.md WITH the delimiters: replaces only the delimited
|
|
14
|
+
* block. Re-runs are byte-identical (no churn, no duplication).
|
|
15
|
+
*
|
|
16
|
+
* Idempotent at the filesystem level: when the computed content equals what
|
|
17
|
+
* is already on disk, NO write occurs (no spurious mtime bump, no git churn).
|
|
18
|
+
* The daemon re-invokes this on every boot to self-heal the seed block, so
|
|
19
|
+
* the unchanged-common-case must not touch the file.
|
|
20
|
+
*/
|
|
21
|
+
export declare function writeOrMergeClaudeMd(repoPath: string, productName: string | null, io: ConnectIO): void;
|
|
22
|
+
/**
|
|
23
|
+
* Write or deep-merge `<repo>/.claude/settings.json`.
|
|
24
|
+
*
|
|
25
|
+
* Fresh: writes the template directly.
|
|
26
|
+
* Existing: deep-merges our `permissions.allow` entries into the user's
|
|
27
|
+
* settings, deduplicating. All other top-level keys are untouched.
|
|
28
|
+
* Re-runs produce no diff.
|
|
29
|
+
*/
|
|
30
|
+
export declare function writeOrMergeClaudeSettings(repoPath: string, io: ConnectIO): void;
|
|
31
|
+
//# sourceMappingURL=claude.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../../src/cli/connect/claude.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,EAAE,EAAE,SAAS,GACZ,IAAI,CAiDN;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,GAAG,IAAI,CA0BhF"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude harness config writers: the seeded `CLAUDE.md` block and the
|
|
3
|
+
* `<repo>/.claude/settings.json` permissions/hooks merge. Extracted verbatim
|
|
4
|
+
* from `../connect.ts` and re-exported from there for import stability.
|
|
5
|
+
*/
|
|
6
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
7
|
+
import { resolve } from 'node:path';
|
|
8
|
+
import { TELORA_CLAUDE_MD_BEGIN, TELORA_CLAUDE_MD_END, renderClaudeMd, } from '../../templates/claude-md.js';
|
|
9
|
+
import { buildClaudeSettings, mergeClaudeSettings, } from '../../templates/claude-settings.js';
|
|
10
|
+
/**
|
|
11
|
+
* Write or merge a seeded `CLAUDE.md` at the repo root.
|
|
12
|
+
*
|
|
13
|
+
* - Fresh repo: writes the seeded block straight in.
|
|
14
|
+
* - Existing CLAUDE.md without the Telora delimiters: appends a delimited
|
|
15
|
+
* Telora block at the end. The user's content is untouched.
|
|
16
|
+
* - Existing CLAUDE.md WITH the delimiters: replaces only the delimited
|
|
17
|
+
* block. Re-runs are byte-identical (no churn, no duplication).
|
|
18
|
+
*
|
|
19
|
+
* Idempotent at the filesystem level: when the computed content equals what
|
|
20
|
+
* is already on disk, NO write occurs (no spurious mtime bump, no git churn).
|
|
21
|
+
* The daemon re-invokes this on every boot to self-heal the seed block, so
|
|
22
|
+
* the unchanged-common-case must not touch the file.
|
|
23
|
+
*/
|
|
24
|
+
export function writeOrMergeClaudeMd(repoPath, productName, io) {
|
|
25
|
+
const path = resolve(repoPath, 'CLAUDE.md');
|
|
26
|
+
const seedBlock = renderClaudeMd(productName);
|
|
27
|
+
if (!existsSync(path)) {
|
|
28
|
+
writeFileSync(path, seedBlock);
|
|
29
|
+
io.out(`Wrote ${path}.\n`);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const existing = readFileSync(path, 'utf-8');
|
|
33
|
+
const beginIdx = existing.indexOf(TELORA_CLAUDE_MD_BEGIN);
|
|
34
|
+
let newContent;
|
|
35
|
+
let message;
|
|
36
|
+
if (beginIdx === -1) {
|
|
37
|
+
// No prior Telora block -- append, preserving user content.
|
|
38
|
+
const sep = existing.endsWith('\n') ? '\n' : '\n\n';
|
|
39
|
+
newContent = existing + sep + seedBlock;
|
|
40
|
+
message = `Appended Telora seed block to ${path}.\n`;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
const endIdx = existing.indexOf(TELORA_CLAUDE_MD_END, beginIdx);
|
|
44
|
+
if (endIdx === -1) {
|
|
45
|
+
// Begin marker without end -- treat as malformed. Append a fresh block
|
|
46
|
+
// rather than risk corrupting whatever's there.
|
|
47
|
+
const sep = existing.endsWith('\n') ? '\n' : '\n\n';
|
|
48
|
+
newContent = existing + sep + seedBlock;
|
|
49
|
+
message = `Appended Telora seed block to ${path} (prior block was malformed).\n`;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
// Replace the existing Telora block in place.
|
|
53
|
+
const after = endIdx + TELORA_CLAUDE_MD_END.length;
|
|
54
|
+
// Trim a trailing newline after the end marker so we don't accumulate
|
|
55
|
+
// blank lines on each re-run.
|
|
56
|
+
const trailingNewline = existing[after] === '\n' ? 1 : 0;
|
|
57
|
+
newContent =
|
|
58
|
+
existing.slice(0, beginIdx) +
|
|
59
|
+
seedBlock.trimEnd() +
|
|
60
|
+
'\n' +
|
|
61
|
+
existing.slice(after + trailingNewline);
|
|
62
|
+
message = `Refreshed Telora seed block in ${path}.\n`;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Idempotency guard: skip the write entirely when nothing would change.
|
|
66
|
+
// This keeps the boot-time self-heal a no-op for already-current repos.
|
|
67
|
+
if (newContent === existing)
|
|
68
|
+
return;
|
|
69
|
+
writeFileSync(path, newContent);
|
|
70
|
+
io.out(message);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Write or deep-merge `<repo>/.claude/settings.json`.
|
|
74
|
+
*
|
|
75
|
+
* Fresh: writes the template directly.
|
|
76
|
+
* Existing: deep-merges our `permissions.allow` entries into the user's
|
|
77
|
+
* settings, deduplicating. All other top-level keys are untouched.
|
|
78
|
+
* Re-runs produce no diff.
|
|
79
|
+
*/
|
|
80
|
+
export function writeOrMergeClaudeSettings(repoPath, io) {
|
|
81
|
+
const dir = resolve(repoPath, '.claude');
|
|
82
|
+
const path = resolve(dir, 'settings.json');
|
|
83
|
+
const seed = buildClaudeSettings();
|
|
84
|
+
if (!existsSync(dir))
|
|
85
|
+
mkdirSync(dir, { recursive: true });
|
|
86
|
+
let existing = null;
|
|
87
|
+
if (existsSync(path)) {
|
|
88
|
+
try {
|
|
89
|
+
const parsed = JSON.parse(readFileSync(path, 'utf-8'));
|
|
90
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
91
|
+
existing = parsed;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
io.err(`Warning: existing ${path} is not valid JSON; leaving it alone: ` +
|
|
96
|
+
`${err instanceof Error ? err.message : String(err)}\n`);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
const merged = mergeClaudeSettings(existing, seed);
|
|
101
|
+
writeFileSync(path, JSON.stringify(merged, null, 2) + '\n');
|
|
102
|
+
io.out(existing ? `Merged Telora entries into ${path}.\n` : `Wrote ${path}.\n`);
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=claude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../../src/cli/connect/claude.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cline harness config writers: the project-level Cline rules file and the
|
|
3
|
+
* Telora MCP registration in the Cline CLI settings. Extracted verbatim from
|
|
4
|
+
* `../connect.ts` and re-exported from there for import stability.
|
|
5
|
+
*/
|
|
6
|
+
import type { AgentsMdConnectionInvariant } from '../../templates/agents-md.js';
|
|
7
|
+
import type { ConnectIO } from './shared.js';
|
|
8
|
+
/**
|
|
9
|
+
* Render a project-level Cline rules file carrying the same Telora seed
|
|
10
|
+
* discipline as CLAUDE.md / AGENTS.md. Cline CLI reads project rules from
|
|
11
|
+
* `.cline/rules/`, so this is the operator-facing context equivalent for the
|
|
12
|
+
* Cline harness.
|
|
13
|
+
*/
|
|
14
|
+
export declare function renderClineRules(inv: AgentsMdConnectionInvariant): string;
|
|
15
|
+
/**
|
|
16
|
+
* Write the Telora Cline project rules file. The file is owned by the connect
|
|
17
|
+
* flow, so re-runs replace it wholesale; user-authored Cline rules live beside
|
|
18
|
+
* it under `.cline/rules/`.
|
|
19
|
+
*/
|
|
20
|
+
export declare function writeClineProjectRules(repoPath: string, inv: AgentsMdConnectionInvariant, io: ConnectIO): void;
|
|
21
|
+
/**
|
|
22
|
+
* Render the Cline CLI MCP config object. Current Cline CLI documentation
|
|
23
|
+
* stores MCP settings under `~/.cline/data/settings/cline_mcp_settings.json`
|
|
24
|
+
* with a top-level `mcpServers` map.
|
|
25
|
+
*
|
|
26
|
+
* Carries the MCP profile ONLY -- never workstation identity. Like the
|
|
27
|
+
* `.mcp.json` and Codex builders, identity (`TELORA_URL` / `TELORA_TRACKER_ID`)
|
|
28
|
+
* resolves from the single source `~/.telora/daemon.json` via the MCP server's
|
|
29
|
+
* `loadCredentials()` fallback; a persisted copy here would only drift.
|
|
30
|
+
*/
|
|
31
|
+
export declare function renderClineMcpSettings(params: {
|
|
32
|
+
mcpServerPath: string;
|
|
33
|
+
}): Record<string, unknown>;
|
|
34
|
+
export declare function writeOrMergeClineMcpSettings(io: ConnectIO, params?: {
|
|
35
|
+
homeOverride?: string;
|
|
36
|
+
}): void;
|
|
37
|
+
//# sourceMappingURL=cline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cline.d.ts","sourceRoot":"","sources":["../../../src/cli/connect/cline.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAChF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAK7C;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,2BAA2B,GAAG,MAAM,CAczE;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,2BAA2B,EAChC,EAAE,EAAE,SAAS,GACZ,IAAI,CASN;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC7C,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAc1B;AAED,wBAAgB,4BAA4B,CAC1C,EAAE,EAAE,SAAS,EACb,MAAM,GAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAA;CAAO,GACrC,IAAI,CAuDN"}
|