@warpgogol/forge 0.28.0 → 1.0.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 (83) hide show
  1. package/AGENTS.md +16 -0
  2. package/README.md +4 -4
  3. package/README.uk.md +4 -4
  4. package/dist/os/core/core.module.d.ts.map +1 -1
  5. package/dist/os/core/core.module.js +34 -0
  6. package/dist/os/core/core.module.js.map +1 -1
  7. package/dist/os/core/handlers/workspace-deps.js +3 -3
  8. package/dist/os/core/handlers/workspace-deps.js.map +1 -1
  9. package/dist/os/program/discovery.d.ts +61 -0
  10. package/dist/os/program/discovery.d.ts.map +1 -0
  11. package/dist/os/program/discovery.js +236 -0
  12. package/dist/os/program/discovery.js.map +1 -0
  13. package/dist/os/program/handlers/complete.d.ts +12 -0
  14. package/dist/os/program/handlers/complete.d.ts.map +1 -0
  15. package/dist/os/program/handlers/complete.js +344 -0
  16. package/dist/os/program/handlers/complete.js.map +1 -0
  17. package/dist/os/program/handlers/lease.d.ts +13 -0
  18. package/dist/os/program/handlers/lease.d.ts.map +1 -0
  19. package/dist/os/program/handlers/lease.js +322 -0
  20. package/dist/os/program/handlers/lease.js.map +1 -0
  21. package/dist/os/program/handlers/seal.d.ts +12 -0
  22. package/dist/os/program/handlers/seal.d.ts.map +1 -0
  23. package/dist/os/program/handlers/seal.js +265 -0
  24. package/dist/os/program/handlers/seal.js.map +1 -0
  25. package/dist/os/program/handlers/validate.d.ts +14 -0
  26. package/dist/os/program/handlers/validate.d.ts.map +1 -0
  27. package/dist/os/program/handlers/validate.js +164 -0
  28. package/dist/os/program/handlers/validate.js.map +1 -0
  29. package/dist/os/program/lease.d.ts +39 -0
  30. package/dist/os/program/lease.d.ts.map +1 -0
  31. package/dist/os/program/lease.js +129 -0
  32. package/dist/os/program/lease.js.map +1 -0
  33. package/dist/os/program/program.module.d.ts +3 -0
  34. package/dist/os/program/program.module.d.ts.map +1 -0
  35. package/dist/os/program/program.module.js +201 -0
  36. package/dist/os/program/program.module.js.map +1 -0
  37. package/dist/os/program/schemas.d.ts +225 -0
  38. package/dist/os/program/schemas.d.ts.map +1 -0
  39. package/dist/os/program/schemas.js +174 -0
  40. package/dist/os/program/schemas.js.map +1 -0
  41. package/dist/os/program/state.d.ts +38 -0
  42. package/dist/os/program/state.d.ts.map +1 -0
  43. package/dist/os/program/state.js +189 -0
  44. package/dist/os/program/state.js.map +1 -0
  45. package/dist/os/rfc/handlers/archive.d.ts +1 -0
  46. package/dist/os/rfc/handlers/archive.d.ts.map +1 -1
  47. package/dist/os/rfc/handlers/archive.js +54 -0
  48. package/dist/os/rfc/handlers/archive.js.map +1 -1
  49. package/dist/os/rfc/handlers/validate-rules.js +2 -2
  50. package/dist/os/rfc/handlers/validate-rules.js.map +1 -1
  51. package/dist/os/werkstatt/handlers/schema.js +2 -2
  52. package/dist/src/index.d.ts +1 -0
  53. package/dist/src/index.d.ts.map +1 -1
  54. package/dist/src/index.js +1 -0
  55. package/dist/src/index.js.map +1 -1
  56. package/dist/src/onboarding/invariant-engine.d.ts.map +1 -1
  57. package/dist/src/onboarding/invariant-engine.js +61 -1
  58. package/dist/src/onboarding/invariant-engine.js.map +1 -1
  59. package/dist/src/profiles/profile-schema.d.ts +7 -1
  60. package/dist/src/profiles/profile-schema.d.ts.map +1 -1
  61. package/dist/src/profiles/profile-schema.js +3 -0
  62. package/dist/src/profiles/profile-schema.js.map +1 -1
  63. package/dist/src/profiles/stack-profile.d.ts +2 -0
  64. package/dist/src/profiles/stack-profile.d.ts.map +1 -1
  65. package/dist/src/utils/fs.js +2 -2
  66. package/dist/src/utils/fs.js.map +1 -1
  67. package/dist/src/utils/string-utils.js +1 -1
  68. package/dist/src/validators/port-validate.js +1 -1
  69. package/dist/src/validators/port-validate.js.map +1 -1
  70. package/package.json +19 -15
  71. package/profiles/astro-typescript-turborepo.yaml +1 -1
  72. package/profiles/editframe.yaml +2 -2
  73. package/profiles/forge-shell.yaml +1 -1
  74. package/profiles/godot-csharp.yaml +388 -0
  75. package/profiles/phaser-turborepo.yaml +1 -1
  76. package/skills/fo/ef-onboard/SKILL.md +1 -1
  77. package/skills/fo/fo-idea/SKILL.md +2 -2
  78. package/skills/fo/fo-idea-implement/SKILL.md +1 -1
  79. package/skills/fo/fo-step-commit/SKILL.md +7 -5
  80. package/skills/shared/grilling/learned-principles.archive.md +212 -0
  81. package/skills/shared/grilling/learned-principles.md +0 -13
  82. package/skills/shared/grilling/qa-log.md +624 -0
  83. package/skills/shared/knowledge/learned-principles.md +99 -0
@@ -7,7 +7,7 @@
7
7
  </non-goals>
8
8
  </MODULE_CONTRACT>
9
9
  <CHANGE_SUMMARY>
10
- <item>Initial inline of collectFiles, fileExists from @warpgogol/werkstatt-site/share/fs.</item>
10
+ <item>Initial inline of collectFiles, fileExists from @warpgogol/werkstatt-shared/share/fs.</item>
11
11
  </CHANGE_SUMMARY>
12
12
  */
13
13
  import { readdir, stat } from "node:fs/promises";
@@ -19,7 +19,7 @@ export async function collectFiles(root, options = {}) {
19
19
  const { extensions, ignore = defaultIgnore, withDirs = false } = options;
20
20
  const results = [];
21
21
  // fs.walk.lint: allow — this is the canonical collectFiles implementation,
22
- // inlined from @warpgogol/werkstatt-site/share/fs to keep @warpgogol/forge dependency-free (RFC-0303).
22
+ // inlined from @warpgogol/werkstatt-shared/share/fs to keep @warpgogol/forge dependency-free (RFC-0303).
23
23
  async function walk(dir) {
24
24
  let entries;
25
25
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"fs.js","sourceRoot":"","sources":["../../../src/utils/fs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;EAWE;AAEF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAQjC,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAY,EACZ,UAA+B,EAAE;IAEjC,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,aAAa,EAAE,QAAQ,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IACzE,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,2EAA2E;IAC3E,uGAAuG;IACvG,KAAK,UAAU,IAAI,CAAC,GAAW;QAC7B,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS;YAEjC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAEnC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,IAAI,QAAQ;oBAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjB,SAAS;YACX,CAAC;YAED,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;gBAAE,SAAS;YAE9B,IAAI,UAAU,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBAAE,SAAS;YAEhF,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY;IAC3C,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../../../src/utils/fs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;EAWE;AAEF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAQjC,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAY,EACZ,UAA+B,EAAE;IAEjC,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,aAAa,EAAE,QAAQ,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IACzE,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,2EAA2E;IAC3E,yGAAyG;IACzG,KAAK,UAAU,IAAI,CAAC,GAAW;QAC7B,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS;YAEjC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAEnC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,IAAI,QAAQ;oBAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjB,SAAS;YACX,CAAC;YAED,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;gBAAE,SAAS;YAE9B,IAAI,UAAU,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBAAE,SAAS;YAEhF,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY;IAC3C,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -7,7 +7,7 @@
7
7
  </non-goals>
8
8
  </MODULE_CONTRACT>
9
9
  <CHANGE_SUMMARY>
10
- <item>Initial inline of toKebabCase from @warpgogol/werkstatt-site/share/string-utils.</item>
10
+ <item>Initial inline of toKebabCase from @warpgogol/werkstatt-shared/share/string-utils.</item>
11
11
  </CHANGE_SUMMARY>
12
12
  */
13
13
  export function toKebabCase(value) {
@@ -19,7 +19,7 @@ import { FORGE_SKILLS } from "../registry.js";
19
19
  const FORBIDDEN_IMPORTS = [
20
20
  "@warpgogol/werkstatt/kernel",
21
21
  "@warpgogol/werkstatt-site/ui",
22
- "@warpgogol/werkstatt-site/share/page",
22
+ "@warpgogol/werkstatt-shared/share/page",
23
23
  ];
24
24
  export function runPortValidate(input, context) {
25
25
  const ctx = context;
@@ -1 +1 @@
1
- {"version":3,"file":"port-validate.js","sourceRoot":"","sources":["../../../src/validators/port-validate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"port-validate.js","sourceRoot":"","sources":["../../../src/validators/port-validate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;EAUE;AAEF,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAQ9C,qFAAqF;AACrF,yFAAyF;AACzF,4EAA4E;AAC5E,sEAAsE;AACtE,MAAM,iBAAiB,GAAG;IACxB,6BAA6B;IAC7B,8BAA8B;IAC9B,wCAAwC;CACzC,CAAC;AAEF,MAAM,UAAU,eAAe,CAC7B,KAAmC,EACnC,OAAgB;IAEhB,MAAM,GAAG,GAAG,OAAqC,CAAC;IAClD,MAAM,aAAa,GAAG,GAAG,EAAE,aAAa,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IAChE,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC;IAE/B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO;YACL,OAAO,EAAE,qBAAqB;YAC9B,MAAM,EAAE,MAAM;YACd,UAAU,EAAE,CAAC,yBAAyB,CAAC;SACxC,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,oCAAoC;IACpC,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAC7D,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,UAAU,CAAC,IAAI,CAAC,UAAU,IAAI,+BAA+B,CAAC,CAAC;IACjE,CAAC;IAED,oFAAoF;IACpF,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAChD,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC;KAC3B,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,uBAAuB,CAAC,GAAG,EAAE,iBAAiB,EAAE,UAAU,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,EAAE,qBAAqB;QAC9B,MAAM,EAAE,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;QACjD,UAAU;KACX,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,GAAW,EAAE,SAAmB,EAAE,UAAoB;IACrF,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,uBAAuB,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QAC3D,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACrE,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAClD,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;gBAC5B,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC1B,UAAU,CAAC,IAAI,CACb,qBAAqB,GAAG,cAAc,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,EAAE,CAC/E,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,19 +1,11 @@
1
1
  {
2
2
  "name": "@warpgogol/forge",
3
- "version": "0.28.0",
3
+ "version": "1.0.1",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
7
7
  "description": "Framework for documenting and implementing ideas — RFC/ADR governance, skills, and project bootstrapping.",
8
- "keywords": [
9
- "rfc",
10
- "adr",
11
- "governance",
12
- "skills",
13
- "ai-agent",
14
- "documentation",
15
- "framework"
16
- ],
8
+ "keywords": ["rfc", "adr", "governance", "skills", "ai-agent", "documentation", "framework"],
17
9
  "homepage": "https://warpgogol.com",
18
10
  "main": "./src/index.ts",
19
11
  "types": "./src/index.ts",
@@ -132,6 +124,10 @@
132
124
  "./os/notes-module": {
133
125
  "types": "./os/notes/notes.module.ts",
134
126
  "default": "./os/notes/notes.module.ts"
127
+ },
128
+ "./os/program": {
129
+ "types": "./os/program/program.module.ts",
130
+ "default": "./os/program/program.module.ts"
135
131
  }
136
132
  },
137
133
  "files": [
@@ -151,7 +147,8 @@
151
147
  "lint": "pnpm exec eslint src --ext .ts",
152
148
  "typecheck": "pnpm exec tsc -p tsconfig.json --noEmit",
153
149
  "test": "vitest run --passWithNoTests",
154
- "test:watch": "vitest"
150
+ "test:watch": "vitest",
151
+ "test:tarball:node24": "node test-fixtures/node24-consumer/smoke.mjs"
155
152
  },
156
153
  "dependencies": {
157
154
  "@aws-sdk/client-s3": "^3.700.0",
@@ -159,14 +156,18 @@
159
156
  "yaml": "^2.9.0",
160
157
  "zod": "^4.4.3"
161
158
  },
159
+ "optionalDependencies": {
160
+ "@warpgogol/werkstatt-shared": "*",
161
+ "@warpgogol/werkstatt": "*"
162
+ },
162
163
  "devDependencies": {
163
- "@types/node": "^26.1.2",
164
+ "@types/node": "^24.0.0",
164
165
  "fast-check": "^4.9.0",
165
166
  "typescript": "^6.0.3",
166
167
  "vitest": "^4.1.10"
167
168
  },
168
169
  "engines": {
169
- "node": ">=20.0.0"
170
+ "node": ">=24 <25"
170
171
  },
171
172
  "publishConfig": {
172
173
  "access": "public",
@@ -284,8 +285,11 @@
284
285
  "./os/notes-module": {
285
286
  "types": "./dist/os/notes/notes.module.d.ts",
286
287
  "default": "./dist/os/notes/notes.module.js"
288
+ },
289
+ "./os/program": {
290
+ "types": "./dist/os/program/program.module.d.ts",
291
+ "default": "./dist/os/program/program.module.js"
287
292
  }
288
293
  }
289
- },
290
- "packageManager": "pnpm@11.10.0"
294
+ }
291
295
  }
@@ -150,7 +150,7 @@ workspace:
150
150
  "private": true,
151
151
  "type": "module",
152
152
  "engines": {
153
- "node": ">=22"
153
+ "node": ">=24 <25"
154
154
  },
155
155
  "scripts": {
156
156
  "clean": "node scripts/clean.mjs",
@@ -51,7 +51,7 @@ release:
51
51
  manifestName: release-manifest.json
52
52
  prerequisites:
53
53
  - id: nodejs
54
- name: Node.js 18+
54
+ name: Node.js 24+
55
55
  check: node --version
56
56
  installHint: "https://nodejs.org/en/download/"
57
57
  severity: error
@@ -296,7 +296,7 @@ workspace:
296
296
  "type": "module",
297
297
  "packageManager": "pnpm@11.10.0",
298
298
  "engines": {
299
- "node": ">=22"
299
+ "node": ">=24 <25"
300
300
  },
301
301
  "scripts": {
302
302
  "clean": "node scripts/clean.mjs",
@@ -101,7 +101,7 @@ workspace:
101
101
  "private": true,
102
102
  "type": "module",
103
103
  "engines": {
104
- "node": ">=22"
104
+ "node": ">=24 <25"
105
105
  },
106
106
  "scripts": {
107
107
  "clean": "node scripts/clean.mjs",
@@ -0,0 +1,388 @@
1
+ schema: forge/stack-profile@1
2
+ id: godot-csharp
3
+ displayName: Godot 4.x + C#
4
+ detect:
5
+ anyOf:
6
+ - project.godot
7
+ domain: game
8
+ register: creative
9
+ terminology:
10
+ artifact: game
11
+ artifactPlural: games
12
+ module: scene
13
+ source: scene/script file
14
+ output: build
15
+ verify: headless-check
16
+ operator: game-developer
17
+ devServer:
18
+ command: godot --path . --editor
19
+ port: 6005
20
+ artifacts:
21
+ - id: game
22
+ extensions:
23
+ - .tscn
24
+ - .cs
25
+ - .tres
26
+ produce:
27
+ command: dotnet build ./Game.csproj
28
+ output: bin/Debug
29
+ validate:
30
+ command: godot --path . --headless --quit
31
+ determinism:
32
+ hashable: true
33
+ inputs:
34
+ - Scenes/**/*.tscn
35
+ - Scripts/**/*.cs
36
+ - Resources/**/*.tres
37
+ - project.godot
38
+ assets:
39
+ dir: Assets
40
+ types:
41
+ - id: image
42
+ extensions: [.png, .jpg, .jpeg, .webp, .svg, .tscn]
43
+ referencePattern: '"([^"]+\.(?:png|jpe?g|webp|svg))"'
44
+ - id: audio
45
+ extensions: [.wav, .mp3, .ogg]
46
+ referencePattern: '"([^"]+\.(?:wav|mp3|ogg))"'
47
+ - id: font
48
+ extensions: [.ttf, .otf, .woff, .woff2]
49
+ referencePattern: '"([^"]+\.(?:ttf|otf|woff2?))"'
50
+ release:
51
+ target: local
52
+ outputDir: build
53
+ manifestName: build-manifest.json
54
+ prerequisites:
55
+ - id: nodejs
56
+ name: Node.js 24+
57
+ check: node --version
58
+ installHint: "https://nodejs.org/en/download/"
59
+ severity: error
60
+ - id: dotnet
61
+ name: .NET SDK 8+
62
+ check: dotnet --version
63
+ installHint: "https://dotnet.microsoft.com/download"
64
+ severity: error
65
+ - id: godot
66
+ name: Godot 4.x (with .NET support)
67
+ check: godot --version
68
+ installHint: "https://godotengine.org/download"
69
+ severity: error
70
+ workspaceTypes:
71
+ - id: game
72
+ detect:
73
+ glob: "project.godot"
74
+ skills:
75
+ - godot-feature
76
+ - godot-scene-review
77
+ - godot-debug
78
+ invariants:
79
+ - id: GODOT-01
80
+ rule: Scene files (.tscn) must reside in Scenes/ and scripts (.cs) in Scripts/
81
+ severity: error
82
+ check:
83
+ kind: filename-pattern
84
+ glob: "**/*.tscn"
85
+ pattern: "^Scenes/"
86
+ - id: GODOT-02
87
+ rule: The .godot/ directory must not be committed to git
88
+ severity: error
89
+ check:
90
+ kind: gitignore-entry
91
+ pattern: ".godot/"
92
+ - id: GODOT-03
93
+ rule: No hardcoded API keys or secrets in C# source files
94
+ severity: error
95
+ check:
96
+ kind: secret-scan
97
+ glob: "**/*.cs"
98
+ - id: GODOT-04
99
+ rule: project.godot autoloads and input map changes require explicit confirmation
100
+ severity: warning
101
+ check:
102
+ kind: file-contains
103
+ glob: "project.godot"
104
+ pattern: ""
105
+ workspace:
106
+ dirs:
107
+ - games
108
+ - packages
109
+ - services
110
+ - scripts
111
+ files:
112
+ - path: pnpm-workspace.yaml
113
+ content: |
114
+ packages:
115
+ - "games/*"
116
+ - "packages/*"
117
+ - "services/*"
118
+ - path: turbo.json
119
+ content: |
120
+ {
121
+ "$schema": "https://turbo.build/schema.json",
122
+ "tasks": {
123
+ "build": {
124
+ "dependsOn": ["^build"],
125
+ "outputs": ["dist/**", "bin/**", ".godot/**"]
126
+ },
127
+ "build:check": {
128
+ "dependsOn": ["^build:check"]
129
+ },
130
+ "test": {
131
+ "dependsOn": ["^build:check"]
132
+ }
133
+ }
134
+ }
135
+ - path: tsconfig.base.json
136
+ content: |
137
+ {
138
+ "compilerOptions": {
139
+ "target": "ESNext",
140
+ "module": "ESNext",
141
+ "moduleResolution": "bundler",
142
+ "strict": true,
143
+ "esModuleInterop": true,
144
+ "skipLibCheck": true,
145
+ "forceConsistentCasingInFileNames": true
146
+ }
147
+ }
148
+ - path: .gitignore
149
+ content: |
150
+ node_modules
151
+ dist
152
+ .turbo
153
+ .cache
154
+ operator-profile.md
155
+
156
+ # Godot
157
+ .godot/
158
+ bin/
159
+ obj/
160
+ *.user
161
+ *.csproj.user
162
+ - path: .github/workflows/ci.yml
163
+ content: |
164
+ name: CI
165
+
166
+ on:
167
+ pull_request:
168
+ push:
169
+ branches: [main]
170
+ workflow_dispatch:
171
+
172
+ concurrency:
173
+ group: ${{ github.workflow }}-${{ github.ref }}
174
+ cancel-in-progress: ${{ github.event_name == 'pull_request' }}
175
+
176
+ permissions:
177
+ contents: read
178
+
179
+ jobs:
180
+ ci:
181
+ runs-on: ubuntu-latest
182
+ timeout-minutes: 20
183
+ name: Build, test, headless check
184
+ env:
185
+ TZ: UTC
186
+
187
+ steps:
188
+ - name: Checkout
189
+ uses: actions/checkout@v5
190
+
191
+ - name: Enable Corepack
192
+ run: corepack enable
193
+
194
+ - name: Setup Node.js
195
+ uses: actions/setup-node@v5
196
+ with:
197
+ node-version: "24"
198
+ cache: "pnpm"
199
+
200
+ - name: Setup .NET SDK
201
+ uses: actions/setup-dotnet@v4
202
+ with:
203
+ dotnet-version: "8.0.x"
204
+
205
+ - name: Setup Godot
206
+ uses: lihop/setup-godot@v1
207
+ with:
208
+ version: "4.3"
209
+ mono: true
210
+
211
+ - name: Install dependencies
212
+ run: pnpm install --frozen-lockfile
213
+
214
+ - name: Format check
215
+ run: pnpm format:check
216
+
217
+ - name: Type check
218
+ run: pnpm build:check
219
+
220
+ - name: Build
221
+ run: pnpm build
222
+
223
+ - name: Test
224
+ run: pnpm test
225
+
226
+ # Windows CI (optional — uncomment if Windows checks are needed):
227
+ #
228
+ # windows-ci:
229
+ # runs-on: windows-latest
230
+ # name: Build, test, headless check (Windows)
231
+ # env:
232
+ # GIT_CONFIG_COUNT: 1
233
+ # GIT_CONFIG_KEY_0: core.longpaths
234
+ # GIT_CONFIG_VALUE_0: "true"
235
+ # steps:
236
+ # - name: Checkout
237
+ # uses: actions/checkout@v5
238
+ # - name: Enable Corepack
239
+ # run: corepack enable
240
+ # - name: Setup Node.js
241
+ # uses: actions/setup-node@v5
242
+ # with:
243
+ # node-version: "24"
244
+ # cache: "pnpm"
245
+ # - name: Setup .NET SDK
246
+ # uses: actions/setup-dotnet@v4
247
+ # with:
248
+ # dotnet-version: "8.0.x"
249
+ # - name: Setup Godot
250
+ # uses: lihop/setup-godot@v1
251
+ # with:
252
+ # version: "4.3"
253
+ # mono: true
254
+ # - name: Install dependencies
255
+ # run: pnpm install --frozen-lockfile
256
+ # - name: Format check
257
+ # run: pnpm format:check
258
+ # - name: Type check
259
+ # run: pnpm build:check
260
+ # - name: Build
261
+ # run: pnpm build
262
+ # - name: Test
263
+ # run: pnpm test
264
+ #
265
+ # The GIT_CONFIG_COUNT env block MUST be set before the checkout step
266
+ # so git can handle long file paths during clone on Windows.
267
+ # Do not add Windows to the matrix "just in case" — it requires
268
+ # separate path-length and platform-specific dependency verification.
269
+ - path: package.json
270
+ content: |
271
+ {
272
+ "name": "__PROJECT_NAME__",
273
+ "version": "0.1.0",
274
+ "private": true,
275
+ "type": "module",
276
+ "engines": {
277
+ "node": ">=24 <25"
278
+ },
279
+ "scripts": {
280
+ "clean": "node scripts/clean.mjs",
281
+ "format": "prettier --write .",
282
+ "format:check": "prettier --check .",
283
+ "build": "turbo run build",
284
+ "build:check": "turbo run build:check",
285
+ "test": "turbo run test",
286
+ "upgrade-packages": "pnpm -r up"
287
+ }
288
+ }
289
+ - path: scripts/clean.mjs
290
+ content: |
291
+ import { readdir, rm } from "node:fs/promises";
292
+ import { join } from "node:path";
293
+ import { fileURLToPath } from "node:url";
294
+
295
+ const TARGETS = new Set(["node_modules", ".turbo", "dist", ".godot", "bin", "obj", ".cache", ".wrangler"]);
296
+
297
+ const repoRoot = join(fileURLToPath(import.meta.url), "..", "..");
298
+
299
+ async function walk(dir, toDelete) {
300
+ const entries = await readdir(dir, { withFileTypes: true });
301
+ for (const entry of entries) {
302
+ if (!entry.isDirectory()) continue;
303
+ const name = entry.name;
304
+ const fullPath = join(dir, name);
305
+ if (TARGETS.has(name)) {
306
+ toDelete.push(fullPath);
307
+ continue;
308
+ }
309
+ await walk(fullPath, toDelete);
310
+ }
311
+ }
312
+
313
+ const toDelete = [];
314
+ await walk(repoRoot, toDelete);
315
+
316
+ if (toDelete.length === 0) {
317
+ console.log("Nothing to clean.");
318
+ process.exit(0);
319
+ }
320
+
321
+ await Promise.all(toDelete.map((p) => rm(p, { recursive: true, force: true })));
322
+
323
+ for (const p of toDelete) {
324
+ console.log("deleted", p.replace(repoRoot + "/", ""));
325
+ }
326
+
327
+ console.log(`Cleaned ${toDelete.length} directories.`);
328
+ install:
329
+ - pnpm add -D typescript turbo @warpgogol/forge prettier
330
+ firstWorkspace:
331
+ path: games/my-game
332
+ files:
333
+ - path: project.godot
334
+ content: |
335
+ ; Engine configuration file.
336
+ ; It's best edited using the editor UI and not directly,
337
+ ; since the parameters that go here are not all obvious.
338
+ config_version=5
339
+
340
+ [application]
341
+ config/name="my-game"
342
+ run/main_scene="res://Scenes/Main.tscn"
343
+ config/features=PackedStringArray("4.3", "C#", "Forward Plus")
344
+ config/icon="res://icon.svg"
345
+
346
+ [dotnet]
347
+ project/assembly_name="my-game"
348
+ - path: Game.csproj
349
+ content: |
350
+ <Project Sdk="Godot.NET.Sdk">
351
+ <PropertyGroup>
352
+ <TargetFramework>net8.0</TargetFramework>
353
+ <TargetFramework Condition="'$(OS)' == 'Windows_NT'">net8.0-windows</TargetFramework>
354
+ <EnableDynamicLoading>true</EnableDynamicLoading>
355
+ <LangVersion>latest</LangVersion>
356
+ <Nullable>enable</Nullable>
357
+ </PropertyGroup>
358
+ </Project>
359
+ - path: Scenes/Main.tscn
360
+ content: |
361
+ [gd_scene load_steps=1 format=3 uid="uid://main_scene"]
362
+
363
+ [ext_resource type="Script" path="res://Scripts/Main.cs" id="1"]
364
+ [ext_resource type="Script" path="res://Scripts/Main.cs" id="1_script"]
365
+
366
+ [node name="Main" type="Node2D"]
367
+ script = ExtResource("1_script")
368
+ - path: Scripts/Main.cs
369
+ content: |
370
+ using Godot;
371
+
372
+ public partial class Main : Node2D
373
+ {
374
+ public override void _Ready()
375
+ {
376
+ GD.Print("my-game ready");
377
+ }
378
+ }
379
+ - path: .gitignore
380
+ content: |
381
+ .godot/
382
+ bin/
383
+ obj/
384
+ *.user
385
+ *.csproj.user
386
+ install:
387
+ - dotnet new sln --name my-game
388
+ - dotnet sln add Game.csproj
@@ -150,7 +150,7 @@ workspace:
150
150
  "private": true,
151
151
  "type": "module",
152
152
  "engines": {
153
- "node": ">=22"
153
+ "node": ">=24 <25"
154
154
  },
155
155
  "scripts": {
156
156
  "clean": "node scripts/clean.mjs",
@@ -25,7 +25,7 @@ Guide the operator through creating a new Editframe video project within a Forge
25
25
 
26
26
  ### 1. Prerequisites check
27
27
 
28
- - **Node.js 18+**: Run `node --version`. If missing or below 18, direct the operator to `https://nodejs.org/en/download/` or install via the system package manager.
28
+ - **Node.js 24+**: Run `node --version`. If missing or below 24, direct the operator to `https://nodejs.org/en/download/` or install via the system package manager.
29
29
  - **FFmpeg**: Run `ffmpeg -version`. If missing, direct the operator to `https://ffmpeg.org/download.html` or install via the system package manager (`apt install ffmpeg`, `brew install ffmpeg`).
30
30
  - If either prerequisite is missing and cannot be installed automatically, stop and ask the operator to install it manually.
31
31
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: fo-idea
3
- description: Analyze a user's idea, decompose if too large, and route to fo-idea-create-rfc, fo-idea-create-adr, or direct implementation. Use when the user describes a change and is unsure if it needs an RFC, ADR, or no document.
3
+ description: Classify an idea, split it when needed, and route it to an RFC, ADR, or direct implementation. Use when the required decision artifact is unclear.
4
4
  invocation: user
5
5
  category: fo
6
6
  concerns: document-only
@@ -131,7 +131,7 @@ These patterns **look like ADRs but are RFCs**:
131
131
  These patterns **look like they need a document but are direct implementation**:
132
132
 
133
133
  - **"Fixing content data"** — correcting a hash, updating a status field, or fixing a factual error in existing content is a data correction within existing structures, not an architectural change. Direct implementation.
134
- - **"Restoring broken behavior"** — a bug fix that restores the intended behavior within existing contracts is direct implementation, not an RFC. (See ADR-0008 for the precedent: "this is a bug fix restoring the intended behavior, not an architectural change.")
134
+ - **"Restoring broken behavior"** — a bug fix that restores the intended behavior within existing contracts is direct implementation, not an architectural change.
135
135
  - **"Cosmetic cleanup"** — formatting, indentation, import ordering, or local variable renaming with no semantic impact is direct implementation.
136
136
 
137
137
  If the classification is ambiguous (e.g. the operator's description is too vague), ask a clarifying question using `ask_user_question` with the recommended classification first.
@@ -434,7 +434,7 @@ Before stamping `implemented`, verify that the ADR is mentioned in the codebase
434
434
 
435
435
  #### 4.10. Stamp implemented
436
436
 
437
- After all checks pass and documentation is updated, transition the ADR to `implemented` using `adr.implement.stamp` (RFC-0727). Direct edits to ADR `status`, `implementedAt`, and `updatedAt` are prohibited — use the stamp command instead.
437
+ After all checks pass and documentation is updated, transition the ADR to `implemented` using `adr.implement.stamp` as required by the ADR lifecycle contract. Direct edits to ADR `status`, `implementedAt`, and `updatedAt` are prohibited — use the stamp command instead.
438
438
 
439
439
  1. Identify the implementation commit SHA — use the first `implement:` commit for this ADR.
440
440
  2. Run the stamp command:
@@ -30,12 +30,13 @@ Commit file changes after every standalone operator request that produces file c
30
30
 
31
31
  After every standalone operator request that produces file changes, perform the following:
32
32
 
33
- 1. **Detect changed files.** Run `git status --short` in the monorepo root. If the working tree is clean (no modifications), skip — no commit.
34
- 2. **Verify diff before staging.** Run `git diff` (not just `git diff --cached`) on every file the agent touched in this request. Confirm the changes are the agent's own work and not foreign changes from another session. If foreign changes are found, exclude them from staging.
33
+ 1. **Detect changed files in ALL trees.** Run `bash scripts/check-clean-trees.sh` from the repo root. This checks the werkstatt monorepo, all active mission workpieces, and all Sternsystem cache clones. If all trees are clean, skip — no commit. If any tree is dirty, proceed to commit each dirty tree.
34
+ 2. **Verify diff before staging.** Run `git diff` (not just `git diff --cached`) on every file the agent touched in this request, in each dirty tree. Confirm the changes are the agent's own work and not foreign changes from another session. If foreign changes are found, exclude them from staging.
35
35
  3. **Stage only agent-changed files.** Stage only the files the agent modified in this request. Never use `git add -A` or `git add .` — another agent or session may have unrelated changes in the working tree. Stage files by explicit path: `git add <path1> <path2> ...`.
36
36
  4. **Form commit message.** Write a conventional commit message (`fix:`, `feat:`, `refactor:`, `docs:`, `chore:`) based on the work performed in this request. The agent determines the type and description from the context of the request.
37
- 5. **Commit in monorepo.** `git commit -m "<message>"` with the staged files.
38
- 6. **Commit in mission workpiece (if applicable).** If the agent changed files in the active mission workpiece, commit there via the kernel's mission git commit command with the same message.
37
+ 5. **Commit in monorepo.** Use `pnpm exec werkstatt run ecosystem.commit --message="<message>"` (NOT raw `git commit`) as required by the canonical commit-discipline contract. Stage files with `git add <paths>` first, then run ecosystem.commit.
38
+ 6. **Commit in mission workpiece (if applicable).** If the agent changed files in the active mission workpiece, commit there via `pnpm exec werkstatt run mission.git.commit --mission=<missionId> --message="<message>"` as required by the canonical commit-discipline contract.
39
+ 7. **Verify clean trees.** After all commits, run `bash scripts/check-clean-trees.sh` again. If any tree is still dirty, report to the operator.
39
40
 
40
41
  ## What this skill does NOT do
41
42
 
@@ -50,6 +51,7 @@ The operator can skip the auto-commit for a specific request by saying "не к
50
51
 
51
52
  ## Failure modes
52
53
 
53
- - **No changes**: skill detects clean working tree and skips — no error, no commit.
54
+ - **No changes**: skill detects clean working tree (via check-clean-trees.sh) and skips — no error, no commit.
54
55
  - **Workpiece not found**: if no active mission workpiece exists, skip workpiece commit. Monorepo commit still proceeds.
55
56
  - **Workpiece commit fails**: if the workpiece commit fails (e.g. dirty tree from another agent), the skill does not block the monorepo commit. The agent reports the failure to the operator.
57
+ - **Post-commit verification**: after committing, re-run `check-clean-trees.sh`. If trees are still dirty, the agent MUST report the remaining dirty files to the operator before sending its response.