@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
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Compatibility translation only: legacy iOS MCP tool names are normalized to
3
+ * the canonical typed iOS plugin action surface. This module owns no runtime,
4
+ * repository, Work, approval, or plugin execution state.
5
+ */
6
+ export interface LegacyIosPluginInvocation {
7
+ actionId: string;
8
+ requestId: string;
9
+ arguments: Record<string, unknown>;
10
+ confirmAuthorization: boolean;
11
+ }
12
+
13
+ function definedArguments(value: Record<string, unknown>): Record<string, unknown> {
14
+ return Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== undefined));
15
+ }
16
+
17
+ function optionalString(args: Record<string, unknown>, key: string): string | undefined {
18
+ return typeof args[key] === 'string' ? args[key] as string : undefined;
19
+ }
20
+
21
+ function optionalNumber(args: Record<string, unknown>, key: string): number | undefined {
22
+ return typeof args[key] === 'number' ? args[key] as number : undefined;
23
+ }
24
+
25
+ export function legacyIosPluginInvocation(
26
+ legacyTool: string,
27
+ args: Record<string, unknown>,
28
+ ): LegacyIosPluginInvocation | undefined {
29
+ const invocation = (() => {
30
+ switch (legacyTool) {
31
+ case 'ios_xcode_status':
32
+ return { actionId: 'xcode_status', arguments: {} };
33
+ case 'ios_simulators_list':
34
+ return { actionId: 'list_simulators', arguments: { runtime: optionalString(args, 'runtime'), name: optionalString(args, 'name') } };
35
+ case 'ios_project_discover':
36
+ return { actionId: 'discover_project', arguments: {} };
37
+ case 'ios_schemes_list':
38
+ return { actionId: 'list_schemes', arguments: { workspace: optionalString(args, 'workspace'), project: optionalString(args, 'project') } };
39
+ case 'ios_simulator_boot':
40
+ return { actionId: 'launch_simulator', arguments: { udid: String(args.udid ?? '').trim(), open_simulator: args.open_simulator !== false, timeout_ms: optionalNumber(args, 'timeout_ms') } };
41
+ case 'ios_app_build':
42
+ return { actionId: 'build', arguments: { scheme: String(args.scheme ?? '').trim(), udid: optionalString(args, 'udid'), simulator_name: optionalString(args, 'simulator_name'), workspace: optionalString(args, 'workspace'), project: optionalString(args, 'project'), configuration: optionalString(args, 'configuration'), timeout_ms: optionalNumber(args, 'timeout_ms') } };
43
+ case 'ios_simulator_screenshot':
44
+ return { actionId: 'capture_screenshot', arguments: { udid: String(args.udid ?? '').trim(), label: optionalString(args, 'label') } };
45
+ case 'ios_ui_smoke_test':
46
+ return { actionId: 'smoke_review', arguments: { scheme: optionalString(args, 'scheme'), bundle_id: optionalString(args, 'bundle_id'), udid: optionalString(args, 'udid'), simulator_name: optionalString(args, 'simulator_name'), workspace: optionalString(args, 'workspace'), project: optionalString(args, 'project'), configuration: optionalString(args, 'configuration'), app_path: optionalString(args, 'app_path'), screenshot_label: optionalString(args, 'screenshot_label') } };
47
+ default:
48
+ return undefined;
49
+ }
50
+ })();
51
+ if (!invocation) return undefined;
52
+ const requestId = typeof args.request_id === 'string' && args.request_id.trim()
53
+ ? args.request_id.trim()
54
+ : `legacy-${legacyTool}-${Date.now()}`;
55
+ return {
56
+ actionId: invocation.actionId,
57
+ requestId,
58
+ arguments: definedArguments(invocation.arguments),
59
+ confirmAuthorization: args.confirm_authorization === true,
60
+ };
61
+ }
@@ -1,5 +1,5 @@
1
1
  import { createHash } from 'crypto';
2
- import type { CallToolResult, McpToolDefinition } from '../../../cli/mcp/tools';
2
+ import type { CallToolResult, McpToolDefinition } from '../../../cli/mcp/tool-contract';
3
3
  import {
4
4
  buildMultiRepositoryToolDefinitions,
5
5
  type MultiRepositoryMcpToolContext,
@@ -9,7 +9,7 @@ import {
9
9
  claimedSessionEditBinding,
10
10
  repositoryToolDefinitions,
11
11
  } from '../../../cli/mcp/repository-tools';
12
- import { runtimeToolDefinitions } from './runtime-tools';
12
+ import { runtimeToolDefinitions } from './runtime-tool-definitions';
13
13
  import { executionToolDefinitions } from './execution-tools';
14
14
  import { processToolDefinitions } from './process-tools';
15
15
  import { resolveRepositorySelection } from '../../../cli/repositories/registry';
@@ -92,6 +92,7 @@ export const runtimeToolDefinitions: McpToolDefinition[] = [
92
92
  handoff_id: { type: 'string', description: 'Optional existing HandoffItem used to resume controller context. Required for controller_disposition=wait_for_user.' },
93
93
  disposition: { type: 'string', enum: ['continue_immediately', 'wait', 'wait_for_user', 'goal_complete'], description: 'Explicit ChatGPT end-of-round semantic decision. continue_immediately is consumed only after the current controller lease closes.' },
94
94
  relay_scope_id: { type: 'string', description: 'Stable Requirement/Goal relay identity. Requirement-bound Work uses requirement:<id>; otherwise reuse the exact returned goal scope across Works.' },
95
+ controller_authority_id: { type: 'string', description: 'Opaque durable authority for the currently dispatched ChatGPT controller round. Required with relay_scope_id for lifecycle mutation of relay-bound Work; rotates before a successor round while surviving MCP transport/Runtime rotation within the same round.' },
95
96
  state_fingerprint: { type: 'string', description: 'Optional controller-observed semantic-state fingerprint. When omitted, Forge derives a mechanical fingerprint from current Requirement/Work/Handoff state.' },
96
97
  max_rounds: { type: 'number', description: 'Mechanical immediate-relay round budget; defaults to 8 and cannot be loosened within an existing relay scope.' },
97
98
  max_repeated_state: { type: 'number', description: 'Mechanical repeated-state fence; defaults to 2 repeated observations and cannot be loosened within an existing relay scope.' },
@@ -155,7 +156,7 @@ export const runtimeToolDefinitions: McpToolDefinition[] = [
155
156
  expected_files: { type: 'number' },
156
157
  expected_changed_lines: { type: 'number' },
157
158
  mode: { type: 'string', enum: ['scale'], description: 'Explicit Scale coordination mode for start. Scale requires a bound approved PlanContract step and uses existing Work/Process/resource-claim authorities; it does not create an agent-swarm lifecycle.' },
158
- work_kind: { type: 'string', enum: ['repository_change', 'completed_no_change', 'investigation', 'local_effect', 'remote_effect', 'reconciliation'], description: 'Explicit technical Work evidence shape for operation=start. local_effect/remote_effect represent effect-only execution and do not require a repository diff; completed_no_change/investigation/reconciliation likewise do not imply a source mutation. None of these imply semantic completion; ChatGPT must still explicitly finalize after reviewing evidence.' },
159
+ work_kind: { type: 'string', enum: ['repository_change', 'completed_no_change', 'read_only_review', 'investigation', 'local_effect', 'remote_effect', 'reconciliation'], description: 'Explicit technical Work evidence shape for operation=start. read_only_review is a recoverable source-frozen review lifecycle: it permits inspected-path/finding persistence without repository edits and only clean-finalizes after unchanged-source proof. local_effect/remote_effect represent effect-only execution; completed_no_change/investigation/reconciliation likewise do not imply a source mutation. None imply semantic completion; ChatGPT must still explicitly finalize after reviewing evidence.' },
159
160
  scope_clear: { type: 'boolean' },
160
161
  requires_investigation: { type: 'boolean' },
161
162
  requires_long_running_checks: { type: 'boolean' },
@@ -178,9 +179,27 @@ export const runtimeToolDefinitions: McpToolDefinition[] = [
178
179
  initial_likely_paths: { type: 'array', items: { type: 'string' }, description: 'Non-authoritative first-pass discovery candidates. May expand after investigation; allowed_paths remains a policy fence only.' },
179
180
  additional_likely_paths: { type: 'array', items: { type: 'string' }, description: 'Non-authoritative candidates discovered after Work start. Valid for continue; does not widen allowed_paths.' },
180
181
  inspected_paths: { type: 'array', items: { type: 'string' }, description: 'Paths actually inspected during progressive discovery. Valid for continue; does not widen allowed_paths.' },
182
+ review_findings: { type: 'array', items: { type: 'string' }, description: 'Concise semantic findings for operation=continue on work_kind=read_only_review. Findings are source-bound durable review evidence and prevent clean completed_no_change finalization until a successor repair/review resolves them.' },
183
+ acceptance_evidence: { type: 'array', items: { type: 'object', required: ['criterion', 'evidence_ids', 'rationale'], properties: { criterion: { type: 'string', description: 'Exact declared Work acceptance criterion reviewed by the Controller.' }, evidence_ids: { type: 'array', items: { type: 'string' }, description: 'Durable evidence ids already attributed to this Work that support this exact criterion.' }, rationale: { type: 'string', description: 'Controller rationale for why the cited evidence satisfies this exact criterion.' } }, additionalProperties: false }, description: 'Operation=continue only. Explicit Controller-reviewed criterion-to-evidence bindings for no-check local_effect Work. Mechanical plugin/process attribution alone never implies semantic acceptance.' },
181
184
  acceptance_failure_decision: { type: 'string', enum: ['repair', 'rescope'], description: 'Explicit Controller decision for operation=continue after a deterministic valid_fail. Bypasses acceptance-review handoff only for this bounded repair/re-scope decision; never inferred from free text.' },
182
185
  forbidden_paths: { type: 'array', items: { type: 'string' } },
183
- constraints: { type: 'object' },
186
+ constraints: {
187
+ type: 'object',
188
+ properties: {
189
+ max_changed_files: { type: 'number' },
190
+ max_changed_lines: { type: 'number' },
191
+ allow_commit: { type: 'boolean' },
192
+ allow_merge: { type: 'boolean' },
193
+ allow_cleanup: { type: 'boolean' },
194
+ allow_destructive: { type: 'boolean' },
195
+ require_handoff_on_ambiguity: { type: 'boolean' },
196
+ access_mode: { type: 'string', enum: ['request', 'full_access'] },
197
+ workspace_mode: { type: 'string', enum: ['current', 'isolated', 'auto'], description: 'Typed placement policy. isolated is an admission fence and cannot be downgraded to Direct Control.' },
198
+ require_worktree: { type: 'boolean', description: 'Typed placement policy. true requires isolated Work placement before routing.' },
199
+ direct_main_prohibited: { type: 'boolean', description: 'Typed admission fence. true forbids Direct Control/current-main repository mutation.' },
200
+ },
201
+ additionalProperties: true,
202
+ },
184
203
  repair_operation: { type: 'string', enum: ['diagnose', 'repair', 'verify', 'handoff'] },
185
204
  target: { type: 'string', enum: ['codex', 'grok', 'claude'], description: 'Explicit small-brain delegate target for operation=delegate. Delegation is never the default execution path.' },
186
205
  available: { type: 'boolean', description: 'Whether the delegate target is currently available.' },