@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.
- package/AGENTS.md +16 -0
- package/README.md +4 -4
- package/README.uk.md +4 -4
- package/dist/os/core/core.module.d.ts.map +1 -1
- package/dist/os/core/core.module.js +34 -0
- package/dist/os/core/core.module.js.map +1 -1
- package/dist/os/core/handlers/workspace-deps.js +3 -3
- package/dist/os/core/handlers/workspace-deps.js.map +1 -1
- package/dist/os/program/discovery.d.ts +61 -0
- package/dist/os/program/discovery.d.ts.map +1 -0
- package/dist/os/program/discovery.js +236 -0
- package/dist/os/program/discovery.js.map +1 -0
- package/dist/os/program/handlers/complete.d.ts +12 -0
- package/dist/os/program/handlers/complete.d.ts.map +1 -0
- package/dist/os/program/handlers/complete.js +344 -0
- package/dist/os/program/handlers/complete.js.map +1 -0
- package/dist/os/program/handlers/lease.d.ts +13 -0
- package/dist/os/program/handlers/lease.d.ts.map +1 -0
- package/dist/os/program/handlers/lease.js +322 -0
- package/dist/os/program/handlers/lease.js.map +1 -0
- package/dist/os/program/handlers/seal.d.ts +12 -0
- package/dist/os/program/handlers/seal.d.ts.map +1 -0
- package/dist/os/program/handlers/seal.js +265 -0
- package/dist/os/program/handlers/seal.js.map +1 -0
- package/dist/os/program/handlers/validate.d.ts +14 -0
- package/dist/os/program/handlers/validate.d.ts.map +1 -0
- package/dist/os/program/handlers/validate.js +164 -0
- package/dist/os/program/handlers/validate.js.map +1 -0
- package/dist/os/program/lease.d.ts +39 -0
- package/dist/os/program/lease.d.ts.map +1 -0
- package/dist/os/program/lease.js +129 -0
- package/dist/os/program/lease.js.map +1 -0
- package/dist/os/program/program.module.d.ts +3 -0
- package/dist/os/program/program.module.d.ts.map +1 -0
- package/dist/os/program/program.module.js +201 -0
- package/dist/os/program/program.module.js.map +1 -0
- package/dist/os/program/schemas.d.ts +225 -0
- package/dist/os/program/schemas.d.ts.map +1 -0
- package/dist/os/program/schemas.js +174 -0
- package/dist/os/program/schemas.js.map +1 -0
- package/dist/os/program/state.d.ts +38 -0
- package/dist/os/program/state.d.ts.map +1 -0
- package/dist/os/program/state.js +189 -0
- package/dist/os/program/state.js.map +1 -0
- package/dist/os/rfc/handlers/archive.d.ts +1 -0
- package/dist/os/rfc/handlers/archive.d.ts.map +1 -1
- package/dist/os/rfc/handlers/archive.js +54 -0
- package/dist/os/rfc/handlers/archive.js.map +1 -1
- package/dist/os/rfc/handlers/validate-rules.js +2 -2
- package/dist/os/rfc/handlers/validate-rules.js.map +1 -1
- package/dist/os/werkstatt/handlers/schema.js +2 -2
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/onboarding/invariant-engine.d.ts.map +1 -1
- package/dist/src/onboarding/invariant-engine.js +61 -1
- package/dist/src/onboarding/invariant-engine.js.map +1 -1
- package/dist/src/profiles/profile-schema.d.ts +7 -1
- package/dist/src/profiles/profile-schema.d.ts.map +1 -1
- package/dist/src/profiles/profile-schema.js +3 -0
- package/dist/src/profiles/profile-schema.js.map +1 -1
- package/dist/src/profiles/stack-profile.d.ts +2 -0
- package/dist/src/profiles/stack-profile.d.ts.map +1 -1
- package/dist/src/utils/fs.js +2 -2
- package/dist/src/utils/fs.js.map +1 -1
- package/dist/src/utils/string-utils.js +1 -1
- package/dist/src/validators/port-validate.js +1 -1
- package/dist/src/validators/port-validate.js.map +1 -1
- package/package.json +19 -15
- package/profiles/astro-typescript-turborepo.yaml +1 -1
- package/profiles/editframe.yaml +2 -2
- package/profiles/forge-shell.yaml +1 -1
- package/profiles/godot-csharp.yaml +388 -0
- package/profiles/phaser-turborepo.yaml +1 -1
- package/skills/fo/ef-onboard/SKILL.md +1 -1
- package/skills/fo/fo-idea/SKILL.md +2 -2
- package/skills/fo/fo-idea-implement/SKILL.md +1 -1
- package/skills/fo/fo-step-commit/SKILL.md +7 -5
- package/skills/shared/grilling/learned-principles.archive.md +212 -0
- package/skills/shared/grilling/learned-principles.md +0 -13
- package/skills/shared/grilling/qa-log.md +624 -0
- package/skills/shared/knowledge/learned-principles.md +99 -0
package/dist/src/utils/fs.js
CHANGED
|
@@ -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-
|
|
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-
|
|
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 {
|
package/dist/src/utils/fs.js.map
CHANGED
|
@@ -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,
|
|
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-
|
|
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-
|
|
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":"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,
|
|
1
|
+
{"version":3,"file":"port-validate.js","sourceRoot":"","sources":["../../../src/validators/port-validate.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,19 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@warpgogol/forge",
|
|
3
|
-
"version": "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": "^
|
|
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": ">=
|
|
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
|
}
|
package/profiles/editframe.yaml
CHANGED
|
@@ -51,7 +51,7 @@ release:
|
|
|
51
51
|
manifestName: release-manifest.json
|
|
52
52
|
prerequisites:
|
|
53
53
|
- id: nodejs
|
|
54
|
-
name: Node.js
|
|
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": ">=
|
|
299
|
+
"node": ">=24 <25"
|
|
300
300
|
},
|
|
301
301
|
"scripts": {
|
|
302
302
|
"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
|
|
@@ -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
|
|
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:
|
|
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
|
|
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`
|
|
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 `
|
|
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.** `
|
|
38
|
-
6. **Commit in mission workpiece (if applicable).** If the agent changed files in the active mission workpiece, commit there via
|
|
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.
|