chore: auto-commit before switching to gsd/M002/S01

This commit is contained in:
Lex Christopherson 2026-03-12 14:39:52 -06:00
parent 1c68dc2906
commit a64508e7a8
5 changed files with 79 additions and 0 deletions

View file

@ -15,3 +15,8 @@
| D007 | M002 | arch | Secret forecasting scope | Current milestone only | Later milestones may change; collect when planning each | Yes — if cross-milestone friction observed |
| D008 | M002 | arch | Existing key handling | Silent skip (no confirmation) | Less friction on repeated runs | Yes — if users want to rotate keys |
| D009 | M002 | arch | Destination detection | Infer from project context (vercel.json, convex/ dir) | User shouldn't specify — falls back to .env | No |
<<<<<<< HEAD
=======
| D010 | M002/S01 | convention | Secrets manifest format | H3 headings per env var key with bold metadata fields and numbered guidance lists | Matches existing GSD markdown conventions (roadmap uses H2, plan uses checkboxes); H3 per key enables extractAllSections(content, 3) reuse | No |
| D011 | M002/S01 | pattern | Guidance list parsing strategy | Regex-based numbered list extraction, not parseBullets | parseBullets strips numbering which loses ordering semantics for step-by-step guidance | No |
>>>>>>> gsd/M002/S01

View file

@ -12,7 +12,11 @@ This file is the explicit capability and coverage contract for the project.
- Source: user
- Primary owning slice: M002/S01
- Supporting slices: M002/S03
<<<<<<< HEAD
- Validation: unmapped
=======
- Validation: contract-proven (S01) — prompt instructions and manifest types/parser established; runtime proof pending S04
>>>>>>> gsd/M002/S01
- Notes: Forecasting is LLM-generated at planning time, not from a static database.
### R002 — Secrets manifest file persisted in .gsd/
@ -23,7 +27,11 @@ This file is the explicit capability and coverage contract for the project.
- Source: user
- Primary owning slice: M002/S01
- Supporting slices: M002/S02, M002/S03
<<<<<<< HEAD
- Validation: unmapped
=======
- Validation: contract-proven (S01) — format defined with types, parser, writer, template; runtime persistence pending S03/S04
>>>>>>> gsd/M002/S01
- Notes: File format must be parseable by the auto-mode state machine.
### R003 — LLM-generated step-by-step guidance per key
@ -34,7 +42,11 @@ This file is the explicit capability and coverage contract for the project.
- Source: user
- Primary owning slice: M002/S01
- Supporting slices: M002/S02
<<<<<<< HEAD
- Validation: unmapped
=======
- Validation: contract-proven (S01) — manifest format includes guidance[], dashboardUrl, formatHint per key; quality validation pending S04
>>>>>>> gsd/M002/S01
- Notes: Guidance quality depends on LLM knowledge of common services. Accuracy is best-effort.
### R004 — Summary screen before collection
@ -100,7 +112,11 @@ This file is the explicit capability and coverage contract for the project.
- Source: inferred
- Primary owning slice: M002/S01
- Supporting slices: none
<<<<<<< HEAD
- Validation: unmapped
=======
- Validation: validated (S01) — both plan-milestone.md and guided-plan-milestone.md contain forecasting instructions with {{secretsOutputPath}} variable, wired through auto.ts and guided-flow.ts
>>>>>>> gsd/M002/S01
- Notes: Modifies plan-milestone.md and possibly the discuss prompt.
### R010 — secure_env_collect enhanced with guidance field
@ -170,15 +186,25 @@ This file is the explicit capability and coverage contract for the project.
| ID | Class | Status | Primary owner | Supporting | Proof |
|---|---|---|---|---|---|
<<<<<<< HEAD
| R001 | core-capability | active | M002/S01 | M002/S03 | unmapped |
| R002 | continuity | active | M002/S01 | M002/S02, M002/S03 | unmapped |
| R003 | primary-user-loop | active | M002/S01 | M002/S02 | unmapped |
=======
| R001 | core-capability | active | M002/S01 | M002/S03 | contract-proven (S01) |
| R002 | continuity | active | M002/S01 | M002/S02, M002/S03 | contract-proven (S01) |
| R003 | primary-user-loop | active | M002/S01 | M002/S02 | contract-proven (S01) |
>>>>>>> gsd/M002/S01
| R004 | primary-user-loop | active | M002/S02 | none | unmapped |
| R005 | primary-user-loop | active | M002/S02 | none | unmapped |
| R006 | integration | active | M002/S02 | M002/S03 | unmapped |
| R007 | core-capability | active | M002/S03 | none | unmapped |
| R008 | core-capability | active | M002/S03 | none | unmapped |
<<<<<<< HEAD
| R009 | integration | active | M002/S01 | none | unmapped |
=======
| R009 | integration | validated | M002/S01 | none | validated (S01) |
>>>>>>> gsd/M002/S01
| R010 | primary-user-loop | active | M002/S02 | none | unmapped |
| R011 | core-capability | deferred | none | none | unmapped |
| R012 | operability | deferred | none | none | unmapped |
@ -187,7 +213,14 @@ This file is the explicit capability and coverage contract for the project.
## Coverage Summary
<<<<<<< HEAD
- Active requirements: 10
- Mapped to slices: 10
- Validated: 0
=======
- Active requirements: 9
- Mapped to slices: 10
- Validated: 1 (R009)
- Contract-proven: 3 (R001, R002, R003)
>>>>>>> gsd/M002/S01
- Unmapped active requirements: 0

View file

@ -2,6 +2,7 @@
**Active Milestone:** M002 — Proactive Secret Management
<<<<<<< HEAD
<<<<<<< HEAD
**Active Slice:** —
**Active Task:** —
**Phase:** pre-planning
@ -23,6 +24,8 @@
- (none)
=======
=======
>>>>>>> gsd/M002/S01
**Active Slice:** S02 — Enhanced Collection UX
**Phase:** planning
**Requirements Status:** 10 active · 0 validated · 2 deferred · 2 out of scope
@ -39,4 +42,7 @@
## Next Action
Plan slice S02 (Enhanced Collection UX).
<<<<<<< HEAD
>>>>>>> gsd/M002/S01
=======
>>>>>>> gsd/M002/S01

View file

@ -22,6 +22,7 @@ function run(cmd, options = {}) {
})
}
<<<<<<< HEAD
<<<<<<< HEAD
// ---------------------------------------------------------------------------
// Redirect stdout → stderr so npm always shows postinstall output.
@ -60,6 +61,9 @@ const banner =
=======
=======
>>>>>>> gsd/M002/S01
// ---------------------------------------------------------------------------
// Redirect stdout → stderr so npm always shows postinstall output.
// npm ≥7 suppresses stdout from lifecycle scripts by default; stderr is
@ -73,28 +77,41 @@ process.stdout.write = process.stderr.write.bind(process.stderr)
;(async () => {
let p, pc
<<<<<<< HEAD
>>>>>>> gsd/M002/S01
=======
>>>>>>> gsd/M002/S01
try {
p = await import('@clack/prompts')
pc = (await import('picocolors')).default
} catch {
// Clack or picocolors unavailable — fall back to minimal output
<<<<<<< HEAD
<<<<<<< HEAD
process.stderr.write(` Run gsd to get started.\n\n`)
await run('npx patch-package')
await run('npx playwright install chromium')
=======
=======
>>>>>>> gsd/M002/S01
process.stderr.write(`\n GSD v${pkg.version} installed.\n Run gsd to get started.\n\n`)
await run('npx patch-package')
const args = os.platform() === 'linux' ? '--with-deps' : ''
await run(`npx playwright install chromium ${args}`)
<<<<<<< HEAD
>>>>>>> gsd/M002/S01
=======
>>>>>>> gsd/M002/S01
return
}
// --- Branded intro -------------------------------------------------------
<<<<<<< HEAD
<<<<<<< HEAD
p.intro('Setup')
=======
p.intro(pc.bgCyan(pc.black(' gsd ')) + ' ' + pc.dim(`v${pkg.version}`))
>>>>>>> gsd/M002/S01
=======
p.intro(pc.bgCyan(pc.black(' gsd ')) + ' ' + pc.dim(`v${pkg.version}`))
>>>>>>> gsd/M002/S01
@ -117,11 +134,17 @@ process.stdout.write = process.stderr.write.bind(process.stderr)
}
// --- Step 2: Playwright browser ------------------------------------------
<<<<<<< HEAD
<<<<<<< HEAD
// Avoid --with-deps: install scripts should not block on interactive sudo
// prompts. If Linux libs are missing, suggest the explicit follow-up.
s.start('Setting up browser tools…')
const pwResult = await run('npx playwright install chromium')
=======
s.start('Setting up browser tools…')
const pwArgs = os.platform() === 'linux' ? ' --with-deps' : ''
const pwResult = await run(`npx playwright install chromium${pwArgs}`)
>>>>>>> gsd/M002/S01
=======
s.start('Setting up browser tools…')
const pwArgs = os.platform() === 'linux' ? ' --with-deps' : ''
@ -131,6 +154,7 @@ process.stdout.write = process.stderr.write.bind(process.stderr)
s.stop('Browser tools ready')
results.push({ label: 'Browser tools ready', ok: true })
} else {
<<<<<<< HEAD
<<<<<<< HEAD
const output = `${pwResult.stdout ?? ''}${pwResult.stderr ?? ''}`
if (os.platform() === 'linux' && output.includes('Host system is missing dependencies to run browsers.')) {
@ -147,11 +171,16 @@ process.stdout.write = process.stderr.write.bind(process.stderr)
})
}
=======
=======
>>>>>>> gsd/M002/S01
s.stop(pc.yellow('Browser tools — skipped (non-fatal)'))
results.push({
label: 'Browser tools unavailable — run ' + pc.cyan('npx playwright install chromium'),
ok: false,
})
<<<<<<< HEAD
>>>>>>> gsd/M002/S01
=======
>>>>>>> gsd/M002/S01
}

View file

@ -1250,6 +1250,7 @@ console.log('\n=== parseRequirementCounts: total is sum of all section counts ==
// ═══════════════════════════════════════════════════════════════════════════
<<<<<<< HEAD
<<<<<<< HEAD
// parseSummary: bare scalar frontmatter fields (regression test for #91)
// ═══════════════════════════════════════════════════════════════════════════
@ -1342,6 +1343,8 @@ Nothing.
assertEq(s.frontmatter.drill_down_paths.length, 0, 'missing drill_down_paths = empty array');
assertEq(s.frontmatter.observability_surfaces.length, 0, 'missing observability_surfaces = empty array');
=======
=======
>>>>>>> gsd/M002/S01
// parseSecretsManifest / formatSecretsManifest tests
// ═══════════════════════════════════════════════════════════════════════════
@ -1579,6 +1582,9 @@ console.log('\n=== parseSecretsManifest + formatSecretsManifest: round-trip ==='
assertEq(e2.guidance[j], e1.guidance[j], `round-trip entry ${i} guidance[${j}]`);
}
}
<<<<<<< HEAD
>>>>>>> gsd/M002/S01
=======
>>>>>>> gsd/M002/S01
}