@warpgogol/forge 1.2.2 → 2.2.0
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 +2 -1
- package/README.md +55 -89
- package/README.uk.md +55 -89
- package/package.json +1 -1
- package/profiles/forge-shell.yaml +122 -1
- package/profiles/godot-csharp.yaml +467 -10
- package/profiles/phaser-turborepo.yaml +139 -3
- package/skills/_shared/fo-pipeline-conventions.md +55 -0
- package/skills/fo/fo-doc-audit/SKILL.md +2 -2
- package/skills/fo/fo-idea-i-just-want-to-see-the-plan/SKILL.md +2 -0
- package/skills/fo/fo-idea-i-just-want-to-see-the-result/SKILL.md +7 -3
- package/skills/fo/fo-idea-implement/SKILL.md +50 -46
- package/skills/fo/fo-session-retro/SKILL.md +2 -2
- package/src/onboarding/templates/behavioral-layer-core.md +4 -5
- package/src/onboarding/templates/root-agents-business.md +1 -1
- package/src/onboarding/templates/root-agents-creative.md +1 -1
- package/profiles/astro-typescript-turborepo.yaml +0 -231
package/package.json
CHANGED
|
@@ -8,6 +8,9 @@ workspace:
|
|
|
8
8
|
dirs:
|
|
9
9
|
- docs
|
|
10
10
|
- scripts
|
|
11
|
+
- tools
|
|
12
|
+
- missions
|
|
13
|
+
- systems-cache
|
|
11
14
|
files:
|
|
12
15
|
- path: .gitignore
|
|
13
16
|
content: |
|
|
@@ -149,6 +152,124 @@ workspace:
|
|
|
149
152
|
console.log("deleted", p.replace(repoRoot + "/", ""));
|
|
150
153
|
}
|
|
151
154
|
|
|
152
|
-
console.log(`Cleaned ${toDelete.length} directories.`)
|
|
155
|
+
console.log(`Cleaned ${toDelete.length} directories.`)
|
|
156
|
+
- path: tools/kernel.config.ts
|
|
157
|
+
content: |
|
|
158
|
+
import { defineKernelConfig } from "@warpgogol/werkstatt/kernel/types";
|
|
159
|
+
|
|
160
|
+
export default defineKernelConfig({
|
|
161
|
+
name: "__PROJECT_NAME__",
|
|
162
|
+
description: "__PROJECT_NAME__ workshop",
|
|
163
|
+
moduleLoaders: {
|
|
164
|
+
"forge-core": async () => (await import("@warpgogol/forge/os/core")).forgeCoreModule,
|
|
165
|
+
"forge-rfc": async () => (await import("@warpgogol/forge/os/rfc-module")).forgeRfcModule,
|
|
166
|
+
"forge-adr": async () => (await import("@warpgogol/forge/os/adr-module")).forgeAdrModule,
|
|
167
|
+
"forge-plan": async () => (await import("@warpgogol/forge/os/plan-module")).forgePlanModule,
|
|
168
|
+
"forge-audit": async () => (await import("@warpgogol/forge/os/audit-module")).forgeAuditModule,
|
|
169
|
+
"forge-compass": async () => (await import("@warpgogol/forge/os/compass")).forgeCompassModule,
|
|
170
|
+
"forge-naming": async () => (await import("@warpgogol/forge/os/naming-module")).forgeNamingModule,
|
|
171
|
+
"forge-workflow": async () => (await import("@warpgogol/forge/os/workflow-module")).forgeWorkflowModule,
|
|
172
|
+
"forge-session": async () => (await import("@warpgogol/forge/os/session-module")).forgeSessionModule,
|
|
173
|
+
"forge-mission": async () => (await import("@warpgogol/forge/os/mission-module")).forgeMissionModule,
|
|
174
|
+
"forge-spec": async () => (await import("@warpgogol/forge/os/spec-module")).forgeSpecModule,
|
|
175
|
+
"forge-exploration": async () => (await import("@warpgogol/forge/os/exploration")).forgeExplorationModule,
|
|
176
|
+
"forge-program": async () => (await import("@warpgogol/forge/os/program")).forgeProgramModule,
|
|
177
|
+
"forge-werkstatt": async () => (await import("@warpgogol/forge/os/werkstatt")).forgeWerkstattModule,
|
|
178
|
+
},
|
|
179
|
+
});
|
|
180
|
+
- path: .npmrc
|
|
181
|
+
content: |
|
|
182
|
+
# @warpgogol scoped registry — replace YOUR_NPM_TOKEN with a valid npm read token
|
|
183
|
+
@warpgogol:registry=https://registry.npmjs.org/
|
|
184
|
+
//registry.npmjs.org/:_authToken=YOUR_NPM_TOKEN
|
|
185
|
+
# Auto-approve build scripts so operators aren't prompted during install
|
|
186
|
+
dangerously-allow-all-builds=true
|
|
187
|
+
- path: eslint.config.js
|
|
188
|
+
content: |
|
|
189
|
+
export default [
|
|
190
|
+
{
|
|
191
|
+
rules: {},
|
|
192
|
+
},
|
|
193
|
+
];
|
|
194
|
+
- path: .prettierrc.mjs
|
|
195
|
+
content: |
|
|
196
|
+
export default {
|
|
197
|
+
semi: true,
|
|
198
|
+
singleQuote: false,
|
|
199
|
+
trailingComma: "all",
|
|
200
|
+
printWidth: 100,
|
|
201
|
+
tabWidth: 2,
|
|
202
|
+
};
|
|
203
|
+
- path: .gitattributes
|
|
204
|
+
content: |
|
|
205
|
+
# No LFS patterns for this stack
|
|
206
|
+
- path: hooks/pre-commit
|
|
207
|
+
content: |
|
|
208
|
+
#!/bin/sh
|
|
209
|
+
# Platform-scope pre-commit guard
|
|
210
|
+
# Runs forge validation before commits
|
|
211
|
+
echo "Pre-commit: running platform checks..."
|
|
212
|
+
pnpm exec forge run forge.validate || exit 1
|
|
213
|
+
- path: systems-cache/.gitkeep
|
|
214
|
+
content: |
|
|
215
|
+
# Sternsystem cache directory (RFC-0790)
|
|
216
|
+
# Per-system config and state files live in systems-cache/<id>/
|
|
217
|
+
- path: missions/.gitkeep
|
|
218
|
+
content: ""
|
|
219
|
+
- path: .forge/pinned.yaml
|
|
220
|
+
content: |
|
|
221
|
+
# Pinned foundation files (DNA-62, RFC-0733)
|
|
222
|
+
# Protect mode: warns on delete/move. Freeze mode: blocks modify too.
|
|
223
|
+
entries:
|
|
224
|
+
- path: tools/kernel.config.ts
|
|
225
|
+
mode: protect
|
|
226
|
+
- path: forge.yaml
|
|
227
|
+
mode: protect
|
|
228
|
+
- path: pnpm-workspace.yaml
|
|
229
|
+
mode: protect
|
|
230
|
+
- path: turbo.json
|
|
231
|
+
mode: protect
|
|
232
|
+
- path: tsconfig.base.json
|
|
233
|
+
mode: protect
|
|
234
|
+
- path: systems-cache/.gitkeep
|
|
235
|
+
mode: protect
|
|
236
|
+
- path: README.md
|
|
237
|
+
content: |
|
|
238
|
+
# __PROJECT_NAME__
|
|
239
|
+
|
|
240
|
+
A Warpgogol workshop powered by the Forge engine.
|
|
241
|
+
|
|
242
|
+
## Prerequisites
|
|
243
|
+
|
|
244
|
+
- Node.js 24+
|
|
245
|
+
- pnpm 10+
|
|
246
|
+
|
|
247
|
+
## Setup
|
|
248
|
+
|
|
249
|
+
### 1. Configure npm token
|
|
250
|
+
|
|
251
|
+
This workshop depends on private @warpgogol packages. Edit `.npmrc` and replace `YOUR_NPM_TOKEN` with a valid npm read token:
|
|
252
|
+
|
|
253
|
+
```sh
|
|
254
|
+
sed -i 's/YOUR_NPM_TOKEN/your_actual_token/' .npmrc
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
### 2. Install dependencies
|
|
258
|
+
|
|
259
|
+
```sh
|
|
260
|
+
pnpm install
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
### 3. Verify the workshop
|
|
264
|
+
|
|
265
|
+
```sh
|
|
266
|
+
pnpm exec forge run forge.doctor
|
|
267
|
+
pnpm exec forge run forge.validate
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
## Stack
|
|
271
|
+
|
|
272
|
+
- Engine: @warpgogol/forge
|
|
273
|
+
- Stack profile: forge-shell
|
|
153
274
|
install:
|
|
154
275
|
- pnpm add -D @warpgogol/forge prettier vitest
|
|
@@ -24,7 +24,7 @@ artifacts:
|
|
|
24
24
|
- .cs
|
|
25
25
|
- .tres
|
|
26
26
|
produce:
|
|
27
|
-
command: dotnet build
|
|
27
|
+
command: dotnet build
|
|
28
28
|
output: bin/Debug
|
|
29
29
|
validate:
|
|
30
30
|
command: godot --path . --headless --quit
|
|
@@ -104,15 +104,18 @@ invariants:
|
|
|
104
104
|
pattern: ""
|
|
105
105
|
workspace:
|
|
106
106
|
dirs:
|
|
107
|
-
-
|
|
107
|
+
- apps
|
|
108
108
|
- packages
|
|
109
109
|
- services
|
|
110
110
|
- scripts
|
|
111
|
+
- tools
|
|
112
|
+
- missions
|
|
113
|
+
- systems-cache
|
|
111
114
|
files:
|
|
112
115
|
- path: pnpm-workspace.yaml
|
|
113
116
|
content: |
|
|
114
117
|
packages:
|
|
115
|
-
- "
|
|
118
|
+
- "apps/*"
|
|
116
119
|
- "packages/*"
|
|
117
120
|
- "services/*"
|
|
118
121
|
- path: turbo.json
|
|
@@ -155,10 +158,19 @@ workspace:
|
|
|
155
158
|
|
|
156
159
|
# Godot
|
|
157
160
|
.godot/
|
|
161
|
+
.godot-bin/
|
|
158
162
|
bin/
|
|
159
163
|
obj/
|
|
160
164
|
*.user
|
|
161
165
|
*.csproj.user
|
|
166
|
+
- path: .vscode/extensions.json
|
|
167
|
+
content: |
|
|
168
|
+
{
|
|
169
|
+
"recommendations": [
|
|
170
|
+
"ms-dotnettools.csharp",
|
|
171
|
+
"geequla.godot-tools"
|
|
172
|
+
]
|
|
173
|
+
}
|
|
162
174
|
- path: .github/workflows/ci.yml
|
|
163
175
|
content: |
|
|
164
176
|
name: CI
|
|
@@ -284,8 +296,167 @@ workspace:
|
|
|
284
296
|
"build:check": "turbo run build:check",
|
|
285
297
|
"test": "turbo run test",
|
|
286
298
|
"upgrade-packages": "pnpm -r up"
|
|
299
|
+
},
|
|
300
|
+
"devDependencies": {
|
|
301
|
+
"typescript": "^5.7.0",
|
|
302
|
+
"turbo": "^2.3.0",
|
|
303
|
+
"prettier": "^3.4.0",
|
|
304
|
+
"@warpgogol/forge": "^2.2.0",
|
|
305
|
+
"@warpgogol/werkstatt": "^1.2.0",
|
|
306
|
+
"@warpgogol/werkstatt-godot": "^0.6.0"
|
|
287
307
|
}
|
|
288
308
|
}
|
|
309
|
+
- path: godot.version
|
|
310
|
+
content: |
|
|
311
|
+
# Exact Godot version for install-godot.sh (CI uses short form "4.3")
|
|
312
|
+
4.3.0
|
|
313
|
+
- path: scripts/install-godot.sh
|
|
314
|
+
content: |
|
|
315
|
+
#!/usr/bin/env bash
|
|
316
|
+
set -euo pipefail
|
|
317
|
+
|
|
318
|
+
# Download and install the Godot mono build specified in godot.version
|
|
319
|
+
# Usage: ./scripts/install-godot.sh [--force]
|
|
320
|
+
|
|
321
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
322
|
+
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
323
|
+
VERSION="$(grep -v '^#' "$PROJECT_ROOT/godot.version" | tr -d '[:space:]')"
|
|
324
|
+
GODOT_DIR="$PROJECT_ROOT/.godot-bin"
|
|
325
|
+
GODOT_BIN="$GODOT_DIR/godot"
|
|
326
|
+
|
|
327
|
+
if [[ -x "$GODOT_BIN" ]] && [[ "$1" != "--force" ]]; then
|
|
328
|
+
echo "Godot $VERSION already installed at $GODOT_BIN"
|
|
329
|
+
echo "Use --force to reinstall."
|
|
330
|
+
exit 0
|
|
331
|
+
fi
|
|
332
|
+
|
|
333
|
+
OS="$(uname -s)"
|
|
334
|
+
ARCH="$(uname -m)"
|
|
335
|
+
|
|
336
|
+
case "$OS" in
|
|
337
|
+
Linux*) PLATFORM="linux" ;;
|
|
338
|
+
Darwin*) PLATFORM="osx" ;;
|
|
339
|
+
MINGW*|MSYS*|CYGWIN*) PLATFORM="win" ;;
|
|
340
|
+
*) echo "Unsupported OS: $OS"; exit 1 ;;
|
|
341
|
+
esac
|
|
342
|
+
|
|
343
|
+
case "$ARCH" in
|
|
344
|
+
x86_64|amd64) ARCH_SUFFIX="x86_64" ;;
|
|
345
|
+
arm64|aarch64) ARCH_SUFFIX="arm64" ;;
|
|
346
|
+
*) echo "Unsupported arch: $ARCH"; exit 1 ;;
|
|
347
|
+
esac
|
|
348
|
+
|
|
349
|
+
if [[ "$PLATFORM" == "osx" && "$ARCH_SUFFIX" == "x86_64" ]]; then
|
|
350
|
+
ARCH_SUFFIX="universal"
|
|
351
|
+
fi
|
|
352
|
+
|
|
353
|
+
if [[ "$PLATFORM" == "win" ]]; then
|
|
354
|
+
ZIP_NAME="Godot_v${VERSION}_mono_win64.zip"
|
|
355
|
+
elif [[ "$PLATFORM" == "osx" ]]; then
|
|
356
|
+
ZIP_NAME="Godot_v${VERSION}_mono_${PLATFORM}_${ARCH_SUFFIX}.zip"
|
|
357
|
+
else
|
|
358
|
+
ZIP_NAME="Godot_v${VERSION}_mono_${PLATFORM}_${ARCH_SUFFIX}.zip"
|
|
359
|
+
fi
|
|
360
|
+
|
|
361
|
+
URL="https://github.com/godotengine/godot/releases/download/v${VERSION}-stable/${ZIP_NAME}"
|
|
362
|
+
|
|
363
|
+
echo "Downloading Godot $VERSION (mono) from:"
|
|
364
|
+
echo " $URL"
|
|
365
|
+
|
|
366
|
+
mkdir -p "$GODOT_DIR"
|
|
367
|
+
TMP_ZIP="$GODOT_DIR/$ZIP_NAME"
|
|
368
|
+
|
|
369
|
+
if command -v curl &>/dev/null; then
|
|
370
|
+
curl -fL --progress-bar -o "$TMP_ZIP" "$URL"
|
|
371
|
+
elif command -v wget &>/dev/null; then
|
|
372
|
+
wget -q --show-progress -O "$TMP_ZIP" "$URL"
|
|
373
|
+
else
|
|
374
|
+
echo "curl or wget required — please install one"; exit 1
|
|
375
|
+
fi
|
|
376
|
+
|
|
377
|
+
echo "Extracting..."
|
|
378
|
+
if command -v unzip &>/dev/null; then
|
|
379
|
+
unzip -o "$TMP_ZIP" -d "$GODOT_DIR"
|
|
380
|
+
else
|
|
381
|
+
echo "unzip not found — please install unzip"; exit 1
|
|
382
|
+
fi
|
|
383
|
+
rm -f "$TMP_ZIP"
|
|
384
|
+
|
|
385
|
+
# Find the godot binary in the extracted files
|
|
386
|
+
if [[ "$PLATFORM" == "osx" ]]; then
|
|
387
|
+
# macOS: .app bundle
|
|
388
|
+
APP_DIR="$GODOT_DIR/Godot.app"
|
|
389
|
+
if [[ -d "$APP_DIR" ]]; then
|
|
390
|
+
ln -sf "$APP_DIR/Contents/MacOS/Godot" "$GODOT_BIN"
|
|
391
|
+
else
|
|
392
|
+
# Some versions ship a unix executable
|
|
393
|
+
find "$GODOT_DIR" -type f -name "Godot*" -executable | head -1 | xargs -I{} ln -sf {} "$GODOT_BIN"
|
|
394
|
+
fi
|
|
395
|
+
elif [[ "$PLATFORM" == "win" ]]; then
|
|
396
|
+
find "$GODOT_DIR" -type f -name "Godot*.exe" | head -1 | xargs -I{} ln -sf {} "$GODOT_BIN"
|
|
397
|
+
else
|
|
398
|
+
find "$GODOT_DIR" -type f -name "Godot*" -executable | head -1 | xargs -I{} ln -sf {} "$GODOT_BIN"
|
|
399
|
+
fi
|
|
400
|
+
|
|
401
|
+
chmod +x "$GODOT_BIN" 2>/dev/null || true
|
|
402
|
+
|
|
403
|
+
if [[ -x "$GODOT_BIN" || -L "$GODOT_BIN" ]]; then
|
|
404
|
+
echo ""
|
|
405
|
+
echo "Godot $VERSION installed to $GODOT_BIN"
|
|
406
|
+
echo "Add to PATH: export PATH=\"$GODOT_DIR:$PATH\""
|
|
407
|
+
else
|
|
408
|
+
echo "Installation completed but binary not found. Check $GODOT_DIR"
|
|
409
|
+
exit 1
|
|
410
|
+
fi
|
|
411
|
+
- path: scripts/run.sh
|
|
412
|
+
content: |
|
|
413
|
+
#!/usr/bin/env bash
|
|
414
|
+
set -euo pipefail
|
|
415
|
+
|
|
416
|
+
# Build the C# project and launch Godot with the correct --path
|
|
417
|
+
# Usage: ./scripts/run.sh [--editor]
|
|
418
|
+
|
|
419
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
420
|
+
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
421
|
+
|
|
422
|
+
# Find the game workspace (first directory under apps/ with a project.godot)
|
|
423
|
+
GAME_DIR=""
|
|
424
|
+
for dir in "$PROJECT_ROOT"/apps/*/; do
|
|
425
|
+
if [[ -f "${dir}project.godot" ]]; then
|
|
426
|
+
GAME_DIR="${dir%/}"
|
|
427
|
+
break
|
|
428
|
+
fi
|
|
429
|
+
done
|
|
430
|
+
|
|
431
|
+
if [[ -z "$GAME_DIR" ]]; then
|
|
432
|
+
echo "No Godot project found under apps/*/"; exit 1
|
|
433
|
+
fi
|
|
434
|
+
|
|
435
|
+
echo "Game project: $GAME_DIR"
|
|
436
|
+
|
|
437
|
+
# Kill any running Godot instances (best-effort)
|
|
438
|
+
pkill -f "godot.*--path" 2>/dev/null || true
|
|
439
|
+
|
|
440
|
+
# Build C# project
|
|
441
|
+
echo "Building C# project..."
|
|
442
|
+
(cd "$GAME_DIR" && dotnet build)
|
|
443
|
+
|
|
444
|
+
# Find godot binary: prefer .godot-bin, then PATH
|
|
445
|
+
GODOT_BIN=""
|
|
446
|
+
if [[ -x "$PROJECT_ROOT/.godot-bin/godot" ]]; then
|
|
447
|
+
GODOT_BIN="$PROJECT_ROOT/.godot-bin/godot"
|
|
448
|
+
elif command -v godot &>/dev/null; then
|
|
449
|
+
GODOT_BIN="godot"
|
|
450
|
+
else
|
|
451
|
+
echo "Godot not found. Run ./scripts/install-godot.sh first."; exit 1
|
|
452
|
+
fi
|
|
453
|
+
|
|
454
|
+
echo "Launching Godot..."
|
|
455
|
+
if [[ "$1" == "--editor" ]]; then
|
|
456
|
+
exec "$GODOT_BIN" --path "$GAME_DIR" --editor
|
|
457
|
+
else
|
|
458
|
+
exec "$GODOT_BIN" --path "$GAME_DIR"
|
|
459
|
+
fi
|
|
289
460
|
- path: scripts/clean.mjs
|
|
290
461
|
content: |
|
|
291
462
|
import { readdir, rm } from "node:fs/promises";
|
|
@@ -325,10 +496,178 @@ workspace:
|
|
|
325
496
|
}
|
|
326
497
|
|
|
327
498
|
console.log(`Cleaned ${toDelete.length} directories.`);
|
|
499
|
+
- path: tools/kernel.config.ts
|
|
500
|
+
content: |
|
|
501
|
+
import { defineKernelConfig } from "@warpgogol/werkstatt/kernel/types";
|
|
502
|
+
import { werkstattGodotPlugin } from "@warpgogol/werkstatt-godot";
|
|
503
|
+
|
|
504
|
+
export default defineKernelConfig({
|
|
505
|
+
name: "__PROJECT_NAME__",
|
|
506
|
+
description: "__PROJECT_NAME__ workshop",
|
|
507
|
+
moduleLoaders: {
|
|
508
|
+
"forge-core": async () => (await import("@warpgogol/forge/os/core")).forgeCoreModule,
|
|
509
|
+
"forge-rfc": async () => (await import("@warpgogol/forge/os/rfc-module")).forgeRfcModule,
|
|
510
|
+
"forge-adr": async () => (await import("@warpgogol/forge/os/adr-module")).forgeAdrModule,
|
|
511
|
+
"forge-plan": async () => (await import("@warpgogol/forge/os/plan-module")).forgePlanModule,
|
|
512
|
+
"forge-audit": async () => (await import("@warpgogol/forge/os/audit-module")).forgeAuditModule,
|
|
513
|
+
"forge-compass": async () => (await import("@warpgogol/forge/os/compass")).forgeCompassModule,
|
|
514
|
+
"forge-naming": async () => (await import("@warpgogol/forge/os/naming-module")).forgeNamingModule,
|
|
515
|
+
"forge-workflow": async () => (await import("@warpgogol/forge/os/workflow-module")).forgeWorkflowModule,
|
|
516
|
+
"forge-session": async () => (await import("@warpgogol/forge/os/session-module")).forgeSessionModule,
|
|
517
|
+
"forge-mission": async () => (await import("@warpgogol/forge/os/mission-module")).forgeMissionModule,
|
|
518
|
+
"forge-spec": async () => (await import("@warpgogol/forge/os/spec-module")).forgeSpecModule,
|
|
519
|
+
"forge-exploration": async () => (await import("@warpgogol/forge/os/exploration")).forgeExplorationModule,
|
|
520
|
+
"forge-program": async () => (await import("@warpgogol/forge/os/program")).forgeProgramModule,
|
|
521
|
+
"forge-werkstatt": async () => (await import("@warpgogol/forge/os/werkstatt")).forgeWerkstattModule,
|
|
522
|
+
mission: async () => (await import("@warpgogol/werkstatt/mission-module")).createMissionModule(),
|
|
523
|
+
sternsystem: async () => (await import("@warpgogol/werkstatt/sternsystem-module")).createSternsystemModule(),
|
|
524
|
+
bordbuch: async () => (await import("@warpgogol/werkstatt/bordbuch-module")).createBordbuchModule(),
|
|
525
|
+
"artifact-store": async () => (await import("@warpgogol/werkstatt/artifact-store-module")).createArtifactStoreModule(),
|
|
526
|
+
release: async () => (await import("@warpgogol/werkstatt/release-module")).createReleaseModule(),
|
|
527
|
+
leitstand: async () => (await import("@warpgogol/werkstatt/leitstand-module")).createLeitstandModule(),
|
|
528
|
+
notausgang: async () => (await import("@warpgogol/werkstatt/notausgang-module")).createNotausgangModule(),
|
|
529
|
+
evidence: async () => (await import("@warpgogol/werkstatt/evidence-module")).createEvidenceModule(),
|
|
530
|
+
"werkstatt-plugin": async () => (await import("@warpgogol/werkstatt/os/werkstatt-plugin-module")).forgeWerkstattPluginModule,
|
|
531
|
+
"werkstatt-autonomy": async () => (await import("@warpgogol/werkstatt/os/werkstatt-autonomy-module")).werkstattAutonomyModule,
|
|
532
|
+
"__PROJECT_NAME__-plugin": async () => werkstattGodotPlugin,
|
|
533
|
+
},
|
|
534
|
+
});
|
|
535
|
+
- path: .npmrc
|
|
536
|
+
content: |
|
|
537
|
+
# @warpgogol scoped registry — replace YOUR_NPM_TOKEN with a valid npm read token
|
|
538
|
+
@warpgogol:registry=https://registry.npmjs.org/
|
|
539
|
+
//registry.npmjs.org/:_authToken=YOUR_NPM_TOKEN
|
|
540
|
+
# Auto-approve build scripts so operators aren't prompted during install
|
|
541
|
+
dangerously-allow-all-builds=true
|
|
542
|
+
- path: eslint.config.js
|
|
543
|
+
content: |
|
|
544
|
+
export default [
|
|
545
|
+
{
|
|
546
|
+
rules: {},
|
|
547
|
+
},
|
|
548
|
+
];
|
|
549
|
+
- path: .prettierrc.mjs
|
|
550
|
+
content: |
|
|
551
|
+
export default {
|
|
552
|
+
semi: true,
|
|
553
|
+
singleQuote: false,
|
|
554
|
+
trailingComma: "all",
|
|
555
|
+
printWidth: 100,
|
|
556
|
+
tabWidth: 2,
|
|
557
|
+
};
|
|
558
|
+
- path: .gitattributes
|
|
559
|
+
content: |
|
|
560
|
+
# No LFS patterns for this stack
|
|
561
|
+
- path: hooks/pre-commit
|
|
562
|
+
content: |
|
|
563
|
+
#!/bin/sh
|
|
564
|
+
# Platform-scope pre-commit guard
|
|
565
|
+
# Runs werkstatt autonomy and plugin validation before commits
|
|
566
|
+
echo "Pre-commit: running platform checks..."
|
|
567
|
+
pnpm exec werkstatt run werkstatt.autonomy.validate || exit 1
|
|
568
|
+
pnpm exec werkstatt run werkstatt.plugin.validate || exit 1
|
|
569
|
+
- path: systems-cache/.gitkeep
|
|
570
|
+
content: |
|
|
571
|
+
# Sternsystem cache directory (RFC-0790)
|
|
572
|
+
# Per-system config and state files live in systems-cache/<id>/
|
|
573
|
+
- path: missions/.gitkeep
|
|
574
|
+
content: ""
|
|
575
|
+
- path: .forge/pinned.yaml
|
|
576
|
+
content: |
|
|
577
|
+
# Pinned foundation files (DNA-62, RFC-0733)
|
|
578
|
+
# Protect mode: warns on delete/move. Freeze mode: blocks modify too.
|
|
579
|
+
entries:
|
|
580
|
+
- path: tools/kernel.config.ts
|
|
581
|
+
mode: protect
|
|
582
|
+
- path: forge.yaml
|
|
583
|
+
mode: protect
|
|
584
|
+
- path: pnpm-workspace.yaml
|
|
585
|
+
mode: protect
|
|
586
|
+
- path: turbo.json
|
|
587
|
+
mode: protect
|
|
588
|
+
- path: tsconfig.base.json
|
|
589
|
+
mode: protect
|
|
590
|
+
- path: systems-cache/.gitkeep
|
|
591
|
+
mode: protect
|
|
592
|
+
- path: godot.version
|
|
593
|
+
mode: protect
|
|
594
|
+
- path: README.md
|
|
595
|
+
content: |
|
|
596
|
+
# __PROJECT_NAME__
|
|
597
|
+
|
|
598
|
+
A Warpgogol workshop powered by the Werkstatt engine and the @warpgogol/werkstatt-godot plugin.
|
|
599
|
+
|
|
600
|
+
## Prerequisites
|
|
601
|
+
|
|
602
|
+
- Node.js 24+
|
|
603
|
+
- pnpm 10+
|
|
604
|
+
- .NET SDK 8+
|
|
605
|
+
- Godot 4.x (with .NET support)
|
|
606
|
+
- On Windows: Git Bash or WSL (for shell scripts)
|
|
607
|
+
|
|
608
|
+
## Setup
|
|
609
|
+
|
|
610
|
+
### 1. Configure npm token
|
|
611
|
+
|
|
612
|
+
This workshop depends on private @warpgogol packages. Edit `.npmrc` and replace `YOUR_NPM_TOKEN` with a valid npm read token:
|
|
613
|
+
|
|
614
|
+
```sh
|
|
615
|
+
sed -i 's/YOUR_NPM_TOKEN/your_actual_token/' .npmrc
|
|
616
|
+
```
|
|
617
|
+
|
|
618
|
+
### 2. Install dependencies
|
|
619
|
+
|
|
620
|
+
```sh
|
|
621
|
+
pnpm install
|
|
622
|
+
```
|
|
623
|
+
|
|
624
|
+
### 3. Verify the workshop
|
|
625
|
+
|
|
626
|
+
```sh
|
|
627
|
+
pnpm exec werkstatt run forge.doctor
|
|
628
|
+
pnpm exec werkstatt run werkstatt.plugin.validate
|
|
629
|
+
pnpm exec werkstatt run werkstatt.autonomy.validate
|
|
630
|
+
```
|
|
631
|
+
|
|
632
|
+
## Running the game
|
|
633
|
+
|
|
634
|
+
### Quick start
|
|
635
|
+
|
|
636
|
+
```sh
|
|
637
|
+
# Install the correct Godot version (mono build)
|
|
638
|
+
./scripts/install-godot.sh
|
|
639
|
+
|
|
640
|
+
# Build and run the game
|
|
641
|
+
./scripts/run.sh
|
|
642
|
+
```
|
|
643
|
+
|
|
644
|
+
Or open in the editor:
|
|
645
|
+
|
|
646
|
+
```sh
|
|
647
|
+
./scripts/run.sh --editor
|
|
648
|
+
```
|
|
649
|
+
|
|
650
|
+
You should see "Hello, my-game!" in the game window.
|
|
651
|
+
|
|
652
|
+
### Manual setup (if you already have Godot installed)
|
|
653
|
+
|
|
654
|
+
Ensure you have Godot 4.3 (mono) installed and on your PATH, then:
|
|
655
|
+
|
|
656
|
+
```sh
|
|
657
|
+
cd apps/my-game
|
|
658
|
+
dotnet build
|
|
659
|
+
godot --path .
|
|
660
|
+
```
|
|
661
|
+
|
|
662
|
+
## Stack
|
|
663
|
+
|
|
664
|
+
- Engine: @warpgogol/werkstatt
|
|
665
|
+
- Plugin: @warpgogol/werkstatt-godot
|
|
666
|
+
- Stack profile: godot-csharp
|
|
328
667
|
install:
|
|
329
|
-
- pnpm
|
|
668
|
+
- pnpm install
|
|
330
669
|
firstWorkspace:
|
|
331
|
-
path:
|
|
670
|
+
path: apps/my-game
|
|
332
671
|
files:
|
|
333
672
|
- path: project.godot
|
|
334
673
|
content: |
|
|
@@ -347,7 +686,14 @@ firstWorkspace:
|
|
|
347
686
|
project/assembly_name="my-game"
|
|
348
687
|
- path: Game.csproj
|
|
349
688
|
content: |
|
|
350
|
-
<Project Sdk="Godot.NET.Sdk">
|
|
689
|
+
<Project Sdk="Godot.NET.Sdk/4.3.0">
|
|
690
|
+
<PropertyGroup>
|
|
691
|
+
<AssemblyName>my-game</AssemblyName>
|
|
692
|
+
</PropertyGroup>
|
|
693
|
+
</Project>
|
|
694
|
+
- path: Directory.Build.props
|
|
695
|
+
content: |
|
|
696
|
+
<Project>
|
|
351
697
|
<PropertyGroup>
|
|
352
698
|
<TargetFramework>net8.0</TargetFramework>
|
|
353
699
|
<TargetFramework Condition="'$(OS)' == 'Windows_NT'">net8.0-windows</TargetFramework>
|
|
@@ -356,15 +702,101 @@ firstWorkspace:
|
|
|
356
702
|
<Nullable>enable</Nullable>
|
|
357
703
|
</PropertyGroup>
|
|
358
704
|
</Project>
|
|
705
|
+
- path: global.json
|
|
706
|
+
content: |
|
|
707
|
+
{
|
|
708
|
+
"sdk": {
|
|
709
|
+
"version": "8.0.100",
|
|
710
|
+
"rollForward": "latestFeature"
|
|
711
|
+
}
|
|
712
|
+
}
|
|
713
|
+
- path: Game.sln
|
|
714
|
+
content: |
|
|
715
|
+
Microsoft Visual Studio Solution File, Format Version 12.00
|
|
716
|
+
# Visual Studio Version 17
|
|
717
|
+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "my-game", "Game.csproj", "{AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA}"
|
|
718
|
+
EndProject
|
|
719
|
+
Global
|
|
720
|
+
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
|
721
|
+
Debug|Any CPU = Debug|Any CPU
|
|
722
|
+
Release|Any CPU = Release|Any CPU
|
|
723
|
+
EndGlobalSection
|
|
724
|
+
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
|
725
|
+
{AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
726
|
+
{AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
727
|
+
{AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
728
|
+
{AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
729
|
+
EndGlobalSection
|
|
730
|
+
EndGlobal
|
|
731
|
+
- path: export_presets.cfg
|
|
732
|
+
content: |
|
|
733
|
+
[preset.0]
|
|
734
|
+
|
|
735
|
+
name="Web"
|
|
736
|
+
platform="Web"
|
|
737
|
+
runnable=true
|
|
738
|
+
dedicated_server=false
|
|
739
|
+
custom_features=""
|
|
740
|
+
export_filter="all_resources"
|
|
741
|
+
include_filter=""
|
|
742
|
+
exclude_filter=""
|
|
743
|
+
export_path="bin/web/index.html"
|
|
744
|
+
encryption_include_filters=""
|
|
745
|
+
encryption_exclude_filters=""
|
|
746
|
+
encrypt_export=false
|
|
747
|
+
|
|
748
|
+
[preset.0.options]
|
|
749
|
+
|
|
750
|
+
html/export_icon=true
|
|
751
|
+
html/custom_html_shell=""
|
|
752
|
+
html/head_include=""
|
|
753
|
+
- path: omnisharp.json
|
|
754
|
+
content: |
|
|
755
|
+
{
|
|
756
|
+
"FormattingOptions": {
|
|
757
|
+
"UseTabs": true,
|
|
758
|
+
"TabSize": 4,
|
|
759
|
+
"IndentationSize": 4,
|
|
760
|
+
"NewLine": "\n"
|
|
761
|
+
},
|
|
762
|
+
"RoslynExtensionsOptions": {
|
|
763
|
+
"EnableAnalyzersSupport": true
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
- path: .vscode/settings.json
|
|
767
|
+
content: |
|
|
768
|
+
{
|
|
769
|
+
"files.associations": {
|
|
770
|
+
"*.tscn": "gdscript",
|
|
771
|
+
"*.tres": "gdscript",
|
|
772
|
+
"*.gd": "gdscript"
|
|
773
|
+
},
|
|
774
|
+
"search.exclude": {
|
|
775
|
+
"**/.godot": true,
|
|
776
|
+
"**/bin": true,
|
|
777
|
+
"**/obj": true
|
|
778
|
+
},
|
|
779
|
+
"files.watcherExclude": {
|
|
780
|
+
"**/.godot/**": true,
|
|
781
|
+
"**/bin/**": true,
|
|
782
|
+
"**/obj/**": true
|
|
783
|
+
}
|
|
784
|
+
}
|
|
359
785
|
- path: Scenes/Main.tscn
|
|
360
786
|
content: |
|
|
361
|
-
[gd_scene load_steps=
|
|
787
|
+
[gd_scene load_steps=2 format=3 uid="uid://main_scene"]
|
|
362
788
|
|
|
363
|
-
[ext_resource type="Script" path="res://Scripts/Main.cs" id="1"]
|
|
364
789
|
[ext_resource type="Script" path="res://Scripts/Main.cs" id="1_script"]
|
|
365
790
|
|
|
366
791
|
[node name="Main" type="Node2D"]
|
|
367
792
|
script = ExtResource("1_script")
|
|
793
|
+
|
|
794
|
+
[node name="HelloLabel" type="Label" parent="."]
|
|
795
|
+
offset_left = 200.0
|
|
796
|
+
offset_top = 200.0
|
|
797
|
+
offset_right = 600.0
|
|
798
|
+
offset_bottom = 300.0
|
|
799
|
+
text = "Hello, my-game!"
|
|
368
800
|
- path: Scripts/Main.cs
|
|
369
801
|
content: |
|
|
370
802
|
using Godot;
|
|
@@ -383,6 +815,31 @@ firstWorkspace:
|
|
|
383
815
|
obj/
|
|
384
816
|
*.user
|
|
385
817
|
*.csproj.user
|
|
818
|
+
- path: icon.svg
|
|
819
|
+
content: |
|
|
820
|
+
<svg width="128" height="128" viewBox="0 0 128 128" xmlns="http://www.w3.org/2000/svg">
|
|
821
|
+
<rect width="128" height="128" rx="16" fill="#478cbf"/>
|
|
822
|
+
<text x="64" y="80" font-family="Arial, sans-serif" font-size="48" font-weight="bold" fill="white" text-anchor="middle">G</text>
|
|
823
|
+
</svg>
|
|
824
|
+
- path: .editorconfig
|
|
825
|
+
content: |
|
|
826
|
+
root = true
|
|
827
|
+
|
|
828
|
+
[*]
|
|
829
|
+
charset = utf-8
|
|
830
|
+
end_of_line = lf
|
|
831
|
+
insert_final_newline = true
|
|
832
|
+
trim_trailing_whitespace = true
|
|
833
|
+
|
|
834
|
+
[*.{cs,csproj}]
|
|
835
|
+
indent_style = tab
|
|
836
|
+
indent_size = 4
|
|
837
|
+
|
|
838
|
+
[*.{tscn,tres,godot,cfg}]
|
|
839
|
+
indent_style = tab
|
|
840
|
+
indent_size = 4
|
|
841
|
+
|
|
842
|
+
[*.{md,txt}]
|
|
843
|
+
trim_trailing_whitespace = false
|
|
386
844
|
install:
|
|
387
|
-
- dotnet
|
|
388
|
-
- dotnet sln add Game.csproj
|
|
845
|
+
- dotnet restore
|