@warpgogol/forge 2.9.11 → 2.9.23

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 (159) hide show
  1. package/dist/bin/cli.js +1 -1
  2. package/dist/os/adr/adr.module.d.ts.map +1 -1
  3. package/dist/os/adr/adr.module.js +1 -0
  4. package/dist/os/adr/adr.module.js.map +1 -1
  5. package/dist/os/audit/audit.module.d.ts.map +1 -1
  6. package/dist/os/audit/audit.module.js +1 -0
  7. package/dist/os/audit/audit.module.js.map +1 -1
  8. package/dist/os/compass/compass.module.d.ts.map +1 -1
  9. package/dist/os/compass/compass.module.js +1 -0
  10. package/dist/os/compass/compass.module.js.map +1 -1
  11. package/dist/os/compass/handlers/compass-inventory-handler.d.ts.map +1 -1
  12. package/dist/os/compass/handlers/compass-inventory-handler.js +82 -1
  13. package/dist/os/compass/handlers/compass-inventory-handler.js.map +1 -1
  14. package/dist/os/core/core.module.d.ts.map +1 -1
  15. package/dist/os/core/core.module.js +16 -0
  16. package/dist/os/core/core.module.js.map +1 -1
  17. package/dist/os/core/handlers/assets-helpers.js +1 -1
  18. package/dist/os/core/handlers/assets-helpers.js.map +1 -1
  19. package/dist/os/core/handlers/determinism-check.js +1 -1
  20. package/dist/os/core/handlers/determinism-check.js.map +1 -1
  21. package/dist/os/core/handlers/forge-autonomy-validate.d.ts +18 -0
  22. package/dist/os/core/handlers/forge-autonomy-validate.d.ts.map +1 -0
  23. package/dist/os/core/handlers/forge-autonomy-validate.js +78 -0
  24. package/dist/os/core/handlers/forge-autonomy-validate.js.map +1 -0
  25. package/dist/os/core/handlers/knowledge-compact.d.ts.map +1 -1
  26. package/dist/os/core/handlers/knowledge-compact.js +7 -1
  27. package/dist/os/core/handlers/knowledge-compact.js.map +1 -1
  28. package/dist/os/core/handlers/release-prepare.js +1 -1
  29. package/dist/os/core/handlers/release-prepare.js.map +1 -1
  30. package/dist/os/exploration/exploration.module.d.ts.map +1 -1
  31. package/dist/os/exploration/exploration.module.js +1 -0
  32. package/dist/os/exploration/exploration.module.js.map +1 -1
  33. package/dist/os/mission/mission.module.d.ts.map +1 -1
  34. package/dist/os/mission/mission.module.js +1 -0
  35. package/dist/os/mission/mission.module.js.map +1 -1
  36. package/dist/os/naming/naming.module.d.ts.map +1 -1
  37. package/dist/os/naming/naming.module.js +1 -0
  38. package/dist/os/naming/naming.module.js.map +1 -1
  39. package/dist/os/notes/notes.module.d.ts.map +1 -1
  40. package/dist/os/notes/notes.module.js +1 -0
  41. package/dist/os/notes/notes.module.js.map +1 -1
  42. package/dist/os/plan/plan.module.d.ts.map +1 -1
  43. package/dist/os/plan/plan.module.js +1 -0
  44. package/dist/os/plan/plan.module.js.map +1 -1
  45. package/dist/os/plugin/plugin.module.d.ts +25 -0
  46. package/dist/os/plugin/plugin.module.d.ts.map +1 -0
  47. package/dist/os/plugin/plugin.module.js +208 -0
  48. package/dist/os/plugin/plugin.module.js.map +1 -0
  49. package/dist/os/program/program.module.d.ts.map +1 -1
  50. package/dist/os/program/program.module.js +1 -0
  51. package/dist/os/program/program.module.js.map +1 -1
  52. package/dist/os/rfc/rfc.module.d.ts.map +1 -1
  53. package/dist/os/rfc/rfc.module.js +1 -0
  54. package/dist/os/rfc/rfc.module.js.map +1 -1
  55. package/dist/os/session/session.module.d.ts.map +1 -1
  56. package/dist/os/session/session.module.js +1 -0
  57. package/dist/os/session/session.module.js.map +1 -1
  58. package/dist/os/spec/spec.module.d.ts.map +1 -1
  59. package/dist/os/spec/spec.module.js +1 -0
  60. package/dist/os/spec/spec.module.js.map +1 -1
  61. package/dist/os/werkstatt/handlers/workspace-deps.d.ts.map +1 -0
  62. package/dist/os/{core → werkstatt}/handlers/workspace-deps.js +4 -3
  63. package/dist/os/werkstatt/handlers/workspace-deps.js.map +1 -0
  64. package/dist/os/werkstatt/werkstatt.module.d.ts.map +1 -1
  65. package/dist/os/werkstatt/werkstatt.module.js +1 -0
  66. package/dist/os/werkstatt/werkstatt.module.js.map +1 -1
  67. package/dist/os/workflow/workflow.module.d.ts.map +1 -1
  68. package/dist/os/workflow/workflow.module.js +1 -0
  69. package/dist/os/workflow/workflow.module.js.map +1 -1
  70. package/dist/src/compass/contract-registry.d.ts +7 -0
  71. package/dist/src/compass/contract-registry.d.ts.map +1 -0
  72. package/dist/src/compass/contract-registry.js +93 -0
  73. package/dist/src/compass/contract-registry.js.map +1 -0
  74. package/dist/src/compass/types.d.ts +28 -0
  75. package/dist/src/compass/types.d.ts.map +1 -0
  76. package/dist/src/compass/types.js +14 -0
  77. package/dist/src/compass/types.js.map +1 -0
  78. package/dist/src/forge-module.d.ts +1 -0
  79. package/dist/src/forge-module.d.ts.map +1 -1
  80. package/dist/src/forge-module.js +2 -1
  81. package/dist/src/forge-module.js.map +1 -1
  82. package/dist/src/index.d.ts +3 -0
  83. package/dist/src/index.d.ts.map +1 -1
  84. package/dist/src/index.js +3 -0
  85. package/dist/src/index.js.map +1 -1
  86. package/dist/src/onboarding/doctor.d.ts.map +1 -1
  87. package/dist/src/onboarding/doctor.js +89 -7
  88. package/dist/src/onboarding/doctor.js.map +1 -1
  89. package/dist/src/onboarding/init.d.ts.map +1 -1
  90. package/dist/src/onboarding/init.js +22 -1
  91. package/dist/src/onboarding/init.js.map +1 -1
  92. package/dist/src/onboarding/scaffold.d.ts.map +1 -1
  93. package/dist/src/onboarding/scaffold.js +1 -0
  94. package/dist/src/onboarding/scaffold.js.map +1 -1
  95. package/dist/src/onboarding/upgrade.d.ts.map +1 -1
  96. package/dist/src/onboarding/upgrade.js +7 -1
  97. package/dist/src/onboarding/upgrade.js.map +1 -1
  98. package/dist/src/plugin/ForgePluginManifest.d.ts +38 -0
  99. package/dist/src/plugin/ForgePluginManifest.d.ts.map +1 -0
  100. package/dist/src/plugin/ForgePluginManifest.js +52 -0
  101. package/dist/src/plugin/ForgePluginManifest.js.map +1 -0
  102. package/dist/src/registry.d.ts.map +1 -1
  103. package/dist/src/registry.js +28 -0
  104. package/dist/src/registry.js.map +1 -1
  105. package/dist/src/validators/port-validate.js +3 -3
  106. package/dist/src/validators/port-validate.js.map +1 -1
  107. package/os/adr/adr.module.ts +1 -0
  108. package/os/audit/audit.module.ts +1 -0
  109. package/os/compass/compass.module.ts +1 -0
  110. package/os/compass/handlers/compass-inventory-handler.ts +107 -1
  111. package/os/core/core.module.ts +18 -0
  112. package/os/core/handlers/assets-helpers.ts +1 -1
  113. package/os/core/handlers/determinism-check.ts +1 -1
  114. package/os/core/handlers/forge-autonomy-validate.ts +115 -0
  115. package/os/core/handlers/knowledge-compact.ts +6 -1
  116. package/os/core/handlers/release-prepare.ts +1 -1
  117. package/os/exploration/exploration.module.ts +1 -0
  118. package/os/mission/mission.module.ts +1 -0
  119. package/os/naming/naming.module.ts +1 -0
  120. package/os/notes/notes.module.ts +1 -0
  121. package/os/plan/plan.module.ts +1 -0
  122. package/os/plugin/plugin.module.ts +261 -0
  123. package/os/program/program.module.ts +1 -0
  124. package/os/rfc/rfc.module.ts +1 -0
  125. package/os/session/session.module.ts +1 -0
  126. package/os/spec/spec.module.ts +1 -0
  127. package/os/{core → werkstatt}/handlers/workspace-deps.ts +4 -3
  128. package/os/werkstatt/werkstatt.module.ts +1 -0
  129. package/os/workflow/workflow.module.ts +1 -0
  130. package/package.json +13 -3
  131. package/profiles/forge-shell.yaml +1 -1
  132. package/profiles/godot-csharp.yaml +13 -13
  133. package/profiles/knowledge-typescript-turborepo.yaml +1 -1
  134. package/profiles/phaser-turborepo.yaml +13 -13
  135. package/skills/fo/fo-add-tests/SKILL.md +54 -0
  136. package/skills/fo/fo-compass-annotate/SKILL.md +1 -0
  137. package/skills/fo/fo-idea-implement/SKILL.md +80 -0
  138. package/src/compass/contract-registry.ts +114 -0
  139. package/src/compass/types.ts +45 -0
  140. package/src/forge-module.ts +3 -1
  141. package/src/index.ts +17 -0
  142. package/src/onboarding/doctor.ts +89 -7
  143. package/src/onboarding/init.ts +20 -1
  144. package/src/onboarding/scaffold.ts +1 -0
  145. package/src/onboarding/templates/behavioral-layer-core.md +9 -0
  146. package/src/onboarding/upgrade.ts +6 -1
  147. package/src/plugin/ForgePluginManifest.ts +76 -0
  148. package/src/registry.ts +36 -0
  149. package/src/tests/contract-registry.test.ts +248 -0
  150. package/src/tests/discover-pack-skills.test.ts +112 -0
  151. package/src/tests/doctor-autonomy.test.ts +3 -3
  152. package/src/tests/fixtures/agents-generate-business-before.txt +9 -0
  153. package/src/tests/forge-autonomy-validate.test.ts +157 -0
  154. package/src/tests/plugin-manifest.test.ts +226 -0
  155. package/src/tests/upgrade.test.ts +5 -0
  156. package/src/validators/port-validate.ts +3 -3
  157. package/dist/os/core/handlers/workspace-deps.d.ts.map +0 -1
  158. package/dist/os/core/handlers/workspace-deps.js.map +0 -1
  159. /package/dist/os/{core → werkstatt}/handlers/workspace-deps.d.ts +0 -0
@@ -0,0 +1,226 @@
1
+ import { test, expect, describe } from "vitest";
2
+ import { forgePluginManifestSchema } from "../plugin/ForgePluginManifest.ts";
3
+
4
+ describe("forgePluginManifestSchema (RFC-0941, RFC-0943)", () => {
5
+ test("accepts valid manifest with id and version", () => {
6
+ const result = forgePluginManifestSchema.safeParse({
7
+ id: "wg",
8
+ version: "1.0.0",
9
+ });
10
+ expect(result.success).toBe(true);
11
+ });
12
+
13
+ test("accepts hyphenated kebab-case id", () => {
14
+ const result = forgePluginManifestSchema.safeParse({
15
+ id: "my-cool-pack",
16
+ version: "0.1.0",
17
+ });
18
+ expect(result.success).toBe(true);
19
+ });
20
+
21
+ test("accepts semver pre-release version", () => {
22
+ const result = forgePluginManifestSchema.safeParse({
23
+ id: "wg",
24
+ version: "1.0.0-beta.1",
25
+ });
26
+ expect(result.success).toBe(true);
27
+ });
28
+
29
+ test("rejects missing id", () => {
30
+ const result = forgePluginManifestSchema.safeParse({
31
+ version: "1.0.0",
32
+ });
33
+ expect(result.success).toBe(false);
34
+ });
35
+
36
+ test("rejects missing version", () => {
37
+ const result = forgePluginManifestSchema.safeParse({
38
+ id: "wg",
39
+ });
40
+ expect(result.success).toBe(false);
41
+ });
42
+
43
+ test("rejects non-kebab-case id (uppercase)", () => {
44
+ const result = forgePluginManifestSchema.safeParse({
45
+ id: "Wg",
46
+ version: "1.0.0",
47
+ });
48
+ expect(result.success).toBe(false);
49
+ });
50
+
51
+ test("rejects id with underscores", () => {
52
+ const result = forgePluginManifestSchema.safeParse({
53
+ id: "my_pack",
54
+ version: "1.0.0",
55
+ });
56
+ expect(result.success).toBe(false);
57
+ });
58
+
59
+ test("rejects id starting with digit", () => {
60
+ const result = forgePluginManifestSchema.safeParse({
61
+ id: "1wg",
62
+ version: "1.0.0",
63
+ });
64
+ expect(result.success).toBe(false);
65
+ });
66
+
67
+ test("rejects invalid semver version", () => {
68
+ const result = forgePluginManifestSchema.safeParse({
69
+ id: "wg",
70
+ version: "1.0",
71
+ });
72
+ expect(result.success).toBe(false);
73
+ });
74
+
75
+ test("rejects extra fields (strict schema)", () => {
76
+ const result = forgePluginManifestSchema.safeParse({
77
+ id: "wg",
78
+ version: "1.0.0",
79
+ unexpectedField: true,
80
+ });
81
+ expect(result.success).toBe(false);
82
+ });
83
+
84
+ test("rejects non-string id", () => {
85
+ const result = forgePluginManifestSchema.safeParse({
86
+ id: 123,
87
+ version: "1.0.0",
88
+ });
89
+ expect(result.success).toBe(false);
90
+ });
91
+
92
+ test("rejects empty object", () => {
93
+ const result = forgePluginManifestSchema.safeParse({});
94
+ expect(result.success).toBe(false);
95
+ });
96
+
97
+ // RFC-0943: extensionPoints.compass.contract
98
+
99
+ test("accepts manifest with extensionPoints.compass.contract", () => {
100
+ const result = forgePluginManifestSchema.safeParse({
101
+ id: "wg",
102
+ version: "1.0.0",
103
+ extensionPoints: {
104
+ compass: {
105
+ contract: {
106
+ blocks: [
107
+ {
108
+ blockId: "api-contract",
109
+ requiredFor: ["packages/my-pack/**/*.ts"],
110
+ },
111
+ ],
112
+ },
113
+ },
114
+ },
115
+ });
116
+ expect(result.success).toBe(true);
117
+ });
118
+
119
+ test("accepts manifest with extensionPoints.compass.contract and requiredTags", () => {
120
+ const result = forgePluginManifestSchema.safeParse({
121
+ id: "wg",
122
+ version: "1.0.0",
123
+ extensionPoints: {
124
+ compass: {
125
+ contract: {
126
+ blocks: [
127
+ {
128
+ blockId: "api-contract",
129
+ requiredFor: ["packages/my-pack/**/*.ts"],
130
+ requiredTags: [{ name: "endpoints", minWords: 5 }],
131
+ },
132
+ ],
133
+ },
134
+ },
135
+ },
136
+ });
137
+ expect(result.success).toBe(true);
138
+ });
139
+
140
+ test("accepts manifest with empty extensionPoints.compass.contract.blocks", () => {
141
+ const result = forgePluginManifestSchema.safeParse({
142
+ id: "wg",
143
+ version: "1.0.0",
144
+ extensionPoints: {
145
+ compass: {
146
+ contract: {
147
+ blocks: [],
148
+ },
149
+ },
150
+ },
151
+ });
152
+ expect(result.success).toBe(true);
153
+ });
154
+
155
+ test("rejects extensionPoints.compass.contract with non-kebab-case blockId", () => {
156
+ const result = forgePluginManifestSchema.safeParse({
157
+ id: "wg",
158
+ version: "1.0.0",
159
+ extensionPoints: {
160
+ compass: {
161
+ contract: {
162
+ blocks: [
163
+ {
164
+ blockId: "API_Contract",
165
+ requiredFor: ["packages/**/*.ts"],
166
+ },
167
+ ],
168
+ },
169
+ },
170
+ },
171
+ });
172
+ expect(result.success).toBe(false);
173
+ });
174
+
175
+ test("rejects extensionPoints.compass.contract with empty requiredFor", () => {
176
+ const result = forgePluginManifestSchema.safeParse({
177
+ id: "wg",
178
+ version: "1.0.0",
179
+ extensionPoints: {
180
+ compass: {
181
+ contract: {
182
+ blocks: [
183
+ {
184
+ blockId: "api-contract",
185
+ requiredFor: [],
186
+ },
187
+ ],
188
+ },
189
+ },
190
+ },
191
+ });
192
+ expect(result.success).toBe(false);
193
+ });
194
+
195
+ test("rejects extensionPoints.compass.contract with negative minWords", () => {
196
+ const result = forgePluginManifestSchema.safeParse({
197
+ id: "wg",
198
+ version: "1.0.0",
199
+ extensionPoints: {
200
+ compass: {
201
+ contract: {
202
+ blocks: [
203
+ {
204
+ blockId: "api-contract",
205
+ requiredFor: ["packages/**/*.ts"],
206
+ requiredTags: [{ name: "endpoints", minWords: -1 }],
207
+ },
208
+ ],
209
+ },
210
+ },
211
+ },
212
+ });
213
+ expect(result.success).toBe(false);
214
+ });
215
+
216
+ test("rejects extensionPoints with unknown extension point key", () => {
217
+ const result = forgePluginManifestSchema.safeParse({
218
+ id: "wg",
219
+ version: "1.0.0",
220
+ extensionPoints: {
221
+ unknown: { foo: "bar" },
222
+ },
223
+ });
224
+ expect(result.success).toBe(false);
225
+ });
226
+ });
@@ -253,6 +253,11 @@ test("RFC-0552: forge.upgrade returns skippedSkills field and syncs non-conflict
253
253
  "---\nname: wg-custom\n---\n# wg-custom (should be synced)\n",
254
254
  "utf8",
255
255
  );
256
+ await writeFile(
257
+ join(tempDir, "packages", "wg-skills", "skills", "forge.plugin.yaml"),
258
+ "id: wg-skills\nversion: 1.0.0\n",
259
+ "utf8",
260
+ );
256
261
 
257
262
  // Write forge.yaml with skillPacks config and null syncedVersion
258
263
  const yaml = `schema: forge/config@1
@@ -22,10 +22,10 @@ interface PortValidateResult {
22
22
 
23
23
  // RFC-0556: removed @warpgogol/site-kernel-checks and @warpgogol/site-kernel-handoff
24
24
  // from this list — os/compass and os/werkstatt no longer import them (handlers inlined).
25
- // RFC-0776: @warpgogol/site-kernel replaced by @warpgogol/werkstatt/kernel.
26
- // @warpgogol/werkstatt/kernel remains forbidden for src/ portability.
25
+ // RFC-0776: @warpgogol/site-kernel replaced by @warpgogol/werkstatt-engine/kernel.
26
+ // @warpgogol/werkstatt-engine/kernel remains forbidden for src/ portability.
27
27
  const FORBIDDEN_IMPORTS = [
28
- "@warpgogol/werkstatt/kernel",
28
+ "@warpgogol/werkstatt-engine/kernel",
29
29
  "@warpgogol/werkstatt-site/ui",
30
30
  "@warpgogol/werkstatt-shared/share/page",
31
31
  ];
@@ -1 +0,0 @@
1
- {"version":3,"file":"workspace-deps.d.ts","sourceRoot":"","sources":["../../../../os/core/handlers/workspace-deps.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,cAAc,GAAG,CAC3B,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IACR,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CACpC,KACE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;AAEvB,MAAM,MAAM,cAAc,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAEnE,UAAU,aAAa;IACrB,YAAY,EAAE,cAAc,CAAC;IAC7B,YAAY,EAAE,cAAc,CAAC;CAC9B;AAKD,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,aAAa,CAAC,CAuBhE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"workspace-deps.js","sourceRoot":"","sources":["../../../../os/core/handlers/workspace-deps.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;EAWE;AAiBF,IAAI,MAAM,GAAyB,IAAI,CAAC;AACxC,IAAI,SAAS,GAAkB,IAAI,CAAC;AAEpC,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,IAAI,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;IAE1C,IAAI,CAAC;QACH,6DAA6D;QAC7D,0FAA0F;QAC1F,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,sCAAsC,CAAC,CAAC;QACtE,6DAA6D;QAC7D,0FAA0F;QAC1F,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,kCAAkC,CAAC,CAAC;QAC/D,MAAM,GAAG;YACP,YAAY,EAAE,QAAQ,CAAC,YAA8B;YACrD,YAAY,EAAE,KAAK,CAAC,YAA8B;SACnD,CAAC;QACF,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,SAAS;YACP,0HAA0H;gBAC1H,6GAA6G;gBAC7G,UAAW,GAAa,CAAC,OAAO,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC"}