@productbrain/cli 0.1.0-beta.9 → 0.1.0-beta.90
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 +77 -92
- 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.js +309 -18
- package/dist/__tests__/capture.test.js.map +1 -1
- 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.js +20 -26
- package/dist/__tests__/constellation.test.js.map +1 -1
- 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.js +68 -68
- package/dist/__tests__/fields.test.js.map +1 -1
- 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-preview.test.d.ts +2 -0
- package/dist/__tests__/handshake-preview.test.d.ts.map +1 -0
- package/dist/__tests__/handshake-preview.test.js +156 -0
- package/dist/__tests__/handshake-preview.test.js.map +1 -0
- package/dist/__tests__/handshake.test.js +27 -18
- package/dist/__tests__/handshake.test.js.map +1 -1
- package/dist/__tests__/hook-intents.test.d.ts +2 -0
- package/dist/__tests__/hook-intents.test.d.ts.map +1 -0
- package/dist/__tests__/hook-intents.test.js +184 -0
- package/dist/__tests__/hook-intents.test.js.map +1 -0
- package/dist/__tests__/ingest.test.js +110 -12
- 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__/manifest.test.d.ts +6 -0
- package/dist/__tests__/manifest.test.d.ts.map +1 -0
- package/dist/__tests__/manifest.test.js +138 -0
- package/dist/__tests__/manifest.test.js.map +1 -0
- package/dist/__tests__/method-registry.integration.test.d.ts +6 -0
- package/dist/__tests__/method-registry.integration.test.d.ts.map +1 -0
- package/dist/__tests__/method-registry.integration.test.js +18 -0
- package/dist/__tests__/method-registry.integration.test.js.map +1 -0
- package/dist/__tests__/method-registry.test.d.ts +14 -0
- package/dist/__tests__/method-registry.test.d.ts.map +1 -0
- package/dist/__tests__/method-registry.test.js +134 -0
- package/dist/__tests__/method-registry.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__/personal-layer.test.d.ts +12 -0
- package/dist/__tests__/personal-layer.test.d.ts.map +1 -0
- package/dist/__tests__/personal-layer.test.js +304 -0
- package/dist/__tests__/personal-layer.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.js +57 -33
- package/dist/__tests__/relate.test.js.map +1 -1
- package/dist/__tests__/repo-detect.test.js +97 -1
- package/dist/__tests__/repo-detect.test.js.map +1 -1
- package/dist/__tests__/runner.test.js +19 -15
- package/dist/__tests__/runner.test.js.map +1 -1
- package/dist/__tests__/session-state-machine.test.d.ts +2 -0
- package/dist/__tests__/session-state-machine.test.d.ts.map +1 -0
- package/dist/__tests__/session-state-machine.test.js +154 -0
- package/dist/__tests__/session-state-machine.test.js.map +1 -0
- package/dist/__tests__/session-touch.test.js +11 -11
- package/dist/__tests__/session-touch.test.js.map +1 -1
- package/dist/__tests__/session.test.js +4 -10
- package/dist/__tests__/session.test.js.map +1 -1
- 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__/state.test.d.ts +6 -0
- package/dist/__tests__/state.test.d.ts.map +1 -0
- package/dist/__tests__/state.test.js +97 -0
- package/dist/__tests__/state.test.js.map +1 -0
- package/dist/__tests__/strip.test.js +2 -2
- package/dist/__tests__/strip.test.js.map +1 -1
- 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__/surfaces.test.d.ts +2 -0
- package/dist/__tests__/surfaces.test.d.ts.map +1 -0
- package/dist/__tests__/surfaces.test.js +46 -0
- package/dist/__tests__/surfaces.test.js.map +1 -0
- package/dist/__tests__/update.test.js +123 -43
- package/dist/__tests__/update.test.js.map +1 -1
- 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 +90 -0
- package/dist/commands/admin/cockpit.d.ts.map +1 -0
- package/dist/commands/admin/cockpit.js +618 -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 +256 -0
- package/dist/commands/admin/index.js.map +1 -0
- package/dist/commands/admin/inspect.d.ts +30 -0
- package/dist/commands/admin/inspect.d.ts.map +1 -0
- package/dist/commands/admin/inspect.js +555 -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 +90 -0
- package/dist/commands/admin/inspect.test.js.map +1 -0
- package/dist/commands/admin/manage.d.ts +8 -0
- package/dist/commands/admin/manage.d.ts.map +1 -0
- package/dist/commands/admin/manage.js +76 -0
- package/dist/commands/admin/manage.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 +533 -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 +9 -0
- package/dist/commands/capture.d.ts.map +1 -1
- package/dist/commands/capture.js +256 -17
- package/dist/commands/capture.js.map +1 -1
- 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 +195 -0
- package/dist/commands/connect-integration.test.js.map +1 -0
- package/dist/commands/connect-screens.d.ts +21 -0
- package/dist/commands/connect-screens.d.ts.map +1 -0
- package/dist/commands/connect-screens.js +79 -0
- package/dist/commands/connect-screens.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 +237 -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 +234 -0
- package/dist/commands/connect.test.js.map +1 -0
- package/dist/commands/constellation.d.ts.map +1 -1
- package/dist/commands/constellation.js +8 -3
- package/dist/commands/constellation.js.map +1 -1
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js +8 -3
- 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.map +1 -1
- package/dist/commands/fields.js +8 -4
- package/dist/commands/fields.js.map +1 -1
- package/dist/commands/get.d.ts.map +1 -1
- package/dist/commands/get.js +14 -6
- package/dist/commands/get.js.map +1 -1
- package/dist/commands/handshake.d.ts +12 -0
- package/dist/commands/handshake.d.ts.map +1 -1
- package/dist/commands/handshake.js +422 -74
- package/dist/commands/handshake.js.map +1 -1
- package/dist/commands/ingest.d.ts +7 -2
- package/dist/commands/ingest.d.ts.map +1 -1
- package/dist/commands/ingest.js +137 -31
- 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 +109 -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/method.d.ts +99 -0
- package/dist/commands/method.d.ts.map +1 -0
- package/dist/commands/method.js +781 -0
- package/dist/commands/method.js.map +1 -0
- package/dist/commands/orient.d.ts +106 -1
- package/dist/commands/orient.d.ts.map +1 -1
- package/dist/commands/orient.js +13 -2
- 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 +1 -0
- package/dist/commands/relate.d.ts.map +1 -1
- package/dist/commands/relate.js +41 -15
- package/dist/commands/relate.js.map +1 -1
- package/dist/commands/search.js +2 -2
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/session.d.ts.map +1 -1
- package/dist/commands/session.js +85 -16
- package/dist/commands/session.js.map +1 -1
- package/dist/commands/setup.d.ts +15 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +148 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/update.d.ts +1 -0
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +102 -13
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/usage.d.ts +40 -0
- package/dist/commands/usage.d.ts.map +1 -0
- package/dist/commands/usage.js +232 -0
- package/dist/commands/usage.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/welcome.d.ts +21 -0
- package/dist/commands/welcome.d.ts.map +1 -0
- package/dist/commands/welcome.js +50 -0
- package/dist/commands/welcome.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 +21 -3
- package/dist/formatters/capture.d.ts.map +1 -1
- package/dist/formatters/capture.js +20 -1
- package/dist/formatters/capture.js.map +1 -1
- 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/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/handshake.d.ts +29 -0
- package/dist/formatters/handshake.d.ts.map +1 -1
- package/dist/formatters/handshake.js +115 -3
- package/dist/formatters/handshake.js.map +1 -1
- 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 +3 -0
- package/dist/formatters/relate.d.ts.map +1 -1
- package/dist/formatters/relate.js +6 -0
- package/dist/formatters/relate.js.map +1 -1
- 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 +1 -1
- package/dist/formatters/session.d.ts.map +1 -1
- package/dist/formatters/session.js +3 -1
- package/dist/formatters/session.js.map +1 -1
- package/dist/formatters/update.d.ts.map +1 -1
- package/dist/formatters/update.js +2 -0
- package/dist/formatters/update.js.map +1 -1
- 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 +37 -3
- package/dist/generators/adapters.d.ts.map +1 -1
- package/dist/generators/adapters.js +193 -5
- package/dist/generators/adapters.js.map +1 -1
- 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/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 +1 -1
- package/dist/generators/context-md.d.ts.map +1 -1
- package/dist/generators/context-md.js +12 -1
- package/dist/generators/context-md.js.map +1 -1
- 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/manifest.d.ts +37 -0
- package/dist/generators/manifest.d.ts.map +1 -0
- package/dist/generators/manifest.js +166 -0
- package/dist/generators/manifest.js.map +1 -0
- package/dist/generators/portable-knowledge.d.ts +102 -9
- package/dist/generators/portable-knowledge.d.ts.map +1 -1
- package/dist/generators/portable-knowledge.js +384 -17
- package/dist/generators/portable-knowledge.js.map +1 -1
- package/dist/generators/portable-knowledge.test.js +529 -1
- package/dist/generators/portable-knowledge.test.js.map +1 -1
- 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.js +618 -138
- 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 +45 -3
- package/dist/lib/client.d.ts.map +1 -1
- package/dist/lib/client.js +188 -36
- package/dist/lib/client.js.map +1 -1
- package/dist/lib/collectionRegistry.d.ts +38 -0
- package/dist/lib/collectionRegistry.d.ts.map +1 -0
- package/dist/lib/collectionRegistry.js +112 -0
- package/dist/lib/collectionRegistry.js.map +1 -0
- 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/hook-intents.d.ts +51 -0
- package/dist/lib/hook-intents.d.ts.map +1 -0
- package/dist/lib/hook-intents.js +85 -0
- package/dist/lib/hook-intents.js.map +1 -0
- package/dist/lib/inferSourceDate.d.ts +12 -0
- package/dist/lib/inferSourceDate.d.ts.map +1 -0
- package/dist/lib/inferSourceDate.js +44 -0
- package/dist/lib/inferSourceDate.js.map +1 -0
- package/dist/lib/method-registry.d.ts +32 -0
- package/dist/lib/method-registry.d.ts.map +1 -0
- package/dist/lib/method-registry.js +53 -0
- package/dist/lib/method-registry.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 +19 -0
- package/dist/lib/repo-detect.d.ts.map +1 -1
- package/dist/lib/repo-detect.js +25 -0
- package/dist/lib/repo-detect.js.map +1 -1
- package/dist/lib/runner.d.ts +2 -0
- package/dist/lib/runner.d.ts.map +1 -1
- package/dist/lib/runner.js +21 -7
- package/dist/lib/runner.js.map +1 -1
- package/dist/lib/session.d.ts +25 -0
- package/dist/lib/session.d.ts.map +1 -1
- package/dist/lib/session.js +70 -4
- package/dist/lib/session.js.map +1 -1
- 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/state.d.ts +51 -0
- package/dist/lib/state.d.ts.map +1 -0
- package/dist/lib/state.js +90 -0
- package/dist/lib/state.js.map +1 -0
- package/dist/lib/strip.d.ts +1 -0
- package/dist/lib/strip.d.ts.map +1 -1
- package/dist/lib/strip.js +15 -0
- package/dist/lib/strip.js.map +1 -1
- package/dist/lib/style.d.ts +96 -0
- package/dist/lib/style.d.ts.map +1 -0
- package/dist/lib/style.js +169 -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/update-check.d.ts +21 -0
- package/dist/lib/update-check.d.ts.map +1 -0
- package/dist/lib/update-check.js +145 -0
- package/dist/lib/update-check.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 +19 -0
- package/dist/lib/workspace-probe.d.ts.map +1 -0
- package/dist/lib/workspace-probe.js +27 -0
- package/dist/lib/workspace-probe.js.map +1 -0
- package/dist/surfaces/registry.d.ts +20 -0
- package/dist/surfaces/registry.d.ts.map +1 -0
- package/dist/surfaces/registry.js +42 -0
- package/dist/surfaces/registry.js.map +1 -0
- package/package.json +9 -3
- 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/method-registry.json +16 -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,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chain Classifier — BET-286 Slice 1
|
|
3
|
+
*
|
|
4
|
+
* Pure function that maps governance entries (from getGovernanceWithRelations)
|
|
5
|
+
* to the governance function each entry serves. No LLM, no network calls.
|
|
6
|
+
* Deterministic: same input always produces same output.
|
|
7
|
+
*
|
|
8
|
+
* Chain: BET-286 (Chain-Derived Agent Configuration)
|
|
9
|
+
*/
|
|
10
|
+
/** Base score awarded for a collection-type match. */
|
|
11
|
+
const COLLECTION_BASE_SCORE = 0.45;
|
|
12
|
+
/** Score boost for a supporting relation type match. */
|
|
13
|
+
const RELATION_BOOST = 0.2;
|
|
14
|
+
/** Score boost for a supporting name pattern match. */
|
|
15
|
+
const NAME_BOOST = 0.15;
|
|
16
|
+
/** Map collection slug → primary governance function. */
|
|
17
|
+
const COLLECTION_TO_FUNCTION = {
|
|
18
|
+
'standards': 'constraint',
|
|
19
|
+
'business-rules': 'constraint',
|
|
20
|
+
'architecture': 'boundary',
|
|
21
|
+
'decisions': 'convention',
|
|
22
|
+
'patterns': 'convention',
|
|
23
|
+
'policies': 'policy',
|
|
24
|
+
'flows': 'workflow',
|
|
25
|
+
'glossary': 'unclassified',
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Relation-type signals that boost a governance function.
|
|
29
|
+
* Key: relation type string (lowercased).
|
|
30
|
+
* Value: [governanceFunction, boost].
|
|
31
|
+
*/
|
|
32
|
+
const RELATION_SIGNALS = [
|
|
33
|
+
{ type: 'constrains', fn: 'constraint', boost: RELATION_BOOST },
|
|
34
|
+
{ type: 'governs', fn: 'policy', boost: RELATION_BOOST },
|
|
35
|
+
{ type: 'part_of', fn: 'workflow', boost: RELATION_BOOST },
|
|
36
|
+
];
|
|
37
|
+
/** Relation signals based on the collection of the *other* entry. */
|
|
38
|
+
const RELATION_COLLECTION_SIGNALS = [
|
|
39
|
+
// informed_by an architecture entry → boost boundary
|
|
40
|
+
{ otherCollectionSlug: 'architecture', relationType: 'informed_by', fn: 'boundary', boost: RELATION_BOOST },
|
|
41
|
+
];
|
|
42
|
+
/**
|
|
43
|
+
* Name keyword signals — applied against the lowercased entry name.
|
|
44
|
+
* Matched signals are applied once per matching keyword group.
|
|
45
|
+
*/
|
|
46
|
+
const NAME_SIGNALS = [
|
|
47
|
+
{
|
|
48
|
+
keywords: ['auth', 'security', 'permission'],
|
|
49
|
+
fn: 'policy',
|
|
50
|
+
boost: NAME_BOOST,
|
|
51
|
+
label: 'name contains security/auth/permission keyword',
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
keywords: ['test', 'quality', 'check', 'gate'],
|
|
55
|
+
fn: 'quality-gate',
|
|
56
|
+
boost: NAME_BOOST,
|
|
57
|
+
label: 'name contains test/quality/check/gate keyword',
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
keywords: ['deploy', 'release', 'rollback'],
|
|
61
|
+
fn: 'convention',
|
|
62
|
+
boost: NAME_BOOST,
|
|
63
|
+
label: 'name contains deploy/release/rollback keyword',
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
keywords: ['domain', 'boundary', 'layer', 'architecture'],
|
|
67
|
+
fn: 'boundary',
|
|
68
|
+
boost: NAME_BOOST,
|
|
69
|
+
label: 'name contains domain/boundary/layer/architecture keyword',
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
keywords: ['flag', 'feature flag'],
|
|
73
|
+
fn: 'convention',
|
|
74
|
+
boost: NAME_BOOST,
|
|
75
|
+
label: 'name contains flag/feature flag keyword',
|
|
76
|
+
},
|
|
77
|
+
];
|
|
78
|
+
/**
|
|
79
|
+
* Secondary collection overrides — for collections that can produce multiple
|
|
80
|
+
* governance functions depending on relation/name context. When a secondary
|
|
81
|
+
* function score exceeds this threshold, it may win over the primary collection
|
|
82
|
+
* signal if its total score is higher.
|
|
83
|
+
*
|
|
84
|
+
* `standards` can produce `quality-gate` in addition to `constraint`.
|
|
85
|
+
* `business-rules` can produce `policy` in addition to `constraint`.
|
|
86
|
+
* `decisions` can produce `boundary` in addition to `convention`.
|
|
87
|
+
*/
|
|
88
|
+
const SECONDARY_COLLECTION_SIGNALS = {
|
|
89
|
+
'standards': 'quality-gate',
|
|
90
|
+
'business-rules': 'policy',
|
|
91
|
+
'decisions': 'boundary',
|
|
92
|
+
};
|
|
93
|
+
// ── Classifier ────────────────────────────────────────────────────────
|
|
94
|
+
/**
|
|
95
|
+
* Classify a batch of governance entries, returning one ClassifiedGovernance
|
|
96
|
+
* per entry that has a non-null entryId. Entries with null entryId are silently
|
|
97
|
+
* excluded (safety guard — entries without IDs cannot be referenced by archetypes).
|
|
98
|
+
*/
|
|
99
|
+
export function classifyGovernance(entries) {
|
|
100
|
+
const results = [];
|
|
101
|
+
for (const entry of entries) {
|
|
102
|
+
// Safety: skip entries without a human-readable ID
|
|
103
|
+
if (entry.entryId === null)
|
|
104
|
+
continue;
|
|
105
|
+
const scores = new Map();
|
|
106
|
+
const signals = [];
|
|
107
|
+
const nameLower = entry.name.toLowerCase();
|
|
108
|
+
const slug = entry.collectionSlug;
|
|
109
|
+
// ── Signal 1: Collection type (strongest) ──────────────────────
|
|
110
|
+
const primaryFn = COLLECTION_TO_FUNCTION[slug];
|
|
111
|
+
if (primaryFn && primaryFn !== 'unclassified') {
|
|
112
|
+
addScore(scores, primaryFn, COLLECTION_BASE_SCORE);
|
|
113
|
+
signals.push(`collection '${slug}' → ${primaryFn}`);
|
|
114
|
+
}
|
|
115
|
+
// Secondary collection function — seed with a lower base so it can win
|
|
116
|
+
// only when relation/name signals push it above the primary.
|
|
117
|
+
const secondaryFn = SECONDARY_COLLECTION_SIGNALS[slug];
|
|
118
|
+
if (secondaryFn) {
|
|
119
|
+
addScore(scores, secondaryFn, COLLECTION_BASE_SCORE - 0.1);
|
|
120
|
+
signals.push(`collection '${slug}' secondary → ${secondaryFn}`);
|
|
121
|
+
}
|
|
122
|
+
// ── Signal 2: Relation types (refining) ───────────────────────
|
|
123
|
+
for (const rel of entry.relations) {
|
|
124
|
+
const relTypeLower = rel.type.toLowerCase();
|
|
125
|
+
for (const sig of RELATION_SIGNALS) {
|
|
126
|
+
if (relTypeLower === sig.type) {
|
|
127
|
+
addScore(scores, sig.fn, sig.boost);
|
|
128
|
+
signals.push(`relation '${rel.type}' → boost ${sig.fn}`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
for (const sig of RELATION_COLLECTION_SIGNALS) {
|
|
132
|
+
if (relTypeLower === sig.relationType &&
|
|
133
|
+
rel.otherCollectionSlug === sig.otherCollectionSlug) {
|
|
134
|
+
addScore(scores, sig.fn, sig.boost);
|
|
135
|
+
signals.push(`relation '${rel.type}' to ${sig.otherCollectionSlug} → boost ${sig.fn}`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// ── Signal 3: Name patterns (weakest) ─────────────────────────
|
|
140
|
+
for (const sig of NAME_SIGNALS) {
|
|
141
|
+
const matched = sig.keywords.some((kw) => nameLower.includes(kw));
|
|
142
|
+
if (matched) {
|
|
143
|
+
addScore(scores, sig.fn, sig.boost);
|
|
144
|
+
signals.push(sig.label);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// ── Pick winner ───────────────────────────────────────────────
|
|
148
|
+
let bestFn = 'unclassified';
|
|
149
|
+
let bestScore = 0;
|
|
150
|
+
for (const [fn, score] of scores) {
|
|
151
|
+
if (score > bestScore) {
|
|
152
|
+
bestScore = score;
|
|
153
|
+
bestFn = fn;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// Glossary is always unclassified regardless of score
|
|
157
|
+
if (slug === 'glossary') {
|
|
158
|
+
bestFn = 'unclassified';
|
|
159
|
+
bestScore = 0;
|
|
160
|
+
}
|
|
161
|
+
// Confidence: clamp to [0, 1]
|
|
162
|
+
const confidence = Math.min(1, Math.max(0, bestScore));
|
|
163
|
+
results.push({
|
|
164
|
+
entryId: entry.entryId,
|
|
165
|
+
name: entry.name,
|
|
166
|
+
collectionSlug: entry.collectionSlug,
|
|
167
|
+
governanceFunction: bestFn,
|
|
168
|
+
confidence,
|
|
169
|
+
matchedSignals: signals,
|
|
170
|
+
data: entry.data,
|
|
171
|
+
relations: entry.relations,
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
return results;
|
|
175
|
+
}
|
|
176
|
+
// ── Helpers ────────────────────────────────────────────────────────────
|
|
177
|
+
function addScore(scores, fn, delta) {
|
|
178
|
+
scores.set(fn, (scores.get(fn) ?? 0) + delta);
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=chain-classifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chain-classifier.js","sourceRoot":"","sources":["../../src/generators/chain-classifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chain-classifier.test.d.ts","sourceRoot":"","sources":["../../src/generators/chain-classifier.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* chain-classifier — unit tests.
|
|
3
|
+
* BET-286 Slice 1: relation-aware governance function classifier.
|
|
4
|
+
*/
|
|
5
|
+
import { describe, expect, it } from 'vitest';
|
|
6
|
+
import { classifyGovernance, } from './chain-classifier.js';
|
|
7
|
+
// ── Helpers ────────────────────────────────────────────────────────────
|
|
8
|
+
function makeEntry(overrides) {
|
|
9
|
+
return {
|
|
10
|
+
status: 'committed',
|
|
11
|
+
verificationStatus: null,
|
|
12
|
+
data: null,
|
|
13
|
+
relations: [],
|
|
14
|
+
...overrides,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function makeRelation(overrides) {
|
|
18
|
+
return {
|
|
19
|
+
direction: 'outgoing',
|
|
20
|
+
otherEntryId: null,
|
|
21
|
+
otherName: 'other entry',
|
|
22
|
+
otherCollectionSlug: null,
|
|
23
|
+
...overrides,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
// ── Test cases ─────────────────────────────────────────────────────────
|
|
27
|
+
describe('classifyGovernance — collection signal', () => {
|
|
28
|
+
it('STD entry with constrains relation → constraint with high confidence (>=0.6)', () => {
|
|
29
|
+
const entry = makeEntry({
|
|
30
|
+
entryId: 'STD-1',
|
|
31
|
+
name: 'Trunk-based development standard',
|
|
32
|
+
collectionSlug: 'standards',
|
|
33
|
+
relations: [makeRelation({ type: 'constrains', otherCollectionSlug: 'bets' })],
|
|
34
|
+
});
|
|
35
|
+
const results = classifyGovernance([entry]);
|
|
36
|
+
expect(results).toHaveLength(1);
|
|
37
|
+
expect(results[0].governanceFunction).toBe('constraint');
|
|
38
|
+
expect(results[0].confidence).toBeGreaterThanOrEqual(0.6);
|
|
39
|
+
});
|
|
40
|
+
it('ARCH entry → boundary with medium confidence (>=0.4)', () => {
|
|
41
|
+
const entry = makeEntry({
|
|
42
|
+
entryId: 'ARCH-1',
|
|
43
|
+
name: 'Seven system domains',
|
|
44
|
+
collectionSlug: 'architecture',
|
|
45
|
+
});
|
|
46
|
+
const results = classifyGovernance([entry]);
|
|
47
|
+
expect(results).toHaveLength(1);
|
|
48
|
+
expect(results[0].governanceFunction).toBe('boundary');
|
|
49
|
+
expect(results[0].confidence).toBeGreaterThanOrEqual(0.4);
|
|
50
|
+
});
|
|
51
|
+
it('DEC entry with deployment in name → convention with boosted confidence', () => {
|
|
52
|
+
const entry = makeEntry({
|
|
53
|
+
entryId: 'DEC-1',
|
|
54
|
+
name: 'deployment ordering for Convex and Railway',
|
|
55
|
+
collectionSlug: 'decisions',
|
|
56
|
+
});
|
|
57
|
+
const noNameEntry = makeEntry({
|
|
58
|
+
entryId: 'DEC-2',
|
|
59
|
+
name: 'some decision',
|
|
60
|
+
collectionSlug: 'decisions',
|
|
61
|
+
});
|
|
62
|
+
const withName = classifyGovernance([entry]);
|
|
63
|
+
const withoutName = classifyGovernance([noNameEntry]);
|
|
64
|
+
expect(withName[0].governanceFunction).toBe('convention');
|
|
65
|
+
expect(withName[0].confidence).toBeGreaterThan(withoutName[0].confidence);
|
|
66
|
+
});
|
|
67
|
+
it('FLOW entry → workflow', () => {
|
|
68
|
+
const entry = makeEntry({
|
|
69
|
+
entryId: 'FLOW-1',
|
|
70
|
+
name: 'Feature flag lifecycle flow',
|
|
71
|
+
collectionSlug: 'flows',
|
|
72
|
+
});
|
|
73
|
+
const results = classifyGovernance([entry]);
|
|
74
|
+
expect(results).toHaveLength(1);
|
|
75
|
+
expect(results[0].governanceFunction).toBe('workflow');
|
|
76
|
+
});
|
|
77
|
+
it('POL entry with governs relation → policy with high confidence', () => {
|
|
78
|
+
const entry = makeEntry({
|
|
79
|
+
entryId: 'POL-1',
|
|
80
|
+
name: 'Access control policy',
|
|
81
|
+
collectionSlug: 'policies',
|
|
82
|
+
relations: [makeRelation({ type: 'governs', otherCollectionSlug: 'bets' })],
|
|
83
|
+
});
|
|
84
|
+
const results = classifyGovernance([entry]);
|
|
85
|
+
expect(results).toHaveLength(1);
|
|
86
|
+
expect(results[0].governanceFunction).toBe('policy');
|
|
87
|
+
expect(results[0].confidence).toBeGreaterThanOrEqual(0.6);
|
|
88
|
+
});
|
|
89
|
+
it('STD entry with test in name → quality-gate with boosted confidence', () => {
|
|
90
|
+
const entry = makeEntry({
|
|
91
|
+
entryId: 'STD-2',
|
|
92
|
+
name: 'Test coverage quality gate for all slices',
|
|
93
|
+
collectionSlug: 'standards',
|
|
94
|
+
});
|
|
95
|
+
const results = classifyGovernance([entry]);
|
|
96
|
+
expect(results).toHaveLength(1);
|
|
97
|
+
expect(results[0].governanceFunction).toBe('quality-gate');
|
|
98
|
+
expect(results[0].confidence).toBeGreaterThanOrEqual(0.5);
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
describe('classifyGovernance — null entryId safety', () => {
|
|
102
|
+
it('entry with null entryId is excluded from output', () => {
|
|
103
|
+
const entry = makeEntry({
|
|
104
|
+
entryId: null,
|
|
105
|
+
name: 'Draft entry without ID',
|
|
106
|
+
collectionSlug: 'standards',
|
|
107
|
+
});
|
|
108
|
+
const results = classifyGovernance([entry]);
|
|
109
|
+
expect(results).toHaveLength(0);
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
describe('classifyGovernance — empty input', () => {
|
|
113
|
+
it('empty input → empty output', () => {
|
|
114
|
+
const results = classifyGovernance([]);
|
|
115
|
+
expect(results).toHaveLength(0);
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
describe('classifyGovernance — unclassified', () => {
|
|
119
|
+
it('glossary entry → unclassified regardless of signals', () => {
|
|
120
|
+
const entry = makeEntry({
|
|
121
|
+
entryId: 'GLO-1',
|
|
122
|
+
name: 'Trunk-based development',
|
|
123
|
+
collectionSlug: 'glossary',
|
|
124
|
+
relations: [makeRelation({ type: 'constrains' })],
|
|
125
|
+
});
|
|
126
|
+
const results = classifyGovernance([entry]);
|
|
127
|
+
expect(results).toHaveLength(1);
|
|
128
|
+
expect(results[0].governanceFunction).toBe('unclassified');
|
|
129
|
+
expect(results[0].confidence).toBe(0);
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
describe('classifyGovernance — multiple signal matches', () => {
|
|
133
|
+
it('entry with multiple signals → highest confidence function wins', () => {
|
|
134
|
+
// BR entry with both constrains AND governs relations.
|
|
135
|
+
// constrains boosts 'constraint', governs boosts 'policy'.
|
|
136
|
+
// business-rules base maps to 'constraint', so constraint should win.
|
|
137
|
+
const entry = makeEntry({
|
|
138
|
+
entryId: 'BR-1',
|
|
139
|
+
name: 'Entry creation must use createEntry gate',
|
|
140
|
+
collectionSlug: 'business-rules',
|
|
141
|
+
relations: [
|
|
142
|
+
makeRelation({ type: 'constrains' }),
|
|
143
|
+
makeRelation({ type: 'constrains' }),
|
|
144
|
+
makeRelation({ type: 'governs' }),
|
|
145
|
+
],
|
|
146
|
+
});
|
|
147
|
+
const results = classifyGovernance([entry]);
|
|
148
|
+
expect(results).toHaveLength(1);
|
|
149
|
+
// Both constraint and policy are plausible; the function with the highest score wins.
|
|
150
|
+
// With 2x constrains boosts, constraint should dominate.
|
|
151
|
+
expect(results[0].governanceFunction).toBe('constraint');
|
|
152
|
+
expect(results[0].confidence).toBeGreaterThanOrEqual(0.6);
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
describe('classifyGovernance — passthrough fields', () => {
|
|
156
|
+
it('passes data and relations through to result', () => {
|
|
157
|
+
const data = { someField: 'someValue' };
|
|
158
|
+
const relation = makeRelation({ type: 'constrains' });
|
|
159
|
+
const entry = makeEntry({
|
|
160
|
+
entryId: 'STD-99',
|
|
161
|
+
name: 'Some standard',
|
|
162
|
+
collectionSlug: 'standards',
|
|
163
|
+
data,
|
|
164
|
+
relations: [relation],
|
|
165
|
+
});
|
|
166
|
+
const results = classifyGovernance([entry]);
|
|
167
|
+
expect(results[0].data).toBe(data);
|
|
168
|
+
expect(results[0].relations).toEqual([relation]);
|
|
169
|
+
});
|
|
170
|
+
it('returns entryId, name, and collectionSlug unchanged', () => {
|
|
171
|
+
const entry = makeEntry({
|
|
172
|
+
entryId: 'ARCH-42',
|
|
173
|
+
name: 'My architecture entry',
|
|
174
|
+
collectionSlug: 'architecture',
|
|
175
|
+
});
|
|
176
|
+
const results = classifyGovernance([entry]);
|
|
177
|
+
expect(results[0].entryId).toBe('ARCH-42');
|
|
178
|
+
expect(results[0].name).toBe('My architecture entry');
|
|
179
|
+
expect(results[0].collectionSlug).toBe('architecture');
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
describe('classifyGovernance — name signal boosts', () => {
|
|
183
|
+
it('security keyword boosts policy for business-rules collection', () => {
|
|
184
|
+
const withKeyword = makeEntry({
|
|
185
|
+
entryId: 'BR-2',
|
|
186
|
+
name: 'Auth security check before MCP tool execution',
|
|
187
|
+
collectionSlug: 'business-rules',
|
|
188
|
+
});
|
|
189
|
+
const withoutKeyword = makeEntry({
|
|
190
|
+
entryId: 'BR-3',
|
|
191
|
+
name: 'Some business rule',
|
|
192
|
+
collectionSlug: 'business-rules',
|
|
193
|
+
});
|
|
194
|
+
const [withResult] = classifyGovernance([withKeyword]);
|
|
195
|
+
const [withoutResult] = classifyGovernance([withoutKeyword]);
|
|
196
|
+
// Security keyword → policy wins over default constraint
|
|
197
|
+
expect(withResult.governanceFunction).toBe('policy');
|
|
198
|
+
// Without keyword, default constraint wins
|
|
199
|
+
expect(withoutResult.governanceFunction).toBe('constraint');
|
|
200
|
+
});
|
|
201
|
+
it('matchedSignals contains human-readable explanations', () => {
|
|
202
|
+
const entry = makeEntry({
|
|
203
|
+
entryId: 'STD-5',
|
|
204
|
+
name: 'Quality gate for test coverage',
|
|
205
|
+
collectionSlug: 'standards',
|
|
206
|
+
relations: [makeRelation({ type: 'constrains' })],
|
|
207
|
+
});
|
|
208
|
+
const [result] = classifyGovernance([entry]);
|
|
209
|
+
expect(result.matchedSignals.length).toBeGreaterThan(0);
|
|
210
|
+
expect(result.matchedSignals.some((s) => s.includes('standards'))).toBe(true);
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
describe('classifyGovernance — mixed null/non-null entryIds', () => {
|
|
214
|
+
it('only entries with non-null entryIds are returned', () => {
|
|
215
|
+
const entries = [
|
|
216
|
+
makeEntry({ entryId: 'STD-1', name: 'Valid standard', collectionSlug: 'standards' }),
|
|
217
|
+
makeEntry({ entryId: null, name: 'Draft entry', collectionSlug: 'standards' }),
|
|
218
|
+
makeEntry({ entryId: 'ARCH-2', name: 'Architecture entry', collectionSlug: 'architecture' }),
|
|
219
|
+
];
|
|
220
|
+
const results = classifyGovernance(entries);
|
|
221
|
+
expect(results).toHaveLength(2);
|
|
222
|
+
expect(results.map((r) => r.entryId)).toEqual(['STD-1', 'ARCH-2']);
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
describe('classifyGovernance — patterns collection', () => {
|
|
226
|
+
it('PAT entry → convention', () => {
|
|
227
|
+
const entry = makeEntry({
|
|
228
|
+
entryId: 'PAT-1',
|
|
229
|
+
name: 'Additive wrapping pattern for feature flags',
|
|
230
|
+
collectionSlug: 'patterns',
|
|
231
|
+
});
|
|
232
|
+
const results = classifyGovernance([entry]);
|
|
233
|
+
expect(results[0].governanceFunction).toBe('convention');
|
|
234
|
+
});
|
|
235
|
+
});
|
|
236
|
+
describe('classifyGovernance — informed_by ARCH relation boosts boundary', () => {
|
|
237
|
+
it('DEC informed_by an architecture entry → boundary wins over convention', () => {
|
|
238
|
+
const entry = makeEntry({
|
|
239
|
+
entryId: 'DEC-5',
|
|
240
|
+
name: 'Domain boundaries for the seven layers',
|
|
241
|
+
collectionSlug: 'decisions',
|
|
242
|
+
relations: [
|
|
243
|
+
makeRelation({
|
|
244
|
+
type: 'informed_by',
|
|
245
|
+
direction: 'outgoing',
|
|
246
|
+
otherCollectionSlug: 'architecture',
|
|
247
|
+
otherName: 'Seven system domains',
|
|
248
|
+
otherEntryId: 'ARCH-26',
|
|
249
|
+
}),
|
|
250
|
+
],
|
|
251
|
+
});
|
|
252
|
+
// Also include 'domain' keyword in the name → double boundary boost
|
|
253
|
+
const results = classifyGovernance([entry]);
|
|
254
|
+
expect(results[0].governanceFunction).toBe('boundary');
|
|
255
|
+
});
|
|
256
|
+
});
|
|
257
|
+
//# sourceMappingURL=chain-classifier.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chain-classifier.test.js","sourceRoot":"","sources":["../../src/generators/chain-classifier.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chain Rules Assembler — BET-286 Slice 3
|
|
3
|
+
*
|
|
4
|
+
* Fetches governance entries via MCP, classifies them, resolves archetype
|
|
5
|
+
* templates, and returns CanonicalRule objects ready to merge into the
|
|
6
|
+
* canonical rules array in runHandshake().
|
|
7
|
+
*
|
|
8
|
+
* Chain: BET-286 (Chain-Derived Agent Configuration)
|
|
9
|
+
*/
|
|
10
|
+
import type { CanonicalRule } from './portable-knowledge.js';
|
|
11
|
+
import type { kernelCall as McpCallFn } from '../lib/client.js';
|
|
12
|
+
/** Statistics from a generateChainRules() call. */
|
|
13
|
+
export interface ChainRulesStats {
|
|
14
|
+
totalEntries: number;
|
|
15
|
+
classifiedEntries: number;
|
|
16
|
+
generatedRules: number;
|
|
17
|
+
suppressedByManual: number;
|
|
18
|
+
suppressedByZeroEntries: number;
|
|
19
|
+
}
|
|
20
|
+
/** Result returned by generateChainRules(). */
|
|
21
|
+
export interface ChainRulesResult {
|
|
22
|
+
/** Generated rules ready to merge into canonical rules array. */
|
|
23
|
+
rules: CanonicalRule[];
|
|
24
|
+
/** Function keys with no matching governance entries. */
|
|
25
|
+
gaps: string[];
|
|
26
|
+
/** Sentinel rule when MCP is unreachable — null on success. */
|
|
27
|
+
sentinel: CanonicalRule | null;
|
|
28
|
+
stats: ChainRulesStats;
|
|
29
|
+
/** Classified governance entries — passed through for diff engine confidence data. */
|
|
30
|
+
classified: import('./chain-classifier.js').ClassifiedGovernance[];
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Fetch governance entries, classify them, resolve archetypes, and produce
|
|
34
|
+
* CanonicalRule objects ready to merge into the handshake pipeline.
|
|
35
|
+
*
|
|
36
|
+
* @param kernelCallFn - Injected kernelCall function for testability.
|
|
37
|
+
* @param manualRules - Existing manual rules from .productbrain/rules/.
|
|
38
|
+
* Used to suppress generated rules when a manual rule
|
|
39
|
+
* with the same name already exists.
|
|
40
|
+
*/
|
|
41
|
+
export declare function generateChainRules(kernelCallFn: typeof McpCallFn, manualRules: CanonicalRule[]): Promise<ChainRulesResult>;
|
|
42
|
+
//# sourceMappingURL=chain-rules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chain-rules.d.ts","sourceRoot":"","sources":["../../src/generators/chain-rules.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAI7D,OAAO,KAAK,EAAE,UAAU,IAAI,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAIhE,mDAAmD;AACnD,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,uBAAuB,EAAE,MAAM,CAAC;CACjC;AAED,+CAA+C;AAC/C,MAAM,WAAW,gBAAgB;IAC/B,iEAAiE;IACjE,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,yDAAyD;IACzD,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,+DAA+D;IAC/D,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IAC/B,KAAK,EAAE,eAAe,CAAC;IACvB,sFAAsF;IACtF,UAAU,EAAE,OAAO,uBAAuB,EAAE,oBAAoB,EAAE,CAAC;CACpE;AAkCD;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACtC,YAAY,EAAE,OAAO,SAAS,EAC9B,WAAW,EAAE,aAAa,EAAE,GAC3B,OAAO,CAAC,gBAAgB,CAAC,CAoF3B"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chain Rules Assembler — BET-286 Slice 3
|
|
3
|
+
*
|
|
4
|
+
* Fetches governance entries via MCP, classifies them, resolves archetype
|
|
5
|
+
* templates, and returns CanonicalRule objects ready to merge into the
|
|
6
|
+
* canonical rules array in runHandshake().
|
|
7
|
+
*
|
|
8
|
+
* Chain: BET-286 (Chain-Derived Agent Configuration)
|
|
9
|
+
*/
|
|
10
|
+
import { classifyGovernance } from './chain-classifier.js';
|
|
11
|
+
import { resolveArchetype } from './archetypes.js';
|
|
12
|
+
// ── Sentinel ──────────────────────────────────────────────────────────
|
|
13
|
+
/** Produced when chain.getGovernanceWithRelations is unreachable. */
|
|
14
|
+
const CHAIN_DEGRADED_SENTINEL = {
|
|
15
|
+
name: '_chain_degraded',
|
|
16
|
+
description: 'Chain governance unavailable — agent operating with manual rules only',
|
|
17
|
+
body: 'WARNING: The Chain MCP endpoint is unreachable. Generated governance rules are unavailable. Agent is operating with manual rules only. Exercise extra caution on governance decisions — check with the human before proceeding.',
|
|
18
|
+
sourcePath: 'chain://_sentinel',
|
|
19
|
+
autoApply: true,
|
|
20
|
+
level: 'core',
|
|
21
|
+
scope: undefined,
|
|
22
|
+
targets: undefined,
|
|
23
|
+
};
|
|
24
|
+
// ── Governance functions to attempt (excluding 'unclassified') ────────
|
|
25
|
+
const GOVERNANCE_FUNCTIONS = [
|
|
26
|
+
'constraint',
|
|
27
|
+
'boundary',
|
|
28
|
+
'convention',
|
|
29
|
+
'policy',
|
|
30
|
+
'workflow',
|
|
31
|
+
'quality-gate',
|
|
32
|
+
];
|
|
33
|
+
/** Maximum number of generated rules (ranked by relation density). */
|
|
34
|
+
const MAX_GENERATED_RULES = 8;
|
|
35
|
+
// ── Assembler ─────────────────────────────────────────────────────────
|
|
36
|
+
/**
|
|
37
|
+
* Fetch governance entries, classify them, resolve archetypes, and produce
|
|
38
|
+
* CanonicalRule objects ready to merge into the handshake pipeline.
|
|
39
|
+
*
|
|
40
|
+
* @param kernelCallFn - Injected kernelCall function for testability.
|
|
41
|
+
* @param manualRules - Existing manual rules from .productbrain/rules/.
|
|
42
|
+
* Used to suppress generated rules when a manual rule
|
|
43
|
+
* with the same name already exists.
|
|
44
|
+
*/
|
|
45
|
+
export async function generateChainRules(kernelCallFn, manualRules) {
|
|
46
|
+
const emptyStats = {
|
|
47
|
+
totalEntries: 0,
|
|
48
|
+
classifiedEntries: 0,
|
|
49
|
+
generatedRules: 0,
|
|
50
|
+
suppressedByManual: 0,
|
|
51
|
+
suppressedByZeroEntries: 0,
|
|
52
|
+
};
|
|
53
|
+
// Step 1: Fetch governance entries — return sentinel on failure
|
|
54
|
+
// The Convex query returns { entries: [...], total: N } — unwrap the array.
|
|
55
|
+
let entries;
|
|
56
|
+
try {
|
|
57
|
+
const result = await kernelCallFn('chain.getGovernanceWithRelations', {});
|
|
58
|
+
if (!Array.isArray(result?.entries)) {
|
|
59
|
+
return { rules: [], gaps: [], sentinel: CHAIN_DEGRADED_SENTINEL, stats: emptyStats, classified: [] };
|
|
60
|
+
}
|
|
61
|
+
entries = result.entries;
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return {
|
|
65
|
+
rules: [],
|
|
66
|
+
gaps: [],
|
|
67
|
+
sentinel: CHAIN_DEGRADED_SENTINEL,
|
|
68
|
+
stats: emptyStats,
|
|
69
|
+
classified: [],
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
// Step 2: Classify entries
|
|
73
|
+
const classified = classifyGovernance(entries);
|
|
74
|
+
// Step 3: Build manual rule name set for suppression check
|
|
75
|
+
const manualRuleNames = new Set(manualRules.map((r) => r.name));
|
|
76
|
+
// Step 4: Resolve an archetype per governance function
|
|
77
|
+
const resolvedRules = [];
|
|
78
|
+
const gaps = [];
|
|
79
|
+
let suppressedByManual = 0;
|
|
80
|
+
let suppressedByZeroEntries = 0;
|
|
81
|
+
for (const fn of GOVERNANCE_FUNCTIONS) {
|
|
82
|
+
const matching = classified.filter((e) => e.governanceFunction === fn);
|
|
83
|
+
if (matching.length === 0) {
|
|
84
|
+
// Zero entries for this function — add to gaps
|
|
85
|
+
gaps.push(fn);
|
|
86
|
+
suppressedByZeroEntries++;
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
const result = resolveArchetype(fn, classified, manualRuleNames);
|
|
90
|
+
if ('skipped' in result) {
|
|
91
|
+
if (result.skipped === 'manual-suppression') {
|
|
92
|
+
suppressedByManual++;
|
|
93
|
+
}
|
|
94
|
+
// 'no-template' and 'zero-entries' are not counted as manual suppression.
|
|
95
|
+
// Zero-entries is already handled above; no-template is a missing file (not a user action).
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
resolvedRules.push(result.resolved.rule);
|
|
99
|
+
}
|
|
100
|
+
// Step 5: Cap at MAX_GENERATED_RULES — rank by relation density
|
|
101
|
+
// Relation density = total relations across all classified entries matching this function
|
|
102
|
+
const ranked = rankByRelationDensity(resolvedRules, classified);
|
|
103
|
+
const cappedRules = ranked.slice(0, MAX_GENERATED_RULES);
|
|
104
|
+
const stats = {
|
|
105
|
+
totalEntries: entries.length,
|
|
106
|
+
classifiedEntries: classified.length,
|
|
107
|
+
generatedRules: cappedRules.length,
|
|
108
|
+
suppressedByManual,
|
|
109
|
+
suppressedByZeroEntries,
|
|
110
|
+
};
|
|
111
|
+
return {
|
|
112
|
+
rules: cappedRules,
|
|
113
|
+
gaps,
|
|
114
|
+
sentinel: null,
|
|
115
|
+
stats,
|
|
116
|
+
classified,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
// ── Ranking ───────────────────────────────────────────────────────────
|
|
120
|
+
/**
|
|
121
|
+
* Rank generated rules by the total number of relations across classified
|
|
122
|
+
* entries that contributed to each rule. Higher relation density → ranked first.
|
|
123
|
+
*
|
|
124
|
+
* Falls back to name-based sort for ties to ensure stable output.
|
|
125
|
+
*/
|
|
126
|
+
function rankByRelationDensity(rules, classified) {
|
|
127
|
+
// Build a density score per sourcePath (chain://<functionKey>)
|
|
128
|
+
const densityMap = new Map();
|
|
129
|
+
for (const rule of rules) {
|
|
130
|
+
// sourcePath is 'chain://<functionKey>'
|
|
131
|
+
const functionKey = rule.sourcePath.replace('chain://', '');
|
|
132
|
+
const matching = classified.filter((e) => e.governanceFunction === functionKey);
|
|
133
|
+
const density = matching.reduce((sum, e) => sum + e.relations.length, 0);
|
|
134
|
+
densityMap.set(rule.sourcePath, density);
|
|
135
|
+
}
|
|
136
|
+
return [...rules].sort((a, b) => {
|
|
137
|
+
const densityA = densityMap.get(a.sourcePath) ?? 0;
|
|
138
|
+
const densityB = densityMap.get(b.sourcePath) ?? 0;
|
|
139
|
+
if (densityB !== densityA)
|
|
140
|
+
return densityB - densityA;
|
|
141
|
+
return a.name.localeCompare(b.name);
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=chain-rules.js.map
|