@t275005746/gse 0.1.0 → 0.1.2
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 +147 -27
- package/CHANGELOG.md +31 -15
- package/CONTRIBUTING.md +64 -64
- package/LICENSE +21 -21
- package/README.md +14 -7
- package/README.zh-CN.md +14 -7
- package/SECURITY.md +41 -41
- package/SKILL.md +32 -12
- 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 +100 -92
- package/assets/templates/evidence.md +15 -9
- 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/role-fallback-packet.md +49 -0
- 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 +52 -44
- package/references/adoption-recipes.md +171 -171
- package/references/agent-roles.md +42 -21
- package/references/architecture-health.md +101 -101
- package/references/benchmark-audit.md +73 -73
- package/references/commands.md +74 -45
- 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 -80
- package/references/evidence-taxonomy.md +145 -108
- package/references/file-ownership.md +97 -93
- package/references/final-form-roadmap.md +201 -0
- 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 +129 -101
- package/references/learning-system.md +42 -26
- package/references/maintenance-cadence.md +51 -0
- 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-guards.md +52 -0
- package/references/project-profile.md +57 -57
- package/references/public-release.md +174 -174
- package/references/quality-gates.md +96 -89
- 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/role-dispatch-fallback.md +54 -0
- 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 +80 -70
- 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-hardening.mjs +188 -0
- package/scripts/audit-close-gate.mjs +448 -262
- package/scripts/audit-command-adapters.mjs +91 -91
- package/scripts/audit-command-execution.mjs +212 -199
- package/scripts/audit-commands.mjs +7 -5
- package/scripts/audit-compatibility.mjs +149 -149
- package/scripts/audit-completion-plan-drill.mjs +230 -0
- package/scripts/audit-completion-readiness.mjs +290 -287
- package/scripts/audit-continue-preflight.mjs +234 -0
- package/scripts/audit-distribution.mjs +251 -251
- package/scripts/audit-domain-quality-gates.mjs +108 -108
- package/scripts/audit-evidence-levels.mjs +217 -0
- package/scripts/audit-evidence-placeholders.mjs +126 -126
- package/scripts/audit-evidence-review-queue.mjs +206 -0
- package/scripts/audit-final-acceptance-packet.mjs +9 -9
- package/scripts/audit-final-form-progress-report.mjs +19 -18
- package/scripts/audit-final-form-roadmap.mjs +157 -0
- package/scripts/audit-final-form-stale-copy.mjs +2 -2
- 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-capabilities.mjs +237 -0
- 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-installed-sync.mjs +203 -0
- package/scripts/audit-learning-drift.mjs +292 -0
- package/scripts/audit-learning-promotion.mjs +351 -0
- package/scripts/audit-learning-system.mjs +24 -14
- package/scripts/audit-local-final-form-completion.mjs +11 -10
- package/scripts/audit-maintenance-cadence.mjs +139 -0
- package/scripts/audit-maintenance-snapshot.mjs +181 -0
- package/scripts/audit-marketplace-discovery.mjs +122 -122
- package/scripts/audit-npm-package-metadata.mjs +160 -154
- package/scripts/audit-npm-publish-dry-run.mjs +194 -166
- package/scripts/audit-npm-tarball-install.mjs +195 -189
- package/scripts/audit-open-source-defaults.mjs +92 -92
- package/scripts/audit-open-source-readiness.mjs +97 -97
- package/scripts/audit-owner-external-gate-kit.mjs +12 -11
- package/scripts/audit-project-guards.mjs +189 -0
- package/scripts/audit-project.mjs +144 -141
- package/scripts/audit-public-acceptance-command-dry-run-drill.mjs +203 -203
- package/scripts/audit-public-acceptance-handoff.mjs +10 -10
- package/scripts/audit-public-acceptance-readiness.mjs +222 -222
- 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-checklist.mjs +17 -15
- 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-bundle.mjs +13 -11
- package/scripts/audit-release-owner-action-plan-drill.mjs +5 -4
- package/scripts/audit-release-owner-action-plan.mjs +10 -10
- package/scripts/audit-release-readiness.mjs +106 -106
- package/scripts/audit-release-status-manifest.mjs +4 -4
- package/scripts/audit-release-trust.mjs +62 -62
- package/scripts/audit-remote-distribution.mjs +266 -266
- package/scripts/audit-roadmap-consistency.mjs +234 -230
- package/scripts/audit-role-dispatch-fallback.mjs +212 -0
- package/scripts/audit-session-sync.mjs +127 -0
- package/scripts/audit-signing.mjs +147 -147
- package/scripts/audit-state-freshness.mjs +20 -14
- package/scripts/audit-state-repair.mjs +360 -0
- package/scripts/audit-target-adoption-evidence.mjs +117 -117
- package/scripts/audit-target-hardening-drills.mjs +267 -0
- package/scripts/audit-target-project.mjs +507 -507
- package/scripts/audit-tool-fallback-policy.mjs +180 -0
- package/scripts/audit-ui-browser-evidence-policy.mjs +191 -0
- 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 -123
- package/scripts/backfill-evidence-levels.mjs +98 -0
- package/scripts/check-encoding.mjs +72 -0
- 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-continue-packet.mjs +1214 -0
- package/scripts/generate-final-acceptance-packet.mjs +188 -173
- package/scripts/generate-final-form-progress-report.mjs +191 -189
- package/scripts/generate-host-runtime-evidence-handoff.mjs +198 -191
- package/scripts/generate-maintenance-snapshot.mjs +216 -0
- package/scripts/generate-owner-external-gate-kit.mjs +295 -295
- package/scripts/generate-public-acceptance-handoff.mjs +168 -156
- 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 -171
- package/scripts/generate-release-status-manifest.mjs +199 -198
- 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 +793 -712
- 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-learning.mjs +37 -8
- 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/record-session-sync.mjs +87 -0
- package/scripts/run-gse-command.mjs +79 -47
- package/scripts/run-validation-profile.mjs +24 -5
- package/scripts/sign-gse-package.mjs +83 -83
- package/scripts/update-project-state.mjs +223 -223
- package/scripts/validate-gse.mjs +216 -0
- package/scripts/verify-gse-package.mjs +85 -85
|
@@ -15,36 +15,39 @@ function readArg(name, fallback = null) {
|
|
|
15
15
|
const root = path.resolve(readArg('--root', path.join(import.meta.dirname, '..')))
|
|
16
16
|
const jsonOnly = args.includes('--json')
|
|
17
17
|
const keepTemp = args.includes('--keep-temp')
|
|
18
|
-
const tempRootArg = readArg('--temp-root', null)
|
|
18
|
+
const tempRootArg = readArg('--temp-root', null)
|
|
19
19
|
const baseTemp = tempRootArg ? path.resolve(tempRootArg) : fs.mkdtempSync(path.join(os.tmpdir(), 'gse-project-audit-'))
|
|
20
20
|
const initScript = path.join(root, 'scripts', 'init-project.mjs')
|
|
21
21
|
|
|
22
|
-
const commonFiles = [
|
|
23
|
-
'.gse/README.md',
|
|
24
|
-
'.gse/state.json',
|
|
25
|
-
'.gse/project-profile.md',
|
|
22
|
+
const commonFiles = [
|
|
23
|
+
'.gse/README.md',
|
|
24
|
+
'.gse/state.json',
|
|
25
|
+
'.gse/project-profile.md',
|
|
26
26
|
'.gse/goal-map.md',
|
|
27
27
|
'.gse/quality-gates.md',
|
|
28
|
+
'.gse/project-guards.md',
|
|
28
29
|
'.gse/tooling.md',
|
|
30
|
+
'.gse/host-capabilities.md',
|
|
29
31
|
'.gse/learnings.md',
|
|
30
|
-
'.gse/evidence/index.jsonl',
|
|
31
|
-
'.gse/goals/README.md',
|
|
32
|
-
'.gse/templates/change-brief.md',
|
|
33
|
-
'.gse/templates/spec.md',
|
|
34
|
-
'.gse/templates/design.md',
|
|
35
|
-
'.gse/templates/tasks.md',
|
|
36
|
-
'.gse/templates/evidence.md',
|
|
37
|
-
'.gse/templates/review.md',
|
|
38
|
-
'.gse/templates/execution-quality-pack.md',
|
|
39
|
-
]
|
|
32
|
+
'.gse/evidence/index.jsonl',
|
|
33
|
+
'.gse/goals/README.md',
|
|
34
|
+
'.gse/templates/change-brief.md',
|
|
35
|
+
'.gse/templates/spec.md',
|
|
36
|
+
'.gse/templates/design.md',
|
|
37
|
+
'.gse/templates/tasks.md',
|
|
38
|
+
'.gse/templates/evidence.md',
|
|
39
|
+
'.gse/templates/review.md',
|
|
40
|
+
'.gse/templates/execution-quality-pack.md',
|
|
41
|
+
]
|
|
40
42
|
|
|
41
43
|
const standardFiles = [
|
|
42
|
-
'.gse/agent-workspace.md',
|
|
43
|
-
'.gse/agents/roles.md',
|
|
44
|
-
'.gse/agents/dispatch.md',
|
|
45
|
-
'.gse/
|
|
46
|
-
'.gse/
|
|
47
|
-
|
|
44
|
+
'.gse/agent-workspace.md',
|
|
45
|
+
'.gse/agents/roles.md',
|
|
46
|
+
'.gse/agents/dispatch.md',
|
|
47
|
+
'.gse/agents/role-fallback-packets.md',
|
|
48
|
+
'.gse/skills/README.md',
|
|
49
|
+
'.gse/lsp/README.md',
|
|
50
|
+
]
|
|
48
51
|
|
|
49
52
|
const enterpriseFiles = [
|
|
50
53
|
'.gse/hooks/README.md',
|
|
@@ -55,23 +58,23 @@ const enterpriseFiles = [
|
|
|
55
58
|
'.gse/audit.md',
|
|
56
59
|
]
|
|
57
60
|
|
|
58
|
-
const modeExpectations = {
|
|
61
|
+
const modeExpectations = {
|
|
59
62
|
lite: {
|
|
60
63
|
files: commonFiles,
|
|
61
|
-
dirs: ['.gse/changes', '.gse/evidence', '.gse/templates', '.gse/goals'],
|
|
64
|
+
dirs: ['.gse/changes', '.gse/evidence', '.gse/templates', '.gse/goals'],
|
|
62
65
|
},
|
|
63
66
|
standard: {
|
|
64
67
|
files: [...commonFiles, ...standardFiles],
|
|
65
|
-
dirs: ['.gse/changes', '.gse/evidence', '.gse/templates', '.gse/goals', '.gse/agents', '.gse/skills', '.gse/lsp'],
|
|
68
|
+
dirs: ['.gse/changes', '.gse/evidence', '.gse/templates', '.gse/goals', '.gse/agents', '.gse/skills', '.gse/lsp'],
|
|
66
69
|
},
|
|
67
70
|
enterprise: {
|
|
68
71
|
files: [...commonFiles, ...standardFiles, ...enterpriseFiles],
|
|
69
72
|
dirs: [
|
|
70
73
|
'.gse/changes',
|
|
71
74
|
'.gse/evidence',
|
|
72
|
-
'.gse/templates',
|
|
73
|
-
'.gse/goals',
|
|
74
|
-
'.gse/agents',
|
|
75
|
+
'.gse/templates',
|
|
76
|
+
'.gse/goals',
|
|
77
|
+
'.gse/agents',
|
|
75
78
|
'.gse/skills',
|
|
76
79
|
'.gse/lsp',
|
|
77
80
|
'.gse/hooks',
|
|
@@ -79,45 +82,45 @@ const modeExpectations = {
|
|
|
79
82
|
'.gse/plugins',
|
|
80
83
|
],
|
|
81
84
|
},
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
const autoExpectations = [
|
|
85
|
-
{
|
|
86
|
-
name: 'empty-project',
|
|
87
|
-
expectedMode: 'lite',
|
|
88
|
-
setup(target) {
|
|
89
|
-
fs.mkdirSync(target, { recursive: true })
|
|
90
|
-
},
|
|
91
|
-
},
|
|
92
|
-
{
|
|
93
|
-
name: 'standard-app',
|
|
94
|
-
expectedMode: 'standard',
|
|
95
|
-
setup(target) {
|
|
96
|
-
fs.mkdirSync(target, { recursive: true })
|
|
97
|
-
fs.writeFileSync(path.join(target, 'README.md'), '# Standard App\n', 'utf8')
|
|
98
|
-
fs.writeFileSync(
|
|
99
|
-
path.join(target, 'package.json'),
|
|
100
|
-
JSON.stringify({ scripts: { test: 'vitest run', build: 'vite build' }, devDependencies: { typescript: '^5.0.0', vitest: '^2.0.0' } }, null, 2),
|
|
101
|
-
'utf8',
|
|
102
|
-
)
|
|
103
|
-
fs.writeFileSync(path.join(target, 'tsconfig.json'), '{}\n', 'utf8')
|
|
104
|
-
},
|
|
105
|
-
},
|
|
106
|
-
{
|
|
107
|
-
name: 'enterprise-agent-runtime',
|
|
108
|
-
expectedMode: 'enterprise',
|
|
109
|
-
setup(target) {
|
|
110
|
-
fs.mkdirSync(path.join(target, '.claude'), { recursive: true })
|
|
111
|
-
fs.mkdirSync(path.join(target, '.codex'), { recursive: true })
|
|
112
|
-
fs.writeFileSync(path.join(target, '.mcp.json'), '{}\n', 'utf8')
|
|
113
|
-
fs.writeFileSync(
|
|
114
|
-
path.join(target, 'package.json'),
|
|
115
|
-
JSON.stringify({ scripts: { test: 'vitest run', release: 'node release.mjs' } }, null, 2),
|
|
116
|
-
'utf8',
|
|
117
|
-
)
|
|
118
|
-
},
|
|
119
|
-
},
|
|
120
|
-
]
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const autoExpectations = [
|
|
88
|
+
{
|
|
89
|
+
name: 'empty-project',
|
|
90
|
+
expectedMode: 'lite',
|
|
91
|
+
setup(target) {
|
|
92
|
+
fs.mkdirSync(target, { recursive: true })
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
name: 'standard-app',
|
|
97
|
+
expectedMode: 'standard',
|
|
98
|
+
setup(target) {
|
|
99
|
+
fs.mkdirSync(target, { recursive: true })
|
|
100
|
+
fs.writeFileSync(path.join(target, 'README.md'), '# Standard App\n', 'utf8')
|
|
101
|
+
fs.writeFileSync(
|
|
102
|
+
path.join(target, 'package.json'),
|
|
103
|
+
JSON.stringify({ scripts: { test: 'vitest run', build: 'vite build' }, devDependencies: { typescript: '^5.0.0', vitest: '^2.0.0' } }, null, 2),
|
|
104
|
+
'utf8',
|
|
105
|
+
)
|
|
106
|
+
fs.writeFileSync(path.join(target, 'tsconfig.json'), '{}\n', 'utf8')
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
name: 'enterprise-agent-runtime',
|
|
111
|
+
expectedMode: 'enterprise',
|
|
112
|
+
setup(target) {
|
|
113
|
+
fs.mkdirSync(path.join(target, '.claude'), { recursive: true })
|
|
114
|
+
fs.mkdirSync(path.join(target, '.codex'), { recursive: true })
|
|
115
|
+
fs.writeFileSync(path.join(target, '.mcp.json'), '{}\n', 'utf8')
|
|
116
|
+
fs.writeFileSync(
|
|
117
|
+
path.join(target, 'package.json'),
|
|
118
|
+
JSON.stringify({ scripts: { test: 'vitest run', release: 'node release.mjs' } }, null, 2),
|
|
119
|
+
'utf8',
|
|
120
|
+
)
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
]
|
|
121
124
|
|
|
122
125
|
function runNode(script, runArgs) {
|
|
123
126
|
return spawnSync(process.execPath, [script, ...runArgs], {
|
|
@@ -169,7 +172,7 @@ function compareSignatures(before, after) {
|
|
|
169
172
|
return changed
|
|
170
173
|
}
|
|
171
174
|
|
|
172
|
-
function auditMode(mode, tempRoot) {
|
|
175
|
+
function auditMode(mode, tempRoot) {
|
|
173
176
|
const target = path.join(tempRoot, mode)
|
|
174
177
|
fs.mkdirSync(target, { recursive: true })
|
|
175
178
|
const expectation = modeExpectations[mode]
|
|
@@ -184,7 +187,7 @@ function auditMode(mode, tempRoot) {
|
|
|
184
187
|
const changedOnRerun = compareSignatures(before, after)
|
|
185
188
|
const writtenCount = firstJson?.results?.filter((item) => item.status === 'written').length ?? 0
|
|
186
189
|
const skippedCount = secondJson?.results?.filter((item) => item.status === 'skipped').length ?? 0
|
|
187
|
-
const expectedWrites = expectation.files.length
|
|
190
|
+
const expectedWrites = expectation.files.length + 1
|
|
188
191
|
const ok =
|
|
189
192
|
firstRun.status === 0 &&
|
|
190
193
|
secondRun.status === 0 &&
|
|
@@ -205,45 +208,45 @@ function auditMode(mode, tempRoot) {
|
|
|
205
208
|
dirChecks,
|
|
206
209
|
changedOnRerun,
|
|
207
210
|
}
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
function auditAuto(item, tempRoot) {
|
|
211
|
-
const target = path.join(tempRoot, 'auto-' + item.name)
|
|
212
|
-
fs.rmSync(target, { recursive: true, force: true })
|
|
213
|
-
item.setup(target)
|
|
214
|
-
const run = runNode(initScript, ['--target', target, '--mode', 'auto'])
|
|
215
|
-
const model = readJsonFromRun(run)
|
|
216
|
-
const expectation = modeExpectations[item.expectedMode]
|
|
217
|
-
const fileChecks = expectation.files.map((relativePath) => ({ relativePath, status: fileStatus(target, relativePath) }))
|
|
218
|
-
const dirChecks = expectation.dirs.map((relativePath) => ({ relativePath, status: dirStatus(target, relativePath) }))
|
|
219
|
-
const ok =
|
|
220
|
-
run.status === 0 &&
|
|
221
|
-
model?.requestedMode === 'auto' &&
|
|
222
|
-
model?.mode === item.expectedMode &&
|
|
223
|
-
Array.isArray(model?.selectionReasons) &&
|
|
224
|
-
model.selectionReasons.length > 0 &&
|
|
225
|
-
fileChecks.every((check) => check.status === 'present') &&
|
|
226
|
-
dirChecks.every((check) => check.status === 'present') &&
|
|
227
|
-
(item.expectedMode !== 'enterprise' || (fileStatus(target, '.codex/gse-adapter.md') === 'present' && fileStatus(target, '.claude/gse-adapter.md') === 'present'))
|
|
228
|
-
return {
|
|
229
|
-
name: item.name,
|
|
230
|
-
target,
|
|
231
|
-
expectedMode: item.expectedMode,
|
|
232
|
-
detectedMode: model?.mode ?? null,
|
|
233
|
-
selectionReasons: model?.selectionReasons ?? [],
|
|
234
|
-
status: ok ? 'passed' : 'failed',
|
|
235
|
-
run: { status: run.status, stderr: run.stderr.trim() },
|
|
236
|
-
fileChecks,
|
|
237
|
-
dirChecks,
|
|
238
|
-
hostAdapterChecks:
|
|
239
|
-
item.expectedMode === 'enterprise'
|
|
240
|
-
? [
|
|
241
|
-
{ relativePath: '.codex/gse-adapter.md', status: fileStatus(target, '.codex/gse-adapter.md') },
|
|
242
|
-
{ relativePath: '.claude/gse-adapter.md', status: fileStatus(target, '.claude/gse-adapter.md') },
|
|
243
|
-
]
|
|
244
|
-
: [],
|
|
245
|
-
}
|
|
246
|
-
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
function auditAuto(item, tempRoot) {
|
|
214
|
+
const target = path.join(tempRoot, 'auto-' + item.name)
|
|
215
|
+
fs.rmSync(target, { recursive: true, force: true })
|
|
216
|
+
item.setup(target)
|
|
217
|
+
const run = runNode(initScript, ['--target', target, '--mode', 'auto'])
|
|
218
|
+
const model = readJsonFromRun(run)
|
|
219
|
+
const expectation = modeExpectations[item.expectedMode]
|
|
220
|
+
const fileChecks = expectation.files.map((relativePath) => ({ relativePath, status: fileStatus(target, relativePath) }))
|
|
221
|
+
const dirChecks = expectation.dirs.map((relativePath) => ({ relativePath, status: dirStatus(target, relativePath) }))
|
|
222
|
+
const ok =
|
|
223
|
+
run.status === 0 &&
|
|
224
|
+
model?.requestedMode === 'auto' &&
|
|
225
|
+
model?.mode === item.expectedMode &&
|
|
226
|
+
Array.isArray(model?.selectionReasons) &&
|
|
227
|
+
model.selectionReasons.length > 0 &&
|
|
228
|
+
fileChecks.every((check) => check.status === 'present') &&
|
|
229
|
+
dirChecks.every((check) => check.status === 'present') &&
|
|
230
|
+
(item.expectedMode !== 'enterprise' || (fileStatus(target, '.codex/gse-adapter.md') === 'present' && fileStatus(target, '.claude/gse-adapter.md') === 'present'))
|
|
231
|
+
return {
|
|
232
|
+
name: item.name,
|
|
233
|
+
target,
|
|
234
|
+
expectedMode: item.expectedMode,
|
|
235
|
+
detectedMode: model?.mode ?? null,
|
|
236
|
+
selectionReasons: model?.selectionReasons ?? [],
|
|
237
|
+
status: ok ? 'passed' : 'failed',
|
|
238
|
+
run: { status: run.status, stderr: run.stderr.trim() },
|
|
239
|
+
fileChecks,
|
|
240
|
+
dirChecks,
|
|
241
|
+
hostAdapterChecks:
|
|
242
|
+
item.expectedMode === 'enterprise'
|
|
243
|
+
? [
|
|
244
|
+
{ relativePath: '.codex/gse-adapter.md', status: fileStatus(target, '.codex/gse-adapter.md') },
|
|
245
|
+
{ relativePath: '.claude/gse-adapter.md', status: fileStatus(target, '.claude/gse-adapter.md') },
|
|
246
|
+
]
|
|
247
|
+
: [],
|
|
248
|
+
}
|
|
249
|
+
}
|
|
247
250
|
|
|
248
251
|
function renderMarkdown(data) {
|
|
249
252
|
const lines = []
|
|
@@ -255,29 +258,29 @@ function renderMarkdown(data) {
|
|
|
255
258
|
lines.push('')
|
|
256
259
|
lines.push('## Summary')
|
|
257
260
|
lines.push('')
|
|
258
|
-
lines.push('- Status: ' + data.summary.status)
|
|
259
|
-
lines.push('- Modes: ' + data.summary.passed + '/' + data.summary.total)
|
|
260
|
-
lines.push('- Bootstrap scaffold: ' + data.workflows.bootstrapScaffold)
|
|
261
|
-
lines.push('- Rerun safety: ' + data.workflows.rerunSafety)
|
|
262
|
-
lines.push('- Auto mode selection: ' + data.workflows.autoModeSelection)
|
|
263
|
-
lines.push('')
|
|
264
|
-
lines.push('## Modes')
|
|
261
|
+
lines.push('- Status: ' + data.summary.status)
|
|
262
|
+
lines.push('- Modes: ' + data.summary.passed + '/' + data.summary.total)
|
|
263
|
+
lines.push('- Bootstrap scaffold: ' + data.workflows.bootstrapScaffold)
|
|
264
|
+
lines.push('- Rerun safety: ' + data.workflows.rerunSafety)
|
|
265
|
+
lines.push('- Auto mode selection: ' + data.workflows.autoModeSelection)
|
|
266
|
+
lines.push('')
|
|
267
|
+
lines.push('## Modes')
|
|
265
268
|
lines.push('')
|
|
266
269
|
for (const item of data.modes) {
|
|
267
270
|
const marker = item.status === 'passed' ? '[x]' : '[ ]'
|
|
268
271
|
lines.push('- ' + marker + ' ' + item.mode + ': files ' + item.fileChecks.filter((check) => check.status === 'present').length + '/' + item.fileChecks.length + ', dirs ' + item.dirChecks.filter((check) => check.status === 'present').length + '/' + item.dirChecks.length + ', skipped on rerun ' + item.secondRun.skippedCount + '/' + item.secondRun.expectedSkips)
|
|
269
|
-
if (item.changedOnRerun.length) lines.push(' - Changed on rerun: ' + item.changedOnRerun.join(', '))
|
|
270
|
-
}
|
|
271
|
-
lines.push('')
|
|
272
|
-
lines.push('## Auto Mode')
|
|
273
|
-
lines.push('')
|
|
274
|
-
for (const item of data.autoModes) {
|
|
275
|
-
const marker = item.status === 'passed' ? '[x]' : '[ ]'
|
|
276
|
-
const hostAdapters = item.hostAdapterChecks?.length ? ', host adapters ' + item.hostAdapterChecks.filter((check) => check.status === 'present').length + '/' + item.hostAdapterChecks.length : ''
|
|
277
|
-
lines.push('- ' + marker + ' ' + item.name + ': expected ' + item.expectedMode + ', detected ' + item.detectedMode + ', reasons ' + item.selectionReasons.join(', ') + hostAdapters)
|
|
278
|
-
}
|
|
279
|
-
lines.push('')
|
|
280
|
-
lines.push('## Limits')
|
|
272
|
+
if (item.changedOnRerun.length) lines.push(' - Changed on rerun: ' + item.changedOnRerun.join(', '))
|
|
273
|
+
}
|
|
274
|
+
lines.push('')
|
|
275
|
+
lines.push('## Auto Mode')
|
|
276
|
+
lines.push('')
|
|
277
|
+
for (const item of data.autoModes) {
|
|
278
|
+
const marker = item.status === 'passed' ? '[x]' : '[ ]'
|
|
279
|
+
const hostAdapters = item.hostAdapterChecks?.length ? ', host adapters ' + item.hostAdapterChecks.filter((check) => check.status === 'present').length + '/' + item.hostAdapterChecks.length : ''
|
|
280
|
+
lines.push('- ' + marker + ' ' + item.name + ': expected ' + item.expectedMode + ', detected ' + item.detectedMode + ', reasons ' + item.selectionReasons.join(', ') + hostAdapters)
|
|
281
|
+
}
|
|
282
|
+
lines.push('')
|
|
283
|
+
lines.push('## Limits')
|
|
281
284
|
lines.push('')
|
|
282
285
|
for (const item of data.limits) lines.push('- ' + item)
|
|
283
286
|
return lines.join('\n') + '\n'
|
|
@@ -291,29 +294,29 @@ if (!fs.existsSync(initScript)) {
|
|
|
291
294
|
fs.rmSync(baseTemp, { recursive: true, force: true })
|
|
292
295
|
fs.mkdirSync(baseTemp, { recursive: true })
|
|
293
296
|
|
|
294
|
-
const modes = Object.keys(modeExpectations).map((mode) => auditMode(mode, baseTemp))
|
|
295
|
-
const autoModes = autoExpectations.map((item) => auditAuto(item, baseTemp))
|
|
296
|
-
const passed = modes.filter((item) => item.status === 'passed').length
|
|
297
|
-
const autoPassed = autoModes.filter((item) => item.status === 'passed').length
|
|
298
|
-
const failed = modes.length - passed + (autoModes.length - autoPassed)
|
|
299
|
-
const report = {
|
|
297
|
+
const modes = Object.keys(modeExpectations).map((mode) => auditMode(mode, baseTemp))
|
|
298
|
+
const autoModes = autoExpectations.map((item) => auditAuto(item, baseTemp))
|
|
299
|
+
const passed = modes.filter((item) => item.status === 'passed').length
|
|
300
|
+
const autoPassed = autoModes.filter((item) => item.status === 'passed').length
|
|
301
|
+
const failed = modes.length - passed + (autoModes.length - autoPassed)
|
|
302
|
+
const report = {
|
|
300
303
|
root,
|
|
301
304
|
generatedAt: new Date().toISOString(),
|
|
302
305
|
tempRoot: baseTemp,
|
|
303
|
-
summary: { passed: passed + autoPassed, failed, total: modes.length + autoModes.length, status: failed === 0 ? 'passed' : 'failed' },
|
|
304
|
-
workflows: {
|
|
305
|
-
bootstrapScaffold: modes.every((item) => item.fileChecks.every((check) => check.status === 'present') && item.dirChecks.every((check) => check.status === 'present')) ? 'verified' : 'failed',
|
|
306
|
-
rerunSafety: modes.every((item) => item.changedOnRerun.length === 0 && item.secondRun.skippedCount === item.secondRun.expectedSkips) ? 'verified' : 'failed',
|
|
307
|
-
autoModeSelection: autoModes.every((item) => item.status === 'passed') ? 'verified' : 'failed',
|
|
308
|
-
},
|
|
306
|
+
summary: { passed: passed + autoPassed, failed, total: modes.length + autoModes.length, status: failed === 0 ? 'passed' : 'failed' },
|
|
307
|
+
workflows: {
|
|
308
|
+
bootstrapScaffold: modes.every((item) => item.fileChecks.every((check) => check.status === 'present') && item.dirChecks.every((check) => check.status === 'present')) ? 'verified' : 'failed',
|
|
309
|
+
rerunSafety: modes.every((item) => item.changedOnRerun.length === 0 && item.secondRun.skippedCount === item.secondRun.expectedSkips) ? 'verified' : 'failed',
|
|
310
|
+
autoModeSelection: autoModes.every((item) => item.status === 'passed') ? 'verified' : 'failed',
|
|
311
|
+
},
|
|
309
312
|
limits: [
|
|
310
313
|
'Project audit uses temporary directories and generated scaffolds, not arbitrary real repositories.',
|
|
311
314
|
'Project audit verifies init-project scaffold and rerun safety, not tool installation, CI, package install, or fresh-session acceptance.',
|
|
312
315
|
'Use discover-project-profile and focused project checks separately for real existing repo adoption.',
|
|
313
316
|
],
|
|
314
|
-
modes,
|
|
315
|
-
autoModes,
|
|
316
|
-
}
|
|
317
|
+
modes,
|
|
318
|
+
autoModes,
|
|
319
|
+
}
|
|
317
320
|
|
|
318
321
|
if (!keepTemp) fs.rmSync(baseTemp, { recursive: true, force: true })
|
|
319
322
|
|