@productbrain/cli 0.1.0-beta.107 → 0.1.0-beta.1070
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/dist/__tests__/audit.test.js +5 -0
- package/dist/__tests__/audit.test.js.map +1 -1
- package/dist/__tests__/canonicalRefs.vocab.test.d.ts +2 -0
- package/dist/__tests__/canonicalRefs.vocab.test.d.ts.map +1 -0
- package/dist/__tests__/canonicalRefs.vocab.test.js +251 -0
- package/dist/__tests__/canonicalRefs.vocab.test.js.map +1 -0
- package/dist/__tests__/config.test.js +272 -2
- package/dist/__tests__/config.test.js.map +1 -1
- package/dist/__tests__/constants.test.js +6 -1
- package/dist/__tests__/constants.test.js.map +1 -1
- package/dist/__tests__/envelope-contract.test.js +29 -3
- package/dist/__tests__/envelope-contract.test.js.map +1 -1
- package/dist/__tests__/errors.test.js +1 -0
- package/dist/__tests__/errors.test.js.map +1 -1
- package/dist/__tests__/handshake-augment.test.d.ts +2 -0
- package/dist/__tests__/handshake-augment.test.d.ts.map +1 -0
- package/dist/__tests__/handshake-augment.test.js +423 -0
- package/dist/__tests__/handshake-augment.test.js.map +1 -0
- package/dist/__tests__/handshake-dormancy.test.d.ts +2 -0
- package/dist/__tests__/handshake-dormancy.test.d.ts.map +1 -0
- package/dist/__tests__/handshake-dormancy.test.js +207 -0
- package/dist/__tests__/handshake-dormancy.test.js.map +1 -0
- package/dist/__tests__/handshake-formatter.test.d.ts +2 -0
- package/dist/__tests__/handshake-formatter.test.d.ts.map +1 -0
- package/dist/__tests__/handshake-formatter.test.js +67 -0
- package/dist/__tests__/handshake-formatter.test.js.map +1 -0
- package/dist/__tests__/handshake-preview.test.js +566 -4
- package/dist/__tests__/handshake-preview.test.js.map +1 -1
- package/dist/__tests__/handshake.e2e.test.d.ts +2 -0
- package/dist/__tests__/handshake.e2e.test.d.ts.map +1 -0
- package/dist/__tests__/handshake.e2e.test.js +1252 -0
- package/dist/__tests__/handshake.e2e.test.js.map +1 -0
- package/dist/__tests__/handshake.test.js +255 -5
- package/dist/__tests__/handshake.test.js.map +1 -1
- package/dist/__tests__/manifest.test.js +118 -1
- package/dist/__tests__/manifest.test.js.map +1 -1
- package/dist/__tests__/notice-marker.test.d.ts +2 -0
- package/dist/__tests__/notice-marker.test.d.ts.map +1 -0
- package/dist/__tests__/notice-marker.test.js +41 -0
- package/dist/__tests__/notice-marker.test.js.map +1 -0
- package/dist/__tests__/onboarding-path-b.test.js +4 -4
- package/dist/__tests__/onboarding-path-b.test.js.map +1 -1
- package/dist/__tests__/orient.test.js +117 -26
- package/dist/__tests__/orient.test.js.map +1 -1
- package/dist/__tests__/perimeter.test.d.ts +2 -0
- package/dist/__tests__/perimeter.test.d.ts.map +1 -0
- package/dist/__tests__/perimeter.test.js +165 -0
- package/dist/__tests__/perimeter.test.js.map +1 -0
- package/dist/__tests__/profiles.test.js +106 -2
- package/dist/__tests__/profiles.test.js.map +1 -1
- package/dist/__tests__/promote.test.js +2 -2
- package/dist/__tests__/promote.test.js.map +1 -1
- package/dist/__tests__/session-reset.test.d.ts +2 -0
- package/dist/__tests__/session-reset.test.d.ts.map +1 -0
- package/dist/__tests__/session-reset.test.js +122 -0
- package/dist/__tests__/session-reset.test.js.map +1 -0
- package/dist/__tests__/session-resume-backstop.test.d.ts +2 -0
- package/dist/__tests__/session-resume-backstop.test.d.ts.map +1 -0
- package/dist/__tests__/session-resume-backstop.test.js +97 -0
- package/dist/__tests__/session-resume-backstop.test.js.map +1 -0
- package/dist/__tests__/session-state-machine.test.js +45 -1
- package/dist/__tests__/session-state-machine.test.js.map +1 -1
- package/dist/__tests__/session-switch.test.d.ts +2 -0
- package/dist/__tests__/session-switch.test.d.ts.map +1 -0
- package/dist/__tests__/session-switch.test.js +129 -0
- package/dist/__tests__/session-switch.test.js.map +1 -0
- package/dist/__tests__/setup-ingest.test.js +16 -0
- package/dist/__tests__/setup-ingest.test.js.map +1 -1
- package/dist/__tests__/skill-vocabulary.test.d.ts +21 -0
- package/dist/__tests__/skill-vocabulary.test.d.ts.map +1 -0
- package/dist/__tests__/skill-vocabulary.test.js +187 -0
- package/dist/__tests__/skill-vocabulary.test.js.map +1 -0
- package/dist/__tests__/update-check.test.d.ts +2 -0
- package/dist/__tests__/update-check.test.d.ts.map +1 -0
- package/dist/__tests__/update-check.test.js +215 -0
- package/dist/__tests__/update-check.test.js.map +1 -0
- package/dist/__tests__/upgrade-runner.test.d.ts +2 -0
- package/dist/__tests__/upgrade-runner.test.d.ts.map +1 -0
- package/dist/__tests__/upgrade-runner.test.js +54 -0
- package/dist/__tests__/upgrade-runner.test.js.map +1 -0
- package/dist/__tests__/upgrade.test.d.ts +2 -0
- package/dist/__tests__/upgrade.test.d.ts.map +1 -0
- package/dist/__tests__/upgrade.test.js +56 -0
- package/dist/__tests__/upgrade.test.js.map +1 -0
- package/dist/__tests__/vocabulary-leak.test.d.ts +39 -0
- package/dist/__tests__/vocabulary-leak.test.d.ts.map +1 -0
- package/dist/__tests__/vocabulary-leak.test.js +534 -0
- package/dist/__tests__/vocabulary-leak.test.js.map +1 -0
- package/dist/commands/__tests__/connect-handoff.test.d.ts +11 -0
- package/dist/commands/__tests__/connect-handoff.test.d.ts.map +1 -0
- package/dist/commands/__tests__/connect-handoff.test.js +111 -0
- package/dist/commands/__tests__/connect-handoff.test.js.map +1 -0
- package/dist/commands/__tests__/setup-detect-surfaces.test.d.ts +15 -0
- package/dist/commands/__tests__/setup-detect-surfaces.test.d.ts.map +1 -0
- package/dist/commands/__tests__/setup-detect-surfaces.test.js +149 -0
- package/dist/commands/__tests__/setup-detect-surfaces.test.js.map +1 -0
- package/dist/commands/__tests__/setup-state.test.d.ts +2 -0
- package/dist/commands/__tests__/setup-state.test.d.ts.map +1 -0
- package/dist/commands/__tests__/setup-state.test.js +194 -0
- package/dist/commands/__tests__/setup-state.test.js.map +1 -0
- package/dist/commands/admin/seed.d.ts +32 -2
- package/dist/commands/admin/seed.d.ts.map +1 -1
- package/dist/commands/admin/seed.js +279 -33
- package/dist/commands/admin/seed.js.map +1 -1
- package/dist/commands/admin/seed.test.js +7 -0
- package/dist/commands/admin/seed.test.js.map +1 -1
- package/dist/commands/admin/seedRegistryEntries.generated.d.ts +14 -0
- package/dist/commands/admin/seedRegistryEntries.generated.d.ts.map +1 -0
- package/dist/commands/admin/seedRegistryEntries.generated.js +117 -0
- package/dist/commands/admin/seedRegistryEntries.generated.js.map +1 -0
- package/dist/commands/admin/seedRegistryEntries.test.d.ts +11 -0
- package/dist/commands/admin/seedRegistryEntries.test.d.ts.map +1 -0
- package/dist/commands/admin/seedRegistryEntries.test.js +67 -0
- package/dist/commands/admin/seedRegistryEntries.test.js.map +1 -0
- package/dist/commands/audit.d.ts.map +1 -1
- package/dist/commands/audit.js +30 -3
- package/dist/commands/audit.js.map +1 -1
- package/dist/commands/authority-domains.d.ts +7 -1
- package/dist/commands/authority-domains.d.ts.map +1 -1
- package/dist/commands/authority-domains.js +19 -4
- package/dist/commands/authority-domains.js.map +1 -1
- package/dist/commands/capture.d.ts +2 -0
- package/dist/commands/capture.d.ts.map +1 -1
- package/dist/commands/capture.js +8 -3
- package/dist/commands/capture.js.map +1 -1
- package/dist/commands/codex-prep.js +6 -6
- package/dist/commands/codex-prep.js.map +1 -1
- package/dist/commands/connect-config.test.d.ts +2 -0
- package/dist/commands/connect-config.test.d.ts.map +1 -0
- package/dist/commands/connect-config.test.js +44 -0
- package/dist/commands/connect-config.test.js.map +1 -0
- package/dist/commands/connect-context.d.ts +45 -0
- package/dist/commands/connect-context.d.ts.map +1 -0
- package/dist/commands/connect-context.js +64 -0
- package/dist/commands/connect-context.js.map +1 -0
- package/dist/commands/connect-context.test.d.ts +2 -0
- package/dist/commands/connect-context.test.d.ts.map +1 -0
- package/dist/commands/connect-context.test.js +110 -0
- package/dist/commands/connect-context.test.js.map +1 -0
- package/dist/commands/connect-handoff.d.ts +51 -0
- package/dist/commands/connect-handoff.d.ts.map +1 -0
- package/dist/commands/connect-handoff.js +70 -0
- package/dist/commands/connect-handoff.js.map +1 -0
- package/dist/commands/connect-integration.test.js +13 -12
- package/dist/commands/connect-integration.test.js.map +1 -1
- package/dist/commands/connect-screens.d.ts +7 -8
- package/dist/commands/connect-screens.d.ts.map +1 -1
- package/dist/commands/connect-screens.js +30 -37
- package/dist/commands/connect-screens.js.map +1 -1
- package/dist/commands/connect.d.ts +19 -6
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +31 -56
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +67 -2
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/doctor.test.js +150 -0
- package/dist/commands/doctor.test.js.map +1 -1
- package/dist/commands/handshake.d.ts +84 -4
- package/dist/commands/handshake.d.ts.map +1 -1
- package/dist/commands/handshake.js +1169 -97
- package/dist/commands/handshake.js.map +1 -1
- package/dist/commands/method.d.ts.map +1 -1
- package/dist/commands/method.js +5 -1
- package/dist/commands/method.js.map +1 -1
- package/dist/commands/orient.d.ts +52 -2
- package/dist/commands/orient.d.ts.map +1 -1
- package/dist/commands/orient.js +41 -7
- package/dist/commands/orient.js.map +1 -1
- package/dist/commands/profile.d.ts +1 -14
- package/dist/commands/profile.d.ts.map +1 -1
- package/dist/commands/profile.js +89 -72
- package/dist/commands/profile.js.map +1 -1
- package/dist/commands/reject.d.ts.map +1 -1
- package/dist/commands/reject.js +2 -1
- package/dist/commands/reject.js.map +1 -1
- package/dist/commands/relate.d.ts.map +1 -1
- package/dist/commands/relate.js +4 -2
- package/dist/commands/relate.js.map +1 -1
- package/dist/commands/session.d.ts +22 -0
- package/dist/commands/session.d.ts.map +1 -1
- package/dist/commands/session.js +112 -14
- package/dist/commands/session.js.map +1 -1
- package/dist/commands/setup-audit.d.ts +59 -0
- package/dist/commands/setup-audit.d.ts.map +1 -0
- package/dist/commands/setup-audit.js +250 -0
- package/dist/commands/setup-audit.js.map +1 -0
- package/dist/commands/setup-detect-surfaces.d.ts +38 -0
- package/dist/commands/setup-detect-surfaces.d.ts.map +1 -0
- package/dist/commands/setup-detect-surfaces.js +76 -0
- package/dist/commands/setup-detect-surfaces.js.map +1 -0
- package/dist/commands/setup-ingest.d.ts.map +1 -1
- package/dist/commands/setup-ingest.js +4 -2
- package/dist/commands/setup-ingest.js.map +1 -1
- package/dist/commands/setup-state.d.ts +42 -0
- package/dist/commands/setup-state.d.ts.map +1 -0
- package/dist/commands/setup-state.js +93 -0
- package/dist/commands/setup-state.js.map +1 -0
- package/dist/commands/setup.d.ts +17 -9
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +52 -131
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +2 -1
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/upgrade.d.ts +5 -0
- package/dist/commands/upgrade.d.ts.map +1 -0
- package/dist/commands/upgrade.js +110 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +2 -1
- package/dist/commands/verify.js.map +1 -1
- package/dist/commands/whoami.d.ts +12 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +70 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/commands/whoami.test.d.ts +2 -0
- package/dist/commands/whoami.test.d.ts.map +1 -0
- package/dist/commands/whoami.test.js +50 -0
- package/dist/commands/whoami.test.js.map +1 -0
- package/dist/formatters/__tests__/orient-provenance.test.d.ts +7 -0
- package/dist/formatters/__tests__/orient-provenance.test.d.ts.map +1 -0
- package/dist/formatters/__tests__/orient-provenance.test.js +454 -0
- package/dist/formatters/__tests__/orient-provenance.test.js.map +1 -0
- package/dist/formatters/audit.d.ts +6 -0
- package/dist/formatters/audit.d.ts.map +1 -1
- package/dist/formatters/audit.js.map +1 -1
- package/dist/formatters/entry.d.ts +21 -0
- package/dist/formatters/entry.d.ts.map +1 -1
- package/dist/formatters/entry.js +46 -5
- package/dist/formatters/entry.js.map +1 -1
- package/dist/formatters/handshake.d.ts +19 -3
- package/dist/formatters/handshake.d.ts.map +1 -1
- package/dist/formatters/handshake.js +47 -12
- package/dist/formatters/handshake.js.map +1 -1
- package/dist/formatters/orient.d.ts +64 -4
- package/dist/formatters/orient.d.ts.map +1 -1
- package/dist/formatters/orient.js +103 -18
- package/dist/formatters/orient.js.map +1 -1
- package/dist/generators/adapters.js +4 -4
- package/dist/generators/context-md.js +6 -6
- package/dist/generators/context-md.js.map +1 -1
- package/dist/generators/manifest.d.ts +76 -0
- package/dist/generators/manifest.d.ts.map +1 -1
- package/dist/generators/manifest.js +125 -14
- package/dist/generators/manifest.js.map +1 -1
- package/dist/generators/portable-knowledge.d.ts +2 -2
- package/dist/generators/portable-knowledge.d.ts.map +1 -1
- package/dist/generators/region-projections.d.ts +18 -0
- package/dist/generators/region-projections.d.ts.map +1 -0
- package/dist/generators/region-projections.js +49 -0
- package/dist/generators/region-projections.js.map +1 -0
- package/dist/generators/region-projections.test.d.ts +2 -0
- package/dist/generators/region-projections.test.d.ts.map +1 -0
- package/dist/generators/region-projections.test.js +63 -0
- package/dist/generators/region-projections.test.js.map +1 -0
- package/dist/generators/region.d.ts +24 -0
- package/dist/generators/region.d.ts.map +1 -0
- package/dist/generators/region.js +87 -0
- package/dist/generators/region.js.map +1 -0
- package/dist/generators/region.test.d.ts +2 -0
- package/dist/generators/region.test.d.ts.map +1 -0
- package/dist/generators/region.test.js +126 -0
- package/dist/generators/region.test.js.map +1 -0
- package/dist/generators/surface-profiles.d.ts +1 -2
- package/dist/generators/surface-profiles.d.ts.map +1 -1
- package/dist/generators/surface-profiles.js.map +1 -1
- package/dist/index.js +144 -25
- package/dist/index.js.map +1 -1
- package/dist/lib/activation.js +2 -2
- package/dist/lib/activation.js.map +1 -1
- package/dist/lib/activation.test.js +3 -3
- package/dist/lib/activation.test.js.map +1 -1
- package/dist/lib/canonicalRefs.d.ts +72 -0
- package/dist/lib/canonicalRefs.d.ts.map +1 -1
- package/dist/lib/canonicalRefs.js +67 -0
- package/dist/lib/canonicalRefs.js.map +1 -1
- package/dist/lib/client.d.ts.map +1 -1
- package/dist/lib/client.js +13 -3
- package/dist/lib/client.js.map +1 -1
- package/dist/lib/config.d.ts +70 -4
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +151 -11
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/constants.d.ts +2 -0
- package/dist/lib/constants.d.ts.map +1 -1
- package/dist/lib/constants.js +2 -0
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/errors.d.ts +1 -0
- package/dist/lib/errors.d.ts.map +1 -1
- package/dist/lib/errors.js +1 -0
- package/dist/lib/errors.js.map +1 -1
- package/dist/lib/notice-marker.d.ts +3 -0
- package/dist/lib/notice-marker.d.ts.map +1 -0
- package/dist/lib/notice-marker.js +53 -0
- package/dist/lib/notice-marker.js.map +1 -0
- package/dist/lib/onboarding-path-b.d.ts.map +1 -1
- package/dist/lib/onboarding-path-b.js +0 -1
- package/dist/lib/onboarding-path-b.js.map +1 -1
- package/dist/lib/onboarding-shared.d.ts +0 -1
- package/dist/lib/onboarding-shared.d.ts.map +1 -1
- package/dist/lib/onboarding-shared.js +1 -17
- package/dist/lib/onboarding-shared.js.map +1 -1
- package/dist/lib/profiles.d.ts +3 -1
- package/dist/lib/profiles.d.ts.map +1 -1
- package/dist/lib/profiles.js +9 -6
- package/dist/lib/profiles.js.map +1 -1
- package/dist/lib/session.d.ts +10 -0
- package/dist/lib/session.d.ts.map +1 -1
- package/dist/lib/session.js +26 -1
- package/dist/lib/session.js.map +1 -1
- package/dist/lib/update-check.d.ts +42 -7
- package/dist/lib/update-check.d.ts.map +1 -1
- package/dist/lib/update-check.js +213 -62
- package/dist/lib/update-check.js.map +1 -1
- package/dist/lib/upgrade-runner.d.ts +22 -0
- package/dist/lib/upgrade-runner.d.ts.map +1 -0
- package/dist/lib/upgrade-runner.js +110 -0
- package/dist/lib/upgrade-runner.js.map +1 -0
- package/dist/lib/workspaceVocabCache.d.ts +60 -0
- package/dist/lib/workspaceVocabCache.d.ts.map +1 -0
- package/dist/lib/workspaceVocabCache.js +98 -0
- package/dist/lib/workspaceVocabCache.js.map +1 -0
- package/dist/setup/__tests__/coach-traces.test.d.ts +2 -0
- package/dist/setup/__tests__/coach-traces.test.d.ts.map +1 -0
- package/dist/setup/__tests__/coach-traces.test.js +189 -0
- package/dist/setup/__tests__/coach-traces.test.js.map +1 -0
- package/dist/setup/__tests__/setup-commands.test.d.ts +2 -0
- package/dist/setup/__tests__/setup-commands.test.d.ts.map +1 -0
- package/dist/setup/__tests__/setup-commands.test.js +177 -0
- package/dist/setup/__tests__/setup-commands.test.js.map +1 -0
- package/dist/setup/__tests__/state-machine.test.d.ts +2 -0
- package/dist/setup/__tests__/state-machine.test.d.ts.map +1 -0
- package/dist/setup/__tests__/state-machine.test.js +341 -0
- package/dist/setup/__tests__/state-machine.test.js.map +1 -0
- package/dist/setup/detect-surfaces.d.ts +21 -0
- package/dist/setup/detect-surfaces.d.ts.map +1 -0
- package/dist/setup/detect-surfaces.js +39 -0
- package/dist/setup/detect-surfaces.js.map +1 -0
- package/dist/setup/manifest-writer.d.ts +17 -0
- package/dist/setup/manifest-writer.d.ts.map +1 -0
- package/dist/setup/manifest-writer.js +153 -0
- package/dist/setup/manifest-writer.js.map +1 -0
- package/dist/setup/perimeter.d.ts +72 -0
- package/dist/setup/perimeter.d.ts.map +1 -0
- package/dist/setup/perimeter.js +128 -0
- package/dist/setup/perimeter.js.map +1 -0
- package/dist/setup/state-machine.d.ts +67 -0
- package/dist/setup/state-machine.d.ts.map +1 -0
- package/dist/setup/state-machine.js +124 -0
- package/dist/setup/state-machine.js.map +1 -0
- package/dist/surfaces/__tests__/adapter.test.d.ts +2 -0
- package/dist/surfaces/__tests__/adapter.test.d.ts.map +1 -0
- package/dist/surfaces/__tests__/adapter.test.js +90 -0
- package/dist/surfaces/__tests__/adapter.test.js.map +1 -0
- package/dist/surfaces/__tests__/pb-setup-passthrough.test.d.ts +2 -0
- package/dist/surfaces/__tests__/pb-setup-passthrough.test.d.ts.map +1 -0
- package/dist/surfaces/__tests__/pb-setup-passthrough.test.js +132 -0
- package/dist/surfaces/__tests__/pb-setup-passthrough.test.js.map +1 -0
- package/dist/surfaces/__tests__/telemetry.test.d.ts +2 -0
- package/dist/surfaces/__tests__/telemetry.test.d.ts.map +1 -0
- package/dist/surfaces/__tests__/telemetry.test.js +55 -0
- package/dist/surfaces/__tests__/telemetry.test.js.map +1 -0
- package/dist/surfaces/adapter.d.ts +70 -0
- package/dist/surfaces/adapter.d.ts.map +1 -0
- package/dist/surfaces/adapter.js +2 -0
- package/dist/surfaces/adapter.js.map +1 -0
- package/dist/surfaces/adapters/claude.d.ts +3 -0
- package/dist/surfaces/adapters/claude.d.ts.map +1 -0
- package/dist/surfaces/adapters/claude.js +67 -0
- package/dist/surfaces/adapters/claude.js.map +1 -0
- package/dist/surfaces/adapters/codex.d.ts +3 -0
- package/dist/surfaces/adapters/codex.d.ts.map +1 -0
- package/dist/surfaces/adapters/codex.js +61 -0
- package/dist/surfaces/adapters/codex.js.map +1 -0
- package/dist/surfaces/adapters/copilot.d.ts +3 -0
- package/dist/surfaces/adapters/copilot.d.ts.map +1 -0
- package/dist/surfaces/adapters/copilot.js +59 -0
- package/dist/surfaces/adapters/copilot.js.map +1 -0
- package/dist/surfaces/adapters/cursor.d.ts +3 -0
- package/dist/surfaces/adapters/cursor.d.ts.map +1 -0
- package/dist/surfaces/adapters/cursor.js +78 -0
- package/dist/surfaces/adapters/cursor.js.map +1 -0
- package/dist/surfaces/registry.d.ts +58 -2
- package/dist/surfaces/registry.d.ts.map +1 -1
- package/dist/surfaces/registry.js +82 -7
- package/dist/surfaces/registry.js.map +1 -1
- package/dist/surfaces/telemetry.d.ts +17 -0
- package/dist/surfaces/telemetry.d.ts.map +1 -0
- package/dist/surfaces/telemetry.js +31 -0
- package/dist/surfaces/telemetry.js.map +1 -0
- package/package.json +3 -1
- package/dist/__tests__/setup.test.d.ts +0 -2
- package/dist/__tests__/setup.test.d.ts.map +0 -1
- package/dist/__tests__/setup.test.js +0 -141
- package/dist/__tests__/setup.test.js.map +0 -1
- package/dist/generators/__tests__/surface-profiles.test.d.ts +0 -2
- package/dist/generators/__tests__/surface-profiles.test.d.ts.map +0 -1
- package/dist/generators/__tests__/surface-profiles.test.js +0 -89
- package/dist/generators/__tests__/surface-profiles.test.js.map +0 -1
- package/dist/lib/onboarding-phases.d.ts +0 -9
- package/dist/lib/onboarding-phases.d.ts.map +0 -1
- package/dist/lib/onboarding-phases.js +0 -120
- package/dist/lib/onboarding-phases.js.map +0 -1
|
@@ -14,6 +14,28 @@ export declare function runSessionStart(options?: {
|
|
|
14
14
|
* Resolves TEN-707. Zero network call — reads local session.json only.
|
|
15
15
|
*/
|
|
16
16
|
export declare function runSessionId(): void;
|
|
17
|
+
/**
|
|
18
|
+
* pb session reset — hard-reset the worktree-local pb SESSION state. TEN-2189 / WP-456 E2.
|
|
19
|
+
*
|
|
20
|
+
* Discards session.json outright (via discardSession — NO resume marker, unlike
|
|
21
|
+
* `pb session close`). Purely local: no network call, no key needed — this is the recovery
|
|
22
|
+
* path when a session is stranded pinned to the wrong workspace (e.g. left over after a
|
|
23
|
+
* pb:preview/pb:real binding flip), so it must work even when the current binding is broken.
|
|
24
|
+
*
|
|
25
|
+
* Scope: SESSION state only. The preview *binding* (config.local.json keys + the
|
|
26
|
+
* .productbrain/PREVIEW_MODE marker) is owned end-to-end by `npm run pb:preview` /
|
|
27
|
+
* `npm run pb:real` — reset never touches it, so the marker can never disagree with the keys
|
|
28
|
+
* that actually route writes (codex PR #145 review: clearing the marker without the keys left
|
|
29
|
+
* the worktree silently still preview-bound). To return a preview-bound worktree to the real
|
|
30
|
+
* Chain: `pb session reset` (clear the session) then `npm run pb:real` (clear the binding).
|
|
31
|
+
*
|
|
32
|
+
* Guard (R4): if there IS an active session, confirm before discarding so in-flight captures
|
|
33
|
+
* aren't silently stranded. `--force` skips the prompt. In a non-interactive context the prompt
|
|
34
|
+
* can't run, so `--force` is required there.
|
|
35
|
+
*/
|
|
36
|
+
export declare function runSessionReset(options?: {
|
|
37
|
+
force?: boolean;
|
|
38
|
+
}): Promise<void>;
|
|
17
39
|
export declare function runSessionClose(options?: {
|
|
18
40
|
force?: boolean;
|
|
19
41
|
}): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/commands/session.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/commands/session.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAwCH,wBAAsB,eAAe,CAAC,OAAO,GAAE;IAC7C,wFAAwF;IACxF,IAAI,CAAC,EAAE,OAAO,CAAA;CACV,GAAG,OAAO,CAAC,IAAI,CAAC,CAoJrB;AAED;;;GAGG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAUnC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,eAAe,CAAC,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAkCtF;AAED,wBAAsB,eAAe,CAAC,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAqFtF"}
|
package/dist/commands/session.js
CHANGED
|
@@ -7,13 +7,14 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { getConfigOrGuide } from '../lib/config.js';
|
|
9
9
|
import { kernelCall } from '../lib/client.js';
|
|
10
|
-
import { readSession, writeSession, clearSession, readClosedMarker } from '../lib/session.js';
|
|
10
|
+
import { readSession, writeSession, clearSession, discardSession, sessionFileExists, readClosedMarker } from '../lib/session.js';
|
|
11
11
|
import { isJsonMode } from '../lib/runner.js';
|
|
12
|
+
import { confirm, isInteractive } from '../lib/prompts.js';
|
|
12
13
|
import { formatSessionStart, formatSessionClose } from '../formatters/session.js';
|
|
13
14
|
import { runHandshake } from './handshake.js';
|
|
14
15
|
import { CLIError, ErrorCode } from '../lib/errors.js';
|
|
15
16
|
import { getActiveProfile } from '../lib/profiles.js';
|
|
16
|
-
import { readLocalProjectConfig } from '../lib/config.js';
|
|
17
|
+
import { readLocalProjectConfig, resolveEffectiveProfile } from '../lib/config.js';
|
|
17
18
|
/** 2-hour window for auto-resume (WP-322 E1). */
|
|
18
19
|
const RESUME_WINDOW_MS = 2 * 60 * 60 * 1000;
|
|
19
20
|
export async function runSessionStart(options = {}) {
|
|
@@ -22,10 +23,21 @@ export async function runSessionStart(options = {}) {
|
|
|
22
23
|
return;
|
|
23
24
|
// Support both legacy --json flag and global output mode (DEC-299, backward compat)
|
|
24
25
|
const json = isJsonMode() || options.json === true;
|
|
26
|
+
// Effective profile for this start — used both for the switch-backstop decision and to
|
|
27
|
+
// stamp the session (one read, one value, so they can't disagree mid-start).
|
|
28
|
+
const effectiveProfile = resolveEffectiveProfile().profile;
|
|
25
29
|
// Check for existing session
|
|
26
30
|
const existing = readSession();
|
|
27
31
|
if (existing) {
|
|
28
|
-
|
|
32
|
+
// Backstop (TEN-2163): if the effective profile changed since this session started,
|
|
33
|
+
// it's pinned to the old workspace — discard it and start fresh. Local, offline-safe.
|
|
34
|
+
const currentProfile = effectiveProfile;
|
|
35
|
+
const switched = existing.profile && currentProfile && existing.profile !== currentProfile;
|
|
36
|
+
if (switched) {
|
|
37
|
+
discardSession();
|
|
38
|
+
// fall through to the fresh-start path below
|
|
39
|
+
}
|
|
40
|
+
else if (json) {
|
|
29
41
|
process.stdout.write(JSON.stringify({
|
|
30
42
|
sessionId: existing.sessionId,
|
|
31
43
|
workspaceName: existing.workspaceName,
|
|
@@ -35,12 +47,14 @@ export async function runSessionStart(options = {}) {
|
|
|
35
47
|
}) + '\n');
|
|
36
48
|
return;
|
|
37
49
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
50
|
+
else {
|
|
51
|
+
process.stdout.write(`Session already active: ${existing.sessionId}\n`);
|
|
52
|
+
process.stdout.write(`Started: ${existing.startedAt}\n`);
|
|
53
|
+
process.stdout.write(`Entries captured: ${existing.entriesCaptured.length}\n`);
|
|
54
|
+
process.stdout.write('\n');
|
|
55
|
+
process.stdout.write('Run `pb session close` to end it, or `pb session close --force` to force-close.\n');
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
44
58
|
}
|
|
45
59
|
// WP-322 E1: Check for a recent closed session — auto-resume within 2h window
|
|
46
60
|
const closedMarker = readClosedMarker();
|
|
@@ -49,7 +63,17 @@ export async function runSessionStart(options = {}) {
|
|
|
49
63
|
if (elapsed < RESUME_WINDOW_MS) {
|
|
50
64
|
// Resolve workspace to get keyId (needed for resumeSession)
|
|
51
65
|
const wsForResume = await kernelCall('resolveWorkspace', {});
|
|
52
|
-
|
|
66
|
+
// Backstop (TEN-2189): the closed marker is pinned to a workspace. If the current binding
|
|
67
|
+
// now resolves to a DIFFERENT workspace (a pb:preview/pb:real flip or profile switch since
|
|
68
|
+
// close), resuming would call agent.resumeSession with a foreign session id and the
|
|
69
|
+
// deployment rejects the cross-workspace resume. Discard the stale marker and fall through
|
|
70
|
+
// to a fresh start instead. This mirrors the active-session profile backstop above, keyed
|
|
71
|
+
// on workspaceId — the resume path previously had no such guard, which is the gap E2 closes.
|
|
72
|
+
if (wsForResume?._id && closedMarker.workspaceId !== wsForResume._id) {
|
|
73
|
+
discardSession();
|
|
74
|
+
// fall through to the fresh-start path below
|
|
75
|
+
}
|
|
76
|
+
else if (wsForResume?.keyId) {
|
|
53
77
|
if (!json)
|
|
54
78
|
process.stdout.write('Resuming session...\n');
|
|
55
79
|
const resumed = await kernelCall('agent.resumeSession', {
|
|
@@ -65,6 +89,7 @@ export async function runSessionStart(options = {}) {
|
|
|
65
89
|
workspaceName: resumed.workspaceName,
|
|
66
90
|
startedAt: new Date().toISOString(),
|
|
67
91
|
entriesCaptured: [],
|
|
92
|
+
profile: effectiveProfile ?? undefined,
|
|
68
93
|
};
|
|
69
94
|
writeSession(state);
|
|
70
95
|
if (json) {
|
|
@@ -119,6 +144,7 @@ export async function runSessionStart(options = {}) {
|
|
|
119
144
|
workspaceName: result.workspaceName,
|
|
120
145
|
startedAt: new Date().toISOString(),
|
|
121
146
|
entriesCaptured: [],
|
|
147
|
+
profile: effectiveProfile ?? undefined,
|
|
122
148
|
};
|
|
123
149
|
writeSession(state);
|
|
124
150
|
if (json) {
|
|
@@ -152,6 +178,56 @@ export function runSessionId() {
|
|
|
152
178
|
}
|
|
153
179
|
process.stdout.write(session.sessionId + '\n');
|
|
154
180
|
}
|
|
181
|
+
/**
|
|
182
|
+
* pb session reset — hard-reset the worktree-local pb SESSION state. TEN-2189 / WP-456 E2.
|
|
183
|
+
*
|
|
184
|
+
* Discards session.json outright (via discardSession — NO resume marker, unlike
|
|
185
|
+
* `pb session close`). Purely local: no network call, no key needed — this is the recovery
|
|
186
|
+
* path when a session is stranded pinned to the wrong workspace (e.g. left over after a
|
|
187
|
+
* pb:preview/pb:real binding flip), so it must work even when the current binding is broken.
|
|
188
|
+
*
|
|
189
|
+
* Scope: SESSION state only. The preview *binding* (config.local.json keys + the
|
|
190
|
+
* .productbrain/PREVIEW_MODE marker) is owned end-to-end by `npm run pb:preview` /
|
|
191
|
+
* `npm run pb:real` — reset never touches it, so the marker can never disagree with the keys
|
|
192
|
+
* that actually route writes (codex PR #145 review: clearing the marker without the keys left
|
|
193
|
+
* the worktree silently still preview-bound). To return a preview-bound worktree to the real
|
|
194
|
+
* Chain: `pb session reset` (clear the session) then `npm run pb:real` (clear the binding).
|
|
195
|
+
*
|
|
196
|
+
* Guard (R4): if there IS an active session, confirm before discarding so in-flight captures
|
|
197
|
+
* aren't silently stranded. `--force` skips the prompt. In a non-interactive context the prompt
|
|
198
|
+
* can't run, so `--force` is required there.
|
|
199
|
+
*/
|
|
200
|
+
export async function runSessionReset(options = {}) {
|
|
201
|
+
const active = readSession();
|
|
202
|
+
// Nothing local to reset — neither an active session nor a closed marker. (A lone
|
|
203
|
+
// PREVIEW_MODE marker is binding state, not session state — `npm run pb:real` clears it.)
|
|
204
|
+
if (!active && !sessionFileExists()) {
|
|
205
|
+
process.stdout.write('Nothing to reset — no local session state.\n');
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
// Active session present: confirm before discarding (R4) unless --force.
|
|
209
|
+
if (active && !options.force) {
|
|
210
|
+
if (!isInteractive()) {
|
|
211
|
+
throw new CLIError('Active session present — refusing to reset without confirmation.', {
|
|
212
|
+
code: ErrorCode.NON_INTERACTIVE,
|
|
213
|
+
category: 'session',
|
|
214
|
+
guidance: 'Re-run with `pb session reset --force` to discard the active session.',
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
process.stdout.write(`Active session: ${active.sessionId} (${active.entriesCaptured.length} entries captured)\n`);
|
|
218
|
+
const ok = await confirm({
|
|
219
|
+
message: 'Discard this active session and any in-flight captures?',
|
|
220
|
+
initialValue: false,
|
|
221
|
+
});
|
|
222
|
+
if (!ok) {
|
|
223
|
+
process.stdout.write('Reset cancelled — session left intact.\n');
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
// Hard-reset: discard session.json (no resume marker). Binding state is left untouched.
|
|
228
|
+
discardSession();
|
|
229
|
+
process.stdout.write('Session state reset — session.json cleared.\n');
|
|
230
|
+
}
|
|
155
231
|
export async function runSessionClose(options = {}) {
|
|
156
232
|
const config = await getConfigOrGuide(() => runSessionClose(options));
|
|
157
233
|
if (!config)
|
|
@@ -186,18 +262,40 @@ export async function runSessionClose(options = {}) {
|
|
|
186
262
|
}
|
|
187
263
|
catch (err) {
|
|
188
264
|
if (!options.force) {
|
|
189
|
-
|
|
265
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
266
|
+
throw new CLIError(`Failed to close session: ${detail}. Run \`pb session close --force\` to clear local state anyway.`, {
|
|
190
267
|
code: ErrorCode.NETWORK_UNREACHABLE,
|
|
191
268
|
category: 'network',
|
|
192
|
-
guidance: '
|
|
269
|
+
guidance: 'Run `pb session close --force` to clear local state anyway.',
|
|
193
270
|
});
|
|
194
271
|
}
|
|
195
272
|
}
|
|
196
273
|
process.stdout.write(formatSessionClose(session) + '\n');
|
|
274
|
+
// WP-439 S6: surface unrepaired setup-asset receipts as a non-blocking
|
|
275
|
+
// advisory. Failures here are silent — never let a network blip or schema
|
|
276
|
+
// gap prevent a session from closing.
|
|
277
|
+
try {
|
|
278
|
+
const advisory = await kernelCall('setup.listFailedAuditReceipts', {});
|
|
279
|
+
if (advisory.total > 0) {
|
|
280
|
+
const preview = advisory.entries
|
|
281
|
+
.slice(0, 3)
|
|
282
|
+
.map((e) => `${e.entryId} (${e.status})`)
|
|
283
|
+
.join(', ');
|
|
284
|
+
const more = advisory.total > 3 ? ` and ${advisory.total - 3} more` : '';
|
|
285
|
+
process.stdout.write(`\nNote: ${advisory.total} unrepaired setup-asset receipt(s) on file — ${preview}${more}.\n` +
|
|
286
|
+
'Run `pb setup-audit` to inspect; `pb setup-audit --repair` to retry.\n');
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
catch {
|
|
290
|
+
// Advisory call failure is non-fatal.
|
|
291
|
+
}
|
|
197
292
|
// Clear local state
|
|
198
293
|
clearSession();
|
|
199
|
-
// Refresh context files so next session starts with updated knowledge
|
|
294
|
+
// Refresh context files so next session starts with updated knowledge.
|
|
295
|
+
// WP-439 S4: internal handshake runs lenient — strict-mode failures from an
|
|
296
|
+
// automatic refresh would block close; orphans are surfaced via the
|
|
297
|
+
// advisory above + `pb handshake` (called directly) instead.
|
|
200
298
|
process.stdout.write('Refreshing context...\n');
|
|
201
|
-
await runHandshake({ force: false, apply: true });
|
|
299
|
+
await runHandshake({ force: false, apply: true, lenient: true });
|
|
202
300
|
}
|
|
203
301
|
//# sourceMappingURL=session.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/commands/session.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAqB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/commands/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `pb setup-audit` — WP-439 S2 (audit) + S3 (--repair).
|
|
3
|
+
*
|
|
4
|
+
* Operator preflight for handshake: classifies every setup_asset row in the
|
|
5
|
+
* caller's active workspace and surfaces orphaned bodies BEFORE handshake
|
|
6
|
+
* runs. With --repair, attempts a transactional fix for each orphan that has
|
|
7
|
+
* a canonical body in STARTER_* (class III and class II rows).
|
|
8
|
+
*
|
|
9
|
+
* Modes:
|
|
10
|
+
* pb setup-audit — human table; exit 1 if orphans > 0.
|
|
11
|
+
* pb setup-audit --json — machine-readable JSON; exit 1 if orphans > 0.
|
|
12
|
+
* pb setup-audit --repair — audit + attempt repair on III/II rows.
|
|
13
|
+
* Exit 1 if any repair genuinely fails (not
|
|
14
|
+
* counted: 'unrecoverable' — those are
|
|
15
|
+
* expected when no STARTER_* match exists).
|
|
16
|
+
*
|
|
17
|
+
* Server contract (see convex/setup.ts:auditAssetBodies, repairAssetBody):
|
|
18
|
+
* - Gateway derives workspaceId from the API key / JWT (injectSessionAuth).
|
|
19
|
+
* - Audit returns { summary, rows[] }. See `AuditResult` below.
|
|
20
|
+
* - Repair returns { status, newBodyStorageId, error, receiptId }.
|
|
21
|
+
*
|
|
22
|
+
* Notes:
|
|
23
|
+
* - Class 'i_inline_only' rows are NOT repaired by this slice (their body
|
|
24
|
+
* recovery comes from the inline `data.body` via a future bet, not from
|
|
25
|
+
* STARTER_*).
|
|
26
|
+
* - Class 'iv_hash_drift' rows are NOT repaired by this slice (out of scope
|
|
27
|
+
* for S3; resolution is per-row operator review).
|
|
28
|
+
*
|
|
29
|
+
* Auth: requires `pb login` / API key. No active write session needed.
|
|
30
|
+
*/
|
|
31
|
+
export interface AuditRow {
|
|
32
|
+
entryId: string;
|
|
33
|
+
entryDocId: string;
|
|
34
|
+
assetKind: 'skill' | 'rule' | 'hook' | 'bundle';
|
|
35
|
+
name: string;
|
|
36
|
+
class: 'ok' | 'i_inline_only' | 'ii_unrecoverable' | 'iii_blob_missing' | 'iv_hash_drift';
|
|
37
|
+
bodyStorageId: string | null;
|
|
38
|
+
inlineBytes: number;
|
|
39
|
+
}
|
|
40
|
+
export interface AuditResult {
|
|
41
|
+
summary: {
|
|
42
|
+
total: number;
|
|
43
|
+
ok: number;
|
|
44
|
+
orphans: number;
|
|
45
|
+
byClass: {
|
|
46
|
+
i: number;
|
|
47
|
+
ii: number;
|
|
48
|
+
iii: number;
|
|
49
|
+
iv: number;
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
rows: AuditRow[];
|
|
53
|
+
}
|
|
54
|
+
export interface RunSetupAuditOptions {
|
|
55
|
+
json?: boolean;
|
|
56
|
+
repair?: boolean;
|
|
57
|
+
}
|
|
58
|
+
export declare function runSetupAudit(opts?: RunSetupAuditOptions): Promise<void>;
|
|
59
|
+
//# sourceMappingURL=setup-audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-audit.d.ts","sourceRoot":"","sources":["../../src/commands/setup-audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAkBH,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,IAAI,GAAG,eAAe,GAAG,kBAAkB,GAAG,kBAAkB,GAAG,eAAe,CAAC;IAC1F,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,EAAE,EAAE,MAAM,CAAC;QACX,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,EAAE,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAC;YAAC,EAAE,EAAE,MAAM,CAAA;SAAE,CAAC;KAC7D,CAAC;IACF,IAAI,EAAE,QAAQ,EAAE,CAAC;CAClB;AAsKD,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAcD,wBAAsB,aAAa,CAAC,IAAI,GAAE,oBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8FlF"}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `pb setup-audit` — WP-439 S2 (audit) + S3 (--repair).
|
|
3
|
+
*
|
|
4
|
+
* Operator preflight for handshake: classifies every setup_asset row in the
|
|
5
|
+
* caller's active workspace and surfaces orphaned bodies BEFORE handshake
|
|
6
|
+
* runs. With --repair, attempts a transactional fix for each orphan that has
|
|
7
|
+
* a canonical body in STARTER_* (class III and class II rows).
|
|
8
|
+
*
|
|
9
|
+
* Modes:
|
|
10
|
+
* pb setup-audit — human table; exit 1 if orphans > 0.
|
|
11
|
+
* pb setup-audit --json — machine-readable JSON; exit 1 if orphans > 0.
|
|
12
|
+
* pb setup-audit --repair — audit + attempt repair on III/II rows.
|
|
13
|
+
* Exit 1 if any repair genuinely fails (not
|
|
14
|
+
* counted: 'unrecoverable' — those are
|
|
15
|
+
* expected when no STARTER_* match exists).
|
|
16
|
+
*
|
|
17
|
+
* Server contract (see convex/setup.ts:auditAssetBodies, repairAssetBody):
|
|
18
|
+
* - Gateway derives workspaceId from the API key / JWT (injectSessionAuth).
|
|
19
|
+
* - Audit returns { summary, rows[] }. See `AuditResult` below.
|
|
20
|
+
* - Repair returns { status, newBodyStorageId, error, receiptId }.
|
|
21
|
+
*
|
|
22
|
+
* Notes:
|
|
23
|
+
* - Class 'i_inline_only' rows are NOT repaired by this slice (their body
|
|
24
|
+
* recovery comes from the inline `data.body` via a future bet, not from
|
|
25
|
+
* STARTER_*).
|
|
26
|
+
* - Class 'iv_hash_drift' rows are NOT repaired by this slice (out of scope
|
|
27
|
+
* for S3; resolution is per-row operator review).
|
|
28
|
+
*
|
|
29
|
+
* Auth: requires `pb login` / API key. No active write session needed.
|
|
30
|
+
*/
|
|
31
|
+
import { getConfigOrGuide } from '../lib/config.js';
|
|
32
|
+
import { kernelCall } from '../lib/client.js';
|
|
33
|
+
import { CLIError, ErrorCode } from '../lib/errors.js';
|
|
34
|
+
import { bold, dim, green, red, yellow, heading, icons, } from '../lib/style.js';
|
|
35
|
+
import { isJsonMode } from '../lib/runner.js';
|
|
36
|
+
// ── Formatting ───────────────────────────────────────────────────────────────
|
|
37
|
+
const CLASS_LABEL = {
|
|
38
|
+
ok: 'ok',
|
|
39
|
+
i_inline_only: 'I:inline-only',
|
|
40
|
+
ii_unrecoverable: 'II:unrecoverable',
|
|
41
|
+
iii_blob_missing: 'III:blob-missing',
|
|
42
|
+
iv_hash_drift: 'IV:hash-drift',
|
|
43
|
+
};
|
|
44
|
+
function colorize(cls, text) {
|
|
45
|
+
if (cls === 'ok')
|
|
46
|
+
return green(text);
|
|
47
|
+
if (cls === 'iii_blob_missing' || cls === 'ii_unrecoverable')
|
|
48
|
+
return red(text);
|
|
49
|
+
return yellow(text);
|
|
50
|
+
}
|
|
51
|
+
function pad(s, len) {
|
|
52
|
+
if (s.length >= len)
|
|
53
|
+
return s;
|
|
54
|
+
return s + ' '.repeat(len - s.length);
|
|
55
|
+
}
|
|
56
|
+
function formatPretty(result) {
|
|
57
|
+
const lines = [];
|
|
58
|
+
lines.push('');
|
|
59
|
+
lines.push(`${bold('Setup-asset orphan audit')} ${dim('— WP-439 S2')}`);
|
|
60
|
+
lines.push('');
|
|
61
|
+
const { total, ok, orphans, byClass } = result.summary;
|
|
62
|
+
lines.push(heading('Summary'));
|
|
63
|
+
lines.push('');
|
|
64
|
+
lines.push(` ${dim('Total rows :')} ${bold(String(total))}`);
|
|
65
|
+
lines.push(` ${dim('OK :')} ${green(String(ok))}`);
|
|
66
|
+
lines.push(` ${dim('Orphans :')} ${orphans > 0 ? red(String(orphans)) : green(String(orphans))}`);
|
|
67
|
+
if (orphans > 0) {
|
|
68
|
+
lines.push('');
|
|
69
|
+
lines.push(` ${dim('Class I (inline-only) :')} ${yellow(String(byClass.i))}`);
|
|
70
|
+
lines.push(` ${dim('Class II (unrecoverable) :')} ${red(String(byClass.ii))}`);
|
|
71
|
+
lines.push(` ${dim('Class III (blob-missing) :')} ${red(String(byClass.iii))}`);
|
|
72
|
+
lines.push(` ${dim('Class IV (hash-drift) :')} ${yellow(String(byClass.iv))}`);
|
|
73
|
+
}
|
|
74
|
+
lines.push('');
|
|
75
|
+
if (result.rows.length === 0) {
|
|
76
|
+
lines.push(dim('No setup_asset rows in this workspace.'));
|
|
77
|
+
return lines.join('\n');
|
|
78
|
+
}
|
|
79
|
+
// Show orphan rows first, then ok rows (for scannability).
|
|
80
|
+
const orphanRows = result.rows.filter((r) => r.class !== 'ok');
|
|
81
|
+
const okRows = result.rows.filter((r) => r.class === 'ok');
|
|
82
|
+
if (orphanRows.length > 0) {
|
|
83
|
+
lines.push(heading('Orphaned rows'));
|
|
84
|
+
lines.push('');
|
|
85
|
+
// Column widths sized to the data so the table stays readable in narrow shells.
|
|
86
|
+
const idW = Math.min(40, Math.max(...orphanRows.map((r) => r.entryId.length), 'EntryId'.length));
|
|
87
|
+
const nameW = Math.min(30, Math.max(...orphanRows.map((r) => r.name.length), 'Name'.length));
|
|
88
|
+
lines.push(` ${dim(pad('EntryId', idW))} ${dim(pad('Kind', 6))} ${dim(pad('Name', nameW))} ${dim('Class')}`);
|
|
89
|
+
for (const row of orphanRows) {
|
|
90
|
+
const label = CLASS_LABEL[row.class];
|
|
91
|
+
lines.push(` ${pad(row.entryId, idW)} ${pad(row.assetKind, 6)} ${pad(row.name.slice(0, nameW), nameW)} ${colorize(row.class, label)}`);
|
|
92
|
+
}
|
|
93
|
+
lines.push('');
|
|
94
|
+
}
|
|
95
|
+
if (okRows.length > 0) {
|
|
96
|
+
lines.push(`${dim(`${icons.dot} ${okRows.length} row(s) classified OK (hidden — re-run with --json to see them).`)}`);
|
|
97
|
+
lines.push('');
|
|
98
|
+
}
|
|
99
|
+
if (orphans === 0) {
|
|
100
|
+
lines.push(green(`${icons.pass} All setup_asset bodies resolve.`));
|
|
101
|
+
}
|
|
102
|
+
return lines.join('\n');
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Repair targets: classes that can be regenerated from STARTER_* constants.
|
|
106
|
+
* - iii_blob_missing — storage blob is gone; canonical body is the fix.
|
|
107
|
+
* - ii_unrecoverable — neither storage nor inline body; canonical body
|
|
108
|
+
* is the only recovery path (otherwise the row was never recoverable).
|
|
109
|
+
*
|
|
110
|
+
* Excluded:
|
|
111
|
+
* - i_inline_only — inline body IS the body; restore from `data.body`
|
|
112
|
+
* (out of scope for this slice).
|
|
113
|
+
* - iv_hash_drift — drifted; manual review (out of scope).
|
|
114
|
+
*/
|
|
115
|
+
function isRepairTarget(cls) {
|
|
116
|
+
return cls === 'iii_blob_missing' || cls === 'ii_unrecoverable';
|
|
117
|
+
}
|
|
118
|
+
async function runRepair(rows) {
|
|
119
|
+
const targets = rows.filter((r) => isRepairTarget(r.class));
|
|
120
|
+
const perRow = [];
|
|
121
|
+
let succeeded = 0;
|
|
122
|
+
let failed = 0;
|
|
123
|
+
let unrecoverable = 0;
|
|
124
|
+
for (const row of targets) {
|
|
125
|
+
let outcome;
|
|
126
|
+
try {
|
|
127
|
+
outcome = await kernelCall('setup.repairAssetBody', {
|
|
128
|
+
entryDocId: row.entryDocId,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
outcome = {
|
|
133
|
+
status: 'failed',
|
|
134
|
+
newBodyStorageId: null,
|
|
135
|
+
error: err instanceof Error ? err.message : String(err),
|
|
136
|
+
receiptId: '',
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
perRow.push({ row, outcome });
|
|
140
|
+
if (outcome.status === 'succeeded')
|
|
141
|
+
succeeded++;
|
|
142
|
+
else if (outcome.status === 'unrecoverable')
|
|
143
|
+
unrecoverable++;
|
|
144
|
+
else
|
|
145
|
+
failed++;
|
|
146
|
+
// Per-row outcome line.
|
|
147
|
+
if (outcome.status === 'succeeded') {
|
|
148
|
+
process.stdout.write(`${green(icons.pass)} ${row.entryId} repaired\n`);
|
|
149
|
+
}
|
|
150
|
+
else if (outcome.status === 'unrecoverable') {
|
|
151
|
+
process.stdout.write(`${yellow('⊘')} ${row.entryId} unrecoverable (no STARTER_* match)\n`);
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
process.stdout.write(`${red(icons.fail)} ${row.entryId} failed: ${outcome.error ?? 'unknown error'}\n`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return { succeeded, failed, unrecoverable, perRow };
|
|
158
|
+
}
|
|
159
|
+
async function fetchAudit() {
|
|
160
|
+
try {
|
|
161
|
+
return await kernelCall('setup.auditAssetBodies', {});
|
|
162
|
+
}
|
|
163
|
+
catch (err) {
|
|
164
|
+
if (err instanceof CLIError)
|
|
165
|
+
throw err;
|
|
166
|
+
throw new CLIError(err instanceof Error ? err.message : String(err), {
|
|
167
|
+
code: ErrorCode.INTERNAL,
|
|
168
|
+
category: 'internal',
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
export async function runSetupAudit(opts = {}) {
|
|
173
|
+
const config = await getConfigOrGuide(() => runSetupAudit(opts));
|
|
174
|
+
if (!config)
|
|
175
|
+
return;
|
|
176
|
+
// Respect both the global --json flag (isJsonMode) and the per-command override.
|
|
177
|
+
const json = opts.json || isJsonMode();
|
|
178
|
+
const repair = opts.repair === true;
|
|
179
|
+
// ── 1. Initial audit ──────────────────────────────────────────────────────
|
|
180
|
+
let result = await fetchAudit();
|
|
181
|
+
if (!repair) {
|
|
182
|
+
if (json) {
|
|
183
|
+
process.stdout.write(JSON.stringify(result) + '\n');
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
process.stdout.write(formatPretty(result) + '\n');
|
|
187
|
+
}
|
|
188
|
+
// Exit-code contract: 0 when clean, 1 when any orphan class is present.
|
|
189
|
+
if (result.summary.orphans > 0) {
|
|
190
|
+
process.exit(1);
|
|
191
|
+
}
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
// ── 2. --repair path: print initial audit, attempt repairs, re-audit. ─────
|
|
195
|
+
if (json) {
|
|
196
|
+
// JSON mode + --repair: emit the union artifact as a single object so
|
|
197
|
+
// pipelines can read structured outcomes.
|
|
198
|
+
const repairReport = await runRepair(result.rows);
|
|
199
|
+
const after = await fetchAudit();
|
|
200
|
+
process.stdout.write(JSON.stringify({
|
|
201
|
+
before: result,
|
|
202
|
+
repair: {
|
|
203
|
+
attempted: repairReport.perRow.length,
|
|
204
|
+
succeeded: repairReport.succeeded,
|
|
205
|
+
failed: repairReport.failed,
|
|
206
|
+
unrecoverable: repairReport.unrecoverable,
|
|
207
|
+
perRow: repairReport.perRow.map(({ row, outcome }) => ({
|
|
208
|
+
entryId: row.entryId,
|
|
209
|
+
entryDocId: row.entryDocId,
|
|
210
|
+
class: row.class,
|
|
211
|
+
status: outcome.status,
|
|
212
|
+
error: outcome.error,
|
|
213
|
+
receiptId: outcome.receiptId,
|
|
214
|
+
newBodyStorageId: outcome.newBodyStorageId,
|
|
215
|
+
})),
|
|
216
|
+
},
|
|
217
|
+
after,
|
|
218
|
+
}) + '\n');
|
|
219
|
+
if (repairReport.failed > 0)
|
|
220
|
+
process.exit(1);
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
// Pretty mode.
|
|
224
|
+
process.stdout.write(formatPretty(result) + '\n');
|
|
225
|
+
const repairTargets = result.rows.filter((r) => isRepairTarget(r.class));
|
|
226
|
+
if (repairTargets.length === 0) {
|
|
227
|
+
process.stdout.write(dim('\nNo repairable orphans (class III/II) — nothing to do.\n'));
|
|
228
|
+
if (result.summary.orphans > 0) {
|
|
229
|
+
// There are class I or IV orphans but nothing this slice can fix.
|
|
230
|
+
process.exit(1);
|
|
231
|
+
}
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
process.stdout.write(`\n${heading('Repair')}\n\n`);
|
|
235
|
+
const repairReport = await runRepair(result.rows);
|
|
236
|
+
process.stdout.write('\n');
|
|
237
|
+
process.stdout.write(` ${dim('Attempted :')} ${bold(String(repairReport.perRow.length))}\n`);
|
|
238
|
+
process.stdout.write(` ${dim('Succeeded :')} ${green(String(repairReport.succeeded))}\n`);
|
|
239
|
+
process.stdout.write(` ${dim('Unrecoverable:')} ${repairReport.unrecoverable > 0 ? yellow(String(repairReport.unrecoverable)) : String(repairReport.unrecoverable)}\n`);
|
|
240
|
+
process.stdout.write(` ${dim('Failed :')} ${repairReport.failed > 0 ? red(String(repairReport.failed)) : String(repairReport.failed)}\n`);
|
|
241
|
+
process.stdout.write('\n');
|
|
242
|
+
// ── 3. Re-run the audit so the operator sees the fresh state. ─────────────
|
|
243
|
+
const after = await fetchAudit();
|
|
244
|
+
process.stdout.write(formatPretty(after) + '\n');
|
|
245
|
+
// Exit code: only genuine failures (not 'unrecoverable') trip the wire.
|
|
246
|
+
if (repairReport.failed > 0) {
|
|
247
|
+
process.exit(1);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=setup-audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-audit.js","sourceRoot":"","sources":["../../src/commands/setup-audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `pb setup-detect-surfaces` — WP-431 S3.
|
|
3
|
+
*
|
|
4
|
+
* Walks the repo for known surface markers (delegated to SURFACE_ADAPTERS) and
|
|
5
|
+
* union-merges the result with whatever `manifest.surfaces` already declares.
|
|
6
|
+
* STD-235 forward-only: detection NEVER removes a surface; only adds. Manifest
|
|
7
|
+
* write goes through `writeManifestSurfaces` which calls `assertSetupWritePath`
|
|
8
|
+
* (STD-234 perimeter).
|
|
9
|
+
*
|
|
10
|
+
* WP-433 S2: After the local manifest write, stamps the detected surfaces onto
|
|
11
|
+
* the server via `setup.stampDetectedSurfaces` so Phase 1 → Phase 2 advances in
|
|
12
|
+
* one server call (TEN-1990 / IMP-10). If the server call fails, the error is
|
|
13
|
+
* logged and surfaced to the caller but the local manifest is NOT rolled back
|
|
14
|
+
* (it is already on disk; the next run will retry the server stamp).
|
|
15
|
+
*/
|
|
16
|
+
export interface RunSetupDetectSurfacesOptions {
|
|
17
|
+
cwd?: string;
|
|
18
|
+
/** Skip the server stamp call (used in tests / offline mode). */
|
|
19
|
+
skipServerStamp?: boolean;
|
|
20
|
+
}
|
|
21
|
+
export interface SetupDetectSurfacesResult {
|
|
22
|
+
detected: string[];
|
|
23
|
+
existing: string[];
|
|
24
|
+
newlyAdded: string[];
|
|
25
|
+
union: string[];
|
|
26
|
+
manifestUpdated: boolean;
|
|
27
|
+
manifestPath: string;
|
|
28
|
+
/** WP-433 S2: result of the server stamp call, or null if skipped / not needed. */
|
|
29
|
+
serverStamp: {
|
|
30
|
+
stamped: boolean;
|
|
31
|
+
surfaces: string[];
|
|
32
|
+
} | null;
|
|
33
|
+
/** WP-433 S2: error from the server stamp call, if any. Does NOT abort the local write. */
|
|
34
|
+
serverStampError: string | null;
|
|
35
|
+
}
|
|
36
|
+
export declare function runSetupDetectSurfaces(opts?: RunSetupDetectSurfacesOptions): Promise<SetupDetectSurfacesResult>;
|
|
37
|
+
export declare function formatDetectSurfacesSummary(result: SetupDetectSurfacesResult): string;
|
|
38
|
+
//# sourceMappingURL=setup-detect-surfaces.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-detect-surfaces.d.ts","sourceRoot":"","sources":["../../src/commands/setup-detect-surfaces.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,MAAM,WAAW,6BAA6B;IAC5C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,mFAAmF;IACnF,WAAW,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC;IAC7D,2FAA2F;IAC3F,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,wBAAsB,sBAAsB,CAC1C,IAAI,GAAE,6BAAkC,GACvC,OAAO,CAAC,yBAAyB,CAAC,CAsCpC;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,yBAAyB,GAAG,MAAM,CAqBrF"}
|