@warpgogol/forge 2.8.0 → 2.8.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 (251) hide show
  1. package/AGENTS.md +1 -1
  2. package/README.md +23 -13
  3. package/README.uk.md +19 -12
  4. package/os/adr/adr.module.ts +158 -0
  5. package/os/adr/frontmatter-io.ts +80 -0
  6. package/os/adr/handlers/archive.ts +244 -0
  7. package/os/adr/handlers/implement-stamp.ts +331 -0
  8. package/os/adr/handlers/list-create.ts +207 -0
  9. package/os/adr/handlers/validate.test.ts +232 -0
  10. package/os/adr/handlers/validate.ts +429 -0
  11. package/os/adr/index.ts +33 -0
  12. package/os/adr/types.ts +141 -0
  13. package/os/audit/audit.module.ts +48 -0
  14. package/os/audit/frontmatter-io.ts +84 -0
  15. package/os/audit/handlers/archive.ts +239 -0
  16. package/os/audit/index.ts +23 -0
  17. package/os/audit/types.ts +29 -0
  18. package/os/compass/compass.module.ts +186 -0
  19. package/os/compass/handlers/compass-audit-handler.ts +382 -0
  20. package/os/compass/handlers/compass-change-summary-handler.ts +272 -0
  21. package/os/compass/handlers/compass-inventory-handler.ts +294 -0
  22. package/os/compass/handlers/compass-inventory.ts +521 -0
  23. package/os/compass/handlers/git-revision.ts +137 -0
  24. package/os/compass/handlers/resolve-scan-root-workpiece.test.ts +65 -0
  25. package/os/compass/handlers/resolve-scan-root.ts +79 -0
  26. package/os/compass/index.ts +33 -0
  27. package/os/core/core.module.ts +948 -0
  28. package/os/core/handlers/assets-check.ts +122 -0
  29. package/os/core/handlers/assets-helpers.ts +174 -0
  30. package/os/core/handlers/assets-list.ts +99 -0
  31. package/os/core/handlers/build.ts +155 -0
  32. package/os/core/handlers/determinism-check.ts +354 -0
  33. package/os/core/handlers/dev.ts +127 -0
  34. package/os/core/handlers/invariant-engine.test.ts +681 -0
  35. package/os/core/handlers/knowledge-compact.ts +248 -0
  36. package/os/core/handlers/lifecycle-handlers.test.ts +524 -0
  37. package/os/core/handlers/note-frontmatter-validate.test.ts +93 -0
  38. package/os/core/handlers/note-link-validate.test.ts +117 -0
  39. package/os/core/handlers/note-orphan-detect.test.ts +94 -0
  40. package/os/core/handlers/package-health.test.ts +226 -0
  41. package/os/core/handlers/package-health.ts +231 -0
  42. package/os/core/handlers/pinned-check.ts +200 -0
  43. package/os/core/handlers/pinned-init.ts +333 -0
  44. package/os/core/handlers/pinned-types.ts +50 -0
  45. package/os/core/handlers/pinned-validate.ts +301 -0
  46. package/os/core/handlers/profile-resolve.ts +92 -0
  47. package/os/core/handlers/release-prepare.ts +294 -0
  48. package/os/core/handlers/release-publish.ts +211 -0
  49. package/os/core/handlers/validate.ts +262 -0
  50. package/os/core/handlers/workspace-deps.ts +55 -0
  51. package/os/core/index.ts +13 -0
  52. package/os/exploration/exploration.module.ts +90 -0
  53. package/os/exploration/frontmatter-io.ts +77 -0
  54. package/os/exploration/handlers/archive.ts +159 -0
  55. package/os/exploration/handlers/list.ts +77 -0
  56. package/os/exploration/handlers/show.ts +107 -0
  57. package/os/exploration/index.ts +25 -0
  58. package/os/exploration/types.ts +65 -0
  59. package/os/mission/handlers/archive.test.ts +391 -0
  60. package/os/mission/handlers/archive.ts +453 -0
  61. package/os/mission/index.ts +1 -0
  62. package/os/mission/mission.module.ts +48 -0
  63. package/os/mission/types.ts +41 -0
  64. package/os/naming/index.ts +14 -0
  65. package/os/naming/naming-convention.test.ts +163 -0
  66. package/os/naming/naming-convention.ts +378 -0
  67. package/os/naming/naming.module.ts +36 -0
  68. package/os/notes/index.ts +10 -0
  69. package/os/notes/notes.module.ts +109 -0
  70. package/os/plan/frontmatter-io.ts +82 -0
  71. package/os/plan/handlers/archive.ts +238 -0
  72. package/os/plan/index.ts +23 -0
  73. package/os/plan/plan.module.ts +48 -0
  74. package/os/plan/types.ts +29 -0
  75. package/os/program/discovery.ts +294 -0
  76. package/os/program/handlers/complete.ts +419 -0
  77. package/os/program/handlers/lease.ts +433 -0
  78. package/os/program/handlers/seal.ts +332 -0
  79. package/os/program/handlers/validate.ts +213 -0
  80. package/os/program/lease.ts +156 -0
  81. package/os/program/program.module.ts +212 -0
  82. package/os/program/schemas.ts +218 -0
  83. package/os/program/state.ts +264 -0
  84. package/os/rfc/acceptance.ts +344 -0
  85. package/os/rfc/decision-log.ts +310 -0
  86. package/os/rfc/dna-trace.ts +280 -0
  87. package/os/rfc/frontmatter-io.test.ts +132 -0
  88. package/os/rfc/frontmatter-io.ts +130 -0
  89. package/os/rfc/handlers/archive.ts +300 -0
  90. package/os/rfc/handlers/check.ts +238 -0
  91. package/os/rfc/handlers/implement-stamp.ts +515 -0
  92. package/os/rfc/handlers/index-graph.ts +237 -0
  93. package/os/rfc/handlers/lifecycle.test.ts +127 -0
  94. package/os/rfc/handlers/lifecycle.ts +249 -0
  95. package/os/rfc/handlers/list-create.ts +296 -0
  96. package/os/rfc/handlers/pipeline-status.ts +173 -0
  97. package/os/rfc/handlers/shared.ts +121 -0
  98. package/os/rfc/handlers/supersede-propose.ts +241 -0
  99. package/os/rfc/handlers/validate-rules.test.ts +891 -0
  100. package/os/rfc/handlers/validate-rules.ts +984 -0
  101. package/os/rfc/handlers/validate.ts +166 -0
  102. package/os/rfc/handlers.ts +19 -0
  103. package/os/rfc/index.ts +97 -0
  104. package/os/rfc/rfc.module.ts +416 -0
  105. package/os/rfc/types.ts +596 -0
  106. package/os/rfc/verification-evidence.ts +244 -0
  107. package/os/session/atif-parser.ts +166 -0
  108. package/os/session/frontmatter-io.ts +163 -0
  109. package/os/session/handlers/archive.ts +288 -0
  110. package/os/session/handlers/list.ts +174 -0
  111. package/os/session/handlers/save.ts +348 -0
  112. package/os/session/handlers/validate.ts +250 -0
  113. package/os/session/index.ts +50 -0
  114. package/os/session/session.module.ts +126 -0
  115. package/os/session/types.ts +203 -0
  116. package/os/spec/live-spec-list-show-validate.test.ts +257 -0
  117. package/os/spec/live-spec-list.ts +78 -0
  118. package/os/spec/live-spec-merge.test.ts +261 -0
  119. package/os/spec/live-spec-merge.ts +413 -0
  120. package/os/spec/live-spec-show.ts +117 -0
  121. package/os/spec/live-spec-types.ts +93 -0
  122. package/os/spec/live-spec-validate.ts +170 -0
  123. package/os/spec/spec-materialize.ts +390 -0
  124. package/os/spec/spec-schema.ts +174 -0
  125. package/os/spec/spec-status.ts +284 -0
  126. package/os/spec/spec-validate.ts +513 -0
  127. package/os/spec/spec.module.ts +135 -0
  128. package/os/werkstatt/handlers/lock.ts +168 -0
  129. package/os/werkstatt/handlers/schema.ts +47 -0
  130. package/os/werkstatt/handlers/werkstatt-lock-recover.ts +175 -0
  131. package/os/werkstatt/handlers/werkstatt-lock-status.ts +73 -0
  132. package/os/werkstatt/handlers/werkstatt-operation-validate.ts +104 -0
  133. package/os/werkstatt/index.ts +39 -0
  134. package/os/werkstatt/werkstatt.module.ts +62 -0
  135. package/os/workflow/handlers.ts +304 -0
  136. package/os/workflow/index.ts +28 -0
  137. package/os/workflow/types.ts +99 -0
  138. package/os/workflow/workflow.module.ts +54 -0
  139. package/package.json +3 -3
  140. package/profiles/godot-csharp.yaml +4 -4
  141. package/profiles/knowledge-typescript-turborepo.yaml +110 -0
  142. package/profiles/phaser-turborepo.yaml +5 -5
  143. package/skills/_shared/fo-session-summary.md +132 -16
  144. package/skills/fo/fo-add-tests/pbt-guide.md +13 -13
  145. package/skills/fo/fo-doc-audit/SKILL.md +6 -6
  146. package/skills/fo/fo-handoff/SKILL.md +5 -0
  147. package/skills/fo/fo-idea/SKILL.md +1 -1
  148. package/skills/fo/fo-review/SKILL.md +1 -1
  149. package/skills/fo/fo-session-retro/SKILL.md +8 -0
  150. package/skills/fo/fo-session-save/SKILL.md +8 -0
  151. package/src/cli-output.ts +59 -0
  152. package/src/config/forge-config.ts +524 -0
  153. package/src/forge-module.ts +39 -0
  154. package/src/index.ts +172 -0
  155. package/src/knowledge/budgets.ts +202 -0
  156. package/src/knowledge/compact.ts +405 -0
  157. package/src/knowledge/index.ts +53 -0
  158. package/src/knowledge/parse.ts +227 -0
  159. package/src/knowledge/promote.ts +156 -0
  160. package/src/knowledge/schema.ts +112 -0
  161. package/src/knowledge/serialize.ts +72 -0
  162. package/src/migration-adapters/git-utils.ts +71 -0
  163. package/src/migration-adapters/ignored-files.ts +221 -0
  164. package/src/migration-adapters/index.ts +21 -0
  165. package/src/migration-adapters/node-typescript-pnpm/index.ts +189 -0
  166. package/src/migration-adapters/phaser-pnpm/index.ts +189 -0
  167. package/src/migration-adapters/registry.ts +61 -0
  168. package/src/migration-adapters/types.ts +68 -0
  169. package/src/onboarding/agents-generate.ts +443 -0
  170. package/src/onboarding/create.ts +427 -0
  171. package/src/onboarding/doctor.ts +1297 -0
  172. package/src/onboarding/init.ts +337 -0
  173. package/src/onboarding/invariant-engine.ts +448 -0
  174. package/src/onboarding/memory-scaffold.ts +189 -0
  175. package/src/onboarding/nested-agents-generate.ts +93 -0
  176. package/src/onboarding/nested-agents-templates.ts +233 -0
  177. package/src/onboarding/profile-validate.ts +139 -0
  178. package/src/onboarding/scaffold-project.ts +299 -0
  179. package/src/onboarding/scaffold.ts +143 -0
  180. package/src/onboarding/upgrade.ts +558 -0
  181. package/src/onboarding/workspace-discovery.ts +167 -0
  182. package/src/profiles/profile-schema.ts +350 -0
  183. package/src/profiles/stack-profile.ts +188 -0
  184. package/src/profiles/terminology-utils.ts +36 -0
  185. package/src/registry.ts +185 -0
  186. package/src/skill-schema.ts +37 -0
  187. package/src/tests/acceptance-criteria.test.ts +99 -0
  188. package/src/tests/adr-implement-stamp.test.ts +368 -0
  189. package/src/tests/agents-generate-domain.test.ts +317 -0
  190. package/src/tests/agents-generate.test.ts +458 -0
  191. package/src/tests/bindings-schema.test.ts +314 -0
  192. package/src/tests/budgets.test.ts +213 -0
  193. package/src/tests/cli-output.test.ts +196 -0
  194. package/src/tests/compact.test.ts +796 -0
  195. package/src/tests/create.test.ts +289 -0
  196. package/src/tests/doctor-autonomy.test.ts +98 -0
  197. package/src/tests/doctor-bindings.test.ts +286 -0
  198. package/src/tests/doctor-domain.test.ts +113 -0
  199. package/src/tests/exploration-handlers.test.ts +256 -0
  200. package/src/tests/fixtures/agents-generate-business-before.txt +288 -0
  201. package/src/tests/forge-config.test.ts +420 -0
  202. package/src/tests/fs-atomic.test.ts +96 -0
  203. package/src/tests/fs.test.ts +103 -0
  204. package/src/tests/generated-marker.test.ts +161 -0
  205. package/src/tests/hash.test.ts +37 -0
  206. package/src/tests/implement-stamp.test.ts +505 -0
  207. package/src/tests/init-bindings.test.ts +183 -0
  208. package/src/tests/knowledge-parse.test.ts +307 -0
  209. package/src/tests/knowledge-pbt.test.ts +164 -0
  210. package/src/tests/memory-scaffold.test.ts +192 -0
  211. package/src/tests/migration-adapters.test.ts +480 -0
  212. package/src/tests/package-files.test.ts +51 -0
  213. package/src/tests/pinned-check.test.ts +194 -0
  214. package/src/tests/pinned-init.test.ts +126 -0
  215. package/src/tests/profile-schema.test.ts +194 -0
  216. package/src/tests/profile-validate.test.ts +120 -0
  217. package/src/tests/program-lease.test.ts +245 -0
  218. package/src/tests/program-paths-extended.test.ts +117 -0
  219. package/src/tests/program-paths.test.ts +98 -0
  220. package/src/tests/program-property.test.ts +139 -0
  221. package/src/tests/program-schemas.test.ts +445 -0
  222. package/src/tests/program-spec-node.test.ts +250 -0
  223. package/src/tests/promote.test.ts +481 -0
  224. package/src/tests/registry.test.ts +73 -0
  225. package/src/tests/scaffold-project.test.ts +150 -0
  226. package/src/tests/session-handlers.test.ts +503 -0
  227. package/src/tests/session-pbt.test.ts +190 -0
  228. package/src/tests/skill-schema.test.ts +146 -0
  229. package/src/tests/skill-validate-knowledge.test.ts +26 -0
  230. package/src/tests/skill-validate.test.ts +254 -0
  231. package/src/tests/stack-profile.test.ts +217 -0
  232. package/src/tests/string-utils.test.ts +42 -0
  233. package/src/tests/upgrade.test.ts +428 -0
  234. package/src/tests/werkstatt-lock.test.ts +343 -0
  235. package/src/tests/workspace-discovery-domain.test.ts +112 -0
  236. package/src/tests/workspace-discovery.test.ts +135 -0
  237. package/src/types.ts +221 -0
  238. package/src/utils/fs-atomic.ts +93 -0
  239. package/src/utils/fs-idempotent.ts +41 -0
  240. package/src/utils/fs-trash-sync.ts +37 -0
  241. package/src/utils/fs-trash.ts +24 -0
  242. package/src/utils/fs.ts +74 -0
  243. package/src/utils/generated-marker.ts +166 -0
  244. package/src/utils/hash.ts +19 -0
  245. package/src/utils/index.ts +29 -0
  246. package/src/utils/string-utils.ts +19 -0
  247. package/src/validators/note-frontmatter-validate.ts +142 -0
  248. package/src/validators/note-link-validate.ts +145 -0
  249. package/src/validators/note-orphan-detect.ts +146 -0
  250. package/src/validators/port-validate.ts +97 -0
  251. package/src/validators/skill-validate.ts +831 -0
@@ -0,0 +1,65 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
+ import { mkdtempSync, mkdirSync, rmSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { tmpdir } from "node:os";
5
+ import { resolveCompassScanRoot } from "./resolve-scan-root.ts";
6
+ import type { ForgeCommandInput, ForgeRuntimeContext } from "../../../src/types.ts";
7
+
8
+ function makeContext(workspaceRoot: string, siteExplicit = false): ForgeRuntimeContext {
9
+ return {
10
+ workspaceRoot,
11
+ site: undefined,
12
+ siteExplicit,
13
+ dryRun: false,
14
+ logger: { info: () => {}, warn: () => {}, error: () => {} },
15
+ } as unknown as ForgeRuntimeContext;
16
+ }
17
+
18
+ function makeInput(flags: Record<string, unknown> = {}): ForgeCommandInput {
19
+ return { flags } as ForgeCommandInput;
20
+ }
21
+
22
+ describe("resolveCompassScanRoot --workpiece (RFC-0617)", () => {
23
+ let tempDir: string;
24
+
25
+ beforeEach(() => {
26
+ tempDir = mkdtempSync(join(tmpdir(), "compass-workpiece-test-"));
27
+ });
28
+
29
+ afterEach(() => {
30
+ rmSync(tempDir, { recursive: true, force: true });
31
+ });
32
+
33
+ it("returns the resolved workpiece path when --workpiece is set", () => {
34
+ const relPath = "missions/test-mission/workpiece";
35
+ mkdirSync(join(tempDir, relPath), { recursive: true });
36
+ const result = resolveCompassScanRoot(makeInput({ workpiece: relPath }), makeContext(tempDir));
37
+ expect(result).toBe(join(tempDir, relPath));
38
+ });
39
+
40
+ it("throws when --workpiece and --packages are both set", () => {
41
+ expect(() =>
42
+ resolveCompassScanRoot(
43
+ makeInput({ workpiece: "some/path", packages: true }),
44
+ makeContext(tempDir),
45
+ ),
46
+ ).toThrow("--workpiece and --packages are mutually exclusive");
47
+ });
48
+
49
+ it("throws when --workpiece and --site are both set", () => {
50
+ expect(() =>
51
+ resolveCompassScanRoot(makeInput({ workpiece: "some/path" }), makeContext(tempDir, true)),
52
+ ).toThrow("--workpiece and --site are mutually exclusive");
53
+ });
54
+
55
+ it("throws when workpiece path does not exist", () => {
56
+ expect(() =>
57
+ resolveCompassScanRoot(makeInput({ workpiece: "nonexistent/path" }), makeContext(tempDir)),
58
+ ).toThrow("workpiece path not found");
59
+ });
60
+
61
+ it("ignores --workpiece when not set and falls through to site resolution", () => {
62
+ const result = resolveCompassScanRoot(makeInput({}), makeContext(tempDir));
63
+ expect(result).toBeUndefined();
64
+ });
65
+ });
@@ -0,0 +1,79 @@
1
+ /*
2
+ <MODULE_CONTRACT>
3
+ <purpose>Canonical Compass scan-root resolution for all Compass commands.
4
+ Moved from @warpgogol/site-kernel to @warpgogol/forge for full autonomous mode (RFC-0556).</purpose>
5
+ <non-goals>
6
+ <item>Do not implement Compass scanning or file processing logic here.</item>
7
+ <item>Do not register commands or modify runtime context.</item>
8
+ </non-goals>
9
+ </MODULE_CONTRACT>
10
+ <CHANGE_SUMMARY>
11
+ <item>Introduced as part of RFC-0015 to extend Compass commands to packages/.</item>
12
+ <item>RFC-0556: moved canonical implementation from @warpgogol/site-kernel to @warpgogol/forge for autonomous mode.</item>
13
+ <item>RFC-0617: added --workpiece flag for mission workpiece directory scanning.</item>
14
+ </CHANGE_SUMMARY>
15
+ */
16
+
17
+ import { existsSync } from "node:fs";
18
+ import { resolve } from "node:path";
19
+ import type { ForgeCommandInput, ForgeRuntimeContext } from "../../../src/types.ts";
20
+
21
+ export function resolveCompassScanRoot(
22
+ input: ForgeCommandInput,
23
+ context: ForgeRuntimeContext,
24
+ ): string | undefined {
25
+ const hasPackages = input.flags["packages"] === true;
26
+ const workpiecePath = input.flags["workpiece"];
27
+ const hasWorkpiece = typeof workpiecePath === "string" && workpiecePath.length > 0;
28
+
29
+ if (hasWorkpiece && hasPackages) {
30
+ throw new Error(
31
+ "[compass] --workpiece and --packages are mutually exclusive. Use one or the other.",
32
+ );
33
+ }
34
+
35
+ if (hasWorkpiece && context.siteExplicit) {
36
+ throw new Error(
37
+ "[compass] --workpiece and --site are mutually exclusive. Use one or the other.",
38
+ );
39
+ }
40
+
41
+ if (hasWorkpiece) {
42
+ const resolved = resolve(context.workspaceRoot, workpiecePath as string);
43
+ if (!existsSync(resolved)) {
44
+ throw new Error(`[compass] workpiece path not found: ${workpiecePath}`);
45
+ }
46
+ return resolved;
47
+ }
48
+
49
+ if (context.siteExplicit && hasPackages) {
50
+ throw new Error(
51
+ "[compass] --site and --packages are mutually exclusive. Use one or the other.",
52
+ );
53
+ }
54
+
55
+ if (!hasPackages) {
56
+ return context.site ? context.site.directory : undefined;
57
+ }
58
+
59
+ const packageName = input.flags["package"];
60
+ if (!packageName || typeof packageName !== "string") {
61
+ return resolve(context.workspaceRoot, "packages");
62
+ }
63
+
64
+ const candidates = [
65
+ resolve(context.workspaceRoot, "packages", "os", packageName),
66
+ resolve(context.workspaceRoot, "packages", packageName),
67
+ ];
68
+
69
+ for (const candidate of candidates) {
70
+ if (existsSync(candidate)) {
71
+ const srcPath = resolve(candidate, "src");
72
+ return existsSync(srcPath) ? srcPath : candidate;
73
+ }
74
+ }
75
+
76
+ throw new Error(
77
+ `[compass] Package "${packageName}" not found. Tried:\n${candidates.map((c) => ` ${c}`).join("\n")}`,
78
+ );
79
+ }
@@ -0,0 +1,33 @@
1
+ /*
2
+ <MODULE_CONTRACT>
3
+ <purpose>Expose the forge Compass kernel module through a stable package subpath.</purpose>
4
+ <non-goals>
5
+ <item>Do not implement compass handler logic.</item>
6
+ </non-goals>
7
+ </MODULE_CONTRACT>
8
+ <CHANGE_SUMMARY>
9
+ <item>RFC-0374: initial compass module barrel.</item>
10
+ </CHANGE_SUMMARY>
11
+ */
12
+
13
+ export { forgeCompassModule } from "./compass.module.ts";
14
+ export {
15
+ createCompassInventoryEntries,
16
+ type CompassInventoryEntry,
17
+ } from "./handlers/compass-inventory.ts";
18
+ export { resolveCompassScanRoot } from "./handlers/resolve-scan-root.ts";
19
+ export { getRevisionByPath, type RevisionByPathResult } from "./handlers/git-revision.ts";
20
+ export { runCompassInventory, runCompassValidation } from "./handlers/compass-inventory-handler.ts";
21
+ export {
22
+ runCompassAuditPlan,
23
+ runCompassAuditRecord,
24
+ runCompassAuditBaseline,
25
+ runCompassAuditValidate,
26
+ isAuditDue,
27
+ } from "./handlers/compass-audit-handler.ts";
28
+ export {
29
+ runCompassChangeSummaryValidate,
30
+ runCompassSummaryTrim,
31
+ classifyChangeSummaryItem,
32
+ type ChangeSummaryItemClass,
33
+ } from "./handlers/compass-change-summary-handler.ts";