@moretea-labs/forge 1.7.0 → 1.7.1

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 +13 -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 +85 -89
  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 +18 -25
  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 +96 -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 +805 -1009
  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 +1 -1
  166. package/src/runtime/root/package-runtime-service.ts +33 -2
  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,175 @@
1
+ #!/usr/bin/env node
2
+ import { chmodSync, readFileSync, renameSync, statSync, writeFileSync } from 'node:fs';
3
+ import { dirname, join, resolve } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+
6
+ const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), '..');
7
+ const CHECK_ONLY = process.argv.includes('--check');
8
+
9
+ const WORKFLOW_CONTRACT = JSON.parse(readFileSync(join(ROOT, 'assets/workflow-contract.v1.json'), 'utf8'));
10
+ const HELPER_FILES = Array.isArray(WORKFLOW_CONTRACT?.helpers?.scripts)
11
+ ? WORKFLOW_CONTRACT.helpers.scripts.filter((value) => typeof value === 'string' && value.trim()).map((value) => value.trim())
12
+ : [];
13
+ if (HELPER_FILES.length === 0) throw new Error('[generated-authority] assets/workflow-contract.v1.json must declare helpers.scripts');
14
+
15
+ const REFERENCE_CONFIG_FILES = [
16
+ 'AGENTS.md',
17
+ 'CLAUDE.md',
18
+ 'agentic-development-flow.md',
19
+ 'ai-workflows.md',
20
+ 'changelog-versioning.md',
21
+ 'coding-standards.md',
22
+ 'development-protocol.md',
23
+ 'document-generation.md',
24
+ 'evaluator-rubric.md',
25
+ 'external-tooling.md',
26
+ 'git-strategy.md',
27
+ 'global-working-rules.md',
28
+ 'handoff-protocol.md',
29
+ 'harness-overview.md',
30
+ 'hook-operations.md',
31
+ 'release-deploy.md',
32
+ 'spa-day-protocol.md',
33
+ 'sprint-contracts.md',
34
+ 'workflow-orchestration.md',
35
+ ];
36
+
37
+ const CLAUDE_TEMPLATE_FILES = [
38
+ 'contract.template.md',
39
+ 'implementation-notes.template.md',
40
+ 'plan.template.md',
41
+ 'prd.template.md',
42
+ 'research.template.md',
43
+ 'review.template.md',
44
+ 'spec.template.md',
45
+ 'sprint.template.md',
46
+ ];
47
+
48
+ function replaceExact(text, before, after, label) {
49
+ const first = text.indexOf(before);
50
+ if (first < 0) throw new Error(`[generated-authority] transform precondition missing: ${label}`);
51
+ if (text.indexOf(before, first + before.length) >= 0) {
52
+ throw new Error(`[generated-authority] transform precondition ambiguous: ${label}`);
53
+ }
54
+ return `${text.slice(0, first)}${after}${text.slice(first + before.length)}`;
55
+ }
56
+
57
+ function projectClaudeTemplate(name, source) {
58
+ if (name === 'contract.template.md') {
59
+ return replaceExact(source, ' - bun run typecheck\n', ' - bun run check:type\n', `${name}: downstream typecheck command`);
60
+ }
61
+ return source;
62
+ }
63
+
64
+ const PACKAGE_VERSION = JSON.parse(readFileSync(join(ROOT, 'package.json'), 'utf8')).version;
65
+
66
+ function referenceConfigStub(name) {
67
+ const docId = name.replace(/\.md$/, '');
68
+ return `<!-- forge: reference-config-stub v1 -->
69
+ # forge Reference: ${docId}
70
+
71
+ > **Runtime Docs**: user-level forge reference
72
+ > **Doc ID**: ${docId}
73
+ > **Version**: ${PACKAGE_VERSION}
74
+ > **Source Command**: \`forge docs path ${docId}\`
75
+
76
+ This repo keeps workflow facts and runtime artifacts locally under \`.ai/\`.
77
+ The full generic runtime guide is supplied by the installed forge
78
+ package/user-level runtime so each repository does not need to refresh a full
79
+ copy of shared documentation.
80
+
81
+ Use:
82
+
83
+ \`\`\`bash
84
+ forge docs path ${docId}
85
+ forge docs show ${docId}
86
+ \`\`\`
87
+ `;
88
+ }
89
+
90
+ function shellCompatibilityWrapper(name) {
91
+ return `#!/bin/bash\nset -euo pipefail\nSCRIPT_DIR="$(cd "$(dirname "\${BASH_SOURCE[0]}")" && pwd)"\nexec "$SCRIPT_DIR/lib/run-forge-helper.sh" "${name}" "$@"\n`;
92
+ }
93
+
94
+ const MODULE_HELPERS = new Set([
95
+ 'check-skill-version.ts',
96
+ 'workflow-contract.ts',
97
+ 'inspect-project-state.ts',
98
+ 'migrate-workflow-docs.ts',
99
+ ]);
100
+
101
+ function typescriptCompatibilityWrapper(name) {
102
+ const reexport = MODULE_HELPERS.has(name)
103
+ ? `export * from "../assets/templates/helpers/${name.replace(/\.ts$/, '')}";\n`
104
+ : '';
105
+ return `#!/usr/bin/env bun\n${reexport}import { runTrackedForgeHelper } from "./lib/run-forge-helper";\n\nif (import.meta.main) runTrackedForgeHelper("${name}");\n`;
106
+ }
107
+
108
+ function syncGeneratedText(targetRel, expected, expectedMode = 0o755) {
109
+ const targetPath = join(ROOT, targetRel);
110
+ const actual = readFileSync(targetPath, 'utf8');
111
+ const actualMode = statSync(targetPath).mode & 0o777;
112
+ const contentDrift = actual !== expected;
113
+ const modeDrift = actualMode !== expectedMode;
114
+ if (!contentDrift && !modeDrift) return false;
115
+ if (CHECK_ONLY) {
116
+ const reasons = [contentDrift ? 'content' : '', modeDrift ? `mode:${actualMode.toString(8)}!=${expectedMode.toString(8)}` : ''].filter(Boolean).join(',');
117
+ console.error(`[generated-authority] drift(${reasons}): ${targetRel} != generated compatibility wrapper`);
118
+ return true;
119
+ }
120
+ if (contentDrift) {
121
+ const temporary = `${targetPath}.tmp-${process.pid}`;
122
+ writeFileSync(temporary, expected);
123
+ chmodSync(temporary, expectedMode);
124
+ renameSync(temporary, targetPath);
125
+ } else {
126
+ chmodSync(targetPath, expectedMode);
127
+ }
128
+ console.log(`[generated-authority] updated ${targetRel} compatibility wrapper`);
129
+ return true;
130
+ }
131
+
132
+ function syncText(sourceRel, targetRel, transform = (value) => value) {
133
+ const sourcePath = join(ROOT, sourceRel);
134
+ const targetPath = join(ROOT, targetRel);
135
+ const source = readFileSync(sourcePath, 'utf8');
136
+ const expected = transform(source);
137
+ const actual = readFileSync(targetPath, 'utf8');
138
+ const expectedMode = statSync(sourcePath).mode & 0o777;
139
+ const actualMode = statSync(targetPath).mode & 0o777;
140
+ const contentDrift = actual !== expected;
141
+ const modeDrift = actualMode !== expectedMode;
142
+ if (!contentDrift && !modeDrift) return false;
143
+ if (CHECK_ONLY) {
144
+ const reasons = [contentDrift ? 'content' : '', modeDrift ? `mode:${actualMode.toString(8)}!=${expectedMode.toString(8)}` : ''].filter(Boolean).join(',');
145
+ console.error(`[generated-authority] drift(${reasons}): ${targetRel} != projection(${sourceRel})`);
146
+ return true;
147
+ }
148
+ if (contentDrift) {
149
+ const temporary = `${targetPath}.tmp-${process.pid}`;
150
+ writeFileSync(temporary, expected);
151
+ chmodSync(temporary, expectedMode);
152
+ renameSync(temporary, targetPath);
153
+ } else {
154
+ chmodSync(targetPath, expectedMode);
155
+ }
156
+ console.log(`[generated-authority] updated ${targetRel} from ${sourceRel}`);
157
+ return true;
158
+ }
159
+
160
+ let drift = false;
161
+ for (const name of HELPER_FILES) {
162
+ const expected = name.endsWith('.sh')
163
+ ? shellCompatibilityWrapper(name)
164
+ : typescriptCompatibilityWrapper(name);
165
+ drift = syncGeneratedText(`scripts/${name}`, expected) || drift;
166
+ }
167
+ for (const name of REFERENCE_CONFIG_FILES) {
168
+ drift = syncGeneratedText(`docs/reference-configs/${name}`, referenceConfigStub(name), 0o644) || drift;
169
+ }
170
+ for (const name of CLAUDE_TEMPLATE_FILES) {
171
+ drift = syncText(`.claude/templates/${name}`, `assets/templates/${name}`, (source) => projectClaudeTemplate(name, source)) || drift;
172
+ }
173
+
174
+ if (CHECK_ONLY && drift) process.exit(1);
175
+ console.log(`[generated-authority] ${CHECK_ONLY ? 'verified' : 'synchronized'} ${HELPER_FILES.length + REFERENCE_CONFIG_FILES.length + CLAUDE_TEMPLATE_FILES.length} projections`);