@warpgogol/forge 0.4.0 → 0.5.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 +116 -4
- package/dist/os/adr/handlers/validate.d.ts.map +1 -1
- package/dist/os/adr/handlers/validate.js +31 -3
- package/dist/os/adr/handlers/validate.js.map +1 -1
- package/dist/os/core/core.module.d.ts.map +1 -1
- package/dist/os/core/core.module.js +76 -2
- package/dist/os/core/core.module.js.map +1 -1
- package/dist/os/core/handlers/knowledge-compact.d.ts +4 -0
- package/dist/os/core/handlers/knowledge-compact.d.ts.map +1 -0
- package/dist/os/core/handlers/knowledge-compact.js +198 -0
- package/dist/os/core/handlers/knowledge-compact.js.map +1 -0
- package/dist/os/rfc/handlers/lifecycle.d.ts.map +1 -1
- package/dist/os/rfc/handlers/lifecycle.js +3 -4
- package/dist/os/rfc/handlers/lifecycle.js.map +1 -1
- package/dist/os/rfc/handlers/validate-rules.d.ts.map +1 -1
- package/dist/os/rfc/handlers/validate-rules.js +41 -3
- package/dist/os/rfc/handlers/validate-rules.js.map +1 -1
- package/dist/os/spec/spec-schema.d.ts +1 -1
- package/dist/src/config/forge-config.d.ts +67 -3
- package/dist/src/config/forge-config.d.ts.map +1 -1
- package/dist/src/config/forge-config.js +86 -2
- package/dist/src/config/forge-config.js.map +1 -1
- package/dist/src/index.d.ts +3 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +6 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/knowledge/budgets.d.ts +38 -0
- package/dist/src/knowledge/budgets.d.ts.map +1 -0
- package/dist/src/knowledge/budgets.js +157 -0
- package/dist/src/knowledge/budgets.js.map +1 -0
- package/dist/src/knowledge/compact.d.ts +47 -0
- package/dist/src/knowledge/compact.d.ts.map +1 -0
- package/dist/src/knowledge/compact.js +322 -0
- package/dist/src/knowledge/compact.js.map +1 -0
- package/dist/src/knowledge/index.d.ts +7 -0
- package/dist/src/knowledge/index.d.ts.map +1 -0
- package/dist/src/knowledge/index.js +19 -0
- package/dist/src/knowledge/index.js.map +1 -0
- package/dist/src/knowledge/parse.d.ts +3 -0
- package/dist/src/knowledge/parse.d.ts.map +1 -0
- package/dist/src/knowledge/parse.js +205 -0
- package/dist/src/knowledge/parse.js.map +1 -0
- package/dist/src/knowledge/promote.d.ts +37 -0
- package/dist/src/knowledge/promote.d.ts.map +1 -0
- package/dist/src/knowledge/promote.js +120 -0
- package/dist/src/knowledge/promote.js.map +1 -0
- package/dist/src/knowledge/schema.d.ts +61 -0
- package/dist/src/knowledge/schema.d.ts.map +1 -0
- package/dist/src/knowledge/schema.js +64 -0
- package/dist/src/knowledge/schema.js.map +1 -0
- package/dist/src/knowledge/serialize.d.ts +3 -0
- package/dist/src/knowledge/serialize.d.ts.map +1 -0
- package/dist/src/knowledge/serialize.js +67 -0
- package/dist/src/knowledge/serialize.js.map +1 -0
- package/dist/src/onboarding/agents-generate.d.ts +15 -0
- package/dist/src/onboarding/agents-generate.d.ts.map +1 -1
- package/dist/src/onboarding/agents-generate.js +118 -58
- package/dist/src/onboarding/agents-generate.js.map +1 -1
- package/dist/src/onboarding/create.d.ts.map +1 -1
- package/dist/src/onboarding/create.js +62 -3
- package/dist/src/onboarding/create.js.map +1 -1
- package/dist/src/onboarding/doctor.d.ts +13 -1
- package/dist/src/onboarding/doctor.d.ts.map +1 -1
- package/dist/src/onboarding/doctor.js +527 -11
- package/dist/src/onboarding/doctor.js.map +1 -1
- package/dist/src/onboarding/init.d.ts +8 -1
- package/dist/src/onboarding/init.d.ts.map +1 -1
- package/dist/src/onboarding/init.js +33 -2
- package/dist/src/onboarding/init.js.map +1 -1
- package/dist/src/onboarding/memory-scaffold.d.ts +18 -0
- package/dist/src/onboarding/memory-scaffold.d.ts.map +1 -0
- package/dist/src/onboarding/memory-scaffold.js +151 -0
- package/dist/src/onboarding/memory-scaffold.js.map +1 -0
- package/dist/src/onboarding/nested-agents-generate.d.ts +6 -2
- package/dist/src/onboarding/nested-agents-generate.d.ts.map +1 -1
- package/dist/src/onboarding/nested-agents-generate.js +34 -9
- package/dist/src/onboarding/nested-agents-generate.js.map +1 -1
- package/dist/src/onboarding/nested-agents-templates.d.ts +23 -1
- package/dist/src/onboarding/nested-agents-templates.d.ts.map +1 -1
- package/dist/src/onboarding/nested-agents-templates.js +138 -8
- package/dist/src/onboarding/nested-agents-templates.js.map +1 -1
- package/dist/src/onboarding/profile-validate.d.ts +13 -0
- package/dist/src/onboarding/profile-validate.d.ts.map +1 -0
- package/dist/src/onboarding/profile-validate.js +109 -0
- package/dist/src/onboarding/profile-validate.js.map +1 -0
- package/dist/src/onboarding/upgrade.d.ts +5 -0
- package/dist/src/onboarding/upgrade.d.ts.map +1 -1
- package/dist/src/onboarding/upgrade.js +27 -1
- package/dist/src/onboarding/upgrade.js.map +1 -1
- package/dist/src/onboarding/workspace-discovery.d.ts +4 -3
- package/dist/src/onboarding/workspace-discovery.d.ts.map +1 -1
- package/dist/src/onboarding/workspace-discovery.js +51 -3
- package/dist/src/onboarding/workspace-discovery.js.map +1 -1
- package/dist/src/profiles/profile-schema.d.ts +116 -0
- package/dist/src/profiles/profile-schema.d.ts.map +1 -0
- package/dist/src/profiles/profile-schema.js +94 -0
- package/dist/src/profiles/profile-schema.js.map +1 -0
- package/dist/src/profiles/stack-profile.d.ts +41 -1
- package/dist/src/profiles/stack-profile.d.ts.map +1 -1
- package/dist/src/profiles/stack-profile.js +9 -0
- package/dist/src/profiles/stack-profile.js.map +1 -1
- package/dist/src/profiles/terminology-utils.d.ts +8 -0
- package/dist/src/profiles/terminology-utils.d.ts.map +1 -0
- package/dist/src/profiles/terminology-utils.js +31 -0
- package/dist/src/profiles/terminology-utils.js.map +1 -0
- package/dist/src/validators/skill-validate.d.ts +15 -0
- package/dist/src/validators/skill-validate.d.ts.map +1 -1
- package/dist/src/validators/skill-validate.js +204 -2
- package/dist/src/validators/skill-validate.js.map +1 -1
- package/package.json +11 -3
- package/profiles/astro-typescript-turborepo.yaml +87 -0
- package/profiles/editframe-html-templates/composition-agents.md +34 -0
- package/profiles/editframe-html-templates/composition.html +32 -0
- package/profiles/editframe-html.yaml +283 -0
- package/profiles/forge-shell.yaml +77 -0
- package/profiles/phaser-turborepo.yaml +87 -0
- package/skills/fo/fo-doc-audit/SKILL.md +6 -6
- package/skills/fo/fo-handoff/SKILL.md +2 -1
- package/skills/fo/fo-idea-implement/SKILL.md +44 -2
- package/skills/fo/fo-idea-plan/SKILL.md +1 -0
- package/skills/fo/fo-knowledge-distill/SKILL.md +170 -0
- package/skills/fo/fo-memory-sync/SKILL.md +6 -3
- package/skills/fo/fo-memory-sync/fix-patterns.md +38 -4
- package/skills/fo/fo-review/SKILL.md +2 -2
- package/skills/fo/fo-session-retro/SKILL.md +21 -11
- package/skills/fo/fo-session-save/SKILL.md +1 -1
- package/skills/fo/fo-session-save/fix-patterns.md +53 -29
- package/skills/fo/fo-session-save/learned-principles.md +59 -8
- package/skills/meta/forge-bootstrap/SKILL.md +16 -4
- package/skills/meta/forge-bootstrap/operator-profile-template.md +1 -0
- package/skills/meta/skill-create/SKILL.md +1 -1
- package/skills/shared/grilling/SKILL.md +1 -1
- package/skills/shared/grilling/learned-principles.md +14 -0
- package/skills/shared/grilling/qa-log.md +105 -6
- package/skills/shared/knowledge/learned-principles.md +5 -0
- package/skills/shared/windows-ai-tooling/SKILL.md +154 -1
- package/skills/shared/writing-great-skills/SKILL.md +74 -1
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
schema: forge/stack-profile@1
|
|
2
|
+
id: editframe-html
|
|
3
|
+
displayName: Editframe HTML Video
|
|
4
|
+
detect:
|
|
5
|
+
anyOf:
|
|
6
|
+
- editframe.config.*
|
|
7
|
+
domain: video
|
|
8
|
+
register: creative
|
|
9
|
+
terminology:
|
|
10
|
+
artifact: composition
|
|
11
|
+
artifactPlural: compositions
|
|
12
|
+
module: scene
|
|
13
|
+
source: composition file
|
|
14
|
+
output: render
|
|
15
|
+
verify: render-verify
|
|
16
|
+
operator: director
|
|
17
|
+
artifacts:
|
|
18
|
+
- id: composition
|
|
19
|
+
extensions:
|
|
20
|
+
- .html
|
|
21
|
+
- .tsx
|
|
22
|
+
produce:
|
|
23
|
+
command: editframe render
|
|
24
|
+
output: dist/{composition}.mp4
|
|
25
|
+
validate:
|
|
26
|
+
command: editframe check
|
|
27
|
+
determinism:
|
|
28
|
+
hashable: true
|
|
29
|
+
inputs:
|
|
30
|
+
- composition files
|
|
31
|
+
- assets
|
|
32
|
+
- editframe version
|
|
33
|
+
workspaceTypes:
|
|
34
|
+
- id: composition
|
|
35
|
+
detect:
|
|
36
|
+
glob: "*.html"
|
|
37
|
+
contains: ef-timegroup
|
|
38
|
+
packageJsonDep: "@editframe/cli"
|
|
39
|
+
skills:
|
|
40
|
+
- ef-composition-review
|
|
41
|
+
- ef-render-verify
|
|
42
|
+
agentsMdTemplate: editframe-html-templates/composition-agents.md
|
|
43
|
+
invariants:
|
|
44
|
+
- id: VIDEO-01
|
|
45
|
+
rule: Composition filenames must use kebab-case (lowercase letters, digits, hyphens only)
|
|
46
|
+
severity: error
|
|
47
|
+
- id: VIDEO-02
|
|
48
|
+
rule: Scene durations must use contain mode by default to avoid unexpected cropping
|
|
49
|
+
severity: warning
|
|
50
|
+
- id: VIDEO-03
|
|
51
|
+
rule: All speech audio elements must have corresponding ef-captions elements for accessibility
|
|
52
|
+
severity: error
|
|
53
|
+
workspace:
|
|
54
|
+
dirs:
|
|
55
|
+
- compositions
|
|
56
|
+
- packages
|
|
57
|
+
- services
|
|
58
|
+
files:
|
|
59
|
+
- path: pnpm-workspace.yaml
|
|
60
|
+
content: |
|
|
61
|
+
packages:
|
|
62
|
+
- "compositions/*"
|
|
63
|
+
- "packages/*"
|
|
64
|
+
- "services/*"
|
|
65
|
+
- path: turbo.json
|
|
66
|
+
content: |
|
|
67
|
+
{
|
|
68
|
+
"$schema": "https://turbo.build/schema.json",
|
|
69
|
+
"tasks": {
|
|
70
|
+
"build": {
|
|
71
|
+
"dependsOn": ["^build"],
|
|
72
|
+
"outputs": ["dist/**"]
|
|
73
|
+
},
|
|
74
|
+
"build:check": {
|
|
75
|
+
"dependsOn": ["^build:check"]
|
|
76
|
+
},
|
|
77
|
+
"test": {
|
|
78
|
+
"dependsOn": ["^build:check"]
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
- path: .gitignore
|
|
83
|
+
content: |
|
|
84
|
+
node_modules
|
|
85
|
+
dist
|
|
86
|
+
.turbo
|
|
87
|
+
.cache
|
|
88
|
+
operator-profile.md
|
|
89
|
+
- path: .github/workflows/ci.yml
|
|
90
|
+
content: |
|
|
91
|
+
name: CI
|
|
92
|
+
|
|
93
|
+
on:
|
|
94
|
+
pull_request:
|
|
95
|
+
push:
|
|
96
|
+
branches: [main]
|
|
97
|
+
workflow_dispatch:
|
|
98
|
+
|
|
99
|
+
concurrency:
|
|
100
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
101
|
+
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
|
102
|
+
|
|
103
|
+
permissions:
|
|
104
|
+
contents: read
|
|
105
|
+
|
|
106
|
+
jobs:
|
|
107
|
+
ci:
|
|
108
|
+
runs-on: ubuntu-latest
|
|
109
|
+
timeout-minutes: 15
|
|
110
|
+
name: Lint, type-check, build, test
|
|
111
|
+
env:
|
|
112
|
+
TZ: UTC
|
|
113
|
+
|
|
114
|
+
steps:
|
|
115
|
+
- name: Checkout
|
|
116
|
+
uses: actions/checkout@v5
|
|
117
|
+
|
|
118
|
+
- name: Enable Corepack
|
|
119
|
+
run: corepack enable
|
|
120
|
+
|
|
121
|
+
- name: Setup Node.js
|
|
122
|
+
uses: actions/setup-node@v5
|
|
123
|
+
with:
|
|
124
|
+
node-version: "24"
|
|
125
|
+
cache: "pnpm"
|
|
126
|
+
|
|
127
|
+
- name: Install dependencies
|
|
128
|
+
run: pnpm install --frozen-lockfile
|
|
129
|
+
|
|
130
|
+
- name: Format check
|
|
131
|
+
run: pnpm format:check
|
|
132
|
+
|
|
133
|
+
- name: Type check
|
|
134
|
+
run: pnpm build:check
|
|
135
|
+
|
|
136
|
+
- name: Build
|
|
137
|
+
run: pnpm build
|
|
138
|
+
|
|
139
|
+
- name: Test
|
|
140
|
+
run: pnpm test
|
|
141
|
+
|
|
142
|
+
# Windows CI (optional — uncomment if Windows checks are needed):
|
|
143
|
+
#
|
|
144
|
+
# windows-ci:
|
|
145
|
+
# runs-on: windows-latest
|
|
146
|
+
# name: Lint, type-check, build, test (Windows)
|
|
147
|
+
# env:
|
|
148
|
+
# GIT_CONFIG_COUNT: 1
|
|
149
|
+
# GIT_CONFIG_KEY_0: core.longpaths
|
|
150
|
+
# GIT_CONFIG_VALUE_0: "true"
|
|
151
|
+
# steps:
|
|
152
|
+
# - name: Checkout
|
|
153
|
+
# uses: actions/checkout@v5
|
|
154
|
+
# - name: Enable Corepack
|
|
155
|
+
# run: corepack enable
|
|
156
|
+
# - name: Setup Node.js
|
|
157
|
+
# uses: actions/setup-node@v5
|
|
158
|
+
# with:
|
|
159
|
+
# node-version: "24"
|
|
160
|
+
# cache: "pnpm"
|
|
161
|
+
# - name: Install dependencies
|
|
162
|
+
# run: pnpm install --frozen-lockfile
|
|
163
|
+
# - name: Format check
|
|
164
|
+
# run: pnpm format:check
|
|
165
|
+
# - name: Type check
|
|
166
|
+
# run: pnpm build:check
|
|
167
|
+
# - name: Build
|
|
168
|
+
# run: pnpm build
|
|
169
|
+
# - name: Test
|
|
170
|
+
# run: pnpm test
|
|
171
|
+
#
|
|
172
|
+
# The GIT_CONFIG_COUNT env block MUST be set before the checkout step
|
|
173
|
+
# so git can handle long file paths during clone on Windows.
|
|
174
|
+
# Do not add Windows to the matrix "just in case" — it requires
|
|
175
|
+
# separate path-length and platform-specific dependency verification.
|
|
176
|
+
- path: package.json
|
|
177
|
+
content: |
|
|
178
|
+
{
|
|
179
|
+
"name": "__PROJECT_NAME__",
|
|
180
|
+
"version": "0.1.0",
|
|
181
|
+
"private": true,
|
|
182
|
+
"type": "module",
|
|
183
|
+
"engines": {
|
|
184
|
+
"node": ">=22"
|
|
185
|
+
},
|
|
186
|
+
"scripts": {
|
|
187
|
+
"clean": "node scripts/clean.mjs",
|
|
188
|
+
"format": "prettier --write .",
|
|
189
|
+
"format:check": "prettier --check .",
|
|
190
|
+
"build": "turbo run build",
|
|
191
|
+
"build:check": "turbo run build:check",
|
|
192
|
+
"test": "turbo run test",
|
|
193
|
+
"upgrade-packages": "pnpm -r up"
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
- path: scripts/clean.mjs
|
|
197
|
+
content: |
|
|
198
|
+
import { readdir, rm } from "node:fs/promises";
|
|
199
|
+
import { join } from "node:path";
|
|
200
|
+
import { fileURLToPath } from "node:url";
|
|
201
|
+
|
|
202
|
+
const TARGETS = new Set(["node_modules", ".turbo", "dist", ".cache"]);
|
|
203
|
+
|
|
204
|
+
const repoRoot = join(fileURLToPath(import.meta.url), "..", "..");
|
|
205
|
+
|
|
206
|
+
async function walk(dir, toDelete) {
|
|
207
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
208
|
+
for (const entry of entries) {
|
|
209
|
+
if (!entry.isDirectory()) continue;
|
|
210
|
+
const name = entry.name;
|
|
211
|
+
const fullPath = join(dir, name);
|
|
212
|
+
if (TARGETS.has(name)) {
|
|
213
|
+
toDelete.push(fullPath);
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
await walk(fullPath, toDelete);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
const toDelete = [];
|
|
221
|
+
await walk(repoRoot, toDelete);
|
|
222
|
+
|
|
223
|
+
if (toDelete.length === 0) {
|
|
224
|
+
console.log("Nothing to clean.");
|
|
225
|
+
process.exit(0);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
await Promise.all(toDelete.map((p) => rm(p, { recursive: true, force: true })));
|
|
229
|
+
|
|
230
|
+
for (const p of toDelete) {
|
|
231
|
+
console.log("deleted", p.replace(repoRoot + "/", ""));
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
console.log(`Cleaned ${toDelete.length} directories.`);
|
|
235
|
+
install:
|
|
236
|
+
- pnpm add -D @editframe/cli @warpgogol/forge turbo prettier
|
|
237
|
+
firstWorkspace:
|
|
238
|
+
path: compositions/my-first-video
|
|
239
|
+
files:
|
|
240
|
+
- path: package.json
|
|
241
|
+
content: |
|
|
242
|
+
{
|
|
243
|
+
"name": "my-first-video",
|
|
244
|
+
"version": "0.1.0",
|
|
245
|
+
"private": true,
|
|
246
|
+
"type": "module",
|
|
247
|
+
"scripts": {
|
|
248
|
+
"preview": "editframe preview",
|
|
249
|
+
"render": "editframe render -o dist/my-first-video.mp4",
|
|
250
|
+
"check": "editframe check"
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
- path: composition.html
|
|
254
|
+
content: |
|
|
255
|
+
<!--
|
|
256
|
+
Editframe HTML composition — my-first-video
|
|
257
|
+
This file declares a video composition using Editframe custom elements.
|
|
258
|
+
Run `editframe preview` to preview, `editframe render` to produce output.
|
|
259
|
+
-->
|
|
260
|
+
<ef-timegroup duration="10s">
|
|
261
|
+
<ef-video
|
|
262
|
+
src="assets/background.mp4"
|
|
263
|
+
fit="contain"
|
|
264
|
+
duration="10s"
|
|
265
|
+
></ef-video>
|
|
266
|
+
<ef-text
|
|
267
|
+
text="Hello, Editframe!"
|
|
268
|
+
x="50%"
|
|
269
|
+
y="50%"
|
|
270
|
+
font-size="48px"
|
|
271
|
+
color="white"
|
|
272
|
+
text-align="center"
|
|
273
|
+
duration="5s"
|
|
274
|
+
></ef-text>
|
|
275
|
+
<ef-audio
|
|
276
|
+
src="assets/narration.mp3"
|
|
277
|
+
></ef-audio>
|
|
278
|
+
<ef-captions
|
|
279
|
+
src="assets/captions.vtt"
|
|
280
|
+
></ef-captions>
|
|
281
|
+
</ef-timegroup>
|
|
282
|
+
install:
|
|
283
|
+
- pnpm add -D vitest
|
|
@@ -16,6 +16,83 @@ workspace:
|
|
|
16
16
|
.turbo
|
|
17
17
|
.cache
|
|
18
18
|
operator-profile.md
|
|
19
|
+
- path: .github/workflows/ci.yml
|
|
20
|
+
content: |
|
|
21
|
+
name: CI
|
|
22
|
+
|
|
23
|
+
on:
|
|
24
|
+
pull_request:
|
|
25
|
+
push:
|
|
26
|
+
branches: [main]
|
|
27
|
+
workflow_dispatch:
|
|
28
|
+
|
|
29
|
+
concurrency:
|
|
30
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
31
|
+
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
|
32
|
+
|
|
33
|
+
permissions:
|
|
34
|
+
contents: read
|
|
35
|
+
|
|
36
|
+
jobs:
|
|
37
|
+
ci:
|
|
38
|
+
runs-on: ubuntu-latest
|
|
39
|
+
timeout-minutes: 15
|
|
40
|
+
name: Lint, type-check, test
|
|
41
|
+
env:
|
|
42
|
+
TZ: UTC
|
|
43
|
+
|
|
44
|
+
steps:
|
|
45
|
+
- name: Checkout
|
|
46
|
+
uses: actions/checkout@v5
|
|
47
|
+
|
|
48
|
+
- name: Enable Corepack
|
|
49
|
+
run: corepack enable
|
|
50
|
+
|
|
51
|
+
- name: Setup Node.js
|
|
52
|
+
uses: actions/setup-node@v5
|
|
53
|
+
with:
|
|
54
|
+
node-version: "24"
|
|
55
|
+
cache: "pnpm"
|
|
56
|
+
|
|
57
|
+
- name: Install dependencies
|
|
58
|
+
run: pnpm install --frozen-lockfile
|
|
59
|
+
|
|
60
|
+
- name: Format check
|
|
61
|
+
run: pnpm format:check
|
|
62
|
+
|
|
63
|
+
- name: Test
|
|
64
|
+
run: pnpm test
|
|
65
|
+
|
|
66
|
+
# Windows CI (optional — uncomment if Windows checks are needed):
|
|
67
|
+
#
|
|
68
|
+
# windows-ci:
|
|
69
|
+
# runs-on: windows-latest
|
|
70
|
+
# name: Lint, type-check, test (Windows)
|
|
71
|
+
# env:
|
|
72
|
+
# GIT_CONFIG_COUNT: 1
|
|
73
|
+
# GIT_CONFIG_KEY_0: core.longpaths
|
|
74
|
+
# GIT_CONFIG_VALUE_0: "true"
|
|
75
|
+
# steps:
|
|
76
|
+
# - name: Checkout
|
|
77
|
+
# uses: actions/checkout@v5
|
|
78
|
+
# - name: Enable Corepack
|
|
79
|
+
# run: corepack enable
|
|
80
|
+
# - name: Setup Node.js
|
|
81
|
+
# uses: actions/setup-node@v5
|
|
82
|
+
# with:
|
|
83
|
+
# node-version: "24"
|
|
84
|
+
# cache: "pnpm"
|
|
85
|
+
# - name: Install dependencies
|
|
86
|
+
# run: pnpm install --frozen-lockfile
|
|
87
|
+
# - name: Format check
|
|
88
|
+
# run: pnpm format:check
|
|
89
|
+
# - name: Test
|
|
90
|
+
# run: pnpm test
|
|
91
|
+
#
|
|
92
|
+
# The GIT_CONFIG_COUNT env block MUST be set before the checkout step
|
|
93
|
+
# so git can handle long file paths during clone on Windows.
|
|
94
|
+
# Do not add Windows to the matrix "just in case" — it requires
|
|
95
|
+
# separate path-length and platform-specific dependency verification.
|
|
19
96
|
- path: package.json
|
|
20
97
|
content: |
|
|
21
98
|
{
|
|
@@ -55,6 +55,93 @@ workspace:
|
|
|
55
55
|
.turbo
|
|
56
56
|
.cache
|
|
57
57
|
operator-profile.md
|
|
58
|
+
- path: .github/workflows/ci.yml
|
|
59
|
+
content: |
|
|
60
|
+
name: CI
|
|
61
|
+
|
|
62
|
+
on:
|
|
63
|
+
pull_request:
|
|
64
|
+
push:
|
|
65
|
+
branches: [main]
|
|
66
|
+
workflow_dispatch:
|
|
67
|
+
|
|
68
|
+
concurrency:
|
|
69
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
70
|
+
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
|
71
|
+
|
|
72
|
+
permissions:
|
|
73
|
+
contents: read
|
|
74
|
+
|
|
75
|
+
jobs:
|
|
76
|
+
ci:
|
|
77
|
+
runs-on: ubuntu-latest
|
|
78
|
+
timeout-minutes: 15
|
|
79
|
+
name: Lint, type-check, build, test
|
|
80
|
+
env:
|
|
81
|
+
TZ: UTC
|
|
82
|
+
|
|
83
|
+
steps:
|
|
84
|
+
- name: Checkout
|
|
85
|
+
uses: actions/checkout@v5
|
|
86
|
+
|
|
87
|
+
- name: Enable Corepack
|
|
88
|
+
run: corepack enable
|
|
89
|
+
|
|
90
|
+
- name: Setup Node.js
|
|
91
|
+
uses: actions/setup-node@v5
|
|
92
|
+
with:
|
|
93
|
+
node-version: "24"
|
|
94
|
+
cache: "pnpm"
|
|
95
|
+
|
|
96
|
+
- name: Install dependencies
|
|
97
|
+
run: pnpm install --frozen-lockfile
|
|
98
|
+
|
|
99
|
+
- name: Format check
|
|
100
|
+
run: pnpm format:check
|
|
101
|
+
|
|
102
|
+
- name: Type check
|
|
103
|
+
run: pnpm build:check
|
|
104
|
+
|
|
105
|
+
- name: Build
|
|
106
|
+
run: pnpm build
|
|
107
|
+
|
|
108
|
+
- name: Test
|
|
109
|
+
run: pnpm test
|
|
110
|
+
|
|
111
|
+
# Windows CI (optional — uncomment if Windows checks are needed):
|
|
112
|
+
#
|
|
113
|
+
# windows-ci:
|
|
114
|
+
# runs-on: windows-latest
|
|
115
|
+
# name: Lint, type-check, build, test (Windows)
|
|
116
|
+
# env:
|
|
117
|
+
# GIT_CONFIG_COUNT: 1
|
|
118
|
+
# GIT_CONFIG_KEY_0: core.longpaths
|
|
119
|
+
# GIT_CONFIG_VALUE_0: "true"
|
|
120
|
+
# steps:
|
|
121
|
+
# - name: Checkout
|
|
122
|
+
# uses: actions/checkout@v5
|
|
123
|
+
# - name: Enable Corepack
|
|
124
|
+
# run: corepack enable
|
|
125
|
+
# - name: Setup Node.js
|
|
126
|
+
# uses: actions/setup-node@v5
|
|
127
|
+
# with:
|
|
128
|
+
# node-version: "24"
|
|
129
|
+
# cache: "pnpm"
|
|
130
|
+
# - name: Install dependencies
|
|
131
|
+
# run: pnpm install --frozen-lockfile
|
|
132
|
+
# - name: Format check
|
|
133
|
+
# run: pnpm format:check
|
|
134
|
+
# - name: Type check
|
|
135
|
+
# run: pnpm build:check
|
|
136
|
+
# - name: Build
|
|
137
|
+
# run: pnpm build
|
|
138
|
+
# - name: Test
|
|
139
|
+
# run: pnpm test
|
|
140
|
+
#
|
|
141
|
+
# The GIT_CONFIG_COUNT env block MUST be set before the checkout step
|
|
142
|
+
# so git can handle long file paths during clone on Windows.
|
|
143
|
+
# Do not add Windows to the matrix "just in case" — it requires
|
|
144
|
+
# separate path-length and platform-specific dependency verification.
|
|
58
145
|
- path: package.json
|
|
59
146
|
content: |
|
|
60
147
|
{
|
|
@@ -125,8 +125,8 @@ If yes, update the **template** files in `packages/os/site-kernel-onboarding/src
|
|
|
125
125
|
If yes, **do not edit the generated file directly**. Update the source registry or generator, then run the regeneration command:
|
|
126
126
|
|
|
127
127
|
```sh
|
|
128
|
-
ref(forge.yaml bindings.commands.
|
|
129
|
-
ref(forge.yaml bindings.commands.
|
|
128
|
+
ref(forge.yaml bindings.commands.produce) --workspace=ecosystem.manifest.generate
|
|
129
|
+
ref(forge.yaml bindings.commands.produce) --workspace=command.manifest.generate
|
|
130
130
|
```
|
|
131
131
|
|
|
132
132
|
Note: if the regeneration command is expensive or unavailable in the current session, document the need to regenerate in the session summary and move on.
|
|
@@ -182,8 +182,8 @@ For each surface that needs updating:
|
|
|
182
182
|
If any generated artifact needed regeneration (step 2f), run the generator now:
|
|
183
183
|
|
|
184
184
|
```sh
|
|
185
|
-
ref(forge.yaml bindings.commands.
|
|
186
|
-
ref(forge.yaml bindings.commands.
|
|
185
|
+
ref(forge.yaml bindings.commands.produce) --workspace=ecosystem.manifest.generate
|
|
186
|
+
ref(forge.yaml bindings.commands.produce) --workspace=command.manifest.generate
|
|
187
187
|
```
|
|
188
188
|
|
|
189
189
|
If the generator command is unavailable or too expensive for this session, note it in the summary — the operator can regenerate later.
|
|
@@ -191,8 +191,8 @@ If the generator command is unavailable or too expensive for this session, note
|
|
|
191
191
|
If a generated artifact was regenerated, run the drift guards:
|
|
192
192
|
|
|
193
193
|
```sh
|
|
194
|
-
ref(forge.yaml bindings.commands.
|
|
195
|
-
ref(forge.yaml bindings.commands.
|
|
194
|
+
ref(forge.yaml bindings.commands.produce) --workspace=ecosystem.manifest.validate
|
|
195
|
+
ref(forge.yaml bindings.commands.produce) --workspace=workspace.surface.validate
|
|
196
196
|
```
|
|
197
197
|
|
|
198
198
|
### 6. Commit
|
|
@@ -34,8 +34,9 @@ Include:
|
|
|
34
34
|
- **References to existing artifacts** — specs, plans, ADRs, issues, commits, diffs. Reference them by path or URL instead of duplicating content.
|
|
35
35
|
- **Current state** — what the codebase looks like now, what's uncommitted, what's in progress.
|
|
36
36
|
- **Next steps** — concrete, actionable items the next agent should pick up.
|
|
37
|
+
- **Memory layer pointer** — tell the next agent to read `.agents/memory/MEMORY.md` and recent `.agents/memory/daily/` files for project context.
|
|
37
38
|
|
|
38
|
-
Do not duplicate content already captured in other artifacts (specs, plans, ADRs, issues, commits, diffs). Reference them by path or URL instead.
|
|
39
|
+
Do not duplicate content already captured in other artifacts (specs, plans, ADRs, issues, commits, diffs). Reference them by path or URL instead. Do not duplicate content from `.agents/memory/` — reference it by path.
|
|
39
40
|
|
|
40
41
|
Redact any sensitive information, such as API keys, passwords, or personally identifiable information.
|
|
41
42
|
|
|
@@ -107,7 +107,7 @@ After **all** plan steps are complete, run the heavy validation suite in order:
|
|
|
107
107
|
2. **Package-level build checks** for each impacted package:
|
|
108
108
|
|
|
109
109
|
```sh
|
|
110
|
-
ref(forge.yaml bindings.commands.
|
|
110
|
+
ref(forge.yaml bindings.commands.validate) --workspace=<package>
|
|
111
111
|
```
|
|
112
112
|
|
|
113
113
|
3. **App-level checks** for each impacted app:
|
|
@@ -201,6 +201,26 @@ Transition the RFC to `implemented` using the `rfc.implement.stamp` command. Dir
|
|
|
201
201
|
|
|
202
202
|
Stage only the RFC file. The implementation commit and the stamp commit MUST be separate.
|
|
203
203
|
|
|
204
|
+
#### 3.8b. Regenerate command manifest (MANDATORY)
|
|
205
|
+
|
|
206
|
+
If the RFC added, changed, or removed commands (check `commands.added`, `commands.changed`, `commands.removed` in the RFC frontmatter), regenerate the command manifest so that `rfc.validate` does not report `RFC-CMD-02` (command listed but not registered):
|
|
207
|
+
|
|
208
|
+
1. Run `ref(forge.yaml bindings.commands.manifestGenerate)`.
|
|
209
|
+
|
|
210
|
+
2. Commit the regenerated manifest:
|
|
211
|
+
|
|
212
|
+
```txt
|
|
213
|
+
docs: regenerate command manifest for RFC-XXXX
|
|
214
|
+
|
|
215
|
+
Update docs/command-manifest.generated.yaml after RFC-XXXX command changes.
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
Stage only `docs/command-manifest.generated.yaml`.
|
|
219
|
+
|
|
220
|
+
If the RFC has no `commands.*` changes (e.g. it only changes schemas, docs, or internal logic), skip this step.
|
|
221
|
+
|
|
222
|
+
This step is MANDATORY for any RFC with `commands.added`, `commands.changed`, or `commands.removed`. A stale manifest causes `RFC-CMD-02` violations that block `rfc.validate` for all implemented RFCs.
|
|
223
|
+
|
|
204
224
|
#### 3.9. Documentation audit (fo-doc-audit)
|
|
205
225
|
|
|
206
226
|
After implementation is complete and all checks pass, invoke `fo-doc-audit` via the `skill` tool. It analyzes the session's changes, checks all documentation surfaces (AGENTS.md, README, Compass XML, architecture-dna.md, templates, generated artifacts, COMMANDS.md/PACKAGE_GRAPH.md), applies needed updates, and commits them separately. Wait for it to complete.
|
|
@@ -229,6 +249,17 @@ If `fo-review` (step 3.10) reported **any** findings (even cosmetic ones on axes
|
|
|
229
249
|
|
|
230
250
|
If `fo-review` reported truly zero findings (the report explicitly states "No issues." on every axis), skip this step. An `approved` verdict with any finding text on any axis does NOT qualify as zero findings.
|
|
231
251
|
|
|
252
|
+
#### 3.11b. Implementation status gate (RFC)
|
|
253
|
+
|
|
254
|
+
Before reporting completion, verify the RFC has been stamped as `implemented`:
|
|
255
|
+
|
|
256
|
+
1. Read the RFC frontmatter — confirm `status: implemented` and `implementedAt` is set.
|
|
257
|
+
2. Run `ref(forge.yaml bindings.commands.validateRfc) --id RFC-XXXX --json` — confirm zero errors.
|
|
258
|
+
3. If status is not `implemented`, go back to step 3.8 (Stamp implemented) and run the stamp command.
|
|
259
|
+
4. If `rfc.validate` reports errors, fix them before proceeding.
|
|
260
|
+
|
|
261
|
+
This gate is MANDATORY. Do not proceed to step 3.12 (report) until the RFC is `implemented`.
|
|
262
|
+
|
|
232
263
|
#### 3.12. RFC report
|
|
233
264
|
|
|
234
265
|
After implementation is complete, report in `aiLanguage`. **Translate all labels and headings to `aiLanguage`** — the template below is structural only. Only identifiers (RFC-XXXX, file paths, skill names) stay untranslated.
|
|
@@ -310,7 +341,7 @@ After implementation is complete, run heavy checks for the impacted workspaces o
|
|
|
310
341
|
2. Determine impacted packages/apps from the ADR's `scope` and the files touched during implementation. Build only those workspaces:
|
|
311
342
|
|
|
312
343
|
```sh
|
|
313
|
-
ref(forge.yaml bindings.commands.
|
|
344
|
+
ref(forge.yaml bindings.commands.validate) --workspace=<package>
|
|
314
345
|
```
|
|
315
346
|
|
|
316
347
|
Or for apps:
|
|
@@ -412,6 +443,17 @@ After all checks pass and documentation is updated, transition the ADR to `imple
|
|
|
412
443
|
|
|
413
444
|
Stage only the ADR file.
|
|
414
445
|
|
|
446
|
+
#### 4.10b. Implementation status gate (ADR)
|
|
447
|
+
|
|
448
|
+
Before reporting completion, verify the ADR has been transitioned to `implemented`:
|
|
449
|
+
|
|
450
|
+
1. Read the ADR frontmatter — confirm `status: implemented` and `implementedAt` is set.
|
|
451
|
+
2. Run `ref(forge.yaml bindings.commands.validateAdr) --id ADR-XXXX --json` — confirm zero errors.
|
|
452
|
+
3. If status is not `implemented`, go back to step 4.10 (Stamp implemented) and set `status: implemented`, `implementedAt`, `updatedAt`.
|
|
453
|
+
4. If `adr.validate` reports errors, fix them before proceeding.
|
|
454
|
+
|
|
455
|
+
This gate is MANDATORY. Do not proceed to step 4.11 (report) until the ADR is `implemented`.
|
|
456
|
+
|
|
415
457
|
#### 4.11. Report
|
|
416
458
|
|
|
417
459
|
After implementation is complete, report in `aiLanguage`. **Translate all labels and headings to `aiLanguage`** — the template below is structural only.
|
|
@@ -141,6 +141,7 @@ Step ordering follows the contract-first pattern:
|
|
|
141
141
|
5. **Validation** — run `rfc.validate`, `build:check`, acceptance probes.
|
|
142
142
|
6. **Evidence** — run `rfc.verification.emit`, commit evidence file.
|
|
143
143
|
7. **Review & Fix** — `fo-review` on all session code changes, `fo-fix` if findings (MANDATORY — do not omit from the plan).
|
|
144
|
+
8. **Stamp implemented** — run `rfc.implement.stamp --id RFC-XXXX --implementation-commit <sha>` to transition `accepted → implemented` (RFC). For ADRs, manually set `status: implemented` and `implementedAt` per `fo-idea-implement` step 4.10.
|
|
144
145
|
|
|
145
146
|
Mark **human review points** on steps that:
|
|
146
147
|
|