convoke-agents 2.0.0
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/CHANGELOG.md +920 -0
- package/INSTALLATION.md +230 -0
- package/LICENSE +21 -0
- package/README.md +330 -0
- package/UPDATE-GUIDE.md +220 -0
- package/_bmad/bme/_vortex/README.md +150 -0
- package/_bmad/bme/_vortex/agents/contextualization-expert.md +100 -0
- package/_bmad/bme/_vortex/agents/discovery-empathy-expert.md +117 -0
- package/_bmad/bme/_vortex/agents/hypothesis-engineer.md +117 -0
- package/_bmad/bme/_vortex/agents/lean-experiments-specialist.md +118 -0
- package/_bmad/bme/_vortex/agents/learning-decision-expert.md +117 -0
- package/_bmad/bme/_vortex/agents/production-intelligence-specialist.md +117 -0
- package/_bmad/bme/_vortex/agents/research-convergence-specialist.md +117 -0
- package/_bmad/bme/_vortex/compass-routing-reference.md +312 -0
- package/_bmad/bme/_vortex/config.yaml +46 -0
- package/_bmad/bme/_vortex/contracts/hc1-empathy-artifacts.md +152 -0
- package/_bmad/bme/_vortex/contracts/hc2-problem-definition.md +125 -0
- package/_bmad/bme/_vortex/contracts/hc3-hypothesis-contract.md +112 -0
- package/_bmad/bme/_vortex/contracts/hc4-experiment-context.md +140 -0
- package/_bmad/bme/_vortex/contracts/hc5-signal-report.md +130 -0
- package/_bmad/bme/_vortex/examples/hc2-example-problem-definition.md +85 -0
- package/_bmad/bme/_vortex/examples/hc3-example-hypothesis-contract.md +103 -0
- package/_bmad/bme/_vortex/examples/hc5-example-signal-report.md +76 -0
- package/_bmad/bme/_vortex/guides/EMMA-USER-GUIDE.md +232 -0
- package/_bmad/bme/_vortex/guides/ISLA-USER-GUIDE.md +208 -0
- package/_bmad/bme/_vortex/guides/LIAM-USER-GUIDE.md +255 -0
- package/_bmad/bme/_vortex/guides/MAX-USER-GUIDE.md +213 -0
- package/_bmad/bme/_vortex/guides/MILA-USER-GUIDE.md +235 -0
- package/_bmad/bme/_vortex/guides/NOAH-USER-GUIDE.md +258 -0
- package/_bmad/bme/_vortex/guides/WADE-USER-GUIDE.md +245 -0
- package/_bmad/bme/_vortex/workflows/_deprecated/empathy-map/empathy-map.template.md +143 -0
- package/_bmad/bme/_vortex/workflows/_deprecated/empathy-map/steps/step-01-define-user.md +60 -0
- package/_bmad/bme/_vortex/workflows/_deprecated/empathy-map/steps/step-02-says-thinks.md +67 -0
- package/_bmad/bme/_vortex/workflows/_deprecated/empathy-map/steps/step-03-does-feels.md +79 -0
- package/_bmad/bme/_vortex/workflows/_deprecated/empathy-map/steps/step-04-pain-points.md +87 -0
- package/_bmad/bme/_vortex/workflows/_deprecated/empathy-map/steps/step-05-gains.md +103 -0
- package/_bmad/bme/_vortex/workflows/_deprecated/empathy-map/steps/step-06-synthesize.md +104 -0
- package/_bmad/bme/_vortex/workflows/_deprecated/empathy-map/validate.md +117 -0
- package/_bmad/bme/_vortex/workflows/_deprecated/empathy-map/workflow.md +44 -0
- package/_bmad/bme/_vortex/workflows/_deprecated/wireframe/steps/step-01-define-requirements.md +85 -0
- package/_bmad/bme/_vortex/workflows/_deprecated/wireframe/steps/step-02-user-flows.md +59 -0
- package/_bmad/bme/_vortex/workflows/_deprecated/wireframe/steps/step-03-information-architecture.md +68 -0
- package/_bmad/bme/_vortex/workflows/_deprecated/wireframe/steps/step-04-wireframe-sketch.md +97 -0
- package/_bmad/bme/_vortex/workflows/_deprecated/wireframe/steps/step-05-components.md +128 -0
- package/_bmad/bme/_vortex/workflows/_deprecated/wireframe/steps/step-06-synthesize.md +83 -0
- package/_bmad/bme/_vortex/workflows/_deprecated/wireframe/wireframe.template.md +287 -0
- package/_bmad/bme/_vortex/workflows/_deprecated/wireframe/workflow.md +44 -0
- package/_bmad/bme/_vortex/workflows/assumption-mapping/steps/step-01-setup.md +66 -0
- package/_bmad/bme/_vortex/workflows/assumption-mapping/steps/step-02-context.md +93 -0
- package/_bmad/bme/_vortex/workflows/assumption-mapping/steps/step-03-risk-mapping.md +103 -0
- package/_bmad/bme/_vortex/workflows/assumption-mapping/steps/step-04-synthesize.md +101 -0
- package/_bmad/bme/_vortex/workflows/assumption-mapping/workflow.md +49 -0
- package/_bmad/bme/_vortex/workflows/behavior-analysis/steps/step-01-setup.md +81 -0
- package/_bmad/bme/_vortex/workflows/behavior-analysis/steps/step-02-context.md +67 -0
- package/_bmad/bme/_vortex/workflows/behavior-analysis/steps/step-03-classification.md +98 -0
- package/_bmad/bme/_vortex/workflows/behavior-analysis/steps/step-04-evidence.md +100 -0
- package/_bmad/bme/_vortex/workflows/behavior-analysis/steps/step-05-synthesize.md +174 -0
- package/_bmad/bme/_vortex/workflows/behavior-analysis/workflow.md +52 -0
- package/_bmad/bme/_vortex/workflows/contextualize-scope/contextualize-scope.template.md +67 -0
- package/_bmad/bme/_vortex/workflows/contextualize-scope/steps/step-01-list-opportunities.md +47 -0
- package/_bmad/bme/_vortex/workflows/contextualize-scope/steps/step-02-define-criteria.md +36 -0
- package/_bmad/bme/_vortex/workflows/contextualize-scope/steps/step-03-evaluate-opportunities.md +30 -0
- package/_bmad/bme/_vortex/workflows/contextualize-scope/steps/step-04-define-boundaries.md +32 -0
- package/_bmad/bme/_vortex/workflows/contextualize-scope/steps/step-05-validate-fit.md +28 -0
- package/_bmad/bme/_vortex/workflows/contextualize-scope/steps/step-06-synthesize.md +36 -0
- package/_bmad/bme/_vortex/workflows/contextualize-scope/validate.md +30 -0
- package/_bmad/bme/_vortex/workflows/contextualize-scope/workflow.md +59 -0
- package/_bmad/bme/_vortex/workflows/empathy-map/empathy-map.template.md +143 -0
- package/_bmad/bme/_vortex/workflows/empathy-map/steps/step-01-define-user.md +60 -0
- package/_bmad/bme/_vortex/workflows/empathy-map/steps/step-02-says-thinks.md +67 -0
- package/_bmad/bme/_vortex/workflows/empathy-map/steps/step-03-does-feels.md +79 -0
- package/_bmad/bme/_vortex/workflows/empathy-map/steps/step-04-pain-points.md +87 -0
- package/_bmad/bme/_vortex/workflows/empathy-map/steps/step-05-gains.md +103 -0
- package/_bmad/bme/_vortex/workflows/empathy-map/steps/step-06-synthesize.md +107 -0
- package/_bmad/bme/_vortex/workflows/empathy-map/validate.md +117 -0
- package/_bmad/bme/_vortex/workflows/empathy-map/workflow.md +45 -0
- package/_bmad/bme/_vortex/workflows/experiment-design/steps/step-01-setup.md +66 -0
- package/_bmad/bme/_vortex/workflows/experiment-design/steps/step-02-context.md +77 -0
- package/_bmad/bme/_vortex/workflows/experiment-design/steps/step-03-design.md +114 -0
- package/_bmad/bme/_vortex/workflows/experiment-design/steps/step-04-synthesize.md +128 -0
- package/_bmad/bme/_vortex/workflows/experiment-design/workflow.md +51 -0
- package/_bmad/bme/_vortex/workflows/hypothesis-engineering/steps/step-01-setup.md +66 -0
- package/_bmad/bme/_vortex/workflows/hypothesis-engineering/steps/step-02-context.md +80 -0
- package/_bmad/bme/_vortex/workflows/hypothesis-engineering/steps/step-03-brainwriting.md +79 -0
- package/_bmad/bme/_vortex/workflows/hypothesis-engineering/steps/step-04-assumption-mapping.md +102 -0
- package/_bmad/bme/_vortex/workflows/hypothesis-engineering/steps/step-05-synthesize.md +130 -0
- package/_bmad/bme/_vortex/workflows/hypothesis-engineering/workflow.md +52 -0
- package/_bmad/bme/_vortex/workflows/lean-experiment/lean-experiment.template.md +29 -0
- package/_bmad/bme/_vortex/workflows/lean-experiment/steps/step-01-hypothesis.md +58 -0
- package/_bmad/bme/_vortex/workflows/lean-experiment/steps/step-02-design.md +68 -0
- package/_bmad/bme/_vortex/workflows/lean-experiment/steps/step-03-metrics.md +73 -0
- package/_bmad/bme/_vortex/workflows/lean-experiment/steps/step-04-run.md +75 -0
- package/_bmad/bme/_vortex/workflows/lean-experiment/steps/step-05-analyze.md +84 -0
- package/_bmad/bme/_vortex/workflows/lean-experiment/steps/step-06-decide.md +111 -0
- package/_bmad/bme/_vortex/workflows/lean-experiment/validate.md +30 -0
- package/_bmad/bme/_vortex/workflows/lean-experiment/workflow.md +26 -0
- package/_bmad/bme/_vortex/workflows/lean-persona/lean-persona.template.md +163 -0
- package/_bmad/bme/_vortex/workflows/lean-persona/steps/step-01-define-job.md +72 -0
- package/_bmad/bme/_vortex/workflows/lean-persona/steps/step-02-current-solution.md +83 -0
- package/_bmad/bme/_vortex/workflows/lean-persona/steps/step-03-problem-contexts.md +90 -0
- package/_bmad/bme/_vortex/workflows/lean-persona/steps/step-04-forces-anxieties.md +98 -0
- package/_bmad/bme/_vortex/workflows/lean-persona/steps/step-05-success-criteria.md +103 -0
- package/_bmad/bme/_vortex/workflows/lean-persona/steps/step-06-synthesize.md +129 -0
- package/_bmad/bme/_vortex/workflows/lean-persona/validate.md +30 -0
- package/_bmad/bme/_vortex/workflows/lean-persona/workflow.md +50 -0
- package/_bmad/bme/_vortex/workflows/learning-card/learning-card.template.md +179 -0
- package/_bmad/bme/_vortex/workflows/learning-card/steps/step-01-experiment-context.md +100 -0
- package/_bmad/bme/_vortex/workflows/learning-card/steps/step-02-raw-results.md +125 -0
- package/_bmad/bme/_vortex/workflows/learning-card/steps/step-03-analysis.md +125 -0
- package/_bmad/bme/_vortex/workflows/learning-card/steps/step-04-validated-learning.md +139 -0
- package/_bmad/bme/_vortex/workflows/learning-card/steps/step-05-implications.md +134 -0
- package/_bmad/bme/_vortex/workflows/learning-card/steps/step-06-synthesize.md +121 -0
- package/_bmad/bme/_vortex/workflows/learning-card/validate.md +134 -0
- package/_bmad/bme/_vortex/workflows/learning-card/workflow.md +51 -0
- package/_bmad/bme/_vortex/workflows/mvp/mvp.template.md +40 -0
- package/_bmad/bme/_vortex/workflows/mvp/steps/step-01-riskiest-assumption.md +17 -0
- package/_bmad/bme/_vortex/workflows/mvp/steps/step-02-success-criteria.md +13 -0
- package/_bmad/bme/_vortex/workflows/mvp/steps/step-03-smallest-test.md +13 -0
- package/_bmad/bme/_vortex/workflows/mvp/steps/step-04-scope-features.md +13 -0
- package/_bmad/bme/_vortex/workflows/mvp/steps/step-05-build-measure-learn.md +13 -0
- package/_bmad/bme/_vortex/workflows/mvp/steps/step-06-synthesize.md +28 -0
- package/_bmad/bme/_vortex/workflows/mvp/validate.md +30 -0
- package/_bmad/bme/_vortex/workflows/mvp/workflow.md +36 -0
- package/_bmad/bme/_vortex/workflows/pattern-mapping/steps/step-01-setup.md +102 -0
- package/_bmad/bme/_vortex/workflows/pattern-mapping/steps/step-02-context.md +81 -0
- package/_bmad/bme/_vortex/workflows/pattern-mapping/steps/step-03-pattern-identification.md +88 -0
- package/_bmad/bme/_vortex/workflows/pattern-mapping/steps/step-04-theme-clustering.md +100 -0
- package/_bmad/bme/_vortex/workflows/pattern-mapping/steps/step-05-synthesize.md +135 -0
- package/_bmad/bme/_vortex/workflows/pattern-mapping/workflow.md +58 -0
- package/_bmad/bme/_vortex/workflows/pivot-patch-persevere/pivot-patch-persevere.template.md +201 -0
- package/_bmad/bme/_vortex/workflows/pivot-patch-persevere/steps/step-01-evidence-review.md +125 -0
- package/_bmad/bme/_vortex/workflows/pivot-patch-persevere/steps/step-02-hypothesis-assessment.md +132 -0
- package/_bmad/bme/_vortex/workflows/pivot-patch-persevere/steps/step-03-option-analysis.md +167 -0
- package/_bmad/bme/_vortex/workflows/pivot-patch-persevere/steps/step-04-stakeholder-input.md +141 -0
- package/_bmad/bme/_vortex/workflows/pivot-patch-persevere/steps/step-05-decision.md +161 -0
- package/_bmad/bme/_vortex/workflows/pivot-patch-persevere/steps/step-06-action-plan.md +188 -0
- package/_bmad/bme/_vortex/workflows/pivot-patch-persevere/validate.md +159 -0
- package/_bmad/bme/_vortex/workflows/pivot-patch-persevere/workflow.md +51 -0
- package/_bmad/bme/_vortex/workflows/pivot-resynthesis/steps/step-01-setup.md +97 -0
- package/_bmad/bme/_vortex/workflows/pivot-resynthesis/steps/step-02-context.md +86 -0
- package/_bmad/bme/_vortex/workflows/pivot-resynthesis/steps/step-03-jtbd-reframing.md +88 -0
- package/_bmad/bme/_vortex/workflows/pivot-resynthesis/steps/step-04-pains-gains-revision.md +76 -0
- package/_bmad/bme/_vortex/workflows/pivot-resynthesis/steps/step-05-synthesize.md +158 -0
- package/_bmad/bme/_vortex/workflows/pivot-resynthesis/workflow.md +52 -0
- package/_bmad/bme/_vortex/workflows/product-vision/product-vision.template.md +147 -0
- package/_bmad/bme/_vortex/workflows/product-vision/steps/step-01-define-problem.md +89 -0
- package/_bmad/bme/_vortex/workflows/product-vision/steps/step-02-target-market.md +91 -0
- package/_bmad/bme/_vortex/workflows/product-vision/steps/step-03-unique-approach.md +87 -0
- package/_bmad/bme/_vortex/workflows/product-vision/steps/step-04-future-state.md +100 -0
- package/_bmad/bme/_vortex/workflows/product-vision/steps/step-05-principles.md +92 -0
- package/_bmad/bme/_vortex/workflows/product-vision/steps/step-06-synthesize.md +170 -0
- package/_bmad/bme/_vortex/workflows/product-vision/validate.md +30 -0
- package/_bmad/bme/_vortex/workflows/product-vision/workflow.md +55 -0
- package/_bmad/bme/_vortex/workflows/production-monitoring/steps/step-01-setup.md +84 -0
- package/_bmad/bme/_vortex/workflows/production-monitoring/steps/step-02-context.md +66 -0
- package/_bmad/bme/_vortex/workflows/production-monitoring/steps/step-03-monitoring.md +74 -0
- package/_bmad/bme/_vortex/workflows/production-monitoring/steps/step-04-prioritization.md +97 -0
- package/_bmad/bme/_vortex/workflows/production-monitoring/steps/step-05-synthesize.md +183 -0
- package/_bmad/bme/_vortex/workflows/production-monitoring/workflow.md +52 -0
- package/_bmad/bme/_vortex/workflows/proof-of-concept/proof-of-concept.template.md +25 -0
- package/_bmad/bme/_vortex/workflows/proof-of-concept/steps/step-01-risk.md +79 -0
- package/_bmad/bme/_vortex/workflows/proof-of-concept/steps/step-02-scope.md +105 -0
- package/_bmad/bme/_vortex/workflows/proof-of-concept/steps/step-03-build.md +92 -0
- package/_bmad/bme/_vortex/workflows/proof-of-concept/steps/step-04-test.md +103 -0
- package/_bmad/bme/_vortex/workflows/proof-of-concept/steps/step-05-evaluate.md +114 -0
- package/_bmad/bme/_vortex/workflows/proof-of-concept/steps/step-06-document.md +125 -0
- package/_bmad/bme/_vortex/workflows/proof-of-concept/validate.md +30 -0
- package/_bmad/bme/_vortex/workflows/proof-of-concept/workflow.md +26 -0
- package/_bmad/bme/_vortex/workflows/proof-of-value/proof-of-value.template.md +29 -0
- package/_bmad/bme/_vortex/workflows/proof-of-value/steps/step-01-value-hypothesis.md +75 -0
- package/_bmad/bme/_vortex/workflows/proof-of-value/steps/step-02-validation-design.md +94 -0
- package/_bmad/bme/_vortex/workflows/proof-of-value/steps/step-03-willingness.md +96 -0
- package/_bmad/bme/_vortex/workflows/proof-of-value/steps/step-04-test.md +107 -0
- package/_bmad/bme/_vortex/workflows/proof-of-value/steps/step-05-analyze.md +116 -0
- package/_bmad/bme/_vortex/workflows/proof-of-value/steps/step-06-document.md +147 -0
- package/_bmad/bme/_vortex/workflows/proof-of-value/validate.md +30 -0
- package/_bmad/bme/_vortex/workflows/proof-of-value/workflow.md +26 -0
- package/_bmad/bme/_vortex/workflows/research-convergence/steps/step-01-setup.md +69 -0
- package/_bmad/bme/_vortex/workflows/research-convergence/steps/step-02-context.md +70 -0
- package/_bmad/bme/_vortex/workflows/research-convergence/steps/step-03-jtbd-framing.md +81 -0
- package/_bmad/bme/_vortex/workflows/research-convergence/steps/step-04-pains-gains.md +77 -0
- package/_bmad/bme/_vortex/workflows/research-convergence/steps/step-05-synthesize.md +147 -0
- package/_bmad/bme/_vortex/workflows/research-convergence/workflow.md +50 -0
- package/_bmad/bme/_vortex/workflows/signal-interpretation/steps/step-01-setup.md +68 -0
- package/_bmad/bme/_vortex/workflows/signal-interpretation/steps/step-02-context.md +67 -0
- package/_bmad/bme/_vortex/workflows/signal-interpretation/steps/step-03-signal-analysis.md +85 -0
- package/_bmad/bme/_vortex/workflows/signal-interpretation/steps/step-04-anomaly-detection.md +93 -0
- package/_bmad/bme/_vortex/workflows/signal-interpretation/steps/step-05-synthesize.md +163 -0
- package/_bmad/bme/_vortex/workflows/signal-interpretation/workflow.md +52 -0
- package/_bmad/bme/_vortex/workflows/user-discovery/steps/step-01-discovery-scope.md +77 -0
- package/_bmad/bme/_vortex/workflows/user-discovery/steps/step-02-research-methods.md +152 -0
- package/_bmad/bme/_vortex/workflows/user-discovery/steps/step-03-research-plan.md +159 -0
- package/_bmad/bme/_vortex/workflows/user-discovery/steps/step-04-execute.md +169 -0
- package/_bmad/bme/_vortex/workflows/user-discovery/steps/step-05-organize-data.md +149 -0
- package/_bmad/bme/_vortex/workflows/user-discovery/steps/step-06-synthesize.md +159 -0
- package/_bmad/bme/_vortex/workflows/user-discovery/user-discovery.template.md +231 -0
- package/_bmad/bme/_vortex/workflows/user-discovery/validate.md +153 -0
- package/_bmad/bme/_vortex/workflows/user-discovery/workflow.md +45 -0
- package/_bmad/bme/_vortex/workflows/user-interview/steps/step-01-research-goals.md +100 -0
- package/_bmad/bme/_vortex/workflows/user-interview/steps/step-02-interview-script.md +123 -0
- package/_bmad/bme/_vortex/workflows/user-interview/steps/step-03-recruitment.md +144 -0
- package/_bmad/bme/_vortex/workflows/user-interview/steps/step-04-conduct.md +154 -0
- package/_bmad/bme/_vortex/workflows/user-interview/steps/step-05-findings.md +163 -0
- package/_bmad/bme/_vortex/workflows/user-interview/steps/step-06-synthesize.md +171 -0
- package/_bmad/bme/_vortex/workflows/user-interview/user-interview.template.md +250 -0
- package/_bmad/bme/_vortex/workflows/user-interview/validate.md +142 -0
- package/_bmad/bme/_vortex/workflows/user-interview/workflow.md +51 -0
- package/_bmad/bme/_vortex/workflows/vortex-navigation/steps/step-01-current-state.md +56 -0
- package/_bmad/bme/_vortex/workflows/vortex-navigation/steps/step-02-evidence-inventory.md +70 -0
- package/_bmad/bme/_vortex/workflows/vortex-navigation/steps/step-03-gap-analysis.md +76 -0
- package/_bmad/bme/_vortex/workflows/vortex-navigation/steps/step-04-stream-evaluation.md +57 -0
- package/_bmad/bme/_vortex/workflows/vortex-navigation/steps/step-05-recommendation.md +65 -0
- package/_bmad/bme/_vortex/workflows/vortex-navigation/steps/step-06-navigation-plan.md +72 -0
- package/_bmad/bme/_vortex/workflows/vortex-navigation/validate.md +75 -0
- package/_bmad/bme/_vortex/workflows/vortex-navigation/vortex-navigation.template.md +105 -0
- package/_bmad/bme/_vortex/workflows/vortex-navigation/workflow.md +54 -0
- package/index.js +56 -0
- package/package.json +77 -0
- package/scripts/README.md +226 -0
- package/scripts/convoke-doctor.js +322 -0
- package/scripts/docs-audit.js +584 -0
- package/scripts/install-all-agents.js +9 -0
- package/scripts/install-vortex-agents.js +208 -0
- package/scripts/postinstall.js +104 -0
- package/scripts/update/convoke-migrate.js +169 -0
- package/scripts/update/convoke-update.js +272 -0
- package/scripts/update/convoke-version.js +134 -0
- package/scripts/update/lib/agent-registry.js +144 -0
- package/scripts/update/lib/backup-manager.js +243 -0
- package/scripts/update/lib/config-merger.js +242 -0
- package/scripts/update/lib/migration-runner.js +367 -0
- package/scripts/update/lib/refresh-installation.js +171 -0
- package/scripts/update/lib/utils.js +96 -0
- package/scripts/update/lib/validator.js +360 -0
- package/scripts/update/lib/version-detector.js +241 -0
- package/scripts/update/migrations/1.0.x-to-1.3.0.js +128 -0
- package/scripts/update/migrations/1.1.x-to-1.3.0.js +29 -0
- package/scripts/update/migrations/1.2.x-to-1.3.0.js +29 -0
- package/scripts/update/migrations/1.3.x-to-1.5.0.js +29 -0
- package/scripts/update/migrations/1.4.x-to-1.5.0.js +29 -0
- package/scripts/update/migrations/1.5.x-to-1.6.0.js +95 -0
- package/scripts/update/migrations/1.6.x-to-1.7.0.js +29 -0
- package/scripts/update/migrations/1.7.x-to-2.0.0.js +31 -0
- package/scripts/update/migrations/registry.js +194 -0
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const readline = require('readline');
|
|
4
|
+
const chalk = require('chalk');
|
|
5
|
+
const versionDetector = require('./lib/version-detector');
|
|
6
|
+
const migrationRunner = require('./lib/migration-runner');
|
|
7
|
+
const registry = require('./migrations/registry');
|
|
8
|
+
const { findProjectRoot } = require('./lib/utils');
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Convoke Update CLI
|
|
12
|
+
* Main update command for users
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Assess the current installation and determine what update action is needed.
|
|
17
|
+
* Pure logic — no I/O, no process.exit. Returns a structured decision object.
|
|
18
|
+
*
|
|
19
|
+
* @param {string|null} projectRoot - Project root path (null if not found)
|
|
20
|
+
* @returns {object} Assessment result with action, versions, migrations, breakingChanges
|
|
21
|
+
*/
|
|
22
|
+
function assessUpdate(projectRoot) {
|
|
23
|
+
if (!projectRoot) {
|
|
24
|
+
return { action: 'no-project' };
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const currentVersion = versionDetector.getCurrentVersion(projectRoot);
|
|
28
|
+
const targetVersion = versionDetector.getTargetVersion();
|
|
29
|
+
const scenario = versionDetector.detectInstallationScenario(projectRoot);
|
|
30
|
+
|
|
31
|
+
if (scenario === 'fresh') {
|
|
32
|
+
return { action: 'fresh', scenario };
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
if (scenario === 'partial' || scenario === 'corrupted') {
|
|
36
|
+
return { action: 'broken', scenario };
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (!currentVersion) {
|
|
40
|
+
return { action: 'no-version', scenario };
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const migrationPath = versionDetector.getMigrationPath(currentVersion, targetVersion);
|
|
44
|
+
|
|
45
|
+
if (migrationPath.type === 'up-to-date') {
|
|
46
|
+
return { action: 'up-to-date', currentVersion, targetVersion };
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (migrationPath.type === 'downgrade') {
|
|
50
|
+
return { action: 'downgrade', currentVersion, targetVersion };
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const migrations = registry.getMigrationsFor(currentVersion);
|
|
54
|
+
const breakingChanges = registry.getBreakingChanges(currentVersion);
|
|
55
|
+
|
|
56
|
+
if (migrations.length === 0) {
|
|
57
|
+
return { action: 'no-migrations', currentVersion, targetVersion };
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return {
|
|
61
|
+
action: 'upgrade',
|
|
62
|
+
currentVersion,
|
|
63
|
+
targetVersion,
|
|
64
|
+
migrations,
|
|
65
|
+
breakingChanges
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
async function main() {
|
|
70
|
+
const args = process.argv.slice(2);
|
|
71
|
+
const dryRun = args.includes('--dry-run');
|
|
72
|
+
const yes = args.includes('--yes') || args.includes('-y');
|
|
73
|
+
const verbose = args.includes('--verbose') || args.includes('-v');
|
|
74
|
+
|
|
75
|
+
// Header
|
|
76
|
+
console.log('');
|
|
77
|
+
console.log(chalk.bold.magenta('╔════════════════════════════════════════╗'));
|
|
78
|
+
console.log(chalk.bold.magenta('║ Convoke Update Manager ║'));
|
|
79
|
+
console.log(chalk.bold.magenta('╚════════════════════════════════════════╝'));
|
|
80
|
+
console.log('');
|
|
81
|
+
|
|
82
|
+
const projectRoot = findProjectRoot();
|
|
83
|
+
const assessment = assessUpdate(projectRoot);
|
|
84
|
+
|
|
85
|
+
switch (assessment.action) {
|
|
86
|
+
case 'no-project':
|
|
87
|
+
console.log(chalk.red('Not in a Convoke project. Could not find _bmad/ directory.'));
|
|
88
|
+
console.log('');
|
|
89
|
+
console.log('Run: ' + chalk.cyan('npx convoke-install'));
|
|
90
|
+
console.log('');
|
|
91
|
+
process.exit(1);
|
|
92
|
+
break;
|
|
93
|
+
|
|
94
|
+
case 'fresh':
|
|
95
|
+
console.log(chalk.yellow('No previous installation detected.'));
|
|
96
|
+
console.log('');
|
|
97
|
+
console.log('Run: ' + chalk.cyan('npx convoke-install'));
|
|
98
|
+
console.log('');
|
|
99
|
+
process.exit(0);
|
|
100
|
+
break;
|
|
101
|
+
|
|
102
|
+
case 'broken':
|
|
103
|
+
console.log(chalk.red('Installation appears incomplete or corrupted.'));
|
|
104
|
+
console.log('');
|
|
105
|
+
console.log('Recommend running: ' + chalk.cyan('npx convoke-install'));
|
|
106
|
+
console.log('');
|
|
107
|
+
process.exit(1);
|
|
108
|
+
break;
|
|
109
|
+
|
|
110
|
+
case 'no-version':
|
|
111
|
+
console.log(chalk.yellow('Could not detect current version.'));
|
|
112
|
+
console.log('');
|
|
113
|
+
console.log('Run: ' + chalk.cyan('npx convoke-install'));
|
|
114
|
+
console.log('');
|
|
115
|
+
process.exit(0);
|
|
116
|
+
break;
|
|
117
|
+
|
|
118
|
+
case 'up-to-date':
|
|
119
|
+
console.log(chalk.green(`✓ Already up to date! (v${assessment.currentVersion})`));
|
|
120
|
+
console.log('');
|
|
121
|
+
console.log(chalk.gray('If you expected a newer version, npx may be serving a cached copy.'));
|
|
122
|
+
console.log(chalk.gray('Run: ') + chalk.cyan('npx -p convoke-agents@latest convoke-update'));
|
|
123
|
+
console.log('');
|
|
124
|
+
process.exit(0);
|
|
125
|
+
break;
|
|
126
|
+
|
|
127
|
+
case 'downgrade':
|
|
128
|
+
console.log(chalk.red.bold('⚠ DOWNGRADE DETECTED'));
|
|
129
|
+
console.log('');
|
|
130
|
+
console.log(` Current version: ${assessment.currentVersion}`);
|
|
131
|
+
console.log(` Package version: ${assessment.targetVersion}`);
|
|
132
|
+
console.log('');
|
|
133
|
+
console.log(chalk.gray('This usually means npx is serving a cached older package.'));
|
|
134
|
+
console.log(chalk.gray('Run: ') + chalk.cyan('npx -p convoke-agents@latest convoke-update'));
|
|
135
|
+
console.log('');
|
|
136
|
+
console.log(chalk.gray('If the issue persists, clear the cache and reinstall:'));
|
|
137
|
+
console.log(chalk.cyan(' npm cache clean --force && npm install convoke-agents@latest'));
|
|
138
|
+
console.log('');
|
|
139
|
+
console.log(chalk.yellow('If you intentionally want to downgrade:'));
|
|
140
|
+
console.log(' 1. Backup your installation');
|
|
141
|
+
console.log(' 2. Uninstall current version');
|
|
142
|
+
console.log(' 3. Install desired version');
|
|
143
|
+
console.log('');
|
|
144
|
+
process.exit(1);
|
|
145
|
+
break;
|
|
146
|
+
|
|
147
|
+
case 'no-migrations':
|
|
148
|
+
console.log(chalk.yellow('No migrations needed (versions compatible)'));
|
|
149
|
+
console.log('');
|
|
150
|
+
process.exit(0);
|
|
151
|
+
break;
|
|
152
|
+
|
|
153
|
+
case 'upgrade':
|
|
154
|
+
break; // Continue below
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Show migration plan
|
|
158
|
+
console.log(chalk.cyan('Migration Plan:'));
|
|
159
|
+
console.log(` From: ${chalk.red(assessment.currentVersion)}`);
|
|
160
|
+
console.log(` To: ${chalk.green(assessment.targetVersion)}`);
|
|
161
|
+
console.log('');
|
|
162
|
+
|
|
163
|
+
console.log(chalk.cyan('Migrations to apply:'));
|
|
164
|
+
assessment.migrations.forEach((m, i) => {
|
|
165
|
+
const icon = m.breaking ? chalk.red('⚠') : chalk.green('✓');
|
|
166
|
+
console.log(` ${i + 1}. ${icon} ${m.description}`);
|
|
167
|
+
});
|
|
168
|
+
console.log('');
|
|
169
|
+
|
|
170
|
+
if (assessment.breakingChanges.length > 0) {
|
|
171
|
+
console.log(chalk.red.bold('⚠ BREAKING CHANGES:'));
|
|
172
|
+
assessment.breakingChanges.forEach(change => {
|
|
173
|
+
console.log(chalk.yellow(` - ${change}`));
|
|
174
|
+
});
|
|
175
|
+
console.log('');
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// Dry run - preview only
|
|
179
|
+
if (dryRun) {
|
|
180
|
+
console.log(chalk.yellow.bold('DRY RUN - Previewing changes'));
|
|
181
|
+
console.log('');
|
|
182
|
+
|
|
183
|
+
try {
|
|
184
|
+
await migrationRunner.runMigrations(assessment.currentVersion, { dryRun: true, verbose });
|
|
185
|
+
} catch (error) {
|
|
186
|
+
console.error(chalk.red('Error during preview:'), error.message);
|
|
187
|
+
process.exit(1);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
process.exit(0);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// Confirm with user (unless --yes)
|
|
194
|
+
if (!yes) {
|
|
195
|
+
console.log(chalk.cyan('Your data will be backed up automatically before migration.'));
|
|
196
|
+
console.log('');
|
|
197
|
+
|
|
198
|
+
const confirmed = await confirm('Proceed with migration?');
|
|
199
|
+
|
|
200
|
+
if (!confirmed) {
|
|
201
|
+
console.log('');
|
|
202
|
+
console.log(chalk.yellow('Migration cancelled.'));
|
|
203
|
+
console.log('');
|
|
204
|
+
process.exit(0);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// Run migrations
|
|
209
|
+
console.log('');
|
|
210
|
+
console.log(chalk.cyan.bold('Starting migration...'));
|
|
211
|
+
|
|
212
|
+
try {
|
|
213
|
+
const result = await migrationRunner.runMigrations(assessment.currentVersion, { verbose });
|
|
214
|
+
|
|
215
|
+
console.log('');
|
|
216
|
+
console.log(chalk.green.bold('✓ Migration completed successfully!'));
|
|
217
|
+
console.log('');
|
|
218
|
+
console.log(chalk.cyan('Changes applied:'));
|
|
219
|
+
result.results.forEach(r => {
|
|
220
|
+
console.log(chalk.green(` ✓ ${r.name}`));
|
|
221
|
+
if (verbose) {
|
|
222
|
+
r.changes.forEach(change => {
|
|
223
|
+
console.log(chalk.gray(` - ${change}`));
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
console.log('');
|
|
228
|
+
console.log(chalk.gray(`Backup location: ${result.backupMetadata.backup_dir}`));
|
|
229
|
+
console.log('');
|
|
230
|
+
|
|
231
|
+
} catch (_error) {
|
|
232
|
+
// Error already logged by migration-runner
|
|
233
|
+
process.exit(1);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Confirm action with user
|
|
239
|
+
* @param {string} message - Confirmation message
|
|
240
|
+
* @returns {Promise<boolean>} True if user confirms
|
|
241
|
+
*/
|
|
242
|
+
async function confirm(message) {
|
|
243
|
+
const rl = readline.createInterface({
|
|
244
|
+
input: process.stdin,
|
|
245
|
+
output: process.stdout
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
return new Promise(resolve => {
|
|
249
|
+
rl.question(chalk.yellow(`${message} [y/N]: `), answer => {
|
|
250
|
+
rl.close();
|
|
251
|
+
resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');
|
|
252
|
+
});
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// Export assessUpdate for testing
|
|
257
|
+
module.exports = { assessUpdate };
|
|
258
|
+
|
|
259
|
+
// Run main when executed directly
|
|
260
|
+
if (require.main === module) {
|
|
261
|
+
main().catch(error => {
|
|
262
|
+
console.error('');
|
|
263
|
+
console.error(chalk.red.bold('Unexpected error:'));
|
|
264
|
+
console.error(chalk.red(error.message));
|
|
265
|
+
console.error('');
|
|
266
|
+
if (error.stack) {
|
|
267
|
+
console.error(chalk.gray(error.stack));
|
|
268
|
+
console.error('');
|
|
269
|
+
}
|
|
270
|
+
process.exit(1);
|
|
271
|
+
});
|
|
272
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const fs = require('fs-extra');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const chalk = require('chalk');
|
|
6
|
+
const yaml = require('js-yaml');
|
|
7
|
+
const versionDetector = require('./lib/version-detector');
|
|
8
|
+
const { findProjectRoot, compareVersions } = require('./lib/utils');
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Convoke Version CLI
|
|
12
|
+
* Show version information and migration history
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
async function main() {
|
|
16
|
+
const projectRoot = findProjectRoot();
|
|
17
|
+
const targetVersion = versionDetector.getTargetVersion();
|
|
18
|
+
|
|
19
|
+
console.log('');
|
|
20
|
+
console.log(chalk.bold('Convoke Version Information'));
|
|
21
|
+
console.log('');
|
|
22
|
+
|
|
23
|
+
// Not in a Convoke project
|
|
24
|
+
if (!projectRoot) {
|
|
25
|
+
console.log(chalk.yellow('Status: Not in a Convoke project'));
|
|
26
|
+
console.log(`Package version: ${chalk.cyan(targetVersion)}`);
|
|
27
|
+
console.log('');
|
|
28
|
+
console.log('Run: ' + chalk.cyan('npx convoke-install'));
|
|
29
|
+
console.log('');
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const currentVersion = versionDetector.getCurrentVersion(projectRoot);
|
|
34
|
+
const scenario = versionDetector.detectInstallationScenario(projectRoot);
|
|
35
|
+
|
|
36
|
+
// Fresh install - not installed yet
|
|
37
|
+
if (scenario === 'fresh') {
|
|
38
|
+
console.log(chalk.yellow('Status: Not installed'));
|
|
39
|
+
console.log(`Package version: ${chalk.cyan(targetVersion)}`);
|
|
40
|
+
console.log('');
|
|
41
|
+
console.log('Run: ' + chalk.cyan('npx convoke-install'));
|
|
42
|
+
console.log('');
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Partial installation - config.yaml missing but some files exist
|
|
47
|
+
if (scenario === 'partial' || !currentVersion) {
|
|
48
|
+
console.log(chalk.red('Status: Partial installation (config.yaml missing)'));
|
|
49
|
+
console.log(`Package version: ${chalk.cyan(targetVersion)}`);
|
|
50
|
+
console.log('');
|
|
51
|
+
console.log(chalk.yellow('This indicates an installation error.'));
|
|
52
|
+
console.log('');
|
|
53
|
+
console.log('Try running: ' + chalk.cyan('npx convoke-install'));
|
|
54
|
+
console.log('');
|
|
55
|
+
console.log('If the problem persists, check the installation logs.');
|
|
56
|
+
console.log('');
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Corrupted installation
|
|
61
|
+
if (scenario === 'corrupted') {
|
|
62
|
+
console.log(chalk.red('Status: Corrupted installation (missing required files)'));
|
|
63
|
+
console.log(`Package version: ${chalk.cyan(targetVersion)}`);
|
|
64
|
+
console.log('');
|
|
65
|
+
console.log(chalk.yellow('Some required files are missing.'));
|
|
66
|
+
console.log('');
|
|
67
|
+
console.log('Run: ' + chalk.cyan('npx convoke-install') + ' to reinstall');
|
|
68
|
+
console.log('');
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Installed
|
|
73
|
+
console.log(`Installed version: ${chalk.cyan(currentVersion)}`);
|
|
74
|
+
console.log(`Package version: ${chalk.cyan(targetVersion)}`);
|
|
75
|
+
console.log('');
|
|
76
|
+
|
|
77
|
+
// Status
|
|
78
|
+
if (currentVersion === targetVersion) {
|
|
79
|
+
console.log(chalk.green('Status: ✓ Up to date'));
|
|
80
|
+
} else if (compareVersions(currentVersion, targetVersion) < 0) {
|
|
81
|
+
console.log(chalk.yellow('Status: ⚠ Update available'));
|
|
82
|
+
console.log('');
|
|
83
|
+
console.log('Run: ' + chalk.cyan('npx -p convoke-agents@latest convoke-update --dry-run') + ' (to preview)');
|
|
84
|
+
console.log(' ' + chalk.cyan('npx -p convoke-agents@latest convoke-update') + ' (to apply)');
|
|
85
|
+
} else {
|
|
86
|
+
console.log(chalk.yellow(`Status: Package version (${targetVersion}) is older than installed (${currentVersion})`));
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Show migration history
|
|
90
|
+
const migrationHistory = await getMigrationHistory(projectRoot);
|
|
91
|
+
if (migrationHistory && migrationHistory.length > 0) {
|
|
92
|
+
console.log('');
|
|
93
|
+
console.log(chalk.cyan('Migration History:'));
|
|
94
|
+
migrationHistory.forEach((entry, index) => {
|
|
95
|
+
const timestamp = new Date(entry.timestamp).toLocaleDateString();
|
|
96
|
+
console.log(chalk.gray(` ${index + 1}. ${entry.from_version} → ${entry.to_version} (${timestamp})`));
|
|
97
|
+
if (entry.migrations_applied && entry.migrations_applied.length > 0) {
|
|
98
|
+
entry.migrations_applied.forEach(m => {
|
|
99
|
+
console.log(chalk.gray(` - ${m}`));
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
console.log('');
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Get migration history from config.yaml
|
|
110
|
+
* @param {string} projectRoot - Project root
|
|
111
|
+
* @returns {Promise<Array|null>} Migration history or null
|
|
112
|
+
*/
|
|
113
|
+
async function getMigrationHistory(projectRoot) {
|
|
114
|
+
const configPath = path.join(projectRoot, '_bmad/bme/_vortex/config.yaml');
|
|
115
|
+
|
|
116
|
+
if (!fs.existsSync(configPath)) {
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
try {
|
|
121
|
+
const configContent = await fs.readFile(configPath, 'utf8');
|
|
122
|
+
const config = yaml.load(configContent);
|
|
123
|
+
|
|
124
|
+
return config.migration_history || null;
|
|
125
|
+
} catch (_error) {
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Run main
|
|
131
|
+
main().catch(error => {
|
|
132
|
+
console.error('Error:', error.message);
|
|
133
|
+
process.exit(1);
|
|
134
|
+
});
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical agent and workflow registry.
|
|
3
|
+
*
|
|
4
|
+
* Single source of truth consumed by refresh-installation, validator,
|
|
5
|
+
* convoke-doctor, installer, index.js, and migration-runner.
|
|
6
|
+
*
|
|
7
|
+
* To add a new agent: push one entry to AGENTS + its workflows to WORKFLOWS.
|
|
8
|
+
* Every consumer picks up the change automatically.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
'use strict';
|
|
12
|
+
|
|
13
|
+
const AGENTS = [
|
|
14
|
+
// Stream 1 — Contextualize
|
|
15
|
+
{
|
|
16
|
+
id: 'contextualization-expert', name: 'Emma', icon: '\u{1F3AF}',
|
|
17
|
+
title: 'Contextualization Expert', stream: 'Contextualize',
|
|
18
|
+
persona: {
|
|
19
|
+
role: 'Strategic Framing + Problem-Product Space Navigator',
|
|
20
|
+
identity: 'Expert in helping teams contextualize their product strategy by defining clear problem spaces and validating assumptions. Specializes in Lean Startup methodologies, persona creation, and product vision framing. Guides teams through the critical \'Contextualize\' stream of the Vortex pattern.',
|
|
21
|
+
communication_style: 'Strategic yet approachable - speaks in frameworks and validated learning. Like a product strategist who asks \'What are we really solving?\' and \'Who is this truly for?\' Uses Lean Startup language (hypotheses, assumptions, pivots) and focuses on clarity before action.',
|
|
22
|
+
expertise: '- Master of Lean Startup and strategic framing methodologies - Personas over demographics - focus on jobs-to-be-done and problem contexts - Vision before features - align team around the \'why\' before the \'what\' - Challenge assumptions - every belief is a hypothesis until validated - Problem-solution fit comes before product-market fit',
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
// Stream 2 — Empathize
|
|
26
|
+
{
|
|
27
|
+
id: 'discovery-empathy-expert', name: 'Isla', icon: '\u{1F50D}',
|
|
28
|
+
title: 'Discovery & Empathy Expert', stream: 'Empathize',
|
|
29
|
+
persona: {
|
|
30
|
+
role: 'Qualitative Research Expert + Empathy Mapping Specialist',
|
|
31
|
+
identity: 'Expert in helping teams deeply understand their users through structured discovery and empathy work. Specializes in qualitative research methods, user interviews, ethnographic observation, and empathy mapping. Guides teams through the \'Empathize\' stream of the Vortex pattern.',
|
|
32
|
+
communication_style: 'Warm and probing - asks follow-up questions others wouldn\'t think of. Speaks in user stories and observations. Celebrates messy, raw findings over polished assumptions. Says things like \'I noticed that...\' and \'What if we asked them WHY they do that?\'',
|
|
33
|
+
expertise: '- Listen before you define - Observe before you assume - Feelings are data - Talk to real people, not personas - Empathy is a practice, not a phase - The messier the research, the richer the insights',
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
// Stream 3 — Synthesize
|
|
37
|
+
{
|
|
38
|
+
id: 'research-convergence-specialist', name: 'Mila', icon: '\u{1F52C}',
|
|
39
|
+
title: 'Research Convergence Specialist', stream: 'Synthesize',
|
|
40
|
+
persona: {
|
|
41
|
+
role: 'Research Convergence + Problem Definition Specialist',
|
|
42
|
+
identity: 'Expert in converging divergent research streams into actionable problem definitions. Specializes in Jobs-to-be-Done framing, Pains & Gains analysis, and cross-source pattern synthesis. Guides teams through the \'Synthesize\' stream — transforming raw empathy data and contextual insights into clear, prioritized problem statements.',
|
|
43
|
+
communication_style: 'Warm but analytically precise — connects dots others miss while keeping teams grounded in evidence. Says things like \'Here\'s what the research is telling us...\' and \'Three patterns converge on this insight.\' Balances empathy with rigor, always linking findings back to user language.',
|
|
44
|
+
expertise: '- Convergence over collection - synthesize before you define - Jobs-to-be-Done framing turns observations into actionable problem statements - Pains & Gains analysis reveals what users value vs. what they tolerate - Cross-source triangulation - one data point is an anecdote, three are a pattern - Problem definition is the highest-leverage activity in product discovery',
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
// Stream 4 — Hypothesize
|
|
48
|
+
{
|
|
49
|
+
id: 'hypothesis-engineer', name: 'Liam', icon: '\u{1F4A1}',
|
|
50
|
+
title: 'Hypothesis Engineer', stream: 'Hypothesize',
|
|
51
|
+
persona: {
|
|
52
|
+
role: 'Creative Ideation + Hypothesis Engineering Specialist',
|
|
53
|
+
identity: 'Creative peer who ideates alongside the user rather than facilitating from a distance. Specializes in structured brainwriting, 4-field hypothesis contracts, and assumption mapping. Guides teams through the \'Hypothesize\' stream — turning validated problem definitions into testable solution hypotheses.',
|
|
54
|
+
communication_style: 'Energetic and challenging — pushes teams past obvious ideas with provocative \'What if?\' questions. Says things like \'That\'s a safe bet — what\'s the bold version?\' and \'Let\'s stress-test that assumption before we build anything.\' Treats ideation as craft, not chaos.',
|
|
55
|
+
expertise: '- Structured brainwriting produces better ideas than unstructured brainstorming - 4-field hypothesis contracts force clarity: belief, evidence needed, experiment, success criteria - Assumption mapping separates what we know from what we think we know - The riskiest assumption gets tested first, not the easiest one - Good hypotheses are falsifiable — if you can\'t prove it wrong, it\'s not a hypothesis',
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
// Stream 5 — Externalize
|
|
59
|
+
{
|
|
60
|
+
id: 'lean-experiments-specialist', name: 'Wade', icon: '\u{1F9EA}',
|
|
61
|
+
title: 'Lean Experiments Specialist', stream: 'Externalize',
|
|
62
|
+
persona: {
|
|
63
|
+
role: 'Lean Startup + Validated Learning Expert',
|
|
64
|
+
identity: 'Lean Startup practitioner specialized in running rapid experiments to validate product hypotheses. Helps teams move from assumptions to evidence through Build-Measure-Learn cycles. Guides teams through the \'Externalize\' stream - taking ideas into the real world to test with actual users.',
|
|
65
|
+
communication_style: 'Experimental and evidence-driven - speaks in hypotheses, metrics, and learning. Like a scientist who says \'Let\'s test that assumption\' and \'What would prove us wrong?\' Uses Lean language (MVPs, pivots, validated learning) and focuses on speed-to-insight over perfection.',
|
|
66
|
+
expertise: '- Master of Lean Startup and rapid experimentation - Build the smallest thing that tests the riskiest assumption - Measure what matters - focus on actionable metrics, not vanity metrics - Learn fast, pivot faster - every experiment teaches something - Proof-of-concept before proof-of-value - validate feasibility before business case - Fail fast is good, learn fast is better',
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
// Stream 6 — Sensitize
|
|
70
|
+
{
|
|
71
|
+
id: 'production-intelligence-specialist', name: 'Noah', icon: '\u{1F4E1}',
|
|
72
|
+
title: 'Production Intelligence Specialist', stream: 'Sensitize',
|
|
73
|
+
persona: {
|
|
74
|
+
role: 'Signal Interpretation + Production Intelligence Analyst',
|
|
75
|
+
identity: 'Intelligence analyst who interprets production signals through contextual lenses. Specializes in signal-context-trend analysis, behavioral pattern detection, and feedback loop interpretation. Guides teams through the \'Sensitize\' stream — reading what real-world usage reveals about product-market fit. Explicitly does NOT make strategic recommendations — that is Max\'s domain.',
|
|
76
|
+
communication_style: 'Calm and observational — reports what the data shows without jumping to conclusions. Says things like \'The signal indicates...\' and \'Here\'s what we\'re seeing in context.\' Presents findings in signal + context + trend format, leaving strategic interpretation to the decision-maker.',
|
|
77
|
+
expertise: '- Signal + context + trend — raw metrics mean nothing without interpretation frames - Behavioral patterns reveal intent that surveys miss - Production data is the most honest user feedback — it can\'t lie - Anomaly detection surfaces what dashboards hide - Observe and report, don\'t prescribe — strategic decisions belong downstream',
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
// Stream 7 — Systematize
|
|
81
|
+
{
|
|
82
|
+
id: 'learning-decision-expert', name: 'Max', icon: '\u{1F9ED}',
|
|
83
|
+
title: 'Learning & Decision Expert', stream: 'Systematize',
|
|
84
|
+
persona: {
|
|
85
|
+
role: 'Validated Learning Synthesizer + Strategic Decision Expert',
|
|
86
|
+
identity: 'Expert in synthesizing experiment results, capturing validated learnings, and guiding strategic pivot/patch/persevere decisions. Guides teams through the \'Systematize\' stream - turning data into decisions and learning into action.',
|
|
87
|
+
communication_style: 'Calm and decisive - cuts through noise to surface what the data actually says. Says things like \'The evidence suggests...\' and \'Based on what we\'ve learned, here are our three options.\' Focuses on evidence over opinion.',
|
|
88
|
+
expertise: '- Data tells a story - learn to read it - Every experiment has a lesson, even failed ones - Decide and move - analysis paralysis kills innovation - Pivot is not failure, it is intelligence - Systematize what you learn so the next team doesn\'t start from zero',
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
];
|
|
92
|
+
|
|
93
|
+
const WORKFLOWS = [
|
|
94
|
+
// Emma — Contextualize (Stream 1)
|
|
95
|
+
{ name: 'lean-persona', agent: 'contextualization-expert' },
|
|
96
|
+
{ name: 'product-vision', agent: 'contextualization-expert' },
|
|
97
|
+
{ name: 'contextualize-scope', agent: 'contextualization-expert' },
|
|
98
|
+
// Isla — Empathize (Stream 2)
|
|
99
|
+
{ name: 'empathy-map', agent: 'discovery-empathy-expert' },
|
|
100
|
+
{ name: 'user-interview', agent: 'discovery-empathy-expert' },
|
|
101
|
+
{ name: 'user-discovery', agent: 'discovery-empathy-expert' },
|
|
102
|
+
// Mila — Synthesize (Stream 3)
|
|
103
|
+
{ name: 'research-convergence', agent: 'research-convergence-specialist' },
|
|
104
|
+
{ name: 'pivot-resynthesis', agent: 'research-convergence-specialist' },
|
|
105
|
+
{ name: 'pattern-mapping', agent: 'research-convergence-specialist' },
|
|
106
|
+
// Liam — Hypothesize (Stream 4)
|
|
107
|
+
{ name: 'hypothesis-engineering', agent: 'hypothesis-engineer' },
|
|
108
|
+
{ name: 'assumption-mapping', agent: 'hypothesis-engineer' },
|
|
109
|
+
{ name: 'experiment-design', agent: 'hypothesis-engineer' },
|
|
110
|
+
// Wade — Externalize (Stream 5)
|
|
111
|
+
{ name: 'mvp', agent: 'lean-experiments-specialist' },
|
|
112
|
+
{ name: 'lean-experiment', agent: 'lean-experiments-specialist' },
|
|
113
|
+
{ name: 'proof-of-concept', agent: 'lean-experiments-specialist' },
|
|
114
|
+
{ name: 'proof-of-value', agent: 'lean-experiments-specialist' },
|
|
115
|
+
// Noah — Sensitize (Stream 6)
|
|
116
|
+
{ name: 'signal-interpretation', agent: 'production-intelligence-specialist' },
|
|
117
|
+
{ name: 'behavior-analysis', agent: 'production-intelligence-specialist' },
|
|
118
|
+
{ name: 'production-monitoring', agent: 'production-intelligence-specialist' },
|
|
119
|
+
// Max — Systematize (Stream 7)
|
|
120
|
+
{ name: 'learning-card', agent: 'learning-decision-expert' },
|
|
121
|
+
{ name: 'pivot-patch-persevere', agent: 'learning-decision-expert' },
|
|
122
|
+
{ name: 'vortex-navigation', agent: 'learning-decision-expert' },
|
|
123
|
+
];
|
|
124
|
+
|
|
125
|
+
// Derived lists — computed from the canonical arrays above
|
|
126
|
+
const AGENT_FILES = AGENTS.map(a => `${a.id}.md`);
|
|
127
|
+
const AGENT_IDS = AGENTS.map(a => a.id);
|
|
128
|
+
const WORKFLOW_NAMES = WORKFLOWS.map(w => w.name);
|
|
129
|
+
const USER_GUIDES = AGENTS.map(a => `${a.name.toUpperCase()}-USER-GUIDE.md`);
|
|
130
|
+
|
|
131
|
+
// Wave 3 streams use standardized step filenames (P20)
|
|
132
|
+
const WAVE3_STREAMS = new Set(['Synthesize', 'Hypothesize', 'Sensitize']);
|
|
133
|
+
const _wave3AgentIds = new Set(AGENTS.filter(a => WAVE3_STREAMS.has(a.stream)).map(a => a.id));
|
|
134
|
+
const WAVE3_WORKFLOW_NAMES = new Set(WORKFLOWS.filter(w => _wave3AgentIds.has(w.agent)).map(w => w.name));
|
|
135
|
+
|
|
136
|
+
module.exports = {
|
|
137
|
+
AGENTS,
|
|
138
|
+
WORKFLOWS,
|
|
139
|
+
AGENT_FILES,
|
|
140
|
+
AGENT_IDS,
|
|
141
|
+
WORKFLOW_NAMES,
|
|
142
|
+
USER_GUIDES,
|
|
143
|
+
WAVE3_WORKFLOW_NAMES,
|
|
144
|
+
};
|