@t275005746/gse 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/ISSUE_TEMPLATE/bug_report.yml +42 -42
- package/.github/ISSUE_TEMPLATE/change_request.yml +50 -50
- package/.github/ISSUE_TEMPLATE/config.yml +5 -5
- package/.github/PULL_REQUEST_TEMPLATE.md +38 -38
- package/.github/workflows/validate-gse.yml +33 -33
- package/.gse/README.md +18 -18
- package/.gse/gse-development-protocol.md +50 -50
- package/.gse/project-profile.md +29 -29
- package/.gse/quality-gates.md +25 -25
- package/.gse/releases/public-registry-publication-npm.md +49 -0
- package/.gse/releases/public-release-owner-required.md +65 -65
- package/.gse/releases/public-security-contact-owner-required.md +45 -45
- package/.gse/state.json +3 -4
- package/CHANGELOG.md +24 -24
- package/CONTRIBUTING.md +64 -64
- package/LICENSE +21 -21
- package/README.md +1 -1
- package/README.zh-CN.md +1 -1
- package/SECURITY.md +41 -41
- package/SUPPORT.md +38 -38
- package/assets/marketplace/README.md +7 -7
- package/assets/marketplace/gse-listing.json +75 -75
- package/assets/templates/acceptance-execution-packet.md +73 -73
- package/assets/templates/adr.md +14 -14
- package/assets/templates/change-brief.md +16 -16
- package/assets/templates/design.md +18 -18
- package/assets/templates/dispatch-packet.md +104 -104
- package/assets/templates/evidence.md +14 -14
- package/assets/templates/execution-quality-pack.md +65 -65
- package/assets/templates/goal-map.md +21 -21
- package/assets/templates/host-adapter.md +48 -48
- package/assets/templates/host-ui-invocation-record.md +42 -42
- package/assets/templates/incident-review.md +60 -60
- package/assets/templates/public-channel-publication-record.md +49 -49
- package/assets/templates/public-ci-run-record.md +53 -53
- package/assets/templates/public-release-record.md +65 -65
- package/assets/templates/public-repository-settings-record.md +59 -59
- package/assets/templates/public-security-contact-record.md +45 -45
- package/assets/templates/release-trust-record.md +32 -32
- package/assets/templates/review.md +18 -18
- package/assets/templates/spec.md +16 -16
- package/assets/templates/target-adoption-evidence.md +29 -29
- package/assets/templates/tasks.md +17 -17
- package/assets/templates/update-release-acceptance-record.md +58 -58
- package/examples/README.md +22 -22
- package/examples/agent-runtime-host/.claude/gse-adapter.md +6 -6
- package/examples/agent-runtime-host/.codex/gse-adapter.md +7 -7
- package/examples/agent-runtime-host/.gse/goal-map.md +7 -7
- package/examples/agent-runtime-host/.gse/project-profile.md +27 -27
- package/examples/agent-runtime-host/.gse/tooling.md +5 -5
- package/examples/agent-runtime-host/.mcp.json +9 -9
- package/examples/agent-runtime-host/AGENTS.md +5 -5
- package/examples/agent-runtime-host/README.md +10 -10
- package/examples/agent-runtime-host/docs/model-routing.md +5 -5
- package/examples/cli-tool/.gse/project-profile.md +21 -21
- package/examples/cli-tool/AGENTS.md +5 -5
- package/examples/cli-tool/README.md +12 -12
- package/examples/cli-tool/package.json +21 -21
- package/examples/small-app/.env.example +2 -2
- package/examples/small-app/.github/workflows/ci.yml +8 -8
- package/examples/small-app/AGENTS.md +5 -5
- package/examples/small-app/README.md +12 -12
- package/examples/small-app/package.json +26 -26
- package/examples/small-app/playwright.config.ts +4 -4
- package/package.json +53 -53
- package/references/adoption-recipes.md +171 -171
- package/references/agent-roles.md +49 -49
- package/references/architecture-health.md +101 -101
- package/references/benchmark-audit.md +73 -73
- package/references/community-channels.md +46 -46
- package/references/compatibility.md +70 -70
- package/references/design-basis.md +38 -38
- package/references/domain-model.md +129 -129
- package/references/domain-quality-gates.md +75 -75
- package/references/drift-audit.md +81 -81
- package/references/evidence-taxonomy.md +123 -123
- package/references/file-ownership.md +107 -107
- package/references/final-readiness.md +84 -84
- package/references/forward-test.md +133 -133
- package/references/goal-map.md +36 -36
- package/references/host-adapters.md +119 -119
- package/references/learning-system.md +35 -35
- package/references/marketplace-discovery.md +46 -46
- package/references/model-routing.md +103 -103
- package/references/open-source-defaults.md +39 -39
- package/references/operating-model.md +52 -52
- package/references/packaging.md +277 -277
- package/references/project-agent-workspace.md +89 -89
- package/references/project-bootstrap.md +122 -122
- package/references/project-profile.md +57 -57
- package/references/public-release.md +174 -174
- package/references/quality-gates.md +100 -100
- package/references/recovery.md +176 -176
- package/references/release-trust.md +43 -43
- package/references/release.md +126 -126
- package/references/review.md +141 -141
- package/references/router.md +90 -90
- package/references/spec-workflow.md +66 -66
- package/references/task-levels.md +81 -81
- package/references/tool-adapters.md +73 -73
- package/scripts/audit-acceptance-execution-packet.mjs +133 -133
- package/scripts/audit-adoption-recipes.mjs +99 -99
- package/scripts/audit-change-lifecycle.mjs +77 -77
- package/scripts/audit-change-system.mjs +134 -134
- package/scripts/audit-ci-readiness.mjs +107 -107
- package/scripts/audit-close-gate.mjs +323 -323
- package/scripts/audit-command-adapters.mjs +91 -91
- package/scripts/audit-command-execution.mjs +210 -210
- package/scripts/audit-compatibility.mjs +149 -149
- package/scripts/audit-completion-readiness.mjs +292 -292
- package/scripts/audit-distribution.mjs +251 -251
- package/scripts/audit-domain-quality-gates.mjs +108 -108
- package/scripts/audit-evidence-placeholders.mjs +126 -126
- package/scripts/audit-final-readiness-promotion.mjs +255 -255
- package/scripts/audit-final-readiness.mjs +226 -226
- package/scripts/audit-fixtures.mjs +154 -154
- package/scripts/audit-fresh-session-readiness.mjs +177 -177
- package/scripts/audit-host-runtime-evidence-handoff.mjs +159 -159
- package/scripts/audit-host-runtime-invocation-drill.mjs +240 -240
- package/scripts/audit-host-runtime-invocations.mjs +254 -254
- package/scripts/audit-host-ui-invocation.mjs +132 -132
- package/scripts/audit-marketplace-discovery.mjs +122 -122
- package/scripts/audit-npm-package-metadata.mjs +155 -155
- package/scripts/audit-npm-publish-dry-run.mjs +191 -169
- package/scripts/audit-npm-tarball-install.mjs +191 -191
- package/scripts/audit-open-source-defaults.mjs +92 -92
- package/scripts/audit-open-source-readiness.mjs +97 -97
- package/scripts/audit-project.mjs +138 -138
- package/scripts/audit-public-acceptance-command-dry-run-drill.mjs +203 -203
- package/scripts/audit-public-acceptance-readiness.mjs +224 -224
- package/scripts/audit-public-channel-publication.mjs +248 -248
- package/scripts/audit-public-ci-run.mjs +184 -184
- package/scripts/audit-public-collaboration-templates.mjs +98 -98
- package/scripts/audit-public-external-gate-probe.mjs +206 -206
- package/scripts/audit-public-release-decision.mjs +201 -201
- package/scripts/audit-public-release-metadata.mjs +176 -176
- package/scripts/audit-public-repository-settings.mjs +237 -237
- package/scripts/audit-public-security-contact.mjs +171 -171
- package/scripts/audit-readme-docs.mjs +6 -4
- package/scripts/audit-recovery-readiness.mjs +98 -98
- package/scripts/audit-release-readiness.mjs +106 -106
- package/scripts/audit-release-trust.mjs +62 -62
- package/scripts/audit-remote-distribution.mjs +266 -266
- package/scripts/audit-roadmap-consistency.mjs +235 -235
- package/scripts/audit-signing.mjs +147 -147
- package/scripts/audit-state-freshness.mjs +14 -9
- package/scripts/audit-target-adoption-evidence.mjs +117 -117
- package/scripts/audit-target-project.mjs +507 -507
- package/scripts/audit-update-release-acceptance.mjs +136 -136
- package/scripts/audit-v1-target-validation.mjs +269 -269
- package/scripts/audit-validation-profiles.mjs +125 -125
- package/scripts/close-change.mjs +116 -116
- package/scripts/discover-project-profile.mjs +307 -307
- package/scripts/generate-command-adapter.mjs +231 -231
- package/scripts/generate-final-acceptance-packet.mjs +181 -181
- package/scripts/generate-final-form-progress-report.mjs +205 -205
- package/scripts/generate-host-runtime-evidence-handoff.mjs +206 -206
- package/scripts/generate-owner-external-gate-kit.mjs +295 -295
- package/scripts/generate-public-acceptance-handoff.mjs +168 -168
- package/scripts/generate-public-release-checklist.mjs +207 -207
- package/scripts/generate-release-bundle.mjs +505 -505
- package/scripts/generate-release-owner-action-plan.mjs +172 -172
- package/scripts/generate-release-status-manifest.mjs +200 -200
- package/scripts/generate-session-prompt.mjs +188 -188
- package/scripts/gse.mjs +67 -67
- package/scripts/init-change.mjs +265 -265
- package/scripts/init-project.mjs +785 -785
- package/scripts/install-gse.mjs +234 -234
- package/scripts/lib/evidence-placeholders.mjs +28 -28
- package/scripts/package-gse.mjs +174 -174
- package/scripts/probe-public-external-gates.mjs +167 -167
- package/scripts/record-host-invocation.mjs +151 -151
- package/scripts/record-public-channel-publication.mjs +178 -178
- package/scripts/record-public-ci-run.mjs +180 -180
- package/scripts/record-public-release.mjs +175 -175
- package/scripts/record-public-repository-settings.mjs +209 -209
- package/scripts/record-public-security-contact.mjs +157 -157
- package/scripts/sign-gse-package.mjs +83 -83
- package/scripts/update-project-state.mjs +223 -223
- package/scripts/verify-gse-package.mjs +85 -85
package/scripts/init-change.mjs
CHANGED
|
@@ -1,265 +1,265 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import fs from 'node:fs'
|
|
3
|
-
import os from 'node:os'
|
|
4
|
-
import path from 'node:path'
|
|
5
|
-
|
|
6
|
-
const args = process.argv.slice(2)
|
|
7
|
-
|
|
8
|
-
function readArg(name, fallback = null) {
|
|
9
|
-
const index = args.indexOf(name)
|
|
10
|
-
if (index === -1) return fallback
|
|
11
|
-
return args[index + 1] ?? fallback
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
const jsonOnly = args.includes('--json')
|
|
15
|
-
const selfTest = args.includes('--self-test') || !args.includes('--target')
|
|
16
|
-
const targetArg = readArg('--target')
|
|
17
|
-
const force = args.includes('--force')
|
|
18
|
-
const changeIdArg = readArg('--change-id', 'sample-change')
|
|
19
|
-
const level = readArg('--level', 'standard')
|
|
20
|
-
const validLevels = new Set(['lite', 'standard', 'enterprise'])
|
|
21
|
-
|
|
22
|
-
if (!validLevels.has(level)) {
|
|
23
|
-
console.error(`Invalid --level "${level}". Expected lite, standard, or enterprise.`)
|
|
24
|
-
process.exit(1)
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function slug(value) {
|
|
28
|
-
return String(value || '')
|
|
29
|
-
.trim()
|
|
30
|
-
.toLowerCase()
|
|
31
|
-
.replace(/[^a-z0-9._-]+/g, '-')
|
|
32
|
-
.replace(/^-+|-+$/g, '') || 'change'
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
function writeIfMissing(filePath, content) {
|
|
36
|
-
fs.mkdirSync(path.dirname(filePath), { recursive: true })
|
|
37
|
-
if (!force && fs.existsSync(filePath)) return 'skipped'
|
|
38
|
-
fs.writeFileSync(filePath, content.trimStart().replace(/\n/g, '\r\n'), 'utf8')
|
|
39
|
-
return fs.existsSync(filePath) ? (force ? 'written-or-overwritten' : 'written') : 'failed'
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
function createFixture() {
|
|
43
|
-
const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'gse-init-change-'))
|
|
44
|
-
fs.mkdirSync(path.join(dir, '.gse'), { recursive: true })
|
|
45
|
-
fs.writeFileSync(path.join(dir, '.gse', 'goal-map.md'), '# Goal Map\n', 'utf8')
|
|
46
|
-
fs.writeFileSync(path.join(dir, '.gse', 'quality-gates.md'), '# Quality Gates\n', 'utf8')
|
|
47
|
-
return dir
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
function renderBrief(changeId) {
|
|
51
|
-
return `# Change Brief
|
|
52
|
-
|
|
53
|
-
Change ID: ${changeId}
|
|
54
|
-
|
|
55
|
-
## Outcome
|
|
56
|
-
|
|
57
|
-
## Scope
|
|
58
|
-
|
|
59
|
-
## Non-goals
|
|
60
|
-
|
|
61
|
-
## Acceptance
|
|
62
|
-
|
|
63
|
-
## Evidence Plan
|
|
64
|
-
|
|
65
|
-
## Risks
|
|
66
|
-
|
|
67
|
-
## Next Action
|
|
68
|
-
`
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
function renderSpec(changeId) {
|
|
72
|
-
return `# Spec
|
|
73
|
-
|
|
74
|
-
Change ID: ${changeId}
|
|
75
|
-
|
|
76
|
-
## User Outcome
|
|
77
|
-
|
|
78
|
-
## Behavior
|
|
79
|
-
|
|
80
|
-
## State / Data Flow
|
|
81
|
-
|
|
82
|
-
## Error and Recovery
|
|
83
|
-
|
|
84
|
-
## Permissions and Privacy
|
|
85
|
-
|
|
86
|
-
## Acceptance Criteria
|
|
87
|
-
|
|
88
|
-
## Non-goals
|
|
89
|
-
`
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
function renderDesign(changeId) {
|
|
93
|
-
return `# Design
|
|
94
|
-
|
|
95
|
-
Change ID: ${changeId}
|
|
96
|
-
|
|
97
|
-
## Approach
|
|
98
|
-
|
|
99
|
-
## State / Data Flow
|
|
100
|
-
|
|
101
|
-
## Interfaces And Contracts
|
|
102
|
-
|
|
103
|
-
## Permissions And Privacy
|
|
104
|
-
|
|
105
|
-
## Error And Recovery
|
|
106
|
-
|
|
107
|
-
## Alternatives Considered
|
|
108
|
-
|
|
109
|
-
## Rollback
|
|
110
|
-
|
|
111
|
-
## Open Questions
|
|
112
|
-
`
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
function renderTasks(changeId) {
|
|
116
|
-
return `# Tasks
|
|
117
|
-
|
|
118
|
-
Change ID: ${changeId}
|
|
119
|
-
|
|
120
|
-
## Slice Plan
|
|
121
|
-
|
|
122
|
-
- [ ] Define outcome, scope, acceptance, evidence, risk, and next action.
|
|
123
|
-
- [ ] Locate existing patterns and ownership boundaries.
|
|
124
|
-
- [ ] Implement the smallest verifiable change.
|
|
125
|
-
- [ ] Run focused verification.
|
|
126
|
-
- [ ] Record evidence and residual risk.
|
|
127
|
-
- [ ] Update state, goal map, and handoff notes when relevant.
|
|
128
|
-
|
|
129
|
-
## Non-Goals
|
|
130
|
-
|
|
131
|
-
## Dependencies
|
|
132
|
-
|
|
133
|
-
## Stop Conditions
|
|
134
|
-
`
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
function renderEvidence(changeId) {
|
|
138
|
-
return `# Evidence
|
|
139
|
-
|
|
140
|
-
Change ID: ${changeId}
|
|
141
|
-
|
|
142
|
-
## Commands
|
|
143
|
-
|
|
144
|
-
## Results
|
|
145
|
-
|
|
146
|
-
## Files Changed
|
|
147
|
-
|
|
148
|
-
## Evidence Status
|
|
149
|
-
|
|
150
|
-
result | verified | accepted | not ready
|
|
151
|
-
|
|
152
|
-
## Residual Risk
|
|
153
|
-
|
|
154
|
-
## Follow-up
|
|
155
|
-
`
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
function renderReview(changeId) {
|
|
159
|
-
return `# Review
|
|
160
|
-
|
|
161
|
-
Change ID: ${changeId}
|
|
162
|
-
|
|
163
|
-
## Spec Compliance
|
|
164
|
-
|
|
165
|
-
## Code Quality
|
|
166
|
-
|
|
167
|
-
## Architecture / Ownership
|
|
168
|
-
|
|
169
|
-
## Security / Privacy
|
|
170
|
-
|
|
171
|
-
## Regression Risk
|
|
172
|
-
|
|
173
|
-
## Evidence Review
|
|
174
|
-
|
|
175
|
-
## Findings
|
|
176
|
-
|
|
177
|
-
## Closure
|
|
178
|
-
`
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
function renderExecutionPack(changeId) {
|
|
182
|
-
return `# Execution Quality Pack
|
|
183
|
-
|
|
184
|
-
Change ID: ${changeId}
|
|
185
|
-
|
|
186
|
-
## Task Profile
|
|
187
|
-
|
|
188
|
-
- Level: ${level}
|
|
189
|
-
- Change type:
|
|
190
|
-
- User-visible impact:
|
|
191
|
-
- Data/security/release impact:
|
|
192
|
-
|
|
193
|
-
## Required Skills Or Roles
|
|
194
|
-
|
|
195
|
-
| Role / Skill | Purpose | Required | Evidence |
|
|
196
|
-
|---|---|---|---|
|
|
197
|
-
| Coordinator | Scope, final judgment, integration | yes | plan/state/evidence |
|
|
198
|
-
| Code Locator | Files, symbols, existing tests | when code changes | search/LSP notes |
|
|
199
|
-
| Builder | Bounded implementation | when files change | diff + focused check |
|
|
200
|
-
| QA / Verification | Focused proof | yes | command/browser/API smoke |
|
|
201
|
-
| Reviewer | Spec, quality, architecture, security | risk-based | review notes |
|
|
202
|
-
|
|
203
|
-
## Tool Routing
|
|
204
|
-
|
|
205
|
-
| Tool | Use When | Status | Fallback |
|
|
206
|
-
|---|---|---|---|
|
|
207
|
-
| rg / rg --files | Code and doc location | recommended | shell listing |
|
|
208
|
-
| LSP / index | Large or typed codebase | unknown | rg + existing tests |
|
|
209
|
-
| Browser / Playwright | UI or user-visible flow | unknown | component/API smoke plus notes |
|
|
210
|
-
| OpenSpec | Capability/API/state contract change | optional | .gse/changes/ markdown |
|
|
211
|
-
| Comet | Full lifecycle change | optional | GSE phase/status files |
|
|
212
|
-
| Superpowers | Complex staged execution/review | optional | GSE roles + quality gates |
|
|
213
|
-
| Subagents | Parallel bounded work | unknown | sequential role execution |
|
|
214
|
-
|
|
215
|
-
## Quality Gates Selected
|
|
216
|
-
|
|
217
|
-
## Evidence Plan
|
|
218
|
-
|
|
219
|
-
## Review And Closure
|
|
220
|
-
`
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
function initChange(target) {
|
|
224
|
-
const resolvedTarget = path.resolve(target)
|
|
225
|
-
const changeId = slug(changeIdArg)
|
|
226
|
-
const changeDir = path.join(resolvedTarget, '.gse', 'changes', changeId)
|
|
227
|
-
const files = [
|
|
228
|
-
['brief.md', renderBrief(changeId)],
|
|
229
|
-
['spec.md', renderSpec(changeId)],
|
|
230
|
-
['design.md', renderDesign(changeId)],
|
|
231
|
-
['tasks.md', renderTasks(changeId)],
|
|
232
|
-
['evidence.md', renderEvidence(changeId)],
|
|
233
|
-
['review.md', renderReview(changeId)],
|
|
234
|
-
['execution-quality-pack.md', renderExecutionPack(changeId)],
|
|
235
|
-
]
|
|
236
|
-
const results = files.map(([name, content]) => ({
|
|
237
|
-
relativePath: path.join('.gse', 'changes', changeId, name).replace(/\\/g, '/'),
|
|
238
|
-
status: writeIfMissing(path.join(changeDir, name), content),
|
|
239
|
-
}))
|
|
240
|
-
const written = results.filter((item) => item.status !== 'skipped').length
|
|
241
|
-
const skipped = results.filter((item) => item.status === 'skipped').length
|
|
242
|
-
return {
|
|
243
|
-
target: resolvedTarget,
|
|
244
|
-
generatedAt: new Date().toISOString(),
|
|
245
|
-
changeId,
|
|
246
|
-
level,
|
|
247
|
-
force,
|
|
248
|
-
summary: {
|
|
249
|
-
status: 'passed',
|
|
250
|
-
written,
|
|
251
|
-
skipped,
|
|
252
|
-
total: results.length,
|
|
253
|
-
},
|
|
254
|
-
results,
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
const target = selfTest ? createFixture() : targetArg
|
|
259
|
-
const report = initChange(target)
|
|
260
|
-
|
|
261
|
-
if (jsonOnly) console.log(JSON.stringify(report, null, 2))
|
|
262
|
-
else {
|
|
263
|
-
console.log(`# GSE Change Init\n\nTarget: ${report.target}\nChange: ${report.changeId}\nLevel: ${report.level}`)
|
|
264
|
-
for (const item of report.results) console.log(`- ${item.relativePath}: ${item.status}`)
|
|
265
|
-
}
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import fs from 'node:fs'
|
|
3
|
+
import os from 'node:os'
|
|
4
|
+
import path from 'node:path'
|
|
5
|
+
|
|
6
|
+
const args = process.argv.slice(2)
|
|
7
|
+
|
|
8
|
+
function readArg(name, fallback = null) {
|
|
9
|
+
const index = args.indexOf(name)
|
|
10
|
+
if (index === -1) return fallback
|
|
11
|
+
return args[index + 1] ?? fallback
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const jsonOnly = args.includes('--json')
|
|
15
|
+
const selfTest = args.includes('--self-test') || !args.includes('--target')
|
|
16
|
+
const targetArg = readArg('--target')
|
|
17
|
+
const force = args.includes('--force')
|
|
18
|
+
const changeIdArg = readArg('--change-id', 'sample-change')
|
|
19
|
+
const level = readArg('--level', 'standard')
|
|
20
|
+
const validLevels = new Set(['lite', 'standard', 'enterprise'])
|
|
21
|
+
|
|
22
|
+
if (!validLevels.has(level)) {
|
|
23
|
+
console.error(`Invalid --level "${level}". Expected lite, standard, or enterprise.`)
|
|
24
|
+
process.exit(1)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function slug(value) {
|
|
28
|
+
return String(value || '')
|
|
29
|
+
.trim()
|
|
30
|
+
.toLowerCase()
|
|
31
|
+
.replace(/[^a-z0-9._-]+/g, '-')
|
|
32
|
+
.replace(/^-+|-+$/g, '') || 'change'
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function writeIfMissing(filePath, content) {
|
|
36
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true })
|
|
37
|
+
if (!force && fs.existsSync(filePath)) return 'skipped'
|
|
38
|
+
fs.writeFileSync(filePath, content.trimStart().replace(/\n/g, '\r\n'), 'utf8')
|
|
39
|
+
return fs.existsSync(filePath) ? (force ? 'written-or-overwritten' : 'written') : 'failed'
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function createFixture() {
|
|
43
|
+
const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'gse-init-change-'))
|
|
44
|
+
fs.mkdirSync(path.join(dir, '.gse'), { recursive: true })
|
|
45
|
+
fs.writeFileSync(path.join(dir, '.gse', 'goal-map.md'), '# Goal Map\n', 'utf8')
|
|
46
|
+
fs.writeFileSync(path.join(dir, '.gse', 'quality-gates.md'), '# Quality Gates\n', 'utf8')
|
|
47
|
+
return dir
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function renderBrief(changeId) {
|
|
51
|
+
return `# Change Brief
|
|
52
|
+
|
|
53
|
+
Change ID: ${changeId}
|
|
54
|
+
|
|
55
|
+
## Outcome
|
|
56
|
+
|
|
57
|
+
## Scope
|
|
58
|
+
|
|
59
|
+
## Non-goals
|
|
60
|
+
|
|
61
|
+
## Acceptance
|
|
62
|
+
|
|
63
|
+
## Evidence Plan
|
|
64
|
+
|
|
65
|
+
## Risks
|
|
66
|
+
|
|
67
|
+
## Next Action
|
|
68
|
+
`
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function renderSpec(changeId) {
|
|
72
|
+
return `# Spec
|
|
73
|
+
|
|
74
|
+
Change ID: ${changeId}
|
|
75
|
+
|
|
76
|
+
## User Outcome
|
|
77
|
+
|
|
78
|
+
## Behavior
|
|
79
|
+
|
|
80
|
+
## State / Data Flow
|
|
81
|
+
|
|
82
|
+
## Error and Recovery
|
|
83
|
+
|
|
84
|
+
## Permissions and Privacy
|
|
85
|
+
|
|
86
|
+
## Acceptance Criteria
|
|
87
|
+
|
|
88
|
+
## Non-goals
|
|
89
|
+
`
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function renderDesign(changeId) {
|
|
93
|
+
return `# Design
|
|
94
|
+
|
|
95
|
+
Change ID: ${changeId}
|
|
96
|
+
|
|
97
|
+
## Approach
|
|
98
|
+
|
|
99
|
+
## State / Data Flow
|
|
100
|
+
|
|
101
|
+
## Interfaces And Contracts
|
|
102
|
+
|
|
103
|
+
## Permissions And Privacy
|
|
104
|
+
|
|
105
|
+
## Error And Recovery
|
|
106
|
+
|
|
107
|
+
## Alternatives Considered
|
|
108
|
+
|
|
109
|
+
## Rollback
|
|
110
|
+
|
|
111
|
+
## Open Questions
|
|
112
|
+
`
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function renderTasks(changeId) {
|
|
116
|
+
return `# Tasks
|
|
117
|
+
|
|
118
|
+
Change ID: ${changeId}
|
|
119
|
+
|
|
120
|
+
## Slice Plan
|
|
121
|
+
|
|
122
|
+
- [ ] Define outcome, scope, acceptance, evidence, risk, and next action.
|
|
123
|
+
- [ ] Locate existing patterns and ownership boundaries.
|
|
124
|
+
- [ ] Implement the smallest verifiable change.
|
|
125
|
+
- [ ] Run focused verification.
|
|
126
|
+
- [ ] Record evidence and residual risk.
|
|
127
|
+
- [ ] Update state, goal map, and handoff notes when relevant.
|
|
128
|
+
|
|
129
|
+
## Non-Goals
|
|
130
|
+
|
|
131
|
+
## Dependencies
|
|
132
|
+
|
|
133
|
+
## Stop Conditions
|
|
134
|
+
`
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function renderEvidence(changeId) {
|
|
138
|
+
return `# Evidence
|
|
139
|
+
|
|
140
|
+
Change ID: ${changeId}
|
|
141
|
+
|
|
142
|
+
## Commands
|
|
143
|
+
|
|
144
|
+
## Results
|
|
145
|
+
|
|
146
|
+
## Files Changed
|
|
147
|
+
|
|
148
|
+
## Evidence Status
|
|
149
|
+
|
|
150
|
+
result | verified | accepted | not ready
|
|
151
|
+
|
|
152
|
+
## Residual Risk
|
|
153
|
+
|
|
154
|
+
## Follow-up
|
|
155
|
+
`
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function renderReview(changeId) {
|
|
159
|
+
return `# Review
|
|
160
|
+
|
|
161
|
+
Change ID: ${changeId}
|
|
162
|
+
|
|
163
|
+
## Spec Compliance
|
|
164
|
+
|
|
165
|
+
## Code Quality
|
|
166
|
+
|
|
167
|
+
## Architecture / Ownership
|
|
168
|
+
|
|
169
|
+
## Security / Privacy
|
|
170
|
+
|
|
171
|
+
## Regression Risk
|
|
172
|
+
|
|
173
|
+
## Evidence Review
|
|
174
|
+
|
|
175
|
+
## Findings
|
|
176
|
+
|
|
177
|
+
## Closure
|
|
178
|
+
`
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
function renderExecutionPack(changeId) {
|
|
182
|
+
return `# Execution Quality Pack
|
|
183
|
+
|
|
184
|
+
Change ID: ${changeId}
|
|
185
|
+
|
|
186
|
+
## Task Profile
|
|
187
|
+
|
|
188
|
+
- Level: ${level}
|
|
189
|
+
- Change type:
|
|
190
|
+
- User-visible impact:
|
|
191
|
+
- Data/security/release impact:
|
|
192
|
+
|
|
193
|
+
## Required Skills Or Roles
|
|
194
|
+
|
|
195
|
+
| Role / Skill | Purpose | Required | Evidence |
|
|
196
|
+
|---|---|---|---|
|
|
197
|
+
| Coordinator | Scope, final judgment, integration | yes | plan/state/evidence |
|
|
198
|
+
| Code Locator | Files, symbols, existing tests | when code changes | search/LSP notes |
|
|
199
|
+
| Builder | Bounded implementation | when files change | diff + focused check |
|
|
200
|
+
| QA / Verification | Focused proof | yes | command/browser/API smoke |
|
|
201
|
+
| Reviewer | Spec, quality, architecture, security | risk-based | review notes |
|
|
202
|
+
|
|
203
|
+
## Tool Routing
|
|
204
|
+
|
|
205
|
+
| Tool | Use When | Status | Fallback |
|
|
206
|
+
|---|---|---|---|
|
|
207
|
+
| rg / rg --files | Code and doc location | recommended | shell listing |
|
|
208
|
+
| LSP / index | Large or typed codebase | unknown | rg + existing tests |
|
|
209
|
+
| Browser / Playwright | UI or user-visible flow | unknown | component/API smoke plus notes |
|
|
210
|
+
| OpenSpec | Capability/API/state contract change | optional | .gse/changes/ markdown |
|
|
211
|
+
| Comet | Full lifecycle change | optional | GSE phase/status files |
|
|
212
|
+
| Superpowers | Complex staged execution/review | optional | GSE roles + quality gates |
|
|
213
|
+
| Subagents | Parallel bounded work | unknown | sequential role execution |
|
|
214
|
+
|
|
215
|
+
## Quality Gates Selected
|
|
216
|
+
|
|
217
|
+
## Evidence Plan
|
|
218
|
+
|
|
219
|
+
## Review And Closure
|
|
220
|
+
`
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
function initChange(target) {
|
|
224
|
+
const resolvedTarget = path.resolve(target)
|
|
225
|
+
const changeId = slug(changeIdArg)
|
|
226
|
+
const changeDir = path.join(resolvedTarget, '.gse', 'changes', changeId)
|
|
227
|
+
const files = [
|
|
228
|
+
['brief.md', renderBrief(changeId)],
|
|
229
|
+
['spec.md', renderSpec(changeId)],
|
|
230
|
+
['design.md', renderDesign(changeId)],
|
|
231
|
+
['tasks.md', renderTasks(changeId)],
|
|
232
|
+
['evidence.md', renderEvidence(changeId)],
|
|
233
|
+
['review.md', renderReview(changeId)],
|
|
234
|
+
['execution-quality-pack.md', renderExecutionPack(changeId)],
|
|
235
|
+
]
|
|
236
|
+
const results = files.map(([name, content]) => ({
|
|
237
|
+
relativePath: path.join('.gse', 'changes', changeId, name).replace(/\\/g, '/'),
|
|
238
|
+
status: writeIfMissing(path.join(changeDir, name), content),
|
|
239
|
+
}))
|
|
240
|
+
const written = results.filter((item) => item.status !== 'skipped').length
|
|
241
|
+
const skipped = results.filter((item) => item.status === 'skipped').length
|
|
242
|
+
return {
|
|
243
|
+
target: resolvedTarget,
|
|
244
|
+
generatedAt: new Date().toISOString(),
|
|
245
|
+
changeId,
|
|
246
|
+
level,
|
|
247
|
+
force,
|
|
248
|
+
summary: {
|
|
249
|
+
status: 'passed',
|
|
250
|
+
written,
|
|
251
|
+
skipped,
|
|
252
|
+
total: results.length,
|
|
253
|
+
},
|
|
254
|
+
results,
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
const target = selfTest ? createFixture() : targetArg
|
|
259
|
+
const report = initChange(target)
|
|
260
|
+
|
|
261
|
+
if (jsonOnly) console.log(JSON.stringify(report, null, 2))
|
|
262
|
+
else {
|
|
263
|
+
console.log(`# GSE Change Init\n\nTarget: ${report.target}\nChange: ${report.changeId}\nLevel: ${report.level}`)
|
|
264
|
+
for (const item of report.results) console.log(`- ${item.relativePath}: ${item.status}`)
|
|
265
|
+
}
|