@warpgogol/forge 2.9.4 → 2.9.6

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 (104) hide show
  1. package/dist/bin/cli.js +0 -0
  2. package/dist/os/adr/handlers/implement-stamp.js +1 -1
  3. package/dist/os/adr/handlers/implement-stamp.js.map +1 -1
  4. package/dist/os/adr/handlers/list-create.d.ts.map +1 -1
  5. package/dist/os/adr/handlers/list-create.js +40 -4
  6. package/dist/os/adr/handlers/list-create.js.map +1 -1
  7. package/dist/os/adr/handlers/validate.d.ts.map +1 -1
  8. package/dist/os/adr/handlers/validate.js +10 -4
  9. package/dist/os/adr/handlers/validate.js.map +1 -1
  10. package/dist/os/adr/types.d.ts +1 -0
  11. package/dist/os/adr/types.d.ts.map +1 -1
  12. package/dist/os/adr/types.js +1 -0
  13. package/dist/os/adr/types.js.map +1 -1
  14. package/dist/os/core/handlers/package-health.d.ts.map +1 -1
  15. package/dist/os/core/handlers/package-health.js +8 -4
  16. package/dist/os/core/handlers/package-health.js.map +1 -1
  17. package/dist/os/core/handlers/pinned-validate.d.ts.map +1 -1
  18. package/dist/os/core/handlers/pinned-validate.js +2 -2
  19. package/dist/os/core/handlers/pinned-validate.js.map +1 -1
  20. package/dist/os/program/handlers/complete.js +2 -2
  21. package/dist/os/program/handlers/complete.js.map +1 -1
  22. package/dist/os/program/handlers/lease.js +1 -1
  23. package/dist/os/program/handlers/lease.js.map +1 -1
  24. package/dist/os/program/handlers/seal.js +2 -2
  25. package/dist/os/program/handlers/seal.js.map +1 -1
  26. package/dist/os/program/handlers/validate.js +3 -3
  27. package/dist/os/program/handlers/validate.js.map +1 -1
  28. package/dist/os/rfc/dna-trace.js +1 -1
  29. package/dist/os/rfc/dna-trace.js.map +1 -1
  30. package/dist/os/rfc/handlers/check.js +3 -3
  31. package/dist/os/rfc/handlers/check.js.map +1 -1
  32. package/dist/os/rfc/handlers/implement-stamp.js +1 -1
  33. package/dist/os/rfc/handlers/implement-stamp.js.map +1 -1
  34. package/dist/os/rfc/handlers/index-graph.js +4 -4
  35. package/dist/os/rfc/handlers/index-graph.js.map +1 -1
  36. package/dist/os/rfc/handlers/lifecycle.js +1 -1
  37. package/dist/os/rfc/handlers/lifecycle.js.map +1 -1
  38. package/dist/os/rfc/handlers/validate.d.ts.map +1 -1
  39. package/dist/os/rfc/handlers/validate.js +10 -4
  40. package/dist/os/rfc/handlers/validate.js.map +1 -1
  41. package/dist/os/session/handlers/validate.d.ts.map +1 -1
  42. package/dist/os/session/handlers/validate.js +10 -4
  43. package/dist/os/session/handlers/validate.js.map +1 -1
  44. package/dist/os/spec/live-spec-validate.js +2 -2
  45. package/dist/os/spec/live-spec-validate.js.map +1 -1
  46. package/dist/os/spec/spec-validate.js +1 -1
  47. package/dist/os/spec/spec-validate.js.map +1 -1
  48. package/dist/os/workflow/handlers.js +1 -1
  49. package/dist/os/workflow/handlers.js.map +1 -1
  50. package/dist/src/onboarding/create.js +1 -1
  51. package/dist/src/onboarding/create.js.map +1 -1
  52. package/dist/src/onboarding/doctor.js +1 -1
  53. package/dist/src/onboarding/doctor.js.map +1 -1
  54. package/dist/src/onboarding/init.d.ts.map +1 -1
  55. package/dist/src/onboarding/init.js +31 -1
  56. package/dist/src/onboarding/init.js.map +1 -1
  57. package/dist/src/onboarding/profile-validate.js +1 -1
  58. package/dist/src/onboarding/profile-validate.js.map +1 -1
  59. package/dist/src/utils/fs-trash.d.ts.map +1 -1
  60. package/dist/src/utils/fs-trash.js +1 -1
  61. package/dist/src/utils/fs-trash.js.map +1 -1
  62. package/dist/src/validators/note-frontmatter-validate.js +1 -1
  63. package/dist/src/validators/note-frontmatter-validate.js.map +1 -1
  64. package/dist/src/validators/note-link-validate.js +1 -1
  65. package/dist/src/validators/note-link-validate.js.map +1 -1
  66. package/os/adr/adr-0000-template.md +46 -0
  67. package/os/adr/handlers/implement-stamp.ts +1 -1
  68. package/os/adr/handlers/list-create.ts +48 -4
  69. package/os/adr/handlers/validate.ts +8 -4
  70. package/os/adr/types.ts +1 -0
  71. package/os/core/handlers/package-health.ts +9 -5
  72. package/os/core/handlers/pinned-validate.ts +4 -2
  73. package/os/program/handlers/complete.ts +2 -2
  74. package/os/program/handlers/lease.ts +1 -1
  75. package/os/program/handlers/seal.ts +2 -2
  76. package/os/program/handlers/validate.ts +3 -3
  77. package/os/rfc/dna-trace.ts +1 -1
  78. package/os/rfc/handlers/check.ts +3 -3
  79. package/os/rfc/handlers/implement-stamp.ts +1 -1
  80. package/os/rfc/handlers/index-graph.ts +4 -4
  81. package/os/rfc/handlers/lifecycle.ts +1 -1
  82. package/os/rfc/handlers/validate.ts +8 -4
  83. package/os/rfc/rfc-0000-template.md +16 -20
  84. package/os/session/handlers/validate.ts +8 -4
  85. package/os/spec/live-spec-validate.ts +2 -2
  86. package/os/spec/spec-validate.ts +1 -1
  87. package/os/workflow/handlers.ts +1 -1
  88. package/package.json +72 -194
  89. package/skills/_shared/fo-pipeline-conventions.md +5 -5
  90. package/skills/fo/fo-extract-dna/SKILL.md +1 -1
  91. package/skills/fo/fo-idea-audit/AUDIT-AXES.md +1 -1
  92. package/skills/fo/fo-idea-create-adr/SKILL.md +1 -1
  93. package/skills/fo/fo-idea-create-rfc/SKILL.md +3 -3
  94. package/skills/fo/fo-idea-implement/ADR-FLOW.md +2 -2
  95. package/skills/fo/fo-idea-implement/SKILL.md +1 -1
  96. package/skills/fo/fo-idea-plan/SKILL.md +2 -2
  97. package/skills/fo/fo-step-commit/SKILL.md +2 -2
  98. package/src/onboarding/create.ts +1 -1
  99. package/src/onboarding/doctor.ts +1 -1
  100. package/src/onboarding/init.ts +30 -1
  101. package/src/onboarding/profile-validate.ts +1 -1
  102. package/src/utils/fs-trash.ts +1 -1
  103. package/src/validators/note-frontmatter-validate.ts +1 -1
  104. package/src/validators/note-link-validate.ts +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@warpgogol/forge",
3
- "version": "2.9.4",
3
+ "version": "2.9.6",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -19,127 +19,127 @@
19
19
  "type": "git",
20
20
  "url": "git+https://github.com/syrokomskyi/forge.git"
21
21
  },
22
- "main": "./src/index.ts",
23
- "types": "./src/index.ts",
22
+ "main": "./dist/src/index.js",
23
+ "types": "./dist/src/index.d.ts",
24
24
  "bin": {
25
25
  "forge": "./bin/cli.js"
26
26
  },
27
27
  "exports": {
28
28
  ".": {
29
- "types": "./src/index.ts",
30
- "default": "./src/index.ts"
29
+ "types": "./dist/src/index.d.ts",
30
+ "default": "./dist/src/index.js"
31
31
  },
32
32
  "./types": {
33
- "types": "./src/types.ts",
34
- "default": "./src/types.ts"
33
+ "types": "./dist/src/types.d.ts",
34
+ "default": "./dist/src/types.js"
35
35
  },
36
36
  "./utils": {
37
- "types": "./src/utils/index.ts",
38
- "default": "./src/utils/index.ts"
37
+ "types": "./dist/src/utils/index.d.ts",
38
+ "default": "./dist/src/utils/index.js"
39
39
  },
40
40
  "./config": {
41
- "types": "./src/config/forge-config.ts",
42
- "default": "./src/config/forge-config.ts"
41
+ "types": "./dist/src/config/forge-config.d.ts",
42
+ "default": "./dist/src/config/forge-config.js"
43
43
  },
44
44
  "./os/core": {
45
- "types": "./os/core/core.module.ts",
46
- "default": "./os/core/core.module.ts"
45
+ "types": "./dist/os/core/core.module.d.ts",
46
+ "default": "./dist/os/core/core.module.js"
47
47
  },
48
48
  "./os/compass": {
49
- "types": "./os/compass/index.ts",
50
- "default": "./os/compass/index.ts"
49
+ "types": "./dist/os/compass/index.d.ts",
50
+ "default": "./dist/os/compass/index.js"
51
51
  },
52
52
  "./os/naming": {
53
- "types": "./os/naming/index.ts",
54
- "default": "./os/naming/index.ts"
53
+ "types": "./dist/os/naming/index.d.ts",
54
+ "default": "./dist/os/naming/index.js"
55
55
  },
56
56
  "./os/naming-module": {
57
- "types": "./os/naming/naming.module.ts",
58
- "default": "./os/naming/naming.module.ts"
57
+ "types": "./dist/os/naming/naming.module.d.ts",
58
+ "default": "./dist/os/naming/naming.module.js"
59
59
  },
60
60
  "./os/rfc": {
61
- "types": "./os/rfc/index.ts",
62
- "default": "./os/rfc/index.ts"
61
+ "types": "./dist/os/rfc/index.d.ts",
62
+ "default": "./dist/os/rfc/index.js"
63
63
  },
64
64
  "./os/rfc-module": {
65
- "types": "./os/rfc/rfc.module.ts",
66
- "default": "./os/rfc/rfc.module.ts"
65
+ "types": "./dist/os/rfc/rfc.module.d.ts",
66
+ "default": "./dist/os/rfc/rfc.module.js"
67
67
  },
68
68
  "./os/werkstatt": {
69
- "types": "./os/werkstatt/index.ts",
70
- "default": "./os/werkstatt/index.ts"
69
+ "types": "./dist/os/werkstatt/index.d.ts",
70
+ "default": "./dist/os/werkstatt/index.js"
71
71
  },
72
72
  "./os/workflow": {
73
- "types": "./os/workflow/index.ts",
74
- "default": "./os/workflow/index.ts"
73
+ "types": "./dist/os/workflow/index.d.ts",
74
+ "default": "./dist/os/workflow/index.js"
75
75
  },
76
76
  "./os/workflow-module": {
77
- "types": "./os/workflow/workflow.module.ts",
78
- "default": "./os/workflow/workflow.module.ts"
77
+ "types": "./dist/os/workflow/workflow.module.d.ts",
78
+ "default": "./dist/os/workflow/workflow.module.js"
79
79
  },
80
80
  "./os/spec-module": {
81
- "types": "./os/spec/spec.module.ts",
82
- "default": "./os/spec/spec.module.ts"
81
+ "types": "./dist/os/spec/spec.module.d.ts",
82
+ "default": "./dist/os/spec/spec.module.js"
83
83
  },
84
84
  "./os/adr": {
85
- "types": "./os/adr/index.ts",
86
- "default": "./os/adr/index.ts"
85
+ "types": "./dist/os/adr/index.d.ts",
86
+ "default": "./dist/os/adr/index.js"
87
87
  },
88
88
  "./os/adr-module": {
89
- "types": "./os/adr/adr.module.ts",
90
- "default": "./os/adr/adr.module.ts"
89
+ "types": "./dist/os/adr/adr.module.d.ts",
90
+ "default": "./dist/os/adr/adr.module.js"
91
91
  },
92
92
  "./os/plan": {
93
- "types": "./os/plan/index.ts",
94
- "default": "./os/plan/index.ts"
93
+ "types": "./dist/os/plan/index.d.ts",
94
+ "default": "./dist/os/plan/index.js"
95
95
  },
96
96
  "./os/plan-module": {
97
- "types": "./os/plan/plan.module.ts",
98
- "default": "./os/plan/plan.module.ts"
97
+ "types": "./dist/os/plan/plan.module.d.ts",
98
+ "default": "./dist/os/plan/plan.module.js"
99
99
  },
100
100
  "./os/audit": {
101
- "types": "./os/audit/index.ts",
102
- "default": "./os/audit/index.ts"
101
+ "types": "./dist/os/audit/index.d.ts",
102
+ "default": "./dist/os/audit/index.js"
103
103
  },
104
104
  "./os/audit-module": {
105
- "types": "./os/audit/audit.module.ts",
106
- "default": "./os/audit/audit.module.ts"
105
+ "types": "./dist/os/audit/audit.module.d.ts",
106
+ "default": "./dist/os/audit/audit.module.js"
107
107
  },
108
108
  "./os/session": {
109
- "types": "./os/session/index.ts",
110
- "default": "./os/session/index.ts"
109
+ "types": "./dist/os/session/index.d.ts",
110
+ "default": "./dist/os/session/index.js"
111
111
  },
112
112
  "./os/session-module": {
113
- "types": "./os/session/session.module.ts",
114
- "default": "./os/session/session.module.ts"
113
+ "types": "./dist/os/session/session.module.d.ts",
114
+ "default": "./dist/os/session/session.module.js"
115
115
  },
116
116
  "./os/mission": {
117
- "types": "./os/mission/index.ts",
118
- "default": "./os/mission/index.ts"
117
+ "types": "./dist/os/mission/index.d.ts",
118
+ "default": "./dist/os/mission/index.js"
119
119
  },
120
120
  "./os/mission-module": {
121
- "types": "./os/mission/mission.module.ts",
122
- "default": "./os/mission/mission.module.ts"
121
+ "types": "./dist/os/mission/mission.module.d.ts",
122
+ "default": "./dist/os/mission/mission.module.js"
123
123
  },
124
124
  "./os/exploration": {
125
- "types": "./os/exploration/index.ts",
126
- "default": "./os/exploration/index.ts"
125
+ "types": "./dist/os/exploration/index.d.ts",
126
+ "default": "./dist/os/exploration/index.js"
127
127
  },
128
128
  "./os/exploration-module": {
129
- "types": "./os/exploration/exploration.module.ts",
130
- "default": "./os/exploration/exploration.module.ts"
129
+ "types": "./dist/os/exploration/exploration.module.d.ts",
130
+ "default": "./dist/os/exploration/exploration.module.js"
131
131
  },
132
132
  "./os/notes": {
133
- "types": "./os/notes/index.ts",
134
- "default": "./os/notes/index.ts"
133
+ "types": "./dist/os/notes/index.d.ts",
134
+ "default": "./dist/os/notes/index.js"
135
135
  },
136
136
  "./os/notes-module": {
137
- "types": "./os/notes/notes.module.ts",
138
- "default": "./os/notes/notes.module.ts"
137
+ "types": "./dist/os/notes/notes.module.d.ts",
138
+ "default": "./dist/os/notes/notes.module.js"
139
139
  },
140
140
  "./os/program": {
141
- "types": "./os/program/program.module.ts",
142
- "default": "./os/program/program.module.ts"
141
+ "types": "./dist/os/program/program.module.d.ts",
142
+ "default": "./dist/os/program/program.module.js"
143
143
  }
144
144
  },
145
145
  "files": [
@@ -154,16 +154,6 @@
154
154
  "README.md",
155
155
  "LICENSE"
156
156
  ],
157
- "scripts": {
158
- "build": "pnpm exec tsc -p tsconfig.json",
159
- "build:check": "pnpm exec tsc -p tsconfig.json --noEmit",
160
- "lint": "pnpm exec eslint \"src/**/*.ts\" \"os/**/*.ts\"",
161
- "typecheck": "pnpm exec tsc -p tsconfig.json --noEmit",
162
- "test": "vitest run --passWithNoTests",
163
- "test:watch": "vitest",
164
- "test:tarball:node24": "node test-fixtures/node24-consumer/smoke.mjs",
165
- "prepublishOnly": "pnpm exec tsc -p tsconfig.json"
166
- },
167
157
  "dependencies": {
168
158
  "@aws-sdk/client-s3": "^3.700.0",
169
159
  "trash": "^10.1.1",
@@ -184,127 +174,15 @@
184
174
  "node": ">=24 <25"
185
175
  },
186
176
  "publishConfig": {
187
- "access": "public",
188
- "main": "./dist/src/index.js",
189
- "types": "./dist/src/index.d.ts",
190
- "exports": {
191
- ".": {
192
- "types": "./dist/src/index.d.ts",
193
- "default": "./dist/src/index.js"
194
- },
195
- "./types": {
196
- "types": "./dist/src/types.d.ts",
197
- "default": "./dist/src/types.js"
198
- },
199
- "./utils": {
200
- "types": "./dist/src/utils/index.d.ts",
201
- "default": "./dist/src/utils/index.js"
202
- },
203
- "./config": {
204
- "types": "./dist/src/config/forge-config.d.ts",
205
- "default": "./dist/src/config/forge-config.js"
206
- },
207
- "./os/core": {
208
- "types": "./dist/os/core/core.module.d.ts",
209
- "default": "./dist/os/core/core.module.js"
210
- },
211
- "./os/compass": {
212
- "types": "./dist/os/compass/index.d.ts",
213
- "default": "./dist/os/compass/index.js"
214
- },
215
- "./os/naming": {
216
- "types": "./dist/os/naming/index.d.ts",
217
- "default": "./dist/os/naming/index.js"
218
- },
219
- "./os/naming-module": {
220
- "types": "./dist/os/naming/naming.module.d.ts",
221
- "default": "./dist/os/naming/naming.module.js"
222
- },
223
- "./os/rfc": {
224
- "types": "./dist/os/rfc/index.d.ts",
225
- "default": "./dist/os/rfc/index.js"
226
- },
227
- "./os/rfc-module": {
228
- "types": "./dist/os/rfc/rfc.module.d.ts",
229
- "default": "./dist/os/rfc/rfc.module.js"
230
- },
231
- "./os/werkstatt": {
232
- "types": "./dist/os/werkstatt/index.d.ts",
233
- "default": "./dist/os/werkstatt/index.js"
234
- },
235
- "./os/workflow": {
236
- "types": "./dist/os/workflow/index.d.ts",
237
- "default": "./dist/os/workflow/index.js"
238
- },
239
- "./os/workflow-module": {
240
- "types": "./dist/os/workflow/workflow.module.d.ts",
241
- "default": "./dist/os/workflow/workflow.module.js"
242
- },
243
- "./os/spec-module": {
244
- "types": "./dist/os/spec/spec.module.d.ts",
245
- "default": "./dist/os/spec/spec.module.js"
246
- },
247
- "./os/adr": {
248
- "types": "./dist/os/adr/index.d.ts",
249
- "default": "./dist/os/adr/index.js"
250
- },
251
- "./os/adr-module": {
252
- "types": "./dist/os/adr/adr.module.d.ts",
253
- "default": "./dist/os/adr/adr.module.js"
254
- },
255
- "./os/plan": {
256
- "types": "./dist/os/plan/index.d.ts",
257
- "default": "./dist/os/plan/index.js"
258
- },
259
- "./os/plan-module": {
260
- "types": "./dist/os/plan/plan.module.d.ts",
261
- "default": "./dist/os/plan/plan.module.js"
262
- },
263
- "./os/audit": {
264
- "types": "./dist/os/audit/index.d.ts",
265
- "default": "./dist/os/audit/index.js"
266
- },
267
- "./os/audit-module": {
268
- "types": "./dist/os/audit/audit.module.d.ts",
269
- "default": "./dist/os/audit/audit.module.js"
270
- },
271
- "./os/session": {
272
- "types": "./dist/os/session/index.d.ts",
273
- "default": "./dist/os/session/index.js"
274
- },
275
- "./os/session-module": {
276
- "types": "./dist/os/session/session.module.d.ts",
277
- "default": "./dist/os/session/session.module.js"
278
- },
279
- "./os/mission": {
280
- "types": "./dist/os/mission/index.d.ts",
281
- "default": "./dist/os/mission/index.js"
282
- },
283
- "./os/mission-module": {
284
- "types": "./dist/os/mission/mission.module.d.ts",
285
- "default": "./dist/os/mission/mission.module.js"
286
- },
287
- "./os/exploration": {
288
- "types": "./dist/os/exploration/index.d.ts",
289
- "default": "./dist/os/exploration/index.js"
290
- },
291
- "./os/exploration-module": {
292
- "types": "./dist/os/exploration/exploration.module.d.ts",
293
- "default": "./dist/os/exploration/exploration.module.js"
294
- },
295
- "./os/notes": {
296
- "types": "./dist/os/notes/index.d.ts",
297
- "default": "./dist/os/notes/index.js"
298
- },
299
- "./os/notes-module": {
300
- "types": "./dist/os/notes/notes.module.d.ts",
301
- "default": "./dist/os/notes/notes.module.js"
302
- },
303
- "./os/program": {
304
- "types": "./dist/os/program/program.module.d.ts",
305
- "default": "./dist/os/program/program.module.js"
306
- }
307
- }
177
+ "access": "public"
308
178
  },
309
- "packageManager": "pnpm@11.10.0"
310
- }
179
+ "scripts": {
180
+ "build": "pnpm exec tsc -p tsconfig.json",
181
+ "build:check": "pnpm exec tsc -p tsconfig.json --noEmit",
182
+ "lint": "pnpm exec eslint \"src/**/*.ts\" \"os/**/*.ts\"",
183
+ "typecheck": "pnpm exec tsc -p tsconfig.json --noEmit",
184
+ "test": "vitest run --passWithNoTests",
185
+ "test:watch": "vitest",
186
+ "test:tarball:node24": "node test-fixtures/node24-consumer/smoke.mjs"
187
+ }
188
+ }
@@ -92,15 +92,15 @@ Every `run_command` call MUST use a 6-minute (360 000 ms) execution budget. This
92
92
  3. **If completed**: Read the output and proceed normally.
93
93
  4. **If still running after 6 min**: Abandon the command — do not wait further. Try an alternative approach (different command, different scope, or skip the step). If no alternative exists, retry the same command once with the same 6-min budget.
94
94
  5. **Max retries**: 2 attempts per command. After 2 failed attempts, report to the operator and ask how to proceed.
95
- 6. **No infinite waits**: NEVER call `command_status` with `WaitDurationSeconds` > 60. NEVER use `Blocking: true` for commands that may hang (builds, checks, `site-kernel run`, `astro check`, `tsc`, `pnpm install`).
95
+ 6. **No infinite waits**: NEVER call `command_status` with `WaitDurationSeconds` > 60. NEVER use `Blocking: true` for commands that may hang (builds, checks, long-running CLI commands, `astro check`, `tsc`, `pnpm install`).
96
96
  7. **Exceptions**: `Blocking: true` is allowed only for trivially fast commands (e.g., `node --version`, `git log -n 1`, `git status --short`) that are guaranteed to complete in seconds.
97
97
 
98
98
  ### Rationale
99
99
 
100
100
  - The `run_command` tool has no built-in timeout parameter. `WaitMsBeforeAsync` is the only mechanism to regain control after a fixed duration.
101
101
  - Abandoning a still-running process is acceptable — the process may complete in the background, but the agent is unblocked and can retry or try an alternative.
102
- - This covers all command classes: `pnpm exec werkstatt run ...`, `pnpm --filter <pkg> run build:check`, `astro check`, `git`, `pnpm install`, etc.
103
- - Site-kernel commands already have internal `timeoutMs`, but the agent-side 6-min budget is a safety net for ALL commands, not just site-kernel.
102
+ - This covers all command classes: `pnpm exec forge ...`, `pnpm --filter <pkg> run build:check`, `astro check`, `git`, `pnpm install`, etc.
103
+ - Project CLI commands may have internal `timeoutMs`, but the agent-side 6-min budget is a safety net for ALL commands, not just project CLI.
104
104
 
105
105
  ## Binding resolution and degradation
106
106
 
@@ -140,8 +140,8 @@ Skills reference bindings by key, never by value. To resolve a binding:
140
140
 
141
141
  A skill needs to run `rfc.validate` for `RFC-XXXX`:
142
142
 
143
- 1. Read `forge.yaml` → `bindings.commands.validateRfc` = `"pnpm exec werkstatt run rfc.validate {id} --json"`
144
- 2. Substitute `{id}` → `"pnpm exec werkstatt run rfc.validate RFC-XXXX --json"`
143
+ 1. Read `forge.yaml` → `bindings.commands.validateRfc` = `"forge rfc.validate {id} --json"`
144
+ 2. Substitute `{id}` → `"forge rfc.validate RFC-XXXX --json"`
145
145
  3. Run the resolved command.
146
146
 
147
147
  If `bindings.commands.validateRfc` were `null`, the skill would skip the step and report: `Degraded: commands.validateRfc — not configured in forge.yaml`.
@@ -52,7 +52,7 @@ Before proposing any candidate, read `ref(forge.yaml bindings.paths.invariantsFi
52
52
  - Which invariants are marked "Foundational invariant (pre-RFC)" vs "Established by RFC-XXXX".
53
53
  - Which invariants have been "Reclassified to feature".
54
54
 
55
- Also read the RFC template (`os/rfc/rfc-0000-template.md` inside `@warpgogol/forge`) to understand the `satisfies` field and the "DNA-N established by this RFC" marker pattern.
55
+ Also read the RFC template (`docs/rfcs/rfc-0000-template.md`) to understand the `satisfies` field and the "DNA-N established by this RFC" marker pattern.
56
56
 
57
57
  ### 3. Discover DNA candidates
58
58
 
@@ -7,7 +7,7 @@ Load this file when running step 4 of `fo-idea-audit`. For each axis, check ever
7
7
  Beyond V-13 (required sections exist) and V-14 (≥3 acceptance items), check that each section contains real content, not template placeholders or empty HTML comments:
8
8
 
9
9
  - **Decision** is a single decision in present tense ("The kernel gains…"), not a wishlist or "we should".
10
- - **CLI surface** shows exact `pnpm exec werkstatt run …` invocations with flags and scope.
10
+ - **CLI surface** shows exact project CLI invocations with flags and scope.
11
11
  - **TypeScript contracts** are minimal type signatures, not full implementations.
12
12
  - **File system responsibilities** table names concrete paths the RFC touches.
13
13
  - **Output format** documents the `--json` shape.
@@ -54,7 +54,7 @@ If any item is false, use `fo-idea-create-rfc` instead and stop.
54
54
  - **title** (required) — short imperative sentence.
55
55
  - **scope** — `package`, `app`, or `workspace`. Default `package`.
56
56
  - **decider** — default `architecture`. The named decider is the only role that may move the ADR out of `proposed`.
57
- - **reviewers** — default empty. When the operator has not specified a reviewer, read the default reviewer(s) from the `reviewers` field comment in `docs/adrs/adr-0000-template.md` (currently `human:andrii-syrokomskyi`). Set all listed default reviewers.
57
+ - **reviewers** — default empty. When the operator has not specified a reviewer, read the default reviewer(s) from the `reviewers` field comment in `docs/adrs/adr-0000-template.md`. Set all listed default reviewers.
58
58
  - **related** — any RFCs, ADRs, DNA invariants, or specs this decision relates to.
59
59
 
60
60
  ### 4. Grill the concept (skip if invoked with an accepted decision)
@@ -52,7 +52,7 @@ Ask the user for, or infer from context:
52
52
  - **liveSpec** — for feature-level RFCs (not governance/policy), suggest `liveSpec: true` to auto-derive a living spec domain from `packagesImpacted[0]`, or `liveSpec: <domain>` for an explicit domain. This enables automatic delta-merge into `docs/specs/live/<domain>.md` when the RFC is implemented.
53
53
  - **satisfies** — for `architecture` or `contract` RFCs, at least one `DNA-NN` invariant from `ref(forge.yaml bindings.paths.invariantsFile)`.
54
54
  - **related** — relevant RFCs, DNA ids, anti-patterns, specs.
55
- - **reviewer** — if the caller specifies a reviewer identity, use it. If not, default to `human:andrii-syrokomskyi` (matching the default in `os/rfc/rfc-0000-template.md` inside `@warpgogol/forge`) **only when the skill is also responsible for moving the RFC out of draft**. For a pure draft scaffold, leave `reviewers: []`.
55
+ - **reviewer** — if the caller specifies a reviewer identity, use it. If not, read the default reviewer(s) from the `reviewers` field comment in `docs/rfcs/rfc-0000-template.md` **only when the skill is also responsible for moving the RFC out of draft**. For a pure draft scaffold, leave `reviewers: []`.
56
56
 
57
57
  ### 3. Grill the concept
58
58
 
@@ -78,7 +78,7 @@ ref(forge.yaml bindings.commands.validateRfc) --create --title="<title>" --kind=
78
78
 
79
79
  ### 5. Fill every section
80
80
 
81
- Read the generated file and the full template (`os/rfc/rfc-0000-template.md` inside `@warpgogol/forge`) as a guide. Replace placeholder text in every required section:
81
+ Read the generated file and the full template (`docs/rfcs/rfc-0000-template.md`) as a guide. Replace placeholder text in every required section:
82
82
 
83
83
  - **Context** — the concrete situation, not a generic preamble.
84
84
  - **Problem** — the exact risk or gap this RFC closes.
@@ -129,7 +129,7 @@ Stage only the RFC file — do not stage unrelated changes. Another agent may be
129
129
  - Use the **full** RFC template for every RFC. Lightweight local decisions now use ADRs instead.
130
130
  - Do not change `status` past `draft`.
131
131
  - Do not add self-authorizing language such as "implementation may start before acceptance."
132
- - Do not default `reviewers` on drafts unless the skill is explicitly performing a status transition and the caller has not supplied a reviewer — in that case use `human:andrii-syrokomskyi`.
132
+ - Do not default `reviewers` on drafts unless the skill is explicitly performing a status transition and the caller has not supplied a reviewer — in that case read the default reviewer(s) from the `reviewers` field comment in `docs/rfcs/rfc-0000-template.md`.
133
133
  - Keep `rfc.validate` clean before presenting the draft.
134
134
  - **Commit the RFC draft.** The RFC file must be committed after creation and validation — never left in the working tree.
135
135
  - **Never manually determine the RFC number.** Always use `rfc.create` (step 4) to assign the number. The RFC number space includes archived RFCs under `docs/rfcs/archive/` — a top-level-only scan of `docs/rfcs/` misses them and produces duplicate IDs. `rfc.create` scans the full tree recursively and picks the correct next number.
@@ -18,7 +18,7 @@ If the ADR is `proposed` or `reviewing`, transition it to `accepted`:
18
18
 
19
19
  1. Set `status: accepted` in the frontmatter.
20
20
  2. Set `updatedAt: <today's date>`.
21
- 3. If `reviewers` is empty, read the default reviewer(s) from the `reviewers` field comment in `docs/adrs/adr-0000-template.md` (currently `human:andrii-syrokomskyi`). Set all listed default reviewers.
21
+ 3. If `reviewers` is empty, read the default reviewer(s) from the `reviewers` field comment in `docs/adrs/adr-0000-template.md`. Set all listed default reviewers.
22
22
  4. Commit:
23
23
 
24
24
  ```txt
@@ -56,7 +56,7 @@ After implementation is complete, run heavy checks for the impacted workspaces o
56
56
  1. ADR validation:
57
57
 
58
58
  ```sh
59
- pnpm exec werkstatt run adr.validate <adr-id> --json
59
+ ref(forge.yaml bindings.commands.validateAdr)
60
60
  ```
61
61
 
62
62
  2. Determine impacted packages/apps from the ADR's `scope` and the files touched during implementation. Build only those workspaces:
@@ -308,7 +308,7 @@ If the ADR is `proposed` or `reviewing`, transition it to `accepted`:
308
308
 
309
309
  1. Set `status: accepted` in the frontmatter.
310
310
  2. Set `updatedAt: <today's date>`.
311
- 3. If `reviewers` is empty, read the default reviewer(s) from the `reviewers` field comment in `docs/adrs/adr-0000-template.md` (currently `human:andrii-syrokomskyi`). Set all listed default reviewers.
311
+ 3. If `reviewers` is empty, read the default reviewer(s) from the `reviewers` field comment in `docs/adrs/adr-0000-template.md`. Set all listed default reviewers.
312
312
  4. Commit:
313
313
 
314
314
  ```txt
@@ -60,7 +60,7 @@ If all checks pass, proceed to step 0.3.
60
60
  If the RFC is `draft` or `reviewing` and has `enhancedAt` — the user's instruction to plan IS the architecture acceptance. Transition the RFC to `accepted`:
61
61
 
62
62
  1. Set `status: accepted`.
63
- 2. Set `reviewers` — if the operator specified a reviewer at invocation, use that. Otherwise, read the default reviewer(s) from the `reviewers` field comment in `os/rfc/rfc-0000-template.md` inside `@warpgogol/forge` (currently `human:andrii-syrokomskyi`). Set all listed default reviewers.
63
+ 2. Set `reviewers` — if the operator specified a reviewer at invocation, use that. Otherwise, read the default reviewer(s) from the `reviewers` field comment in `docs/rfcs/rfc-0000-template.md`. Set all listed default reviewers.
64
64
  3. Set `updatedAt` to today's date.
65
65
  4. Commit:
66
66
 
@@ -245,5 +245,5 @@ When an RFC was planned in this session, prefer implementing it in this session
245
245
  - The plan MUST NOT propose changing DNA invariants without a new superseding RFC.
246
246
  - The plan MUST respect RFC-XXXX: only `accepted → implemented` is agent-permitted; all other status transitions are human-only. The `draft → accepted` transition in step 0.3 is an exception authorized by the user's explicit instruction to plan the RFC.
247
247
  - The plan MUST reference the RFC's acceptance criteria as the source of truth for completion.
248
- - **Default reviewer source.** When transitioning `draft → accepted` and the operator has not specified a reviewer, read the default reviewer(s) from the `reviewers` field comment in `os/rfc/rfc-0000-template.md` inside `@warpgogol/forge` (currently `human:andrii-syrokomskyi`). Set all listed default reviewers.
248
+ - **Default reviewer source.** When transitioning `draft → accepted` and the operator has not specified a reviewer, read the default reviewer(s) from the `reviewers` field comment in `docs/rfcs/rfc-0000-template.md`. Set all listed default reviewers.
249
249
  - **No pauses for recoverable tool errors.** If a tool call fails with a recoverable error — e.g. `write_to_file` content too long, JSON truncation, line count/character limit exceeded, or similar — do not stop and ask the user. Recover autonomously: split the content into smaller writes, use `edit`/`multi_edit`, decompose oversized files, and retry immediately. The operator's default answer to "Shall I proceed?" is always "yes".
@@ -34,8 +34,8 @@ After every standalone operator request that produces file changes, perform the
34
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.** 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.
37
+ 5. **Commit in monorepo.** Use `pnpm exec werkstatt run ecosystem.commit --message "<message>"` to commit in the werkstatt monorepo. This handles platform-scope version bumps and X-Platform-Bump trailers automatically. Stage files with `git add <paths>` first (the pre-commit hook blocks raw `git commit` for platform-scope files). For non-platform-only changes (docs/**), `ecosystem.commit` delegates to a plain `git commit` without version bump.
38
+ 6. **Commit in mission workpiece (if applicable).** If the agent changed files in the active mission workpiece, commit there via `git commit` in the workpiece directory.
39
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.
40
40
 
41
41
  ## What this skill does NOT do
@@ -297,7 +297,7 @@ export async function runCreate(
297
297
 
298
298
  if (initResult.status !== "pass") {
299
299
  if (outputFormat === "pretty") {
300
- logger.error(`Init failed with ${initResult.errors.length} error(s):`);
300
+ logger.error(`Init failed with ${initResult.errors.length} error${initResult.errors.length === 1 ? "" : "s"}:`);
301
301
  for (const err of initResult.errors.slice(0, 5)) {
302
302
  logger.error(` ${err}`);
303
303
  }
@@ -1136,7 +1136,7 @@ export async function runDoctor(
1136
1136
 
1137
1137
  const parts: string[] = [];
1138
1138
  if (allViolations.length > 0) {
1139
- parts.push(`${allViolations.length} violation(s)`);
1139
+ parts.push(`${allViolations.length} violation${allViolations.length === 1 ? "" : "s"}`);
1140
1140
  for (const v of allViolations.slice(0, 3)) {
1141
1141
  parts.push(`${v.invariantId}: ${v.file} — ${v.message}`);
1142
1142
  }
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  <MODULE_CONTRACT>
3
- <purpose>forge.init — deploys forge into a project: creates forge.yaml, PREFERENCES.md, copies skills to .agents/skills/, creates docs directories, copies RFC template. Config-driven via resolveForgeRoot and loadForgeConfig.</purpose>
3
+ <purpose>forge.init — deploys forge into a project: creates forge.yaml, PREFERENCES.md, copies skills to .agents/skills/, creates docs directories, copies RFC and ADR templates. Config-driven via resolveForgeRoot and loadForgeConfig.</purpose>
4
4
  <non-goals>
5
5
  <item>Do not overwrite existing forge.yaml, PREFERENCES.md, or kernel.config.ts — skip with warning.</item>
6
6
  <item>Do not generate AGENTS.md — that is forge.agents.generate's responsibility.</item>
@@ -334,6 +334,35 @@ export function runInit(
334
334
  }
335
335
  }
336
336
 
337
+ // 5. Copy neutral RFC and ADR templates into the project's docs directories.
338
+ // Templates are copied from the forge package so new projects can create
339
+ // RFCs and ADRs without falling back to the forge package's internal copy.
340
+ // Existing templates are never overwritten.
341
+ const templatesToCopy = [
342
+ {
343
+ src: path.join(forgeRoot, "os", "rfc", "rfc-0000-template.md"),
344
+ destRel: `${config.paths.rfcsDir}/rfc-0000-template.md`,
345
+ label: "docs/rfcs/rfc-0000-template.md",
346
+ },
347
+ {
348
+ src: path.join(forgeRoot, "os", "adr", "adr-0000-template.md"),
349
+ destRel: `${config.paths.adrsDir}/adr-0000-template.md`,
350
+ label: "docs/adrs/adr-0000-template.md",
351
+ },
352
+ ];
353
+ for (const { src, destRel, label } of templatesToCopy) {
354
+ const destPath = path.join(workspaceRoot, destRel);
355
+ if (fs.existsSync(destPath)) {
356
+ skipped.push(`${label} (already exists)`);
357
+ } else if (fs.existsSync(src)) {
358
+ fs.mkdirSync(path.dirname(destPath), { recursive: true });
359
+ fs.writeFileSync(destPath, fs.readFileSync(src, "utf8"), "utf8");
360
+ created.push(label);
361
+ } else {
362
+ errors.push(`Template source not found: ${src}`);
363
+ }
364
+ }
365
+
337
366
  return {
338
367
  command: "forge.init",
339
368
  status: errors.length === 0 ? "pass" : "fail",
@@ -111,7 +111,7 @@ export async function runProfileValidate(
111
111
  for (const p of profileResults) {
112
112
  const icon = p.valid ? "✓" : "✖";
113
113
  const fn = p.valid ? logger.success : logger.error;
114
- fn(`${icon} ${p.id}: ${p.valid ? "valid" : `${p.errors.length} error(s)`}`);
114
+ fn(`${icon} ${p.id}: ${p.valid ? "valid" : `${p.errors.length} error${p.errors.length === 1 ? "" : "s"}`}`);
115
115
  for (const err of p.errors) {
116
116
  logger.error(` - ${err}`);
117
117
  }
@@ -16,9 +16,9 @@ Windows.</purpose>
16
16
  */
17
17
 
18
18
  import { existsSync } from "node:fs";
19
- import trash from "trash";
20
19
 
21
20
  export async function trashPath(targetPath: string): Promise<void> {
22
21
  if (!existsSync(targetPath)) return;
22
+ const { default: trash } = await import("trash");
23
23
  await trash(targetPath, { glob: false });
24
24
  }
@@ -136,7 +136,7 @@ export function runNoteFrontmatterValidate(
136
136
  exitCode: violations.length > 0 ? 1 : 0,
137
137
  summary:
138
138
  violations.length > 0
139
- ? `note.frontmatter.validate: ${violations.length} violation(s) found`
139
+ ? `note.frontmatter.validate: ${violations.length} violation${violations.length === 1 ? "" : "s"} found`
140
140
  : "note.frontmatter.validate: OK — 0 violations",
141
141
  };
142
142
  }
@@ -139,7 +139,7 @@ export function runNoteLinkValidate(
139
139
  exitCode: violations.length > 0 ? 1 : 0,
140
140
  summary:
141
141
  violations.length > 0
142
- ? `note.link.validate: ${violations.length} violation(s) found`
142
+ ? `note.link.validate: ${violations.length} violation${violations.length === 1 ? "" : "s"} found`
143
143
  : "note.link.validate: OK — 0 violations",
144
144
  };
145
145
  }