@moretea-labs/forge 1.7.0 → 1.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/AGENTS.md +2 -0
  2. package/CHANGELOG.md +26 -0
  3. package/CLAUDE.md +2 -0
  4. package/THIRD_PARTY_NOTICES.md +1 -1
  5. package/agents/openai.yaml +1 -1
  6. package/assets/partials-agents/02-operating-mode.partial.md +2 -0
  7. package/assets/plugin-registry.v1.json +3 -3
  8. package/assets/skill-version.json +2 -2
  9. package/assets/templates/helpers/check-architecture-sync.sh +17 -0
  10. package/assets/templates/helpers/inspect-project-state.ts +8 -6
  11. package/assets/templates/helpers/migrate-workflow-docs.ts +9 -7
  12. package/assets/templates/helpers/workflow-contract.ts +5 -1
  13. package/docs/architecture/CURRENT.md +12 -4
  14. package/docs/forge-plugin-management.md +1 -1
  15. package/docs/operations/controller-performance-and-502.md +19 -0
  16. package/docs/operations/homebrew.md +2 -2
  17. package/package.json +5 -2
  18. package/scripts/architecture-event.ts +2 -820
  19. package/scripts/architecture-queue.sh +2 -645
  20. package/scripts/archive-architecture-request.sh +2 -242
  21. package/scripts/archive-workflow.sh +1 -291
  22. package/scripts/benchmark-work-efficiency.ts +0 -0
  23. package/scripts/capability-config.ts +2 -392
  24. package/scripts/capability-resolver.ts +2 -503
  25. package/scripts/capture-plan.sh +1 -332
  26. package/scripts/check-agent-tooling.sh +2 -1531
  27. package/scripts/check-architecture-sync.sh +2 -302
  28. package/scripts/check-brain-manifest.sh +2 -253
  29. package/scripts/check-context-files.sh +2 -47
  30. package/scripts/check-deploy-sql-order.sh +2 -115
  31. package/scripts/check-runtime-architecture.mjs +243 -16
  32. package/scripts/check-skill-version.ts +3 -191
  33. package/scripts/check-source-duplication.mjs +61 -0
  34. package/scripts/check-stable-baseline.ts +0 -0
  35. package/scripts/check-task-sync.sh +2 -63
  36. package/scripts/check-task-workflow.sh +2 -1000
  37. package/scripts/codex-handoff-resume.sh +2 -267
  38. package/scripts/context-contract-sync.sh +2 -514
  39. package/scripts/contract-run.ts +2 -463
  40. package/scripts/contract-worktree.sh +1 -702
  41. package/scripts/ensure-task-workflow.sh +1 -1192
  42. package/scripts/inspect-project-state.ts +4 -279
  43. package/scripts/lib/project-init-lib.sh +7 -2
  44. package/scripts/lib/run-forge-helper.sh +19 -0
  45. package/scripts/lib/run-forge-helper.ts +26 -0
  46. package/scripts/migrate-project-template.sh +1 -33
  47. package/scripts/migrate-workflow-docs.ts +4 -412
  48. package/scripts/new-plan.sh +1 -180
  49. package/scripts/new-spec.sh +1 -47
  50. package/scripts/new-sprint.sh +1 -46
  51. package/scripts/plan-to-todo.sh +1 -771
  52. package/scripts/prepare-codex-handoff.sh +2 -201
  53. package/scripts/prepare-handoff.sh +1 -78
  54. package/scripts/refresh-current-status.sh +2 -467
  55. package/scripts/run-governed-gate.ts +3 -0
  56. package/scripts/select-agent-context-blocks.sh +2 -64
  57. package/scripts/ship-worktrees.sh +1 -531
  58. package/scripts/sprint-backlog.sh +1 -834
  59. package/scripts/stage-runtime-release.ts +2 -1
  60. package/scripts/summarize-failures.sh +2 -123
  61. package/scripts/switch-plan.sh +1 -150
  62. package/scripts/sync-brain-docs.sh +2 -379
  63. package/scripts/sync-generated-authority.mjs +175 -0
  64. package/scripts/verify-contract.sh +2 -593
  65. package/scripts/verify-sprint.sh +1 -500
  66. package/scripts/workflow-contract.ts +4 -201
  67. package/scripts/workstream-sync.sh +2 -261
  68. package/src/cli/agent-jobs/executor-health.ts +1 -1
  69. package/src/cli/commands/plugin.ts +12 -3
  70. package/src/cli/controller/check-runner.ts +7 -2
  71. package/src/cli/controller/context-pack.ts +46 -21
  72. package/src/cli/github/contracts.ts +16 -0
  73. package/src/cli/github/github.ts +2 -16
  74. package/src/cli/github/session.ts +2 -1
  75. package/src/cli/local-bridge/facade-api.ts +37 -47
  76. package/src/cli/local-bridge/server.ts +2 -2
  77. package/src/cli/mcp/legacy-tool-service.ts +10 -33
  78. package/src/cli/mcp/post-finalize-work-attribution.ts +150 -0
  79. package/src/cli/mcp/repository-tools.ts +125 -101
  80. package/src/cli/mcp/server.ts +57 -13
  81. package/src/cli/mcp/tool-contract.ts +14 -0
  82. package/src/cli/mcp/toolset.ts +2 -2
  83. package/src/cli/mcp/transports/http.ts +23 -0
  84. package/src/cli/repositories/command-classifier.ts +2 -2
  85. package/src/cli/repositories/command-executor.ts +24 -6
  86. package/src/cli/repositories/repository-snapshot.ts +5 -2
  87. package/src/cli/repositories/structured-git.ts +57 -3
  88. package/src/cli/repository/inspector.ts +11 -3
  89. package/src/runtime/context/generic-lsp-provider.ts +1 -1
  90. package/src/runtime/context/semantic-navigation-contract.ts +61 -0
  91. package/src/runtime/context/semantic-navigation.ts +9 -61
  92. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +69 -29
  93. package/src/runtime/control-plane/execution/repository-work-attribution.ts +106 -0
  94. package/src/runtime/control-plane/execution/retained-work-resume.ts +203 -0
  95. package/src/runtime/control-plane/execution/work-completion-authority.ts +58 -0
  96. package/src/runtime/control-plane/execution/work-evidence-policy.ts +200 -0
  97. package/src/runtime/control-plane/execution/work-execution-support.ts +386 -0
  98. package/src/runtime/control-plane/execution/work-finalization-service.ts +1913 -0
  99. package/src/runtime/control-plane/execution/work-handle-authority.ts +150 -0
  100. package/src/runtime/control-plane/execution/work-handle-store.ts +1 -1
  101. package/src/runtime/control-plane/execution/work-operation-service.ts +468 -0
  102. package/src/runtime/control-plane/execution/work-path-scope.ts +37 -0
  103. package/src/runtime/control-plane/execution/work-preparation-service.ts +479 -0
  104. package/src/runtime/control-plane/execution/work-process-evidence.ts +129 -0
  105. package/src/runtime/control-plane/execution/work-task-receipt.ts +4 -43
  106. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +13 -3
  107. package/src/runtime/control-plane/execution/work-verification-context.ts +56 -0
  108. package/src/runtime/control-plane/execution/work-verification-service.ts +388 -0
  109. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +5 -1
  110. package/src/runtime/control-plane/facade/controller-round-relay.ts +164 -37
  111. package/src/runtime/control-plane/facade/controller-session-store.ts +183 -24
  112. package/src/runtime/control-plane/facade/goal-workloop-access.ts +15 -1
  113. package/src/runtime/control-plane/facade/goal-workloop.ts +329 -148
  114. package/src/runtime/control-plane/facade/index.ts +2 -0
  115. package/src/runtime/control-plane/facade/plan-contract-store.ts +90 -22
  116. package/src/runtime/control-plane/facade/repository-work-admission.ts +147 -0
  117. package/src/runtime/control-plane/facade/requirement-authority.ts +83 -0
  118. package/src/runtime/control-plane/facade/types.ts +68 -5
  119. package/src/runtime/control-plane/facade/work-contract-store.ts +3 -209
  120. package/src/runtime/control-plane/facade/work-state-machine.ts +250 -0
  121. package/src/runtime/control-plane/global-scheduler/maintenance.ts +14 -7
  122. package/src/runtime/control-plane/global-scheduler/scheduler.ts +5 -1
  123. package/src/runtime/control-plane/launcher/chatgpt-work-binding-store.ts +13 -0
  124. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +15 -6
  125. package/src/runtime/control-plane/launcher/launch-reservation-store.ts +54 -5
  126. package/src/runtime/control-plane/launcher/thin-launcher.ts +56 -7
  127. package/src/runtime/control-plane/persistence/requirement-store.ts +0 -12
  128. package/src/runtime/control-plane/repo-actor/registry.ts +4 -2
  129. package/src/runtime/control-plane/routing/route-policy.ts +18 -6
  130. package/src/runtime/control-plane/routing/workspace-admission.ts +70 -0
  131. package/src/runtime/evidence/process-check-execution.ts +18 -0
  132. package/src/runtime/execution/jobs/child-reference.ts +6 -2
  133. package/src/runtime/execution/process-runtime/check-result.ts +53 -18
  134. package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +7 -1
  135. package/src/runtime/execution/process-runtime/command-facade.ts +39 -17
  136. package/src/runtime/execution/process-runtime/lightweight-managed.ts +20 -3
  137. package/src/runtime/execution/process-runtime/persisted-check.ts +4 -1
  138. package/src/runtime/execution/process-runtime/runtime.ts +10 -0
  139. package/src/runtime/execution/process-runtime/types.ts +2 -12
  140. package/src/runtime/execution/work-activity.ts +21 -0
  141. package/src/runtime/execution/workers/executor.ts +18 -13
  142. package/src/runtime/gateway/mcp/execution-tools.ts +35 -2930
  143. package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +61 -0
  144. package/src/runtime/gateway/mcp/router.ts +2 -2
  145. package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +21 -2
  146. package/src/runtime/gateway/mcp/runtime-tools.ts +815 -1015
  147. package/src/runtime/plugins/app-store-connect-adapter.ts +93 -28
  148. package/src/runtime/plugins/browser-adapter.ts +256 -1083
  149. package/src/runtime/plugins/browser-handoff-host.ts +2 -25
  150. package/src/runtime/plugins/browser-handoff.ts +18 -3
  151. package/src/runtime/plugins/browser-macos-bridge.ts +121 -16
  152. package/src/runtime/plugins/browser-manifest-surface.ts +603 -0
  153. package/src/runtime/plugins/browser-native-session-service.ts +222 -0
  154. package/src/runtime/plugins/browser-runtime-contract.ts +2 -0
  155. package/src/runtime/plugins/browser-runtime.ts +10 -0
  156. package/src/runtime/plugins/browser-session-store.ts +121 -0
  157. package/src/runtime/plugins/browser-session-types.ts +98 -0
  158. package/src/runtime/plugins/desktop-operator-registration.ts +4 -4
  159. package/src/runtime/plugins/external-adapter.ts +92 -58
  160. package/src/runtime/plugins/macos-capability-broker.ts +0 -8
  161. package/src/runtime/plugins/store.ts +66 -9
  162. package/src/runtime/plugins/types.ts +3 -1
  163. package/src/runtime/recovery/maintenance-executor.ts +61 -25
  164. package/src/runtime/root/package-connector-service.ts +46 -4
  165. package/src/runtime/root/package-runtime-release.ts +3 -2
  166. package/src/runtime/root/package-runtime-service.ts +48 -3
  167. package/src/runtime/root/release-manifest.ts +137 -16
  168. package/src/runtime/root/release-materialize.ts +109 -35
  169. package/src/runtime/root/types.ts +10 -0
  170. package/src/runtime/standalone-recovery/core.ts +425 -194
  171. package/src/runtime/standalone-recovery/entry.ts +1 -1
  172. package/src/runtime/standalone-recovery/installer.ts +1 -1
  173. package/src/runtime/workflow/schedules/engine.ts +113 -87
  174. package/src/runtime/workflow/schedules/settlement.ts +26 -23
  175. package/src/runtime/workflow/schedules/store.ts +79 -10
@@ -1,269 +1,4 @@
1
1
  #!/bin/bash
2
2
  set -euo pipefail
3
-
4
- usage() {
5
- cat <<'USAGE_EOF'
6
- Usage: scripts/codex-handoff-resume.sh --cwd <repo> [--print-prompt] [--reason <reason>]
7
- USAGE_EOF
8
- }
9
-
10
- cwd=""
11
- print_prompt=0
12
- reason="manual"
13
-
14
- while [[ $# -gt 0 ]]; do
15
- case "$1" in
16
- --cwd)
17
- cwd="${2:-}"
18
- shift 2
19
- ;;
20
- --print-prompt)
21
- print_prompt=1
22
- shift
23
- ;;
24
- --reason)
25
- reason="${2:-manual}"
26
- shift 2
27
- ;;
28
- --help|-h)
29
- usage
30
- exit 0
31
- ;;
32
- *)
33
- echo "Unknown argument: $1" >&2
34
- usage >&2
35
- exit 1
36
- ;;
37
- esac
38
- done
39
-
40
- if [[ -z "$cwd" ]]; then
41
- cwd="$(pwd)"
42
- fi
43
-
44
- cwd="$(cd "$cwd" && pwd)"
45
- cd "$cwd"
46
-
47
- policy_get() {
48
- local jq_path="$1"
49
- local default_value="$2"
50
-
51
- if [[ -f ".ai/harness/policy.json" ]] && command -v jq >/dev/null 2>&1; then
52
- local value
53
- value="$(jq -r "$jq_path // empty" .ai/harness/policy.json 2>/dev/null || true)"
54
- if [[ -n "$value" ]]; then
55
- printf '%s' "$value"
56
- return 0
57
- fi
58
- fi
59
-
60
- printf '%s' "$default_value"
61
- }
62
-
63
- safe_repo_file() {
64
- local value="$1"
65
- local default_value="$2"
66
- local allowed_prefix="${3:-}"
67
-
68
- if [[ -z "$value" || "$value" == /* || "$value" == *$'\n'* || "$value" == *$'\r'* ]]; then
69
- printf '%s' "$default_value"
70
- return 0
71
- fi
72
-
73
- case "$value" in
74
- ..|../*|*/..|*/../*)
75
- printf '%s' "$default_value"
76
- ;;
77
- *)
78
- if [[ -n "$allowed_prefix" && "$value" != "$allowed_prefix"* ]]; then
79
- printf '%s' "$default_value"
80
- return 0
81
- fi
82
- printf '%s' "$value"
83
- ;;
84
- esac
85
- }
86
-
87
- active_plan() {
88
- for marker_file in ".ai/harness/active-plan" ".claude/.active-plan"; do
89
- if [[ ! -f "$marker_file" ]]; then
90
- continue
91
- fi
92
- local marker
93
- marker="$(cat "$marker_file" 2>/dev/null | xargs)"
94
- if [[ -n "$marker" && -f "$marker" ]]; then
95
- printf '%s' "$marker"
96
- return 0
97
- fi
98
- done
99
- }
100
-
101
- plan_slug_from_path() {
102
- local plan_file="$1"
103
- local base slug
104
- base="$(basename "$plan_file")"
105
- slug="$(printf '%s' "$base" | sed -E 's/^plan-[0-9]{8}-[0-9]{4}-//; s/\.md$//')"
106
- printf '%s' "$slug"
107
- }
108
-
109
- plan_original_artifact_stem_from_path() {
110
- local plan_file="$1"
111
- local base stem
112
- base="$(basename "$plan_file")"
113
- stem="$(printf '%s' "$base" | sed -E 's/^plan-//; s/\.md$//')"
114
- if [[ "$stem" =~ ^[0-9]{8}-[0-9]{4}-.+ ]]; then
115
- printf '%s' "$stem"
116
- else
117
- plan_slug_from_path "$plan_file"
118
- fi
119
- }
120
-
121
- is_transient_plan_slug() {
122
- case "$1" in
123
- think-plan-[0-9]*|codex-plan-[0-9]*|approved-plan-[0-9]*)
124
- return 0
125
- ;;
126
- esac
127
- return 1
128
- }
129
-
130
- plan_title_slug_from_file() {
131
- local plan_file="$1"
132
- local title slug
133
- [[ -f "$plan_file" ]] || return 1
134
- title="$(awk '
135
- /^# Plan:[[:space:]]*/ {
136
- sub(/^# Plan:[[:space:]]*/, "")
137
- print
138
- exit
139
- }
140
- ' "$plan_file" | xargs)"
141
- [[ -n "$title" ]] || return 1
142
- slug="$(printf '%s' "$title" | tr '[:upper:]' '[:lower:]' | sed -E 's/[^a-z0-9]+/-/g; s/^-+//; s/-+$//; s/-{2,}/-/g')"
143
- [[ -n "$slug" ]] || return 1
144
- printf '%s' "$slug"
145
- }
146
-
147
- plan_artifact_stem_from_path() {
148
- local plan_file="$1"
149
- local stem stamp slug title_slug
150
- stem="$(plan_original_artifact_stem_from_path "$plan_file")"
151
- if [[ "$stem" =~ ^[0-9]{8}-[0-9]{4}-.+ ]]; then
152
- stamp="$(printf '%s' "$stem" | sed -E 's/^([0-9]{8}-[0-9]{4})-.+$/\1/')"
153
- slug="$(printf '%s' "$stem" | sed -E 's/^[0-9]{8}-[0-9]{4}-//')"
154
- if is_transient_plan_slug "$slug"; then
155
- title_slug="$(plan_title_slug_from_file "$plan_file" || true)"
156
- if [[ -n "$title_slug" && "$title_slug" != "$slug" ]]; then
157
- printf '%s-%s' "$stamp" "$title_slug"
158
- return 0
159
- fi
160
- fi
161
- printf '%s' "$stem"
162
- else
163
- plan_slug_from_path "$plan_file"
164
- fi
165
- }
166
-
167
- preferred_or_legacy_path() {
168
- local preferred="$1"
169
- local legacy="$2"
170
- if [[ -f "$preferred" ]] || [[ ! -f "$legacy" ]]; then
171
- printf '%s' "$preferred"
172
- else
173
- printf '%s' "$legacy"
174
- fi
175
- }
176
-
177
- derive_contract() {
178
- local plan_file="$1"
179
- local slug stem
180
- [[ -n "$plan_file" ]] || return 1
181
- slug="$(plan_slug_from_path "$plan_file")"
182
- stem="$(plan_artifact_stem_from_path "$plan_file")"
183
- [[ -n "$slug" && -n "$stem" ]] || return 1
184
- preferred_or_legacy_path "tasks/contracts/${stem}.contract.md" "tasks/contracts/${slug}.contract.md"
185
- }
186
-
187
- derive_notes() {
188
- local plan_file="$1"
189
- local slug stem notes_dir
190
- [[ -n "$plan_file" ]] || return 1
191
- slug="$(plan_slug_from_path "$plan_file")"
192
- stem="$(plan_artifact_stem_from_path "$plan_file")"
193
- [[ -n "$slug" && -n "$stem" ]] || return 1
194
- notes_dir="$(safe_repo_file "$(policy_get '.tasks.notes_dir' 'tasks/notes')" 'tasks/notes' 'tasks/')"
195
- preferred_or_legacy_path "${notes_dir}/${stem}.notes.md" "${notes_dir}/${slug}.notes.md"
196
- }
197
-
198
- latest_global_handoff() {
199
- local codex_home="${CODEX_HOME:-$HOME/.codex}"
200
- find "$codex_home/handoffs" -maxdepth 1 -type f -name 'handoff-*.md' 2>/dev/null | sort | tail -1
201
- }
202
-
203
- resume_file="$(safe_repo_file "$(policy_get '.session.resume_file' '.ai/harness/session/resume.md')" '.ai/harness/session/resume.md' '.ai/harness/')"
204
- repo_handoff="$(safe_repo_file "$(policy_get '.session.continuation_file' '.ai/harness/session/continuation.md')" '.ai/harness/session/continuation.md' '.ai/harness/')"
205
- checks_file="$(safe_repo_file "$(policy_get '.harness.checks_file' '.ai/harness/checks/latest.json')" '.ai/harness/checks/latest.json' '.ai/harness/')"
206
- research_dir="$(safe_repo_file "$(policy_get '.tasks.research_dir' 'docs/researches')" 'docs/researches' 'docs/researches')"
207
- todo_file="$(safe_repo_file "$(policy_get '.tasks.todo_file' 'tasks/todos.md')" 'tasks/todos.md' 'tasks/')"
208
- plan_file="$(active_plan || true)"
209
- contract_file="$(derive_contract "$plan_file" || true)"
210
- notes_file="$(derive_notes "$plan_file" || true)"
211
- global_handoff="$(latest_global_handoff || true)"
212
-
213
- mkdir -p "$(dirname "$resume_file")"
214
-
215
- cat > "$resume_file" <<EOF_RESUME
216
- # Codex Resume Packet
217
- <!-- generated-by: forge codex-handoff-resume v1 -->
218
-
219
- > **Generated**: $(date '+%Y-%m-%d %H:%M:%S')
220
- > **Reason**: ${reason}
221
- > **Working Directory**: ${cwd}
222
-
223
- ## Resume Prompt
224
-
225
- You are starting a fresh Codex session for an existing long-running task. Do not rely on prior chat history or Codex auto-compact. First read the current user input and Canonical Runtime state when available, then source/evidence artifacts, and use the session continuation cache only to recover the exact next step.
226
-
227
- Current prompt files first:
228
- - If the current user message lists files under \`# Files mentioned by the user\`, references \`pasted-text.txt\`, or includes an explicit attachment/file path, read those current-input files before the repo recovery artifacts below.
229
- - Use handoff, resume, and \`tasks/current.md\` as recovery context only; they do not outrank the current user message.
230
-
231
- Required first reads:
232
- - AGENTS.md
233
- - ${repo_handoff}
234
- - ${todo_file}
235
- - ${notes_file:-(none)}
236
- - ${research_dir}/
237
- - ${checks_file}
238
-
239
- Conditional first reads:
240
- - Active plan: ${plan_file:-(none)}
241
- - Active contract: ${contract_file:-(none)}
242
- - Implementation notes: ${notes_file:-(none)}
243
- - Global handoff: ${global_handoff:-(none)}
244
-
245
- Execution rules:
246
- - Treat Canonical Runtime lifecycle state as authoritative for migrated Requirement/Plan/Work state; treat Git source/evidence as authoritative in their own domains and session Markdown as rebuildable cache only.
247
- - Decide in the main agent whether to use subagents, parallel sidecars, sidecar \`codex exec --json\`, or a bounded main-thread trace for broad research/log scans based on context impact and callable tools; do not ask the user for spawn confirmation.
248
- - Keep deep research conclusions in \`${research_dir}/\`, not only in chat.
249
- - Do not run \`/compact\` as the primary recovery path.
250
- - Preserve the current dirty worktree and do not touch unrelated untracked files.
251
-
252
- ## Source Artifacts
253
-
254
- - Session continuation: ${repo_handoff}
255
- - Resume packet: ${resume_file}
256
- - Checks: ${checks_file}
257
- - Todo: ${todo_file}
258
- - Research: ${research_dir}/
259
- - Plan: ${plan_file:-(none)}
260
- - Contract: ${contract_file:-(none)}
261
- - Notes: ${notes_file:-(none)}
262
- - Global handoff: ${global_handoff:-(none)}
263
- EOF_RESUME
264
-
265
- if [[ "$print_prompt" -eq 1 ]]; then
266
- awk '/^## Resume Prompt$/ {printing=1; next} /^## Source Artifacts$/ {printing=0} printing == 1 {print}' "$resume_file" | sed -E '/^[[:space:]]*$/N; /^\n$/D'
267
- else
268
- echo "Updated $resume_file"
269
- fi
3
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
4
+ exec "$SCRIPT_DIR/lib/run-forge-helper.sh" "codex-handoff-resume.sh" "$@"