@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
|
@@ -1,240 +1,240 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import fs from 'node:fs'
|
|
3
|
-
import os from 'node:os'
|
|
4
|
-
import path from 'node:path'
|
|
5
|
-
import { spawnSync } from 'node:child_process'
|
|
6
|
-
|
|
7
|
-
const args = process.argv.slice(2)
|
|
8
|
-
|
|
9
|
-
function readArg(name, fallback = null) {
|
|
10
|
-
const index = args.indexOf(name)
|
|
11
|
-
if (index === -1) return fallback
|
|
12
|
-
return args[index + 1] ?? fallback
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
const root = path.resolve(readArg('--root', path.join(import.meta.dirname, '..')))
|
|
16
|
-
const jsonOnly = args.includes('--json')
|
|
17
|
-
const keepFixture = args.includes('--keep-fixture')
|
|
18
|
-
const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'gse-host-runtime-drill-'))
|
|
19
|
-
const recordsDir = path.join(tempRoot, 'host-invocations')
|
|
20
|
-
|
|
21
|
-
function run(commandArgs) {
|
|
22
|
-
const result = spawnSync(process.execPath, commandArgs, {
|
|
23
|
-
cwd: root,
|
|
24
|
-
encoding: 'utf8',
|
|
25
|
-
windowsHide: true,
|
|
26
|
-
})
|
|
27
|
-
return {
|
|
28
|
-
status: result.status ?? 1,
|
|
29
|
-
stdout: (result.stdout ?? '').trim(),
|
|
30
|
-
stderr: (result.stderr ?? '').trim(),
|
|
31
|
-
command: [process.execPath, ...commandArgs].join(' '),
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
function parseJson(text) {
|
|
36
|
-
try {
|
|
37
|
-
return JSON.parse(text)
|
|
38
|
-
} catch {
|
|
39
|
-
return null
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
function check(id, label, ok, evidence, risk = '') {
|
|
44
|
-
return { id, label, status: ok ? 'passed' : 'failed', evidence, risk }
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
function record({
|
|
48
|
-
fileName,
|
|
49
|
-
host,
|
|
50
|
-
hostVersion,
|
|
51
|
-
adapterPath,
|
|
52
|
-
invocationMethod,
|
|
53
|
-
command,
|
|
54
|
-
nativeSlashCommand,
|
|
55
|
-
portableTextCommand,
|
|
56
|
-
generatedPointer,
|
|
57
|
-
}) {
|
|
58
|
-
return run([
|
|
59
|
-
path.join(root, 'scripts', 'record-host-invocation.mjs'),
|
|
60
|
-
'--root',
|
|
61
|
-
root,
|
|
62
|
-
'--host',
|
|
63
|
-
host,
|
|
64
|
-
'--host-version',
|
|
65
|
-
hostVersion,
|
|
66
|
-
'--project',
|
|
67
|
-
'GSE host runtime fixture',
|
|
68
|
-
'--adapter-path',
|
|
69
|
-
adapterPath,
|
|
70
|
-
'--invocation-method',
|
|
71
|
-
invocationMethod,
|
|
72
|
-
'--command',
|
|
73
|
-
command,
|
|
74
|
-
'--status',
|
|
75
|
-
'verified',
|
|
76
|
-
'--evidence-owner',
|
|
77
|
-
'host runtime invocation drill',
|
|
78
|
-
'--evidence',
|
|
79
|
-
'temporary fixture record; not real host runtime evidence',
|
|
80
|
-
'--files-read',
|
|
81
|
-
'.gse/README.md,.gse/project-profile.md,.gse/state.json,.gse/goal-map.md,.gse/quality-gates.md',
|
|
82
|
-
'--verification-command',
|
|
83
|
-
'node scripts/audit-host-runtime-invocations.mjs --records-dir <fixture>',
|
|
84
|
-
'--native-slash-command',
|
|
85
|
-
nativeSlashCommand,
|
|
86
|
-
'--portable-text-command',
|
|
87
|
-
portableTextCommand,
|
|
88
|
-
'--generated-pointer',
|
|
89
|
-
generatedPointer,
|
|
90
|
-
'--owner-acceptance-required',
|
|
91
|
-
'false',
|
|
92
|
-
'--residual-risk',
|
|
93
|
-
'Fixture proof only; real host runtime invocation still requires persistent project evidence.',
|
|
94
|
-
'--out',
|
|
95
|
-
path.join(recordsDir, fileName),
|
|
96
|
-
'--json',
|
|
97
|
-
])
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
const records = [
|
|
101
|
-
record({
|
|
102
|
-
fileName: 'claude-native-fixture.md',
|
|
103
|
-
host: 'Claude Code-style',
|
|
104
|
-
hostVersion: 'fixture',
|
|
105
|
-
adapterPath: '.claude/commands/gse.md',
|
|
106
|
-
invocationMethod: 'native slash-command fixture',
|
|
107
|
-
command: '/gse continue',
|
|
108
|
-
nativeSlashCommand: 'true',
|
|
109
|
-
portableTextCommand: 'false',
|
|
110
|
-
generatedPointer: 'false',
|
|
111
|
-
}),
|
|
112
|
-
record({
|
|
113
|
-
fileName: 'codex-portable-fixture.md',
|
|
114
|
-
host: 'Codex-style',
|
|
115
|
-
hostVersion: 'fixture',
|
|
116
|
-
adapterPath: '.codex/gse-command.md',
|
|
117
|
-
invocationMethod: 'portable text command fixture',
|
|
118
|
-
command: '/gse help',
|
|
119
|
-
nativeSlashCommand: 'false',
|
|
120
|
-
portableTextCommand: 'true',
|
|
121
|
-
generatedPointer: 'true',
|
|
122
|
-
}),
|
|
123
|
-
record({
|
|
124
|
-
fileName: 'hermes-runtime-fixture.md',
|
|
125
|
-
host: 'Hermes/AION-style runtime',
|
|
126
|
-
hostVersion: 'fixture',
|
|
127
|
-
adapterPath: '.gse/host-adapters/hermes-runtime.md',
|
|
128
|
-
invocationMethod: 'runtime bridge text-command fixture',
|
|
129
|
-
command: '/gse continue AION',
|
|
130
|
-
nativeSlashCommand: 'false',
|
|
131
|
-
portableTextCommand: 'true',
|
|
132
|
-
generatedPointer: 'true',
|
|
133
|
-
}),
|
|
134
|
-
record({
|
|
135
|
-
fileName: 'workbuddy-fixture.md',
|
|
136
|
-
host: 'WorkBuddy/other IDE agents',
|
|
137
|
-
hostVersion: 'fixture',
|
|
138
|
-
adapterPath: '.gse/host-adapters/workbuddy.md',
|
|
139
|
-
invocationMethod: 'IDE command-palette text-command fixture',
|
|
140
|
-
command: '/gse continue',
|
|
141
|
-
nativeSlashCommand: 'false',
|
|
142
|
-
portableTextCommand: 'true',
|
|
143
|
-
generatedPointer: 'true',
|
|
144
|
-
}),
|
|
145
|
-
record({
|
|
146
|
-
fileName: 'generic-agent-fixture.md',
|
|
147
|
-
host: 'Unknown or custom host',
|
|
148
|
-
hostVersion: 'fixture',
|
|
149
|
-
adapterPath: '.gse/host-adapters/generic-agent.md',
|
|
150
|
-
invocationMethod: 'generic natural-language command fixture',
|
|
151
|
-
command: 'gse continue',
|
|
152
|
-
nativeSlashCommand: 'false',
|
|
153
|
-
portableTextCommand: 'true',
|
|
154
|
-
generatedPointer: 'true',
|
|
155
|
-
}),
|
|
156
|
-
]
|
|
157
|
-
|
|
158
|
-
const audit = run([
|
|
159
|
-
path.join(root, 'scripts', 'audit-host-runtime-invocations.mjs'),
|
|
160
|
-
'--root',
|
|
161
|
-
root,
|
|
162
|
-
'--records-dir',
|
|
163
|
-
recordsDir,
|
|
164
|
-
'--json',
|
|
165
|
-
])
|
|
166
|
-
const auditData = parseJson(audit.stdout)
|
|
167
|
-
const recordData = records.map((item) => parseJson(item.stdout))
|
|
168
|
-
const recordWrites = recordData.filter((item) => item?.status === 'written').length
|
|
169
|
-
const hostSet = new Set(auditData?.inventory?.hosts ?? [])
|
|
170
|
-
const expectedHosts = [
|
|
171
|
-
'Claude Code-style',
|
|
172
|
-
'Codex-style',
|
|
173
|
-
'Hermes/AION-style runtime',
|
|
174
|
-
'WorkBuddy/other IDE agents',
|
|
175
|
-
'Unknown or custom host',
|
|
176
|
-
]
|
|
177
|
-
|
|
178
|
-
const checks = [
|
|
179
|
-
check('HRD01', 'all fixture host records are written', records.every((item) => item.status === 0) && recordWrites === records.length, `${recordWrites}/${records.length} fixture records`),
|
|
180
|
-
check('HRD02', 'host runtime invocation audit passes over fixture records', audit.status === 0 && auditData?.summary?.status === 'passed', audit.command),
|
|
181
|
-
check('HRD03', 'fixture inventory covers expected host families', expectedHosts.every((host) => hostSet.has(host)), expectedHosts.join(', ')),
|
|
182
|
-
check('HRD04', 'native slash-command evidence stays isolated to the Claude fixture', auditData?.inventory?.nativeSlashCommandRecords === 1, `${auditData?.inventory?.nativeSlashCommandRecords ?? 'unknown'} native record(s)`),
|
|
183
|
-
check('HRD05', 'portable text-command evidence covers non-native fixtures', auditData?.inventory?.portableTextCommandRecords === 4, `${auditData?.inventory?.portableTextCommandRecords ?? 'unknown'} portable record(s)`),
|
|
184
|
-
check('HRD06', 'drill evidence is not persisted as real host evidence', !fs.existsSync(path.join(root, '.gse', 'evidence', 'host-invocations', 'claude-native-fixture.md')), 'fixture stays outside persistent evidence directory'),
|
|
185
|
-
]
|
|
186
|
-
|
|
187
|
-
if (!keepFixture) fs.rmSync(tempRoot, { recursive: true, force: true })
|
|
188
|
-
|
|
189
|
-
const passed = checks.filter((item) => item.status === 'passed').length
|
|
190
|
-
const failed = checks.length - passed
|
|
191
|
-
const report = {
|
|
192
|
-
root,
|
|
193
|
-
generatedAt: new Date().toISOString(),
|
|
194
|
-
tempRoot: keepFixture ? tempRoot : null,
|
|
195
|
-
summary: { status: failed === 0 ? 'passed' : 'failed', passed, failed, total: checks.length },
|
|
196
|
-
workflows: {
|
|
197
|
-
hostRuntimeInvocationDrill: failed === 0 ? 'verified' : 'failed',
|
|
198
|
-
fixtureNativeSlashCommandRecords: auditData?.inventory?.nativeSlashCommandRecords ?? 0,
|
|
199
|
-
fixturePortableTextCommandRecords: auditData?.inventory?.portableTextCommandRecords ?? 0,
|
|
200
|
-
},
|
|
201
|
-
limits: [
|
|
202
|
-
'This drill uses temporary fixture records only.',
|
|
203
|
-
'It proves record and audit mechanics across host families, not real host runtime support.',
|
|
204
|
-
'Real native slash-command or runtime support still requires persistent host invocation records from actual host sessions.',
|
|
205
|
-
],
|
|
206
|
-
checks,
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
function renderMarkdown(data) {
|
|
210
|
-
const lines = []
|
|
211
|
-
lines.push('# GSE Host Runtime Invocation Drill')
|
|
212
|
-
lines.push('')
|
|
213
|
-
lines.push('Generated: ' + data.generatedAt)
|
|
214
|
-
lines.push('Root: ' + data.root)
|
|
215
|
-
lines.push('')
|
|
216
|
-
lines.push('## Summary')
|
|
217
|
-
lines.push('')
|
|
218
|
-
lines.push('- Status: ' + data.summary.status)
|
|
219
|
-
lines.push('- Checks: ' + data.summary.passed + '/' + data.summary.total)
|
|
220
|
-
lines.push('- Host runtime invocation drill: ' + data.workflows.hostRuntimeInvocationDrill)
|
|
221
|
-
lines.push('- Fixture native slash-command records: ' + data.workflows.fixtureNativeSlashCommandRecords)
|
|
222
|
-
lines.push('- Fixture portable text-command records: ' + data.workflows.fixturePortableTextCommandRecords)
|
|
223
|
-
lines.push('')
|
|
224
|
-
lines.push('## Checks')
|
|
225
|
-
lines.push('')
|
|
226
|
-
for (const item of data.checks) {
|
|
227
|
-
const marker = item.status === 'passed' ? '[x]' : '[ ]'
|
|
228
|
-
lines.push('- ' + marker + ' ' + item.id + ' ' + item.label + ': ' + item.evidence)
|
|
229
|
-
}
|
|
230
|
-
lines.push('')
|
|
231
|
-
lines.push('## Limits')
|
|
232
|
-
lines.push('')
|
|
233
|
-
for (const item of data.limits) lines.push('- ' + item)
|
|
234
|
-
return lines.join('\n') + '\n'
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
if (jsonOnly) console.log(JSON.stringify(report, null, 2))
|
|
238
|
-
else console.log(renderMarkdown(report))
|
|
239
|
-
|
|
240
|
-
if (failed > 0) process.exit(1)
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import fs from 'node:fs'
|
|
3
|
+
import os from 'node:os'
|
|
4
|
+
import path from 'node:path'
|
|
5
|
+
import { spawnSync } from 'node:child_process'
|
|
6
|
+
|
|
7
|
+
const args = process.argv.slice(2)
|
|
8
|
+
|
|
9
|
+
function readArg(name, fallback = null) {
|
|
10
|
+
const index = args.indexOf(name)
|
|
11
|
+
if (index === -1) return fallback
|
|
12
|
+
return args[index + 1] ?? fallback
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const root = path.resolve(readArg('--root', path.join(import.meta.dirname, '..')))
|
|
16
|
+
const jsonOnly = args.includes('--json')
|
|
17
|
+
const keepFixture = args.includes('--keep-fixture')
|
|
18
|
+
const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'gse-host-runtime-drill-'))
|
|
19
|
+
const recordsDir = path.join(tempRoot, 'host-invocations')
|
|
20
|
+
|
|
21
|
+
function run(commandArgs) {
|
|
22
|
+
const result = spawnSync(process.execPath, commandArgs, {
|
|
23
|
+
cwd: root,
|
|
24
|
+
encoding: 'utf8',
|
|
25
|
+
windowsHide: true,
|
|
26
|
+
})
|
|
27
|
+
return {
|
|
28
|
+
status: result.status ?? 1,
|
|
29
|
+
stdout: (result.stdout ?? '').trim(),
|
|
30
|
+
stderr: (result.stderr ?? '').trim(),
|
|
31
|
+
command: [process.execPath, ...commandArgs].join(' '),
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function parseJson(text) {
|
|
36
|
+
try {
|
|
37
|
+
return JSON.parse(text)
|
|
38
|
+
} catch {
|
|
39
|
+
return null
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function check(id, label, ok, evidence, risk = '') {
|
|
44
|
+
return { id, label, status: ok ? 'passed' : 'failed', evidence, risk }
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function record({
|
|
48
|
+
fileName,
|
|
49
|
+
host,
|
|
50
|
+
hostVersion,
|
|
51
|
+
adapterPath,
|
|
52
|
+
invocationMethod,
|
|
53
|
+
command,
|
|
54
|
+
nativeSlashCommand,
|
|
55
|
+
portableTextCommand,
|
|
56
|
+
generatedPointer,
|
|
57
|
+
}) {
|
|
58
|
+
return run([
|
|
59
|
+
path.join(root, 'scripts', 'record-host-invocation.mjs'),
|
|
60
|
+
'--root',
|
|
61
|
+
root,
|
|
62
|
+
'--host',
|
|
63
|
+
host,
|
|
64
|
+
'--host-version',
|
|
65
|
+
hostVersion,
|
|
66
|
+
'--project',
|
|
67
|
+
'GSE host runtime fixture',
|
|
68
|
+
'--adapter-path',
|
|
69
|
+
adapterPath,
|
|
70
|
+
'--invocation-method',
|
|
71
|
+
invocationMethod,
|
|
72
|
+
'--command',
|
|
73
|
+
command,
|
|
74
|
+
'--status',
|
|
75
|
+
'verified',
|
|
76
|
+
'--evidence-owner',
|
|
77
|
+
'host runtime invocation drill',
|
|
78
|
+
'--evidence',
|
|
79
|
+
'temporary fixture record; not real host runtime evidence',
|
|
80
|
+
'--files-read',
|
|
81
|
+
'.gse/README.md,.gse/project-profile.md,.gse/state.json,.gse/goal-map.md,.gse/quality-gates.md',
|
|
82
|
+
'--verification-command',
|
|
83
|
+
'node scripts/audit-host-runtime-invocations.mjs --records-dir <fixture>',
|
|
84
|
+
'--native-slash-command',
|
|
85
|
+
nativeSlashCommand,
|
|
86
|
+
'--portable-text-command',
|
|
87
|
+
portableTextCommand,
|
|
88
|
+
'--generated-pointer',
|
|
89
|
+
generatedPointer,
|
|
90
|
+
'--owner-acceptance-required',
|
|
91
|
+
'false',
|
|
92
|
+
'--residual-risk',
|
|
93
|
+
'Fixture proof only; real host runtime invocation still requires persistent project evidence.',
|
|
94
|
+
'--out',
|
|
95
|
+
path.join(recordsDir, fileName),
|
|
96
|
+
'--json',
|
|
97
|
+
])
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const records = [
|
|
101
|
+
record({
|
|
102
|
+
fileName: 'claude-native-fixture.md',
|
|
103
|
+
host: 'Claude Code-style',
|
|
104
|
+
hostVersion: 'fixture',
|
|
105
|
+
adapterPath: '.claude/commands/gse.md',
|
|
106
|
+
invocationMethod: 'native slash-command fixture',
|
|
107
|
+
command: '/gse continue',
|
|
108
|
+
nativeSlashCommand: 'true',
|
|
109
|
+
portableTextCommand: 'false',
|
|
110
|
+
generatedPointer: 'false',
|
|
111
|
+
}),
|
|
112
|
+
record({
|
|
113
|
+
fileName: 'codex-portable-fixture.md',
|
|
114
|
+
host: 'Codex-style',
|
|
115
|
+
hostVersion: 'fixture',
|
|
116
|
+
adapterPath: '.codex/gse-command.md',
|
|
117
|
+
invocationMethod: 'portable text command fixture',
|
|
118
|
+
command: '/gse help',
|
|
119
|
+
nativeSlashCommand: 'false',
|
|
120
|
+
portableTextCommand: 'true',
|
|
121
|
+
generatedPointer: 'true',
|
|
122
|
+
}),
|
|
123
|
+
record({
|
|
124
|
+
fileName: 'hermes-runtime-fixture.md',
|
|
125
|
+
host: 'Hermes/AION-style runtime',
|
|
126
|
+
hostVersion: 'fixture',
|
|
127
|
+
adapterPath: '.gse/host-adapters/hermes-runtime.md',
|
|
128
|
+
invocationMethod: 'runtime bridge text-command fixture',
|
|
129
|
+
command: '/gse continue AION',
|
|
130
|
+
nativeSlashCommand: 'false',
|
|
131
|
+
portableTextCommand: 'true',
|
|
132
|
+
generatedPointer: 'true',
|
|
133
|
+
}),
|
|
134
|
+
record({
|
|
135
|
+
fileName: 'workbuddy-fixture.md',
|
|
136
|
+
host: 'WorkBuddy/other IDE agents',
|
|
137
|
+
hostVersion: 'fixture',
|
|
138
|
+
adapterPath: '.gse/host-adapters/workbuddy.md',
|
|
139
|
+
invocationMethod: 'IDE command-palette text-command fixture',
|
|
140
|
+
command: '/gse continue',
|
|
141
|
+
nativeSlashCommand: 'false',
|
|
142
|
+
portableTextCommand: 'true',
|
|
143
|
+
generatedPointer: 'true',
|
|
144
|
+
}),
|
|
145
|
+
record({
|
|
146
|
+
fileName: 'generic-agent-fixture.md',
|
|
147
|
+
host: 'Unknown or custom host',
|
|
148
|
+
hostVersion: 'fixture',
|
|
149
|
+
adapterPath: '.gse/host-adapters/generic-agent.md',
|
|
150
|
+
invocationMethod: 'generic natural-language command fixture',
|
|
151
|
+
command: 'gse continue',
|
|
152
|
+
nativeSlashCommand: 'false',
|
|
153
|
+
portableTextCommand: 'true',
|
|
154
|
+
generatedPointer: 'true',
|
|
155
|
+
}),
|
|
156
|
+
]
|
|
157
|
+
|
|
158
|
+
const audit = run([
|
|
159
|
+
path.join(root, 'scripts', 'audit-host-runtime-invocations.mjs'),
|
|
160
|
+
'--root',
|
|
161
|
+
root,
|
|
162
|
+
'--records-dir',
|
|
163
|
+
recordsDir,
|
|
164
|
+
'--json',
|
|
165
|
+
])
|
|
166
|
+
const auditData = parseJson(audit.stdout)
|
|
167
|
+
const recordData = records.map((item) => parseJson(item.stdout))
|
|
168
|
+
const recordWrites = recordData.filter((item) => item?.status === 'written').length
|
|
169
|
+
const hostSet = new Set(auditData?.inventory?.hosts ?? [])
|
|
170
|
+
const expectedHosts = [
|
|
171
|
+
'Claude Code-style',
|
|
172
|
+
'Codex-style',
|
|
173
|
+
'Hermes/AION-style runtime',
|
|
174
|
+
'WorkBuddy/other IDE agents',
|
|
175
|
+
'Unknown or custom host',
|
|
176
|
+
]
|
|
177
|
+
|
|
178
|
+
const checks = [
|
|
179
|
+
check('HRD01', 'all fixture host records are written', records.every((item) => item.status === 0) && recordWrites === records.length, `${recordWrites}/${records.length} fixture records`),
|
|
180
|
+
check('HRD02', 'host runtime invocation audit passes over fixture records', audit.status === 0 && auditData?.summary?.status === 'passed', audit.command),
|
|
181
|
+
check('HRD03', 'fixture inventory covers expected host families', expectedHosts.every((host) => hostSet.has(host)), expectedHosts.join(', ')),
|
|
182
|
+
check('HRD04', 'native slash-command evidence stays isolated to the Claude fixture', auditData?.inventory?.nativeSlashCommandRecords === 1, `${auditData?.inventory?.nativeSlashCommandRecords ?? 'unknown'} native record(s)`),
|
|
183
|
+
check('HRD05', 'portable text-command evidence covers non-native fixtures', auditData?.inventory?.portableTextCommandRecords === 4, `${auditData?.inventory?.portableTextCommandRecords ?? 'unknown'} portable record(s)`),
|
|
184
|
+
check('HRD06', 'drill evidence is not persisted as real host evidence', !fs.existsSync(path.join(root, '.gse', 'evidence', 'host-invocations', 'claude-native-fixture.md')), 'fixture stays outside persistent evidence directory'),
|
|
185
|
+
]
|
|
186
|
+
|
|
187
|
+
if (!keepFixture) fs.rmSync(tempRoot, { recursive: true, force: true })
|
|
188
|
+
|
|
189
|
+
const passed = checks.filter((item) => item.status === 'passed').length
|
|
190
|
+
const failed = checks.length - passed
|
|
191
|
+
const report = {
|
|
192
|
+
root,
|
|
193
|
+
generatedAt: new Date().toISOString(),
|
|
194
|
+
tempRoot: keepFixture ? tempRoot : null,
|
|
195
|
+
summary: { status: failed === 0 ? 'passed' : 'failed', passed, failed, total: checks.length },
|
|
196
|
+
workflows: {
|
|
197
|
+
hostRuntimeInvocationDrill: failed === 0 ? 'verified' : 'failed',
|
|
198
|
+
fixtureNativeSlashCommandRecords: auditData?.inventory?.nativeSlashCommandRecords ?? 0,
|
|
199
|
+
fixturePortableTextCommandRecords: auditData?.inventory?.portableTextCommandRecords ?? 0,
|
|
200
|
+
},
|
|
201
|
+
limits: [
|
|
202
|
+
'This drill uses temporary fixture records only.',
|
|
203
|
+
'It proves record and audit mechanics across host families, not real host runtime support.',
|
|
204
|
+
'Real native slash-command or runtime support still requires persistent host invocation records from actual host sessions.',
|
|
205
|
+
],
|
|
206
|
+
checks,
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
function renderMarkdown(data) {
|
|
210
|
+
const lines = []
|
|
211
|
+
lines.push('# GSE Host Runtime Invocation Drill')
|
|
212
|
+
lines.push('')
|
|
213
|
+
lines.push('Generated: ' + data.generatedAt)
|
|
214
|
+
lines.push('Root: ' + data.root)
|
|
215
|
+
lines.push('')
|
|
216
|
+
lines.push('## Summary')
|
|
217
|
+
lines.push('')
|
|
218
|
+
lines.push('- Status: ' + data.summary.status)
|
|
219
|
+
lines.push('- Checks: ' + data.summary.passed + '/' + data.summary.total)
|
|
220
|
+
lines.push('- Host runtime invocation drill: ' + data.workflows.hostRuntimeInvocationDrill)
|
|
221
|
+
lines.push('- Fixture native slash-command records: ' + data.workflows.fixtureNativeSlashCommandRecords)
|
|
222
|
+
lines.push('- Fixture portable text-command records: ' + data.workflows.fixturePortableTextCommandRecords)
|
|
223
|
+
lines.push('')
|
|
224
|
+
lines.push('## Checks')
|
|
225
|
+
lines.push('')
|
|
226
|
+
for (const item of data.checks) {
|
|
227
|
+
const marker = item.status === 'passed' ? '[x]' : '[ ]'
|
|
228
|
+
lines.push('- ' + marker + ' ' + item.id + ' ' + item.label + ': ' + item.evidence)
|
|
229
|
+
}
|
|
230
|
+
lines.push('')
|
|
231
|
+
lines.push('## Limits')
|
|
232
|
+
lines.push('')
|
|
233
|
+
for (const item of data.limits) lines.push('- ' + item)
|
|
234
|
+
return lines.join('\n') + '\n'
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
if (jsonOnly) console.log(JSON.stringify(report, null, 2))
|
|
238
|
+
else console.log(renderMarkdown(report))
|
|
239
|
+
|
|
240
|
+
if (failed > 0) process.exit(1)
|