@productbrain/cli 0.1.0-beta.7 → 0.1.0-beta.70
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/README.md +98 -30
- package/dist/__tests__/adapters.test.d.ts +2 -0
- package/dist/__tests__/adapters.test.d.ts.map +1 -0
- package/dist/__tests__/adapters.test.js +417 -0
- package/dist/__tests__/adapters.test.js.map +1 -0
- package/dist/__tests__/audit.test.d.ts +2 -0
- package/dist/__tests__/audit.test.d.ts.map +1 -0
- package/dist/__tests__/audit.test.js +394 -0
- package/dist/__tests__/audit.test.js.map +1 -0
- package/dist/__tests__/batch-transformations.test.d.ts +2 -0
- package/dist/__tests__/batch-transformations.test.d.ts.map +1 -0
- package/dist/__tests__/batch-transformations.test.js +263 -0
- package/dist/__tests__/batch-transformations.test.js.map +1 -0
- package/dist/__tests__/capture.test.d.ts +2 -0
- package/dist/__tests__/capture.test.d.ts.map +1 -0
- package/dist/__tests__/capture.test.js +377 -0
- package/dist/__tests__/capture.test.js.map +1 -0
- package/dist/__tests__/config.test.d.ts +8 -0
- package/dist/__tests__/config.test.d.ts.map +1 -0
- package/dist/__tests__/config.test.js +166 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/constants.test.d.ts +2 -0
- package/dist/__tests__/constants.test.d.ts.map +1 -0
- package/dist/__tests__/constants.test.js +141 -0
- package/dist/__tests__/constants.test.js.map +1 -0
- package/dist/__tests__/constellation.test.d.ts +2 -0
- package/dist/__tests__/constellation.test.d.ts.map +1 -0
- package/dist/__tests__/constellation.test.js +254 -0
- package/dist/__tests__/constellation.test.js.map +1 -0
- package/dist/__tests__/context-strategy.test.d.ts +2 -0
- package/dist/__tests__/context-strategy.test.d.ts.map +1 -0
- package/dist/__tests__/context-strategy.test.js +79 -0
- package/dist/__tests__/context-strategy.test.js.map +1 -0
- package/dist/__tests__/errors.test.d.ts +2 -0
- package/dist/__tests__/errors.test.d.ts.map +1 -0
- package/dist/__tests__/errors.test.js +117 -0
- package/dist/__tests__/errors.test.js.map +1 -0
- package/dist/__tests__/experiment.test.d.ts +6 -0
- package/dist/__tests__/experiment.test.d.ts.map +1 -0
- package/dist/__tests__/experiment.test.js +69 -0
- package/dist/__tests__/experiment.test.js.map +1 -0
- package/dist/__tests__/fields.test.d.ts +2 -0
- package/dist/__tests__/fields.test.d.ts.map +1 -0
- package/dist/__tests__/fields.test.js +238 -0
- package/dist/__tests__/fields.test.js.map +1 -0
- package/dist/__tests__/glossary.test.d.ts +2 -0
- package/dist/__tests__/glossary.test.d.ts.map +1 -0
- package/dist/__tests__/glossary.test.js +32 -0
- package/dist/__tests__/glossary.test.js.map +1 -0
- package/dist/__tests__/handshake.test.d.ts +2 -0
- package/dist/__tests__/handshake.test.d.ts.map +1 -0
- package/dist/__tests__/handshake.test.js +196 -0
- package/dist/__tests__/handshake.test.js.map +1 -0
- package/dist/__tests__/ingest.test.js +98 -0
- package/dist/__tests__/ingest.test.js.map +1 -1
- package/dist/__tests__/init.test.d.ts +7 -0
- package/dist/__tests__/init.test.d.ts.map +1 -0
- package/dist/__tests__/init.test.js +146 -0
- package/dist/__tests__/init.test.js.map +1 -0
- package/dist/__tests__/login.test.d.ts +2 -0
- package/dist/__tests__/login.test.d.ts.map +1 -0
- package/dist/__tests__/login.test.js +167 -0
- package/dist/__tests__/login.test.js.map +1 -0
- package/dist/__tests__/onboarding-path-b.test.d.ts +2 -0
- package/dist/__tests__/onboarding-path-b.test.d.ts.map +1 -0
- package/dist/__tests__/onboarding-path-b.test.js +46 -0
- package/dist/__tests__/onboarding-path-b.test.js.map +1 -0
- package/dist/__tests__/onboarding.test.d.ts +6 -0
- package/dist/__tests__/onboarding.test.d.ts.map +1 -0
- package/dist/__tests__/onboarding.test.js +347 -0
- package/dist/__tests__/onboarding.test.js.map +1 -0
- package/dist/__tests__/orient.test.d.ts +2 -0
- package/dist/__tests__/orient.test.d.ts.map +1 -0
- package/dist/__tests__/orient.test.js +143 -0
- package/dist/__tests__/orient.test.js.map +1 -0
- package/dist/__tests__/profiles.test.d.ts +2 -0
- package/dist/__tests__/profiles.test.d.ts.map +1 -0
- package/dist/__tests__/profiles.test.js +168 -0
- package/dist/__tests__/profiles.test.js.map +1 -0
- package/dist/__tests__/promote.test.d.ts +2 -0
- package/dist/__tests__/promote.test.d.ts.map +1 -0
- package/dist/__tests__/promote.test.js +161 -0
- package/dist/__tests__/promote.test.js.map +1 -0
- package/dist/__tests__/prompts.test.d.ts +6 -0
- package/dist/__tests__/prompts.test.d.ts.map +1 -0
- package/dist/__tests__/prompts.test.js +146 -0
- package/dist/__tests__/prompts.test.js.map +1 -0
- package/dist/__tests__/proposals.test.d.ts +2 -0
- package/dist/__tests__/proposals.test.d.ts.map +1 -0
- package/dist/__tests__/proposals.test.js +167 -0
- package/dist/__tests__/proposals.test.js.map +1 -0
- package/dist/__tests__/relate.test.d.ts +2 -0
- package/dist/__tests__/relate.test.d.ts.map +1 -0
- package/dist/__tests__/relate.test.js +103 -0
- package/dist/__tests__/relate.test.js.map +1 -0
- package/dist/__tests__/repo-detect.test.d.ts +2 -0
- package/dist/__tests__/repo-detect.test.d.ts.map +1 -0
- package/dist/__tests__/repo-detect.test.js +215 -0
- package/dist/__tests__/repo-detect.test.js.map +1 -0
- package/dist/__tests__/runner.test.d.ts +2 -0
- package/dist/__tests__/runner.test.d.ts.map +1 -0
- package/dist/__tests__/runner.test.js +219 -0
- package/dist/__tests__/runner.test.js.map +1 -0
- package/dist/__tests__/session-touch.test.d.ts +2 -0
- package/dist/__tests__/session-touch.test.d.ts.map +1 -0
- package/dist/__tests__/session-touch.test.js +134 -0
- package/dist/__tests__/session-touch.test.js.map +1 -0
- package/dist/__tests__/session.test.d.ts +2 -0
- package/dist/__tests__/session.test.d.ts.map +1 -0
- package/dist/__tests__/session.test.js +46 -0
- package/dist/__tests__/session.test.js.map +1 -0
- package/dist/__tests__/setup.test.d.ts +2 -0
- package/dist/__tests__/setup.test.d.ts.map +1 -0
- package/dist/__tests__/setup.test.js +141 -0
- package/dist/__tests__/setup.test.js.map +1 -0
- package/dist/__tests__/spinner-labels.test.d.ts +2 -0
- package/dist/__tests__/spinner-labels.test.d.ts.map +1 -0
- package/dist/__tests__/spinner-labels.test.js +23 -0
- package/dist/__tests__/spinner-labels.test.js.map +1 -0
- package/dist/__tests__/strip.test.d.ts +2 -0
- package/dist/__tests__/strip.test.d.ts.map +1 -0
- package/dist/__tests__/strip.test.js +136 -0
- package/dist/__tests__/strip.test.js.map +1 -0
- package/dist/__tests__/surface-profiles.test.d.ts +2 -0
- package/dist/__tests__/surface-profiles.test.d.ts.map +1 -0
- package/dist/__tests__/surface-profiles.test.js +233 -0
- package/dist/__tests__/surface-profiles.test.js.map +1 -0
- package/dist/__tests__/update.test.d.ts +2 -0
- package/dist/__tests__/update.test.d.ts.map +1 -0
- package/dist/__tests__/update.test.js +228 -0
- package/dist/__tests__/update.test.js.map +1 -0
- package/dist/__tests__/workspace.test.d.ts +2 -0
- package/dist/__tests__/workspace.test.d.ts.map +1 -0
- package/dist/__tests__/workspace.test.js +308 -0
- package/dist/__tests__/workspace.test.js.map +1 -0
- package/dist/commands/accept.d.ts +18 -0
- package/dist/commands/accept.d.ts.map +1 -0
- package/dist/commands/accept.js +76 -0
- package/dist/commands/accept.js.map +1 -0
- package/dist/commands/admin/cockpit.d.ts +88 -0
- package/dist/commands/admin/cockpit.d.ts.map +1 -0
- package/dist/commands/admin/cockpit.js +409 -0
- package/dist/commands/admin/cockpit.js.map +1 -0
- package/dist/commands/admin/index.d.ts +21 -0
- package/dist/commands/admin/index.d.ts.map +1 -0
- package/dist/commands/admin/index.js +254 -0
- package/dist/commands/admin/index.js.map +1 -0
- package/dist/commands/admin/inspect.d.ts +21 -0
- package/dist/commands/admin/inspect.d.ts.map +1 -0
- package/dist/commands/admin/inspect.js +536 -0
- package/dist/commands/admin/inspect.js.map +1 -0
- package/dist/commands/admin/inspect.test.d.ts +7 -0
- package/dist/commands/admin/inspect.test.d.ts.map +1 -0
- package/dist/commands/admin/inspect.test.js +71 -0
- package/dist/commands/admin/inspect.test.js.map +1 -0
- package/dist/commands/admin/seed.d.ts +32 -0
- package/dist/commands/admin/seed.d.ts.map +1 -0
- package/dist/commands/admin/seed.js +527 -0
- package/dist/commands/admin/seed.js.map +1 -0
- package/dist/commands/admin/seed.test.d.ts +6 -0
- package/dist/commands/admin/seed.test.d.ts.map +1 -0
- package/dist/commands/admin/seed.test.js +65 -0
- package/dist/commands/admin/seed.test.js.map +1 -0
- package/dist/commands/audit.d.ts +25 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +188 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/brand-pack.d.ts +2 -0
- package/dist/commands/brand-pack.d.ts.map +1 -0
- package/dist/commands/brand-pack.js +25 -0
- package/dist/commands/brand-pack.js.map +1 -0
- package/dist/commands/brief.d.ts +28 -0
- package/dist/commands/brief.d.ts.map +1 -0
- package/dist/commands/brief.js +75 -0
- package/dist/commands/brief.js.map +1 -0
- package/dist/commands/capture.d.ts +30 -0
- package/dist/commands/capture.d.ts.map +1 -0
- package/dist/commands/capture.js +385 -0
- package/dist/commands/capture.js.map +1 -0
- package/dist/commands/chain-walk.d.ts +14 -0
- package/dist/commands/chain-walk.d.ts.map +1 -0
- package/dist/commands/chain-walk.js +38 -0
- package/dist/commands/chain-walk.js.map +1 -0
- package/dist/commands/changes.d.ts +11 -0
- package/dist/commands/changes.d.ts.map +1 -0
- package/dist/commands/changes.js +46 -0
- package/dist/commands/changes.js.map +1 -0
- package/dist/commands/codex-prep.d.ts +12 -0
- package/dist/commands/codex-prep.d.ts.map +1 -0
- package/dist/commands/codex-prep.js +122 -0
- package/dist/commands/codex-prep.js.map +1 -0
- package/dist/commands/collections.d.ts +22 -0
- package/dist/commands/collections.d.ts.map +1 -0
- package/dist/commands/collections.js +77 -0
- package/dist/commands/collections.js.map +1 -0
- package/dist/commands/connect-integration.test.d.ts +7 -0
- package/dist/commands/connect-integration.test.d.ts.map +1 -0
- package/dist/commands/connect-integration.test.js +200 -0
- package/dist/commands/connect-integration.test.js.map +1 -0
- package/dist/commands/connect.d.ts +21 -0
- package/dist/commands/connect.d.ts.map +1 -0
- package/dist/commands/connect.js +279 -0
- package/dist/commands/connect.js.map +1 -0
- package/dist/commands/connect.test.d.ts +6 -0
- package/dist/commands/connect.test.d.ts.map +1 -0
- package/dist/commands/connect.test.js +230 -0
- package/dist/commands/connect.test.js.map +1 -0
- package/dist/commands/constellation.d.ts +11 -0
- package/dist/commands/constellation.d.ts.map +1 -0
- package/dist/commands/constellation.js +33 -0
- package/dist/commands/constellation.js.map +1 -0
- package/dist/commands/context.d.ts +2 -1
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js +20 -9
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/cross-cut.d.ts +11 -0
- package/dist/commands/cross-cut.d.ts.map +1 -0
- package/dist/commands/cross-cut.js +23 -0
- package/dist/commands/cross-cut.js.map +1 -0
- package/dist/commands/doctor.d.ts +18 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +232 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/doctor.test.d.ts +8 -0
- package/dist/commands/doctor.test.d.ts.map +1 -0
- package/dist/commands/doctor.test.js +311 -0
- package/dist/commands/doctor.test.js.map +1 -0
- package/dist/commands/fields.d.ts +9 -0
- package/dist/commands/fields.d.ts.map +1 -0
- package/dist/commands/fields.js +30 -0
- package/dist/commands/fields.js.map +1 -0
- package/dist/commands/get.d.ts +8 -1
- package/dist/commands/get.d.ts.map +1 -1
- package/dist/commands/get.js +60 -7
- package/dist/commands/get.js.map +1 -1
- package/dist/commands/handshake.d.ts +28 -0
- package/dist/commands/handshake.d.ts.map +1 -0
- package/dist/commands/handshake.js +617 -0
- package/dist/commands/handshake.js.map +1 -0
- package/dist/commands/ingest.d.ts +8 -2
- package/dist/commands/ingest.d.ts.map +1 -1
- package/dist/commands/ingest.js +148 -25
- package/dist/commands/ingest.js.map +1 -1
- package/dist/commands/init.d.ts +14 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +117 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/login.d.ts +4 -0
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +101 -38
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/orient.d.ts +107 -1
- package/dist/commands/orient.d.ts.map +1 -1
- package/dist/commands/orient.js +24 -8
- package/dist/commands/orient.js.map +1 -1
- package/dist/commands/profile.d.ts +24 -0
- package/dist/commands/profile.d.ts.map +1 -0
- package/dist/commands/profile.js +82 -0
- package/dist/commands/profile.js.map +1 -0
- package/dist/commands/promote.d.ts +12 -0
- package/dist/commands/promote.d.ts.map +1 -0
- package/dist/commands/promote.js +90 -0
- package/dist/commands/promote.js.map +1 -0
- package/dist/commands/proposals.d.ts +9 -0
- package/dist/commands/proposals.d.ts.map +1 -0
- package/dist/commands/proposals.js +24 -0
- package/dist/commands/proposals.js.map +1 -0
- package/dist/commands/reject.d.ts +14 -0
- package/dist/commands/reject.d.ts.map +1 -0
- package/dist/commands/reject.js +43 -0
- package/dist/commands/reject.js.map +1 -0
- package/dist/commands/relate.d.ts +16 -0
- package/dist/commands/relate.d.ts.map +1 -0
- package/dist/commands/relate.js +98 -0
- package/dist/commands/relate.js.map +1 -0
- package/dist/commands/search.d.ts +1 -0
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/search.js +5 -3
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/session.d.ts +20 -0
- package/dist/commands/session.d.ts.map +1 -0
- package/dist/commands/session.js +148 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/commands/setup.d.ts +15 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +168 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/update.d.ts +17 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +178 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/verify.d.ts +13 -0
- package/dist/commands/verify.d.ts.map +1 -0
- package/dist/commands/verify.js +49 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/commands/workspace.d.ts +41 -0
- package/dist/commands/workspace.d.ts.map +1 -0
- package/dist/commands/workspace.js +239 -0
- package/dist/commands/workspace.js.map +1 -0
- package/dist/formatters/audit.d.ts +46 -0
- package/dist/formatters/audit.d.ts.map +1 -0
- package/dist/formatters/audit.js +81 -0
- package/dist/formatters/audit.js.map +1 -0
- package/dist/formatters/brief.d.ts +112 -0
- package/dist/formatters/brief.d.ts.map +1 -0
- package/dist/formatters/brief.js +179 -0
- package/dist/formatters/brief.js.map +1 -0
- package/dist/formatters/capture.d.ts +48 -0
- package/dist/formatters/capture.d.ts.map +1 -0
- package/dist/formatters/capture.js +77 -0
- package/dist/formatters/capture.js.map +1 -0
- package/dist/formatters/chain-walk.d.ts +33 -0
- package/dist/formatters/chain-walk.d.ts.map +1 -0
- package/dist/formatters/chain-walk.js +54 -0
- package/dist/formatters/chain-walk.js.map +1 -0
- package/dist/formatters/changes.d.ts +25 -0
- package/dist/formatters/changes.d.ts.map +1 -0
- package/dist/formatters/changes.js +60 -0
- package/dist/formatters/changes.js.map +1 -0
- package/dist/formatters/collections.d.ts +40 -0
- package/dist/formatters/collections.d.ts.map +1 -0
- package/dist/formatters/collections.js +93 -0
- package/dist/formatters/collections.js.map +1 -0
- package/dist/formatters/constellation.d.ts +34 -0
- package/dist/formatters/constellation.d.ts.map +1 -0
- package/dist/formatters/constellation.js +38 -0
- package/dist/formatters/constellation.js.map +1 -0
- package/dist/formatters/cross-cut.d.ts +21 -0
- package/dist/formatters/cross-cut.d.ts.map +1 -0
- package/dist/formatters/cross-cut.js +32 -0
- package/dist/formatters/cross-cut.js.map +1 -0
- package/dist/formatters/entry.d.ts +11 -4
- package/dist/formatters/entry.d.ts.map +1 -1
- package/dist/formatters/entry.js +24 -8
- package/dist/formatters/entry.js.map +1 -1
- package/dist/formatters/fields.d.ts +32 -0
- package/dist/formatters/fields.d.ts.map +1 -0
- package/dist/formatters/fields.js +49 -0
- package/dist/formatters/fields.js.map +1 -0
- package/dist/formatters/handshake.d.ts +24 -0
- package/dist/formatters/handshake.d.ts.map +1 -0
- package/dist/formatters/handshake.js +69 -0
- package/dist/formatters/handshake.js.map +1 -0
- package/dist/formatters/orient.d.ts +104 -1
- package/dist/formatters/orient.d.ts.map +1 -1
- package/dist/formatters/orient.js +140 -17
- package/dist/formatters/orient.js.map +1 -1
- package/dist/formatters/promote.d.ts +30 -0
- package/dist/formatters/promote.d.ts.map +1 -0
- package/dist/formatters/promote.js +39 -0
- package/dist/formatters/promote.js.map +1 -0
- package/dist/formatters/proposals.d.ts +45 -0
- package/dist/formatters/proposals.d.ts.map +1 -0
- package/dist/formatters/proposals.js +62 -0
- package/dist/formatters/proposals.js.map +1 -0
- package/dist/formatters/relate.d.ts +14 -0
- package/dist/formatters/relate.d.ts.map +1 -0
- package/dist/formatters/relate.js +16 -0
- package/dist/formatters/relate.js.map +1 -0
- package/dist/formatters/search.d.ts +0 -4
- package/dist/formatters/search.d.ts.map +1 -1
- package/dist/formatters/search.js +4 -1
- package/dist/formatters/search.js.map +1 -1
- package/dist/formatters/session.d.ts +11 -0
- package/dist/formatters/session.d.ts.map +1 -0
- package/dist/formatters/session.js +53 -0
- package/dist/formatters/session.js.map +1 -0
- package/dist/formatters/update.d.ts +17 -0
- package/dist/formatters/update.d.ts.map +1 -0
- package/dist/formatters/update.js +45 -0
- package/dist/formatters/update.js.map +1 -0
- package/dist/formatters/verify.d.ts +11 -0
- package/dist/formatters/verify.d.ts.map +1 -0
- package/dist/formatters/verify.js +11 -0
- package/dist/formatters/verify.js.map +1 -0
- package/dist/generators/__tests__/surface-profiles.test.d.ts +2 -0
- package/dist/generators/__tests__/surface-profiles.test.d.ts.map +1 -0
- package/dist/generators/__tests__/surface-profiles.test.js +89 -0
- package/dist/generators/__tests__/surface-profiles.test.js.map +1 -0
- package/dist/generators/adapters.d.ts +44 -0
- package/dist/generators/adapters.d.ts.map +1 -0
- package/dist/generators/adapters.js +290 -0
- package/dist/generators/adapters.js.map +1 -0
- package/dist/generators/adapters.test.d.ts +2 -0
- package/dist/generators/adapters.test.d.ts.map +1 -0
- package/dist/generators/adapters.test.js +27 -0
- package/dist/generators/adapters.test.js.map +1 -0
- package/dist/generators/archetypes.d.ts +52 -0
- package/dist/generators/archetypes.d.ts.map +1 -0
- package/dist/generators/archetypes.js +153 -0
- package/dist/generators/archetypes.js.map +1 -0
- package/dist/generators/archetypes.test.d.ts +2 -0
- package/dist/generators/archetypes.test.d.ts.map +1 -0
- package/dist/generators/archetypes.test.js +237 -0
- package/dist/generators/archetypes.test.js.map +1 -0
- package/dist/generators/briefing-md.d.ts +8 -0
- package/dist/generators/briefing-md.d.ts.map +1 -0
- package/dist/generators/briefing-md.js +51 -0
- package/dist/generators/briefing-md.js.map +1 -0
- package/dist/generators/chain-classifier.d.ts +49 -0
- package/dist/generators/chain-classifier.d.ts.map +1 -0
- package/dist/generators/chain-classifier.js +180 -0
- package/dist/generators/chain-classifier.js.map +1 -0
- package/dist/generators/chain-classifier.test.d.ts +2 -0
- package/dist/generators/chain-classifier.test.d.ts.map +1 -0
- package/dist/generators/chain-classifier.test.js +257 -0
- package/dist/generators/chain-classifier.test.js.map +1 -0
- package/dist/generators/chain-rules.d.ts +42 -0
- package/dist/generators/chain-rules.d.ts.map +1 -0
- package/dist/generators/chain-rules.js +144 -0
- package/dist/generators/chain-rules.js.map +1 -0
- package/dist/generators/chain-rules.test.d.ts +2 -0
- package/dist/generators/chain-rules.test.d.ts.map +1 -0
- package/dist/generators/chain-rules.test.js +179 -0
- package/dist/generators/chain-rules.test.js.map +1 -0
- package/dist/generators/context-md.d.ts +8 -0
- package/dist/generators/context-md.d.ts.map +1 -0
- package/dist/generators/context-md.js +134 -0
- package/dist/generators/context-md.js.map +1 -0
- package/dist/generators/handshake-diff.d.ts +67 -0
- package/dist/generators/handshake-diff.d.ts.map +1 -0
- package/dist/generators/handshake-diff.js +183 -0
- package/dist/generators/handshake-diff.js.map +1 -0
- package/dist/generators/handshake-diff.test.d.ts +2 -0
- package/dist/generators/handshake-diff.test.d.ts.map +1 -0
- package/dist/generators/handshake-diff.test.js +264 -0
- package/dist/generators/handshake-diff.test.js.map +1 -0
- package/dist/generators/portable-knowledge.d.ts +143 -0
- package/dist/generators/portable-knowledge.d.ts.map +1 -0
- package/dist/generators/portable-knowledge.js +504 -0
- package/dist/generators/portable-knowledge.js.map +1 -0
- package/dist/generators/portable-knowledge.test.d.ts +2 -0
- package/dist/generators/portable-knowledge.test.d.ts.map +1 -0
- package/dist/generators/portable-knowledge.test.js +927 -0
- package/dist/generators/portable-knowledge.test.js.map +1 -0
- package/dist/generators/surface-profiles.d.ts +49 -0
- package/dist/generators/surface-profiles.d.ts.map +1 -0
- package/dist/generators/surface-profiles.js +98 -0
- package/dist/generators/surface-profiles.js.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +642 -37
- package/dist/index.js.map +1 -1
- package/dist/lib/activation.d.ts +28 -0
- package/dist/lib/activation.d.ts.map +1 -0
- package/dist/lib/activation.js +57 -0
- package/dist/lib/activation.js.map +1 -0
- package/dist/lib/activation.test.d.ts +6 -0
- package/dist/lib/activation.test.d.ts.map +1 -0
- package/dist/lib/activation.test.js +121 -0
- package/dist/lib/activation.test.js.map +1 -0
- package/dist/lib/client.d.ts +61 -0
- package/dist/lib/client.d.ts.map +1 -1
- package/dist/lib/client.js +258 -12
- package/dist/lib/client.js.map +1 -1
- package/dist/lib/config.d.ts +84 -4
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +322 -42
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/constants.d.ts +42 -0
- package/dist/lib/constants.d.ts.map +1 -0
- package/dist/lib/constants.js +76 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/conversation-engine.d.ts +45 -0
- package/dist/lib/conversation-engine.d.ts.map +1 -0
- package/dist/lib/conversation-engine.js +112 -0
- package/dist/lib/conversation-engine.js.map +1 -0
- package/dist/lib/conversation-phases.d.ts +59 -0
- package/dist/lib/conversation-phases.d.ts.map +1 -0
- package/dist/lib/conversation-phases.js +11 -0
- package/dist/lib/conversation-phases.js.map +1 -0
- package/dist/lib/conversation-signals.d.ts +30 -0
- package/dist/lib/conversation-signals.d.ts.map +1 -0
- package/dist/lib/conversation-signals.js +64 -0
- package/dist/lib/conversation-signals.js.map +1 -0
- package/dist/lib/deployment.d.ts +23 -0
- package/dist/lib/deployment.d.ts.map +1 -0
- package/dist/lib/deployment.js +78 -0
- package/dist/lib/deployment.js.map +1 -0
- package/dist/lib/deployment.test.d.ts +5 -0
- package/dist/lib/deployment.test.d.ts.map +1 -0
- package/dist/lib/deployment.test.js +54 -0
- package/dist/lib/deployment.test.js.map +1 -0
- package/dist/lib/errors.d.ts +58 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +67 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/experiment.d.ts +18 -0
- package/dist/lib/experiment.d.ts.map +1 -0
- package/dist/lib/experiment.js +28 -0
- package/dist/lib/experiment.js.map +1 -0
- package/dist/lib/format.d.ts +10 -0
- package/dist/lib/format.d.ts.map +1 -0
- package/dist/lib/format.js +27 -0
- package/dist/lib/format.js.map +1 -0
- package/dist/lib/glossary.d.ts +19 -0
- package/dist/lib/glossary.d.ts.map +1 -0
- package/dist/lib/glossary.js +53 -0
- package/dist/lib/glossary.js.map +1 -0
- package/dist/lib/onboarding-path-b.d.ts +10 -0
- package/dist/lib/onboarding-path-b.d.ts.map +1 -0
- package/dist/lib/onboarding-path-b.js +214 -0
- package/dist/lib/onboarding-path-b.js.map +1 -0
- package/dist/lib/onboarding-phases.d.ts +9 -0
- package/dist/lib/onboarding-phases.d.ts.map +1 -0
- package/dist/lib/onboarding-phases.js +120 -0
- package/dist/lib/onboarding-phases.js.map +1 -0
- package/dist/lib/onboarding-shared.d.ts +81 -0
- package/dist/lib/onboarding-shared.d.ts.map +1 -0
- package/dist/lib/onboarding-shared.js +190 -0
- package/dist/lib/onboarding-shared.js.map +1 -0
- package/dist/lib/onboarding-topics.d.ts +27 -0
- package/dist/lib/onboarding-topics.d.ts.map +1 -0
- package/dist/lib/onboarding-topics.js +57 -0
- package/dist/lib/onboarding-topics.js.map +1 -0
- package/dist/lib/onboarding.d.ts +17 -0
- package/dist/lib/onboarding.d.ts.map +1 -0
- package/dist/lib/onboarding.js +350 -0
- package/dist/lib/onboarding.js.map +1 -0
- package/dist/lib/profiles.d.ts +39 -0
- package/dist/lib/profiles.d.ts.map +1 -0
- package/dist/lib/profiles.js +185 -0
- package/dist/lib/profiles.js.map +1 -0
- package/dist/lib/prompts.d.ts +65 -0
- package/dist/lib/prompts.d.ts.map +1 -0
- package/dist/lib/prompts.js +132 -0
- package/dist/lib/prompts.js.map +1 -0
- package/dist/lib/repo-detect.d.ts +33 -0
- package/dist/lib/repo-detect.d.ts.map +1 -0
- package/dist/lib/repo-detect.js +83 -0
- package/dist/lib/repo-detect.js.map +1 -0
- package/dist/lib/runner.d.ts +33 -0
- package/dist/lib/runner.d.ts.map +1 -0
- package/dist/lib/runner.js +79 -0
- package/dist/lib/runner.js.map +1 -0
- package/dist/lib/session.d.ts +17 -0
- package/dist/lib/session.d.ts.map +1 -0
- package/dist/lib/session.js +43 -0
- package/dist/lib/session.js.map +1 -0
- package/dist/lib/spinner.d.ts +27 -0
- package/dist/lib/spinner.d.ts.map +1 -0
- package/dist/lib/spinner.js +76 -0
- package/dist/lib/spinner.js.map +1 -0
- package/dist/lib/spinner.test.d.ts +2 -0
- package/dist/lib/spinner.test.d.ts.map +1 -0
- package/dist/lib/spinner.test.js +39 -0
- package/dist/lib/spinner.test.js.map +1 -0
- package/dist/lib/strip.d.ts +12 -0
- package/dist/lib/strip.d.ts.map +1 -0
- package/dist/lib/strip.js +41 -0
- package/dist/lib/strip.js.map +1 -0
- package/dist/lib/style.d.ts +94 -0
- package/dist/lib/style.d.ts.map +1 -0
- package/dist/lib/style.js +167 -0
- package/dist/lib/style.js.map +1 -0
- package/dist/lib/style.test.d.ts +7 -0
- package/dist/lib/style.test.d.ts.map +1 -0
- package/dist/lib/style.test.js +263 -0
- package/dist/lib/style.test.js.map +1 -0
- package/dist/lib/telemetry.d.ts +15 -0
- package/dist/lib/telemetry.d.ts.map +1 -0
- package/dist/lib/telemetry.js +47 -0
- package/dist/lib/telemetry.js.map +1 -0
- package/dist/lib/tokenConstants.d.ts +17 -0
- package/dist/lib/tokenConstants.d.ts.map +1 -0
- package/dist/lib/tokenConstants.js +17 -0
- package/dist/lib/tokenConstants.js.map +1 -0
- package/dist/lib/wizard-surfaces.d.ts +47 -0
- package/dist/lib/wizard-surfaces.d.ts.map +1 -0
- package/dist/lib/wizard-surfaces.js +176 -0
- package/dist/lib/wizard-surfaces.js.map +1 -0
- package/dist/lib/wizard-surfaces.test.d.ts +2 -0
- package/dist/lib/wizard-surfaces.test.d.ts.map +1 -0
- package/dist/lib/wizard-surfaces.test.js +127 -0
- package/dist/lib/wizard-surfaces.test.js.map +1 -0
- package/dist/lib/wizard-trust.d.ts +31 -0
- package/dist/lib/wizard-trust.d.ts.map +1 -0
- package/dist/lib/wizard-trust.js +66 -0
- package/dist/lib/wizard-trust.js.map +1 -0
- package/dist/lib/wizard-trust.test.d.ts +2 -0
- package/dist/lib/wizard-trust.test.d.ts.map +1 -0
- package/dist/lib/wizard-trust.test.js +32 -0
- package/dist/lib/wizard-trust.test.js.map +1 -0
- package/dist/lib/workspace-probe.d.ts +16 -0
- package/dist/lib/workspace-probe.d.ts.map +1 -0
- package/dist/lib/workspace-probe.js +33 -0
- package/dist/lib/workspace-probe.js.map +1 -0
- package/package.json +13 -4
- package/templates/archetypes/boundary.md +23 -0
- package/templates/archetypes/constraint.md +23 -0
- package/templates/archetypes/convention.md +23 -0
- package/templates/archetypes/policy.md +23 -0
- package/templates/archetypes/quality-gate.md +23 -0
- package/templates/archetypes/workflow.md +23 -0
- package/templates/general/code-integrity.md +11 -0
- package/templates/general/getting-started.md +12 -0
- package/templates/node-ts/code-integrity.md +13 -0
- package/templates/node-ts/testing.md +12 -0
- package/templates/python/code-integrity.md +13 -0
- package/templates/python/testing.md +12 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt gate — TTY-aware, cancel-safe, mode-aware.
|
|
3
|
+
* All interactive CLI prompts flow through this module.
|
|
4
|
+
* WP-303 Slice 1: replaces raw readline with @clack/prompts.
|
|
5
|
+
*/
|
|
6
|
+
export interface PromptOptions {
|
|
7
|
+
message: string;
|
|
8
|
+
placeholder?: string;
|
|
9
|
+
defaultValue?: string;
|
|
10
|
+
validate?: (value: string) => string | undefined;
|
|
11
|
+
}
|
|
12
|
+
export interface ConfirmOptions {
|
|
13
|
+
message: string;
|
|
14
|
+
initialValue?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface SelectOptions<T> {
|
|
17
|
+
message: string;
|
|
18
|
+
options: {
|
|
19
|
+
value: T;
|
|
20
|
+
label: string;
|
|
21
|
+
hint?: string;
|
|
22
|
+
}[];
|
|
23
|
+
}
|
|
24
|
+
export interface PasswordOptions {
|
|
25
|
+
message: string;
|
|
26
|
+
validate?: (value: string) => string | undefined;
|
|
27
|
+
}
|
|
28
|
+
/** Returns true if the CLI is running in a context where prompts are safe. */
|
|
29
|
+
export declare function isInteractive(): boolean;
|
|
30
|
+
/** Text input — wraps clack.text(). */
|
|
31
|
+
export declare function ask(opts: PromptOptions): Promise<string>;
|
|
32
|
+
/** Yes/no confirmation — wraps clack.confirm(). */
|
|
33
|
+
export declare function confirm(opts: ConfirmOptions): Promise<boolean>;
|
|
34
|
+
/** Single-select menu — wraps clack.select(). */
|
|
35
|
+
export declare function select<T>(opts: SelectOptions<T>): Promise<T>;
|
|
36
|
+
/** Password input (masked) — wraps clack.password(). */
|
|
37
|
+
export declare function password(opts: PasswordOptions): Promise<string>;
|
|
38
|
+
export interface MultiSelectOptions<T> {
|
|
39
|
+
message: string;
|
|
40
|
+
options: {
|
|
41
|
+
value: T;
|
|
42
|
+
label: string;
|
|
43
|
+
hint?: string;
|
|
44
|
+
}[];
|
|
45
|
+
required?: boolean;
|
|
46
|
+
initialValues?: T[];
|
|
47
|
+
}
|
|
48
|
+
/** Multi-select menu — wraps clack.multiselect(). */
|
|
49
|
+
export declare function multiselect<T>(opts: MultiSelectOptions<T>): Promise<T[]>;
|
|
50
|
+
/** Open a titled session — wraps clack.intro(). No-op in non-interactive. */
|
|
51
|
+
export declare function intro(title?: string): void;
|
|
52
|
+
/** Close a session — wraps clack.outro(). No-op in non-interactive. */
|
|
53
|
+
export declare function outro(message?: string): void;
|
|
54
|
+
/** Styled information box — wraps clack.note(). No-op in non-interactive. */
|
|
55
|
+
export declare function note(message: string, title?: string): void;
|
|
56
|
+
/** Structured log helpers — degrade to plain stdout/stderr in non-interactive. */
|
|
57
|
+
export declare const log: {
|
|
58
|
+
step: (msg: string) => void;
|
|
59
|
+
success: (msg: string) => void;
|
|
60
|
+
warn: (msg: string) => void;
|
|
61
|
+
error: (msg: string) => void;
|
|
62
|
+
info: (msg: string) => void;
|
|
63
|
+
message: (msg?: string) => void;
|
|
64
|
+
};
|
|
65
|
+
//# sourceMappingURL=prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/lib/prompts.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;CAClD;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE;QAAE,KAAK,EAAE,CAAC,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACvD;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;CAClD;AA0CD,8EAA8E;AAC9E,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED,uCAAuC;AACvC,wBAAsB,GAAG,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAU9D;AAED,mDAAmD;AACnD,wBAAsB,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAQpE;AAED,iDAAiD;AACjD,wBAAsB,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CASlE;AAED,wDAAwD;AACxD,wBAAsB,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAQrE;AAED,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE;QAAE,KAAK,EAAE,CAAC,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACtD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC;CACrB;AAED,qDAAqD;AACrD,wBAAsB,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAW9E;AAED,6EAA6E;AAC7E,wBAAgB,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAG1C;AAED,uEAAuE;AACvE,wBAAgB,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAG5C;AAED,6EAA6E;AAC7E,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAG1D;AAED,kFAAkF;AAClF,eAAO,MAAM,GAAG;gBACC,MAAM;mBACN,MAAM;gBACN,MAAM;iBACN,MAAM;gBACN,MAAM;oBACL,MAAM;CAGvB,CAAC"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt gate — TTY-aware, cancel-safe, mode-aware.
|
|
3
|
+
* All interactive CLI prompts flow through this module.
|
|
4
|
+
* WP-303 Slice 1: replaces raw readline with @clack/prompts.
|
|
5
|
+
*/
|
|
6
|
+
import * as clack from '@clack/prompts';
|
|
7
|
+
import { CLIError, ErrorCode } from './errors.js';
|
|
8
|
+
import { isJsonMode, isQuietMode } from './runner.js';
|
|
9
|
+
// --- Guards ---
|
|
10
|
+
const CANCEL = Symbol.for('cancel');
|
|
11
|
+
function isCancelled(value) {
|
|
12
|
+
return value === CANCEL || clack.isCancel(value);
|
|
13
|
+
}
|
|
14
|
+
function assertInteractive() {
|
|
15
|
+
if (!process.stdin.isTTY) {
|
|
16
|
+
throw new CLIError('Non-interactive environment detected.', {
|
|
17
|
+
code: ErrorCode.NON_INTERACTIVE,
|
|
18
|
+
category: 'config',
|
|
19
|
+
guidance: 'Run with explicit args or use --json mode.',
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
if (isJsonMode()) {
|
|
23
|
+
throw new CLIError('Prompt skipped in JSON mode.', {
|
|
24
|
+
code: ErrorCode.NON_INTERACTIVE,
|
|
25
|
+
category: 'config',
|
|
26
|
+
guidance: 'Provide values via command-line arguments instead of interactive prompts.',
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
if (isQuietMode()) {
|
|
30
|
+
throw new CLIError('Prompt skipped in quiet mode.', {
|
|
31
|
+
code: ErrorCode.NON_INTERACTIVE,
|
|
32
|
+
category: 'config',
|
|
33
|
+
guidance: 'Provide values via command-line arguments.',
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function handleCancel(value) {
|
|
38
|
+
if (isCancelled(value)) {
|
|
39
|
+
process.exit(130);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// --- Exports ---
|
|
43
|
+
/** Returns true if the CLI is running in a context where prompts are safe. */
|
|
44
|
+
export function isInteractive() {
|
|
45
|
+
return !!process.stdin.isTTY && !isQuietMode() && !isJsonMode();
|
|
46
|
+
}
|
|
47
|
+
/** Text input — wraps clack.text(). */
|
|
48
|
+
export async function ask(opts) {
|
|
49
|
+
assertInteractive();
|
|
50
|
+
const result = await clack.text({
|
|
51
|
+
message: opts.message,
|
|
52
|
+
placeholder: opts.placeholder,
|
|
53
|
+
defaultValue: opts.defaultValue,
|
|
54
|
+
validate: opts.validate,
|
|
55
|
+
});
|
|
56
|
+
handleCancel(result);
|
|
57
|
+
return result;
|
|
58
|
+
}
|
|
59
|
+
/** Yes/no confirmation — wraps clack.confirm(). */
|
|
60
|
+
export async function confirm(opts) {
|
|
61
|
+
assertInteractive();
|
|
62
|
+
const result = await clack.confirm({
|
|
63
|
+
message: opts.message,
|
|
64
|
+
initialValue: opts.initialValue,
|
|
65
|
+
});
|
|
66
|
+
handleCancel(result);
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
/** Single-select menu — wraps clack.select(). */
|
|
70
|
+
export async function select(opts) {
|
|
71
|
+
assertInteractive();
|
|
72
|
+
// Cast needed: TypeScript can't reduce clack's conditional Option<T> for arbitrary T
|
|
73
|
+
const result = await clack.select({
|
|
74
|
+
message: opts.message,
|
|
75
|
+
options: opts.options,
|
|
76
|
+
});
|
|
77
|
+
handleCancel(result);
|
|
78
|
+
return result;
|
|
79
|
+
}
|
|
80
|
+
/** Password input (masked) — wraps clack.password(). */
|
|
81
|
+
export async function password(opts) {
|
|
82
|
+
assertInteractive();
|
|
83
|
+
const result = await clack.password({
|
|
84
|
+
message: opts.message,
|
|
85
|
+
validate: opts.validate,
|
|
86
|
+
});
|
|
87
|
+
handleCancel(result);
|
|
88
|
+
return result;
|
|
89
|
+
}
|
|
90
|
+
/** Multi-select menu — wraps clack.multiselect(). */
|
|
91
|
+
export async function multiselect(opts) {
|
|
92
|
+
assertInteractive();
|
|
93
|
+
// Cast needed: same conditional Option<T> issue as select()
|
|
94
|
+
const result = await clack.multiselect({
|
|
95
|
+
message: opts.message,
|
|
96
|
+
options: opts.options,
|
|
97
|
+
required: opts.required,
|
|
98
|
+
initialValues: opts.initialValues,
|
|
99
|
+
});
|
|
100
|
+
handleCancel(result);
|
|
101
|
+
return result;
|
|
102
|
+
}
|
|
103
|
+
/** Open a titled session — wraps clack.intro(). No-op in non-interactive. */
|
|
104
|
+
export function intro(title) {
|
|
105
|
+
if (!isInteractive())
|
|
106
|
+
return;
|
|
107
|
+
clack.intro(title);
|
|
108
|
+
}
|
|
109
|
+
/** Close a session — wraps clack.outro(). No-op in non-interactive. */
|
|
110
|
+
export function outro(message) {
|
|
111
|
+
if (!isInteractive())
|
|
112
|
+
return;
|
|
113
|
+
clack.outro(message);
|
|
114
|
+
}
|
|
115
|
+
/** Styled information box — wraps clack.note(). No-op in non-interactive. */
|
|
116
|
+
export function note(message, title) {
|
|
117
|
+
if (!isInteractive())
|
|
118
|
+
return;
|
|
119
|
+
clack.note(message, title);
|
|
120
|
+
}
|
|
121
|
+
/** Structured log helpers — degrade to plain stdout/stderr in non-interactive. */
|
|
122
|
+
export const log = {
|
|
123
|
+
step: (msg) => isInteractive() ? clack.log.step(msg) : void process.stdout.write(` ${msg}\n`),
|
|
124
|
+
success: (msg) => isInteractive() ? clack.log.success(msg) : void process.stdout.write(` ✓ ${msg}\n`),
|
|
125
|
+
warn: (msg) => isInteractive() ? clack.log.warn(msg) : void process.stderr.write(` ⚠ ${msg}\n`),
|
|
126
|
+
error: (msg) => isInteractive() ? clack.log.error(msg) : void process.stderr.write(` ✗ ${msg}\n`),
|
|
127
|
+
info: (msg) => isInteractive() ? clack.log.info(msg) : void process.stdout.write(` ${msg}\n`),
|
|
128
|
+
message: (msg) => isInteractive()
|
|
129
|
+
? clack.log.message(msg)
|
|
130
|
+
: (msg !== undefined ? void process.stdout.write(`${msg}\n`) : undefined),
|
|
131
|
+
};
|
|
132
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/lib/prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local repo detection — reads filesystem signals to build a RepoContext.
|
|
3
|
+
* No API calls. Pure filesystem inspection.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Workspace maturity profile derived from the Chain's workspaceReadiness signal.
|
|
7
|
+
* Used by handshake to tailor generated context files (BET-170, DEC-291).
|
|
8
|
+
*/
|
|
9
|
+
export interface WorkspaceProfile {
|
|
10
|
+
stage: string;
|
|
11
|
+
totalEntries: number;
|
|
12
|
+
totalRelations: number;
|
|
13
|
+
collectionCount: number;
|
|
14
|
+
activeCount: number;
|
|
15
|
+
draftCount: number;
|
|
16
|
+
orphanedCount: number;
|
|
17
|
+
governanceMode: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Extract a WorkspaceProfile from the raw workspaceReadiness API response.
|
|
21
|
+
* Returns null on any failure — callers must handle null (fail-open pattern).
|
|
22
|
+
*/
|
|
23
|
+
export declare function extractWorkspaceProfile(response: unknown): WorkspaceProfile | null;
|
|
24
|
+
export interface RepoContext {
|
|
25
|
+
name: string | null;
|
|
26
|
+
description: string | null;
|
|
27
|
+
gitRemote: string | null;
|
|
28
|
+
repoSlug: string | null;
|
|
29
|
+
detectedStack: string[];
|
|
30
|
+
isMonorepo: boolean;
|
|
31
|
+
}
|
|
32
|
+
export declare function detectRepo(cwd?: string): RepoContext;
|
|
33
|
+
//# sourceMappingURL=repo-detect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-detect.d.ts","sourceRoot":"","sources":["../../src/lib/repo-detect.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,OAAO,GAAG,gBAAgB,GAAG,IAAI,CAsBlF;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,UAAU,CAAC,GAAG,SAAgB,GAAG,WAAW,CAiD3D"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local repo detection — reads filesystem signals to build a RepoContext.
|
|
3
|
+
* No API calls. Pure filesystem inspection.
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync, readFileSync } from 'fs';
|
|
6
|
+
import { resolve, basename } from 'path';
|
|
7
|
+
import { execSync } from 'child_process';
|
|
8
|
+
/**
|
|
9
|
+
* Extract a WorkspaceProfile from the raw workspaceReadiness API response.
|
|
10
|
+
* Returns null on any failure — callers must handle null (fail-open pattern).
|
|
11
|
+
*/
|
|
12
|
+
export function extractWorkspaceProfile(response) {
|
|
13
|
+
if (!response || typeof response !== 'object')
|
|
14
|
+
return null;
|
|
15
|
+
const r = response;
|
|
16
|
+
const stage = typeof r['stage'] === 'string' ? r['stage'] : null;
|
|
17
|
+
const governanceMode = typeof r['governanceMode'] === 'string' ? r['governanceMode'] : null;
|
|
18
|
+
if (!stage || !governanceMode)
|
|
19
|
+
return null;
|
|
20
|
+
const stats = r['stats'] && typeof r['stats'] === 'object' ? r['stats'] : {};
|
|
21
|
+
const toNum = (v) => (typeof v === 'number' ? v : 0);
|
|
22
|
+
return {
|
|
23
|
+
stage,
|
|
24
|
+
totalEntries: toNum(stats['totalEntries']),
|
|
25
|
+
totalRelations: toNum(stats['totalRelations']),
|
|
26
|
+
collectionCount: toNum(stats['collectionCount']),
|
|
27
|
+
activeCount: toNum(stats['activeCount']),
|
|
28
|
+
draftCount: toNum(stats['draftCount']),
|
|
29
|
+
orphanedCount: toNum(stats['orphanedCount']),
|
|
30
|
+
governanceMode,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export function detectRepo(cwd = process.cwd()) {
|
|
34
|
+
const ctx = {
|
|
35
|
+
name: null,
|
|
36
|
+
description: null,
|
|
37
|
+
gitRemote: null,
|
|
38
|
+
repoSlug: null,
|
|
39
|
+
detectedStack: [],
|
|
40
|
+
isMonorepo: false,
|
|
41
|
+
};
|
|
42
|
+
// package.json
|
|
43
|
+
const pkgPath = resolve(cwd, 'package.json');
|
|
44
|
+
if (existsSync(pkgPath)) {
|
|
45
|
+
try {
|
|
46
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
|
|
47
|
+
ctx.name = pkg.name?.replace(/^@[^/]+\//, '') ?? null;
|
|
48
|
+
ctx.description = pkg.description ?? null;
|
|
49
|
+
if (pkg.workspaces)
|
|
50
|
+
ctx.isMonorepo = true;
|
|
51
|
+
}
|
|
52
|
+
catch { /* ignore parse errors */ }
|
|
53
|
+
}
|
|
54
|
+
// git remote
|
|
55
|
+
try {
|
|
56
|
+
const remote = execSync('git remote get-url origin', { cwd, encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
|
|
57
|
+
ctx.gitRemote = remote;
|
|
58
|
+
// Extract owner/repo from SSH or HTTPS URL
|
|
59
|
+
const m = remote.match(/[:/]([^/]+\/[^/.]+?)(?:\.git)?$/);
|
|
60
|
+
if (m)
|
|
61
|
+
ctx.repoSlug = m[1];
|
|
62
|
+
}
|
|
63
|
+
catch { /* not a git repo or no remote */ }
|
|
64
|
+
// Stack detection
|
|
65
|
+
const checks = [
|
|
66
|
+
['sveltekit', ['svelte.config.js', 'svelte.config.ts']],
|
|
67
|
+
['convex', ['convex']],
|
|
68
|
+
['typescript', ['tsconfig.json']],
|
|
69
|
+
['nextjs', ['next.config.js', 'next.config.ts', 'next.config.mjs']],
|
|
70
|
+
['vite', ['vite.config.ts', 'vite.config.js']],
|
|
71
|
+
['react', ['src/App.tsx', 'src/App.jsx']],
|
|
72
|
+
];
|
|
73
|
+
for (const [tech, paths] of checks) {
|
|
74
|
+
if (paths.some((p) => existsSync(resolve(cwd, p)))) {
|
|
75
|
+
ctx.detectedStack.push(tech);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// Fallback name from directory
|
|
79
|
+
if (!ctx.name)
|
|
80
|
+
ctx.name = basename(cwd);
|
|
81
|
+
return ctx;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=repo-detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-detect.js","sourceRoot":"","sources":["../../src/lib/repo-detect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* runCliCommand — shared command runner for the Product Brain CLI.
|
|
3
|
+
*
|
|
4
|
+
* Owns:
|
|
5
|
+
* (a) TTY detection via process.stdout.isTTY
|
|
6
|
+
* (b) JSON vs human output branching
|
|
7
|
+
* (c) stripConvexInternals() application in JSON mode
|
|
8
|
+
* (d) --json and --pretty explicit overrides that take precedence over auto-detection
|
|
9
|
+
* (e) Error handling: JSON error object in JSON mode, formatted message in TTY mode
|
|
10
|
+
*
|
|
11
|
+
* Chain: DEC-299 (JSON-default), STD-65 (agent responses: structured, parseable, minimal)
|
|
12
|
+
*/
|
|
13
|
+
export declare function setOutputMode(mode: 'auto' | 'json' | 'pretty'): void;
|
|
14
|
+
export declare function getOutputMode(): 'auto' | 'json' | 'pretty';
|
|
15
|
+
/** Returns true if the current output mode resolves to JSON. */
|
|
16
|
+
export declare function isJsonMode(): boolean;
|
|
17
|
+
export declare function setQuietMode(quiet: boolean): void;
|
|
18
|
+
export declare function isQuietMode(): boolean;
|
|
19
|
+
export interface RunCliCommandOptions<T> {
|
|
20
|
+
/** The async function that performs the MCP call and returns data. */
|
|
21
|
+
fn: () => Promise<T>;
|
|
22
|
+
/** Formats data for human-readable TTY output. */
|
|
23
|
+
formatPretty: (data: T) => string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Execute a CLI command with unified output handling.
|
|
27
|
+
*
|
|
28
|
+
* - JSON mode: strip Convex internals, JSON.stringify to stdout
|
|
29
|
+
* - Pretty mode: call formatPretty callback, print result
|
|
30
|
+
* - Errors: JSON error object in JSON mode, plain message in pretty mode
|
|
31
|
+
*/
|
|
32
|
+
export declare function runCliCommand<T>(options: RunCliCommandOptions<T>): Promise<void>;
|
|
33
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/lib/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAWH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,IAAI,CAEpE;AAED,wBAAgB,aAAa,IAAI,MAAM,GAAG,MAAM,GAAG,QAAQ,CAE1D;AAED,gEAAgE;AAChE,wBAAgB,UAAU,IAAI,OAAO,CAKpC;AASD,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAEjD;AAED,wBAAgB,WAAW,IAAI,OAAO,CAIrC;AAED,MAAM,WAAW,oBAAoB,CAAC,CAAC;IACrC,sEAAsE;IACtE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;IACrB,kDAAkD;IAClD,YAAY,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;CACnC;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBtF"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* runCliCommand — shared command runner for the Product Brain CLI.
|
|
3
|
+
*
|
|
4
|
+
* Owns:
|
|
5
|
+
* (a) TTY detection via process.stdout.isTTY
|
|
6
|
+
* (b) JSON vs human output branching
|
|
7
|
+
* (c) stripConvexInternals() application in JSON mode
|
|
8
|
+
* (d) --json and --pretty explicit overrides that take precedence over auto-detection
|
|
9
|
+
* (e) Error handling: JSON error object in JSON mode, formatted message in TTY mode
|
|
10
|
+
*
|
|
11
|
+
* Chain: DEC-299 (JSON-default), STD-65 (agent responses: structured, parseable, minimal)
|
|
12
|
+
*/
|
|
13
|
+
import { stripConvexInternals } from './strip.js';
|
|
14
|
+
import { CLIError } from './errors.js';
|
|
15
|
+
/**
|
|
16
|
+
* Global output mode — set by the CLI entry point when --json or --pretty flags are parsed.
|
|
17
|
+
* 'auto' = detect via TTY; 'json' = force JSON; 'pretty' = force human.
|
|
18
|
+
*/
|
|
19
|
+
let outputMode = 'auto';
|
|
20
|
+
export function setOutputMode(mode) {
|
|
21
|
+
outputMode = mode;
|
|
22
|
+
}
|
|
23
|
+
export function getOutputMode() {
|
|
24
|
+
return outputMode;
|
|
25
|
+
}
|
|
26
|
+
/** Returns true if the current output mode resolves to JSON. */
|
|
27
|
+
export function isJsonMode() {
|
|
28
|
+
if (outputMode === 'json')
|
|
29
|
+
return true;
|
|
30
|
+
if (outputMode === 'pretty')
|
|
31
|
+
return false;
|
|
32
|
+
// auto: non-TTY (piped) → JSON, TTY → human
|
|
33
|
+
return !process.stdout.isTTY;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Quiet mode — suppresses non-essential output (banners, hints, progress).
|
|
37
|
+
* Only the essential result (data line or error) is shown.
|
|
38
|
+
* WP-302 Slice 1.
|
|
39
|
+
*/
|
|
40
|
+
let quietMode = false;
|
|
41
|
+
export function setQuietMode(quiet) {
|
|
42
|
+
quietMode = quiet;
|
|
43
|
+
}
|
|
44
|
+
export function isQuietMode() {
|
|
45
|
+
// JSON mode is inherently quiet — no decorative output needed
|
|
46
|
+
if (isJsonMode())
|
|
47
|
+
return true;
|
|
48
|
+
return quietMode;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Execute a CLI command with unified output handling.
|
|
52
|
+
*
|
|
53
|
+
* - JSON mode: strip Convex internals, JSON.stringify to stdout
|
|
54
|
+
* - Pretty mode: call formatPretty callback, print result
|
|
55
|
+
* - Errors: JSON error object in JSON mode, plain message in pretty mode
|
|
56
|
+
*/
|
|
57
|
+
export async function runCliCommand(options) {
|
|
58
|
+
const json = isJsonMode();
|
|
59
|
+
try {
|
|
60
|
+
const data = await options.fn();
|
|
61
|
+
if (json) {
|
|
62
|
+
const stripped = stripConvexInternals(data);
|
|
63
|
+
process.stdout.write(JSON.stringify(stripped) + '\n');
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
const formatted = options.formatPretty(data);
|
|
67
|
+
process.stdout.write(formatted + '\n');
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
// Re-throw to the central handleError() in index.ts for formatting and exit.
|
|
72
|
+
// CLIErrors pass through directly; unknown errors are wrapped.
|
|
73
|
+
if (err instanceof CLIError) {
|
|
74
|
+
throw err;
|
|
75
|
+
}
|
|
76
|
+
throw new CLIError(err instanceof Error ? err.message : String(err), { code: 'INTERNAL', category: 'internal' });
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/lib/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC;;;GAGG;AACH,IAAI,UAAU,GAA+B,MAAM,CAAC;AAEpD,MAAM,UAAU,aAAa,CAAC,IAAgC;IAC5D,UAAU,GAAG,IAAI,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,UAAU;IACxB,IAAI,UAAU,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACvC,IAAI,UAAU,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC1C,4CAA4C;IAC5C,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;AAC/B,CAAC;AAED;;;;GAIG;AACH,IAAI,SAAS,GAAG,KAAK,CAAC;AAEtB,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,SAAS,GAAG,KAAK,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,8DAA8D;IAC9D,IAAI,UAAU,EAAE;QAAE,OAAO,IAAI,CAAC;IAC9B,OAAO,SAAS,CAAC;AACnB,CAAC;AASD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAI,OAAgC;IACrE,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;IAE1B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,EAAE,EAAE,CAAC;QAEhC,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,QAAQ,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;YAC5C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;QACxD,CAAC;aAAM,CAAC;YACN,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YAC7C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,6EAA6E;QAC7E,+DAA+D;QAC/D,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;YAC5B,MAAM,GAAG,CAAC;QACZ,CAAC;QACD,MAAM,IAAI,QAAQ,CAChB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAChD,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,CAC3C,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session state — persists active session ID between CLI invocations.
|
|
3
|
+
* Stored at .productbrain/session.json in the project root.
|
|
4
|
+
* Solves TEN-264 (option 1: explicit session token).
|
|
5
|
+
*/
|
|
6
|
+
export interface SessionState {
|
|
7
|
+
sessionId: string;
|
|
8
|
+
workspaceId: string;
|
|
9
|
+
workspaceName: string;
|
|
10
|
+
startedAt: string;
|
|
11
|
+
entriesCaptured: string[];
|
|
12
|
+
}
|
|
13
|
+
export declare function readSession(): SessionState | null;
|
|
14
|
+
export declare function writeSession(state: SessionState): void;
|
|
15
|
+
export declare function clearSession(): void;
|
|
16
|
+
export declare function addCapturedEntry(entryId: string): void;
|
|
17
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/lib/session.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAUD,wBAAgB,WAAW,IAAI,YAAY,GAAG,IAAI,CAQjD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAItD;AAED,wBAAgB,YAAY,IAAI,IAAI,CAGnC;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAKtD"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session state — persists active session ID between CLI invocations.
|
|
3
|
+
* Stored at .productbrain/session.json in the project root.
|
|
4
|
+
* Solves TEN-264 (option 1: explicit session token).
|
|
5
|
+
*/
|
|
6
|
+
import { existsSync, readFileSync, writeFileSync, unlinkSync, mkdirSync } from 'fs';
|
|
7
|
+
import { join } from 'path';
|
|
8
|
+
function getSessionDir() {
|
|
9
|
+
return join(process.cwd(), '.productbrain');
|
|
10
|
+
}
|
|
11
|
+
function getSessionPath() {
|
|
12
|
+
return join(getSessionDir(), 'session.json');
|
|
13
|
+
}
|
|
14
|
+
export function readSession() {
|
|
15
|
+
const p = getSessionPath();
|
|
16
|
+
if (!existsSync(p))
|
|
17
|
+
return null;
|
|
18
|
+
try {
|
|
19
|
+
return JSON.parse(readFileSync(p, 'utf8'));
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export function writeSession(state) {
|
|
26
|
+
const dir = getSessionDir();
|
|
27
|
+
if (!existsSync(dir))
|
|
28
|
+
mkdirSync(dir, { recursive: true });
|
|
29
|
+
writeFileSync(getSessionPath(), JSON.stringify(state, null, 2));
|
|
30
|
+
}
|
|
31
|
+
export function clearSession() {
|
|
32
|
+
const p = getSessionPath();
|
|
33
|
+
if (existsSync(p))
|
|
34
|
+
unlinkSync(p);
|
|
35
|
+
}
|
|
36
|
+
export function addCapturedEntry(entryId) {
|
|
37
|
+
const session = readSession();
|
|
38
|
+
if (!session)
|
|
39
|
+
return;
|
|
40
|
+
session.entriesCaptured.push(entryId);
|
|
41
|
+
writeSession(session);
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/lib/session.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACpF,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAU5B,SAAS,aAAa;IACpB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,eAAe,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,cAAc;IACrB,OAAO,IAAI,CAAC,aAAa,EAAE,EAAE,cAAc,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,MAAM,CAAC,GAAG,cAAc,EAAE,CAAC;IAC3B,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAiB,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAmB;IAC9C,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;IAC5B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,aAAa,CAAC,cAAc,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,MAAM,CAAC,GAAG,cAAc,EAAE,CAAC;IAC3B,IAAI,UAAU,CAAC,CAAC,CAAC;QAAE,UAAU,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAC9B,IAAI,CAAC,OAAO;QAAE,OAAO;IACrB,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtC,YAAY,CAAC,OAAO,CAAC,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contextual spinner for async operations.
|
|
3
|
+
* WP-303 Slice 2: Ambient Feedback (Spinners).
|
|
4
|
+
*
|
|
5
|
+
* - TTY: shows animated spinner with 200ms delayed start
|
|
6
|
+
* - Non-TTY / quiet / json: silent (no output)
|
|
7
|
+
* - On success: replaces spinner with success message
|
|
8
|
+
* - On failure: replaces spinner with failure message, rethrows
|
|
9
|
+
*
|
|
10
|
+
* Uses raw ANSI escape codes to stay consistent with style.ts (no @clack dependency).
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Run an async function with a contextual spinner.
|
|
14
|
+
*
|
|
15
|
+
* In interactive TTY mode, a spinner appears after 200ms (avoids flicker for
|
|
16
|
+
* fast operations). In non-TTY / quiet / JSON mode, the function runs silently.
|
|
17
|
+
*
|
|
18
|
+
* @param label - Text shown next to the spinner (e.g. "Loading orient data")
|
|
19
|
+
* @param fn - The async operation to run
|
|
20
|
+
* @param options.successMessage - Optional override for the completion message
|
|
21
|
+
* @returns The result of fn()
|
|
22
|
+
* @throws Rethrows any error from fn() after displaying failure
|
|
23
|
+
*/
|
|
24
|
+
export declare function withSpinner<T>(label: string, fn: () => Promise<T>, options?: {
|
|
25
|
+
successMessage?: string;
|
|
26
|
+
}): Promise<T>;
|
|
27
|
+
//# sourceMappingURL=spinner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../src/lib/spinner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAcH;;;;;;;;;;;GAWG;AACH,wBAAsB,WAAW,CAAC,CAAC,EACjC,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,CAAC,EAAE;IAAE,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,GACpC,OAAO,CAAC,CAAC,CAAC,CA4CZ"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contextual spinner for async operations.
|
|
3
|
+
* WP-303 Slice 2: Ambient Feedback (Spinners).
|
|
4
|
+
*
|
|
5
|
+
* - TTY: shows animated spinner with 200ms delayed start
|
|
6
|
+
* - Non-TTY / quiet / json: silent (no output)
|
|
7
|
+
* - On success: replaces spinner with success message
|
|
8
|
+
* - On failure: replaces spinner with failure message, rethrows
|
|
9
|
+
*
|
|
10
|
+
* Uses raw ANSI escape codes to stay consistent with style.ts (no @clack dependency).
|
|
11
|
+
*/
|
|
12
|
+
import { isQuietMode, isJsonMode } from './runner.js';
|
|
13
|
+
import { green, red, icons } from './style.js';
|
|
14
|
+
const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
15
|
+
const FRAME_INTERVAL_MS = 80;
|
|
16
|
+
const DELAYED_START_MS = 200;
|
|
17
|
+
/** Returns true if spinner output should be suppressed. */
|
|
18
|
+
function isSilent() {
|
|
19
|
+
return !process.stdout.isTTY || isQuietMode() || isJsonMode();
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Run an async function with a contextual spinner.
|
|
23
|
+
*
|
|
24
|
+
* In interactive TTY mode, a spinner appears after 200ms (avoids flicker for
|
|
25
|
+
* fast operations). In non-TTY / quiet / JSON mode, the function runs silently.
|
|
26
|
+
*
|
|
27
|
+
* @param label - Text shown next to the spinner (e.g. "Loading orient data")
|
|
28
|
+
* @param fn - The async operation to run
|
|
29
|
+
* @param options.successMessage - Optional override for the completion message
|
|
30
|
+
* @returns The result of fn()
|
|
31
|
+
* @throws Rethrows any error from fn() after displaying failure
|
|
32
|
+
*/
|
|
33
|
+
export async function withSpinner(label, fn, options) {
|
|
34
|
+
// Non-interactive: just run the function
|
|
35
|
+
if (isSilent()) {
|
|
36
|
+
return fn();
|
|
37
|
+
}
|
|
38
|
+
let frameIndex = 0;
|
|
39
|
+
let spinnerInterval;
|
|
40
|
+
let started = false;
|
|
41
|
+
const write = (text) => {
|
|
42
|
+
// Clear line and write
|
|
43
|
+
process.stderr.write(`\r\x1b[K${text}`);
|
|
44
|
+
};
|
|
45
|
+
const startSpinner = () => {
|
|
46
|
+
started = true;
|
|
47
|
+
spinnerInterval = setInterval(() => {
|
|
48
|
+
const frame = SPINNER_FRAMES[frameIndex % SPINNER_FRAMES.length];
|
|
49
|
+
write(`${frame} ${label}`);
|
|
50
|
+
frameIndex++;
|
|
51
|
+
}, FRAME_INTERVAL_MS);
|
|
52
|
+
};
|
|
53
|
+
// Delayed start — avoids spinner flash for fast operations
|
|
54
|
+
const delayTimer = setTimeout(startSpinner, DELAYED_START_MS);
|
|
55
|
+
try {
|
|
56
|
+
const result = await fn();
|
|
57
|
+
clearTimeout(delayTimer);
|
|
58
|
+
if (spinnerInterval)
|
|
59
|
+
clearInterval(spinnerInterval);
|
|
60
|
+
if (started) {
|
|
61
|
+
const msg = options?.successMessage || label;
|
|
62
|
+
write(`${green(icons.pass)} ${msg}\n`);
|
|
63
|
+
}
|
|
64
|
+
return result;
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
clearTimeout(delayTimer);
|
|
68
|
+
if (spinnerInterval)
|
|
69
|
+
clearInterval(spinnerInterval);
|
|
70
|
+
if (started) {
|
|
71
|
+
write(`${red(icons.fail)} ${label} \u2014 failed\n`);
|
|
72
|
+
}
|
|
73
|
+
throw err;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=spinner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/lib/spinner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAC1E,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAC7B,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAE7B,2DAA2D;AAC3D,SAAS,QAAQ;IACf,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,WAAW,EAAE,IAAI,UAAU,EAAE,CAAC;AAChE,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,KAAa,EACb,EAAoB,EACpB,OAAqC;IAErC,yCAAyC;IACzC,IAAI,QAAQ,EAAE,EAAE,CAAC;QACf,OAAO,EAAE,EAAE,CAAC;IACd,CAAC;IAED,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,eAA2D,CAAC;IAChE,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,EAAE;QAC7B,uBAAuB;QACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,OAAO,GAAG,IAAI,CAAC;QACf,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE;YACjC,MAAM,KAAK,GAAG,cAAc,CAAC,UAAU,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;YACjE,KAAK,CAAC,GAAG,KAAK,IAAI,KAAK,EAAE,CAAC,CAAC;YAC3B,UAAU,EAAE,CAAC;QACf,CAAC,EAAE,iBAAiB,CAAC,CAAC;IACxB,CAAC,CAAC;IAEF,2DAA2D;IAC3D,MAAM,UAAU,GAAG,UAAU,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;IAE9D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC;QAC1B,YAAY,CAAC,UAAU,CAAC,CAAC;QACzB,IAAI,eAAe;YAAE,aAAa,CAAC,eAAe,CAAC,CAAC;QACpD,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,GAAG,GAAG,OAAO,EAAE,cAAc,IAAI,KAAK,CAAC;YAC7C,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,YAAY,CAAC,UAAU,CAAC,CAAC;QACzB,IAAI,eAAe;YAAE,aAAa,CAAC,eAAe,CAAC,CAAC;QACpD,IAAI,OAAO,EAAE,CAAC;YACZ,KAAK,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,kBAAkB,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spinner.test.d.ts","sourceRoot":"","sources":["../../src/lib/spinner.test.ts"],"names":[],"mappings":""}
|