@planu/cli 1.1.1 → 1.2.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/dist/config/license-plans.json +110 -9
- package/dist/config/spec-cookbook.json +341 -0
- package/dist/engine/asana-sync.d.ts +12 -0
- package/dist/engine/asana-sync.d.ts.map +1 -0
- package/dist/engine/asana-sync.js +72 -0
- package/dist/engine/asana-sync.js.map +1 -0
- package/dist/engine/code-impact-analyzer.d.ts +6 -0
- package/dist/engine/code-impact-analyzer.d.ts.map +1 -0
- package/dist/engine/code-impact-analyzer.js +152 -0
- package/dist/engine/code-impact-analyzer.js.map +1 -0
- package/dist/engine/compliance-reporter.d.ts +11 -0
- package/dist/engine/compliance-reporter.d.ts.map +1 -0
- package/dist/engine/compliance-reporter.js +245 -0
- package/dist/engine/compliance-reporter.js.map +1 -0
- package/dist/engine/context-manager.d.ts +7 -0
- package/dist/engine/context-manager.d.ts.map +1 -0
- package/dist/engine/context-manager.js +76 -0
- package/dist/engine/context-manager.js.map +1 -0
- package/dist/engine/cost-budget-manager.d.ts +10 -0
- package/dist/engine/cost-budget-manager.d.ts.map +1 -0
- package/dist/engine/cost-budget-manager.js +165 -0
- package/dist/engine/cost-budget-manager.js.map +1 -0
- package/dist/engine/dependency-impact-analyzer.d.ts +14 -0
- package/dist/engine/dependency-impact-analyzer.d.ts.map +1 -0
- package/dist/engine/dependency-impact-analyzer.js +133 -0
- package/dist/engine/dependency-impact-analyzer.js.map +1 -0
- package/dist/engine/diff-spec-generator.d.ts +6 -0
- package/dist/engine/diff-spec-generator.d.ts.map +1 -0
- package/dist/engine/diff-spec-generator.js +181 -0
- package/dist/engine/diff-spec-generator.js.map +1 -0
- package/dist/engine/drift-monitor.d.ts +5 -0
- package/dist/engine/drift-monitor.d.ts.map +1 -0
- package/dist/engine/drift-monitor.js +92 -0
- package/dist/engine/drift-monitor.js.map +1 -0
- package/dist/engine/global-rules-manager.d.ts +10 -0
- package/dist/engine/global-rules-manager.d.ts.map +1 -0
- package/dist/engine/global-rules-manager.js +214 -0
- package/dist/engine/global-rules-manager.js.map +1 -0
- package/dist/engine/knowledge-base.d.ts +12 -0
- package/dist/engine/knowledge-base.d.ts.map +1 -0
- package/dist/engine/knowledge-base.js +250 -0
- package/dist/engine/knowledge-base.js.map +1 -0
- package/dist/engine/monday-sync.d.ts +10 -0
- package/dist/engine/monday-sync.d.ts.map +1 -0
- package/dist/engine/monday-sync.js +56 -0
- package/dist/engine/monday-sync.js.map +1 -0
- package/dist/engine/notion-sync.d.ts +13 -0
- package/dist/engine/notion-sync.d.ts.map +1 -0
- package/dist/engine/notion-sync.js +87 -0
- package/dist/engine/notion-sync.js.map +1 -0
- package/dist/engine/onboarding-engine.d.ts +11 -0
- package/dist/engine/onboarding-engine.d.ts.map +1 -0
- package/dist/engine/onboarding-engine.js +575 -0
- package/dist/engine/onboarding-engine.js.map +1 -0
- package/dist/engine/parallel-safety-engine.d.ts +8 -0
- package/dist/engine/parallel-safety-engine.d.ts.map +1 -0
- package/dist/engine/parallel-safety-engine.js +106 -0
- package/dist/engine/parallel-safety-engine.js.map +1 -0
- package/dist/engine/schema-generator.d.ts +6 -0
- package/dist/engine/schema-generator.d.ts.map +1 -0
- package/dist/engine/schema-generator.js +321 -0
- package/dist/engine/schema-generator.js.map +1 -0
- package/dist/engine/spec-cookbook.d.ts +12 -0
- package/dist/engine/spec-cookbook.d.ts.map +1 -0
- package/dist/engine/spec-cookbook.js +176 -0
- package/dist/engine/spec-cookbook.js.map +1 -0
- package/dist/engine/spec-diff-engine.d.ts +8 -0
- package/dist/engine/spec-diff-engine.d.ts.map +1 -0
- package/dist/engine/spec-diff-engine.js +321 -0
- package/dist/engine/spec-diff-engine.js.map +1 -0
- package/dist/engine/spec-hooks-engine.d.ts +12 -0
- package/dist/engine/spec-hooks-engine.d.ts.map +1 -0
- package/dist/engine/spec-hooks-engine.js +79 -0
- package/dist/engine/spec-hooks-engine.js.map +1 -0
- package/dist/engine/spec-lint-engine.d.ts +6 -0
- package/dist/engine/spec-lint-engine.d.ts.map +1 -0
- package/dist/engine/spec-lint-engine.js +164 -0
- package/dist/engine/spec-lint-engine.js.map +1 -0
- package/dist/engine/spec-scheduler.d.ts +13 -0
- package/dist/engine/spec-scheduler.d.ts.map +1 -0
- package/dist/engine/spec-scheduler.js +154 -0
- package/dist/engine/spec-scheduler.js.map +1 -0
- package/dist/engine/spec-source-sync.d.ts +14 -0
- package/dist/engine/spec-source-sync.d.ts.map +1 -0
- package/dist/engine/spec-source-sync.js +148 -0
- package/dist/engine/spec-source-sync.js.map +1 -0
- package/dist/engine/tech-debt-manager.d.ts +12 -0
- package/dist/engine/tech-debt-manager.d.ts.map +1 -0
- package/dist/engine/tech-debt-manager.js +152 -0
- package/dist/engine/tech-debt-manager.js.map +1 -0
- package/dist/engine/validation-loop.d.ts +4 -0
- package/dist/engine/validation-loop.d.ts.map +1 -0
- package/dist/engine/validation-loop.js +133 -0
- package/dist/engine/validation-loop.js.map +1 -0
- package/dist/engine/webhook-server.d.ts +19 -0
- package/dist/engine/webhook-server.d.ts.map +1 -0
- package/dist/engine/webhook-server.js +169 -0
- package/dist/engine/webhook-server.js.map +1 -0
- package/dist/engine/workspace-manager.d.ts +8 -0
- package/dist/engine/workspace-manager.d.ts.map +1 -0
- package/dist/engine/workspace-manager.js +255 -0
- package/dist/engine/workspace-manager.js.map +1 -0
- package/dist/index.js +50 -0
- package/dist/index.js.map +1 -1
- package/dist/storage/api-surfaces-store.d.ts +8 -0
- package/dist/storage/api-surfaces-store.d.ts.map +1 -0
- package/dist/storage/api-surfaces-store.js +31 -0
- package/dist/storage/api-surfaces-store.js.map +1 -0
- package/dist/storage/asana-config-store.d.ts +9 -0
- package/dist/storage/asana-config-store.d.ts.map +1 -0
- package/dist/storage/asana-config-store.js +51 -0
- package/dist/storage/asana-config-store.js.map +1 -0
- package/dist/storage/context-config-store.d.ts +4 -0
- package/dist/storage/context-config-store.d.ts.map +1 -0
- package/dist/storage/context-config-store.js +20 -0
- package/dist/storage/context-config-store.js.map +1 -0
- package/dist/storage/cost-budget-store.d.ts +6 -0
- package/dist/storage/cost-budget-store.d.ts.map +1 -0
- package/dist/storage/cost-budget-store.js +42 -0
- package/dist/storage/cost-budget-store.js.map +1 -0
- package/dist/storage/drift-monitor-store.d.ts +9 -0
- package/dist/storage/drift-monitor-store.d.ts.map +1 -0
- package/dist/storage/drift-monitor-store.js +45 -0
- package/dist/storage/drift-monitor-store.js.map +1 -0
- package/dist/storage/monday-config-store.d.ts +9 -0
- package/dist/storage/monday-config-store.d.ts.map +1 -0
- package/dist/storage/monday-config-store.js +51 -0
- package/dist/storage/monday-config-store.js.map +1 -0
- package/dist/storage/notion-config-store.d.ts +9 -0
- package/dist/storage/notion-config-store.d.ts.map +1 -0
- package/dist/storage/notion-config-store.js +51 -0
- package/dist/storage/notion-config-store.js.map +1 -0
- package/dist/storage/onboarding-store.d.ts +4 -0
- package/dist/storage/onboarding-store.d.ts.map +1 -0
- package/dist/storage/onboarding-store.js +14 -0
- package/dist/storage/onboarding-store.js.map +1 -0
- package/dist/storage/retention-policy-store.d.ts +4 -0
- package/dist/storage/retention-policy-store.d.ts.map +1 -0
- package/dist/storage/retention-policy-store.js +20 -0
- package/dist/storage/retention-policy-store.js.map +1 -0
- package/dist/storage/spec-bindings-store.d.ts +8 -0
- package/dist/storage/spec-bindings-store.d.ts.map +1 -0
- package/dist/storage/spec-bindings-store.js +44 -0
- package/dist/storage/spec-bindings-store.js.map +1 -0
- package/dist/storage/spec-hooks-store.d.ts +8 -0
- package/dist/storage/spec-hooks-store.d.ts.map +1 -0
- package/dist/storage/spec-hooks-store.js +56 -0
- package/dist/storage/spec-hooks-store.js.map +1 -0
- package/dist/storage/spec-lint-rules-store.d.ts +5 -0
- package/dist/storage/spec-lint-rules-store.d.ts.map +1 -0
- package/dist/storage/spec-lint-rules-store.js +40 -0
- package/dist/storage/spec-lint-rules-store.js.map +1 -0
- package/dist/storage/tech-debt-store.d.ts +12 -0
- package/dist/storage/tech-debt-store.d.ts.map +1 -0
- package/dist/storage/tech-debt-store.js +51 -0
- package/dist/storage/tech-debt-store.js.map +1 -0
- package/dist/storage/webhook-server-store.d.ts +5 -0
- package/dist/storage/webhook-server-store.d.ts.map +1 -0
- package/dist/storage/webhook-server-store.js +14 -0
- package/dist/storage/webhook-server-store.js.map +1 -0
- package/dist/tools/asana-handler.d.ts +6 -0
- package/dist/tools/asana-handler.d.ts.map +1 -0
- package/dist/tools/asana-handler.js +199 -0
- package/dist/tools/asana-handler.js.map +1 -0
- package/dist/tools/code-impact-handler.d.ts +6 -0
- package/dist/tools/code-impact-handler.d.ts.map +1 -0
- package/dist/tools/code-impact-handler.js +158 -0
- package/dist/tools/code-impact-handler.js.map +1 -0
- package/dist/tools/compliance-audit-handler.d.ts +6 -0
- package/dist/tools/compliance-audit-handler.d.ts.map +1 -0
- package/dist/tools/compliance-audit-handler.js +87 -0
- package/dist/tools/compliance-audit-handler.js.map +1 -0
- package/dist/tools/context-manager-handler.d.ts +8 -0
- package/dist/tools/context-manager-handler.d.ts.map +1 -0
- package/dist/tools/context-manager-handler.js +180 -0
- package/dist/tools/context-manager-handler.js.map +1 -0
- package/dist/tools/cost-budget-handler.d.ts +7 -0
- package/dist/tools/cost-budget-handler.d.ts.map +1 -0
- package/dist/tools/cost-budget-handler.js +242 -0
- package/dist/tools/cost-budget-handler.js.map +1 -0
- package/dist/tools/dependency-impact-handler.d.ts +6 -0
- package/dist/tools/dependency-impact-handler.d.ts.map +1 -0
- package/dist/tools/dependency-impact-handler.js +100 -0
- package/dist/tools/dependency-impact-handler.js.map +1 -0
- package/dist/tools/diff-spec-generator-handler.d.ts +22 -0
- package/dist/tools/diff-spec-generator-handler.d.ts.map +1 -0
- package/dist/tools/diff-spec-generator-handler.js +87 -0
- package/dist/tools/diff-spec-generator-handler.js.map +1 -0
- package/dist/tools/drift-monitor-handler.d.ts +25 -0
- package/dist/tools/drift-monitor-handler.d.ts.map +1 -0
- package/dist/tools/drift-monitor-handler.js +95 -0
- package/dist/tools/drift-monitor-handler.js.map +1 -0
- package/dist/tools/global-rules-handler.d.ts +17 -0
- package/dist/tools/global-rules-handler.d.ts.map +1 -0
- package/dist/tools/global-rules-handler.js +178 -0
- package/dist/tools/global-rules-handler.js.map +1 -0
- package/dist/tools/incoming-webhook-handler.d.ts +6 -0
- package/dist/tools/incoming-webhook-handler.d.ts.map +1 -0
- package/dist/tools/incoming-webhook-handler.js +247 -0
- package/dist/tools/incoming-webhook-handler.js.map +1 -0
- package/dist/tools/knowledge-base-handler.d.ts +7 -0
- package/dist/tools/knowledge-base-handler.d.ts.map +1 -0
- package/dist/tools/knowledge-base-handler.js +137 -0
- package/dist/tools/knowledge-base-handler.js.map +1 -0
- package/dist/tools/monday-handler.d.ts +6 -0
- package/dist/tools/monday-handler.d.ts.map +1 -0
- package/dist/tools/monday-handler.js +190 -0
- package/dist/tools/monday-handler.js.map +1 -0
- package/dist/tools/notion-handler.d.ts +6 -0
- package/dist/tools/notion-handler.d.ts.map +1 -0
- package/dist/tools/notion-handler.js +197 -0
- package/dist/tools/notion-handler.js.map +1 -0
- package/dist/tools/onboarding-handler.d.ts +7 -0
- package/dist/tools/onboarding-handler.d.ts.map +1 -0
- package/dist/tools/onboarding-handler.js +59 -0
- package/dist/tools/onboarding-handler.js.map +1 -0
- package/dist/tools/parallel-safety-handler.d.ts +7 -0
- package/dist/tools/parallel-safety-handler.d.ts.map +1 -0
- package/dist/tools/parallel-safety-handler.js +29 -0
- package/dist/tools/parallel-safety-handler.js.map +1 -0
- package/dist/tools/register-asana-tools.d.ts +3 -0
- package/dist/tools/register-asana-tools.d.ts.map +1 -0
- package/dist/tools/register-asana-tools.js +74 -0
- package/dist/tools/register-asana-tools.js.map +1 -0
- package/dist/tools/register-code-impact-tools.d.ts +3 -0
- package/dist/tools/register-code-impact-tools.d.ts.map +1 -0
- package/dist/tools/register-code-impact-tools.js +58 -0
- package/dist/tools/register-code-impact-tools.js.map +1 -0
- package/dist/tools/register-compliance-audit-tools.d.ts +3 -0
- package/dist/tools/register-compliance-audit-tools.d.ts.map +1 -0
- package/dist/tools/register-compliance-audit-tools.js +106 -0
- package/dist/tools/register-compliance-audit-tools.js.map +1 -0
- package/dist/tools/register-context-manager-tools.d.ts +3 -0
- package/dist/tools/register-context-manager-tools.d.ts.map +1 -0
- package/dist/tools/register-context-manager-tools.js +138 -0
- package/dist/tools/register-context-manager-tools.js.map +1 -0
- package/dist/tools/register-cost-budget-tools.d.ts +3 -0
- package/dist/tools/register-cost-budget-tools.d.ts.map +1 -0
- package/dist/tools/register-cost-budget-tools.js +98 -0
- package/dist/tools/register-cost-budget-tools.js.map +1 -0
- package/dist/tools/register-dependency-impact-tools.d.ts +3 -0
- package/dist/tools/register-dependency-impact-tools.d.ts.map +1 -0
- package/dist/tools/register-dependency-impact-tools.js +63 -0
- package/dist/tools/register-dependency-impact-tools.js.map +1 -0
- package/dist/tools/register-diff-spec-tools.d.ts +3 -0
- package/dist/tools/register-diff-spec-tools.d.ts.map +1 -0
- package/dist/tools/register-diff-spec-tools.js +55 -0
- package/dist/tools/register-diff-spec-tools.js.map +1 -0
- package/dist/tools/register-drift-monitor-tools.d.ts +3 -0
- package/dist/tools/register-drift-monitor-tools.d.ts.map +1 -0
- package/dist/tools/register-drift-monitor-tools.js +64 -0
- package/dist/tools/register-drift-monitor-tools.js.map +1 -0
- package/dist/tools/register-global-rules-tools.d.ts +3 -0
- package/dist/tools/register-global-rules-tools.d.ts.map +1 -0
- package/dist/tools/register-global-rules-tools.js +44 -0
- package/dist/tools/register-global-rules-tools.js.map +1 -0
- package/dist/tools/register-incoming-webhook-tools.d.ts +3 -0
- package/dist/tools/register-incoming-webhook-tools.d.ts.map +1 -0
- package/dist/tools/register-incoming-webhook-tools.js +50 -0
- package/dist/tools/register-incoming-webhook-tools.js.map +1 -0
- package/dist/tools/register-knowledge-base-tools.d.ts +3 -0
- package/dist/tools/register-knowledge-base-tools.d.ts.map +1 -0
- package/dist/tools/register-knowledge-base-tools.js +66 -0
- package/dist/tools/register-knowledge-base-tools.js.map +1 -0
- package/dist/tools/register-monday-tools.d.ts +3 -0
- package/dist/tools/register-monday-tools.d.ts.map +1 -0
- package/dist/tools/register-monday-tools.js +69 -0
- package/dist/tools/register-monday-tools.js.map +1 -0
- package/dist/tools/register-notion-tools.d.ts +3 -0
- package/dist/tools/register-notion-tools.d.ts.map +1 -0
- package/dist/tools/register-notion-tools.js +76 -0
- package/dist/tools/register-notion-tools.js.map +1 -0
- package/dist/tools/register-onboarding-tools.d.ts +3 -0
- package/dist/tools/register-onboarding-tools.d.ts.map +1 -0
- package/dist/tools/register-onboarding-tools.js +70 -0
- package/dist/tools/register-onboarding-tools.js.map +1 -0
- package/dist/tools/register-parallel-safety-tools.d.ts +3 -0
- package/dist/tools/register-parallel-safety-tools.d.ts.map +1 -0
- package/dist/tools/register-parallel-safety-tools.js +18 -0
- package/dist/tools/register-parallel-safety-tools.js.map +1 -0
- package/dist/tools/register-schema-generator-tools.d.ts +3 -0
- package/dist/tools/register-schema-generator-tools.d.ts.map +1 -0
- package/dist/tools/register-schema-generator-tools.js +46 -0
- package/dist/tools/register-schema-generator-tools.js.map +1 -0
- package/dist/tools/register-spec-cookbook-tools.d.ts +3 -0
- package/dist/tools/register-spec-cookbook-tools.d.ts.map +1 -0
- package/dist/tools/register-spec-cookbook-tools.js +90 -0
- package/dist/tools/register-spec-cookbook-tools.js.map +1 -0
- package/dist/tools/register-spec-diff-tools.d.ts +3 -0
- package/dist/tools/register-spec-diff-tools.d.ts.map +1 -0
- package/dist/tools/register-spec-diff-tools.js +67 -0
- package/dist/tools/register-spec-diff-tools.js.map +1 -0
- package/dist/tools/register-spec-hooks-tools.d.ts +3 -0
- package/dist/tools/register-spec-hooks-tools.d.ts.map +1 -0
- package/dist/tools/register-spec-hooks-tools.js +124 -0
- package/dist/tools/register-spec-hooks-tools.js.map +1 -0
- package/dist/tools/register-spec-lint-tools.d.ts +3 -0
- package/dist/tools/register-spec-lint-tools.d.ts.map +1 -0
- package/dist/tools/register-spec-lint-tools.js +79 -0
- package/dist/tools/register-spec-lint-tools.js.map +1 -0
- package/dist/tools/register-spec-scheduler-tools.d.ts +3 -0
- package/dist/tools/register-spec-scheduler-tools.d.ts.map +1 -0
- package/dist/tools/register-spec-scheduler-tools.js +73 -0
- package/dist/tools/register-spec-scheduler-tools.js.map +1 -0
- package/dist/tools/register-spec-source-tools.d.ts +3 -0
- package/dist/tools/register-spec-source-tools.d.ts.map +1 -0
- package/dist/tools/register-spec-source-tools.js +48 -0
- package/dist/tools/register-spec-source-tools.js.map +1 -0
- package/dist/tools/register-tech-debt-tools.d.ts +3 -0
- package/dist/tools/register-tech-debt-tools.d.ts.map +1 -0
- package/dist/tools/register-tech-debt-tools.js +95 -0
- package/dist/tools/register-tech-debt-tools.js.map +1 -0
- package/dist/tools/register-validation-loop-tools.d.ts +3 -0
- package/dist/tools/register-validation-loop-tools.d.ts.map +1 -0
- package/dist/tools/register-validation-loop-tools.js +77 -0
- package/dist/tools/register-validation-loop-tools.js.map +1 -0
- package/dist/tools/register-workspace-dashboard-tools.d.ts +3 -0
- package/dist/tools/register-workspace-dashboard-tools.d.ts.map +1 -0
- package/dist/tools/register-workspace-dashboard-tools.js +98 -0
- package/dist/tools/register-workspace-dashboard-tools.js.map +1 -0
- package/dist/tools/schema-generator-handler.d.ts +4 -0
- package/dist/tools/schema-generator-handler.d.ts.map +1 -0
- package/dist/tools/schema-generator-handler.js +129 -0
- package/dist/tools/schema-generator-handler.js.map +1 -0
- package/dist/tools/spec-cookbook-handler.d.ts +7 -0
- package/dist/tools/spec-cookbook-handler.d.ts.map +1 -0
- package/dist/tools/spec-cookbook-handler.js +83 -0
- package/dist/tools/spec-cookbook-handler.js.map +1 -0
- package/dist/tools/spec-hooks-handler.d.ts +7 -0
- package/dist/tools/spec-hooks-handler.d.ts.map +1 -0
- package/dist/tools/spec-hooks-handler.js +112 -0
- package/dist/tools/spec-hooks-handler.js.map +1 -0
- package/dist/tools/spec-lint-handler.d.ts +6 -0
- package/dist/tools/spec-lint-handler.d.ts.map +1 -0
- package/dist/tools/spec-lint-handler.js +165 -0
- package/dist/tools/spec-lint-handler.js.map +1 -0
- package/dist/tools/spec-scheduler-handler.d.ts +6 -0
- package/dist/tools/spec-scheduler-handler.d.ts.map +1 -0
- package/dist/tools/spec-scheduler-handler.js +108 -0
- package/dist/tools/spec-scheduler-handler.js.map +1 -0
- package/dist/tools/spec-source-handler.d.ts +21 -0
- package/dist/tools/spec-source-handler.d.ts.map +1 -0
- package/dist/tools/spec-source-handler.js +75 -0
- package/dist/tools/spec-source-handler.js.map +1 -0
- package/dist/tools/spec-visual-diff-handler.d.ts +7 -0
- package/dist/tools/spec-visual-diff-handler.d.ts.map +1 -0
- package/dist/tools/spec-visual-diff-handler.js +130 -0
- package/dist/tools/spec-visual-diff-handler.js.map +1 -0
- package/dist/tools/tech-debt-handler.d.ts +8 -0
- package/dist/tools/tech-debt-handler.d.ts.map +1 -0
- package/dist/tools/tech-debt-handler.js +150 -0
- package/dist/tools/tech-debt-handler.js.map +1 -0
- package/dist/tools/validation-loop-handler.d.ts +5 -0
- package/dist/tools/validation-loop-handler.d.ts.map +1 -0
- package/dist/tools/validation-loop-handler.js +59 -0
- package/dist/tools/validation-loop-handler.js.map +1 -0
- package/dist/tools/workspace-dashboard-handler.d.ts +8 -0
- package/dist/tools/workspace-dashboard-handler.d.ts.map +1 -0
- package/dist/tools/workspace-dashboard-handler.js +108 -0
- package/dist/tools/workspace-dashboard-handler.js.map +1 -0
- package/dist/types/code-impact.d.ts +57 -0
- package/dist/types/code-impact.d.ts.map +1 -0
- package/dist/types/code-impact.js +3 -0
- package/dist/types/code-impact.js.map +1 -0
- package/dist/types/compliance-audit.d.ts +55 -0
- package/dist/types/compliance-audit.d.ts.map +1 -0
- package/dist/types/compliance-audit.js +3 -0
- package/dist/types/compliance-audit.js.map +1 -0
- package/dist/types/context-manager.d.ts +57 -0
- package/dist/types/context-manager.d.ts.map +1 -0
- package/dist/types/context-manager.js +3 -0
- package/dist/types/context-manager.js.map +1 -0
- package/dist/types/cost-budget.d.ts +84 -0
- package/dist/types/cost-budget.d.ts.map +1 -0
- package/dist/types/cost-budget.js +3 -0
- package/dist/types/cost-budget.js.map +1 -0
- package/dist/types/dependency-impact.d.ts +45 -0
- package/dist/types/dependency-impact.d.ts.map +1 -0
- package/dist/types/dependency-impact.js +3 -0
- package/dist/types/dependency-impact.js.map +1 -0
- package/dist/types/diff-spec-types.d.ts +39 -0
- package/dist/types/diff-spec-types.d.ts.map +1 -0
- package/dist/types/diff-spec-types.js +3 -0
- package/dist/types/diff-spec-types.js.map +1 -0
- package/dist/types/drift-monitor-types.d.ts +47 -0
- package/dist/types/drift-monitor-types.d.ts.map +1 -0
- package/dist/types/drift-monitor-types.js +3 -0
- package/dist/types/drift-monitor-types.js.map +1 -0
- package/dist/types/global-rules-types.d.ts +31 -0
- package/dist/types/global-rules-types.d.ts.map +1 -0
- package/dist/types/global-rules-types.js +3 -0
- package/dist/types/global-rules-types.js.map +1 -0
- package/dist/types/incoming-webhook.d.ts +40 -0
- package/dist/types/incoming-webhook.d.ts.map +1 -0
- package/dist/types/incoming-webhook.js +3 -0
- package/dist/types/incoming-webhook.js.map +1 -0
- package/dist/types/index.d.ts +23 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +23 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/knowledge-base.d.ts +57 -0
- package/dist/types/knowledge-base.d.ts.map +1 -0
- package/dist/types/knowledge-base.js +3 -0
- package/dist/types/knowledge-base.js.map +1 -0
- package/dist/types/notion-asana-monday.d.ts +196 -0
- package/dist/types/notion-asana-monday.d.ts.map +1 -0
- package/dist/types/notion-asana-monday.js +3 -0
- package/dist/types/notion-asana-monday.js.map +1 -0
- package/dist/types/onboarding-types.d.ts +69 -0
- package/dist/types/onboarding-types.d.ts.map +1 -0
- package/dist/types/onboarding-types.js +3 -0
- package/dist/types/onboarding-types.js.map +1 -0
- package/dist/types/parallel-safety-types.d.ts +14 -0
- package/dist/types/parallel-safety-types.d.ts.map +1 -0
- package/dist/types/parallel-safety-types.js +3 -0
- package/dist/types/parallel-safety-types.js.map +1 -0
- package/dist/types/schema-generator.d.ts +61 -0
- package/dist/types/schema-generator.d.ts.map +1 -0
- package/dist/types/schema-generator.js +3 -0
- package/dist/types/schema-generator.js.map +1 -0
- package/dist/types/spec-cookbook-types.d.ts +45 -0
- package/dist/types/spec-cookbook-types.d.ts.map +1 -0
- package/dist/types/spec-cookbook-types.js +3 -0
- package/dist/types/spec-cookbook-types.js.map +1 -0
- package/dist/types/spec-diff-visual-types.d.ts +75 -0
- package/dist/types/spec-diff-visual-types.d.ts.map +1 -0
- package/dist/types/spec-diff-visual-types.js +3 -0
- package/dist/types/spec-diff-visual-types.js.map +1 -0
- package/dist/types/spec-hooks.d.ts +62 -0
- package/dist/types/spec-hooks.d.ts.map +1 -0
- package/dist/types/spec-hooks.js +3 -0
- package/dist/types/spec-hooks.js.map +1 -0
- package/dist/types/spec-lint.d.ts +79 -0
- package/dist/types/spec-lint.d.ts.map +1 -0
- package/dist/types/spec-lint.js +3 -0
- package/dist/types/spec-lint.js.map +1 -0
- package/dist/types/spec-scheduler.d.ts +58 -0
- package/dist/types/spec-scheduler.d.ts.map +1 -0
- package/dist/types/spec-scheduler.js +3 -0
- package/dist/types/spec-scheduler.js.map +1 -0
- package/dist/types/spec-source-types.d.ts +37 -0
- package/dist/types/spec-source-types.d.ts.map +1 -0
- package/dist/types/spec-source-types.js +3 -0
- package/dist/types/spec-source-types.js.map +1 -0
- package/dist/types/tech-debt.d.ts +66 -0
- package/dist/types/tech-debt.d.ts.map +1 -0
- package/dist/types/tech-debt.js +3 -0
- package/dist/types/tech-debt.js.map +1 -0
- package/dist/types/validation-loop.d.ts +39 -0
- package/dist/types/validation-loop.d.ts.map +1 -0
- package/dist/types/validation-loop.js +3 -0
- package/dist/types/validation-loop.js.map +1 -0
- package/dist/types/workspace-dashboard-types.d.ts +74 -0
- package/dist/types/workspace-dashboard-types.d.ts.map +1 -0
- package/dist/types/workspace-dashboard-types.js +3 -0
- package/dist/types/workspace-dashboard-types.js.map +1 -0
- package/package.json +2 -1
- package/src/config/license-plans.json +110 -9
- package/src/config/spec-cookbook.json +341 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
const NOTION_API_BASE = 'https://api.notion.com/v1';
|
|
2
|
+
const NOTION_VERSION = '2022-06-28';
|
|
3
|
+
export const DEFAULT_FIELD_MAPPING = {
|
|
4
|
+
title: 'title',
|
|
5
|
+
description: 'rich_text',
|
|
6
|
+
status: 'select',
|
|
7
|
+
priority: 'select',
|
|
8
|
+
tags: 'multi_select',
|
|
9
|
+
};
|
|
10
|
+
function buildHeaders(token) {
|
|
11
|
+
return {
|
|
12
|
+
Authorization: `Bearer ${token}`,
|
|
13
|
+
'Notion-Version': NOTION_VERSION,
|
|
14
|
+
'Content-Type': 'application/json',
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function buildProperties(spec, mapping) {
|
|
18
|
+
const props = {
|
|
19
|
+
[mapping.title]: {
|
|
20
|
+
title: [{ text: { content: `${spec.id}: ${spec.title}` } }],
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
if (spec.description !== undefined) {
|
|
24
|
+
props[mapping.description] = {
|
|
25
|
+
rich_text: [{ text: { content: spec.description.slice(0, 2000) } }],
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
if (spec.status !== undefined) {
|
|
29
|
+
props[mapping.status] = { select: { name: spec.status } };
|
|
30
|
+
}
|
|
31
|
+
if (spec.priority !== undefined) {
|
|
32
|
+
props[mapping.priority] = { select: { name: spec.priority } };
|
|
33
|
+
}
|
|
34
|
+
if (spec.tags !== undefined && spec.tags.length > 0) {
|
|
35
|
+
props[mapping.tags] = {
|
|
36
|
+
multi_select: spec.tags.map((t) => ({ name: t })),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
return props;
|
|
40
|
+
}
|
|
41
|
+
export async function createNotionPage(config, spec) {
|
|
42
|
+
const mapping = { ...DEFAULT_FIELD_MAPPING, ...(config.fieldMapping ?? {}) };
|
|
43
|
+
const body = {
|
|
44
|
+
parent: { database_id: config.databaseId },
|
|
45
|
+
properties: buildProperties(spec, mapping),
|
|
46
|
+
};
|
|
47
|
+
const response = await fetch(`${NOTION_API_BASE}/pages`, {
|
|
48
|
+
method: 'POST',
|
|
49
|
+
headers: buildHeaders(config.token),
|
|
50
|
+
body: JSON.stringify(body),
|
|
51
|
+
});
|
|
52
|
+
if (!response.ok) {
|
|
53
|
+
const text = await response.text();
|
|
54
|
+
throw new Error(`Notion API error ${response.status}: ${text}`);
|
|
55
|
+
}
|
|
56
|
+
const data = (await response.json());
|
|
57
|
+
return {
|
|
58
|
+
specId: spec.id,
|
|
59
|
+
externalId: data.id,
|
|
60
|
+
externalUrl: data.url,
|
|
61
|
+
title: `${spec.id}: ${spec.title}`,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
export async function updateNotionPage(config, pageId, spec) {
|
|
65
|
+
const mapping = { ...DEFAULT_FIELD_MAPPING, ...(config.fieldMapping ?? {}) };
|
|
66
|
+
const body = { properties: buildProperties(spec, mapping) };
|
|
67
|
+
const response = await fetch(`${NOTION_API_BASE}/pages/${pageId}`, {
|
|
68
|
+
method: 'PATCH',
|
|
69
|
+
headers: buildHeaders(config.token),
|
|
70
|
+
body: JSON.stringify(body),
|
|
71
|
+
});
|
|
72
|
+
if (!response.ok) {
|
|
73
|
+
const text = await response.text();
|
|
74
|
+
throw new Error(`Notion API error ${response.status}: ${text}`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
export function specToNotionSpec(spec) {
|
|
78
|
+
return {
|
|
79
|
+
id: spec.id,
|
|
80
|
+
title: spec.title,
|
|
81
|
+
description: spec.description,
|
|
82
|
+
status: spec.status,
|
|
83
|
+
priority: spec.priority,
|
|
84
|
+
tags: spec.tags,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=notion-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notion-sync.js","sourceRoot":"","sources":["../../src/engine/notion-sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { OnboardingConfig, OnboardingChecklist, GuidedTour, GuidedTourArea, OnboardingRecommendation, OnboardingProgressSummary, TourStep, QuickStartTemplate, OnboardingRole, OnboardingProjectType, OnboardingTeamSize } from '../types/index.js';
|
|
2
|
+
export declare function buildRecommendations(role: OnboardingRole, projectType: OnboardingProjectType, teamSize: OnboardingTeamSize): OnboardingRecommendation[];
|
|
3
|
+
export declare function formatRecommendationsMarkdown(config: OnboardingConfig, recommendations: OnboardingRecommendation[]): string;
|
|
4
|
+
export declare function getGuidedTour(area: GuidedTourArea): GuidedTour;
|
|
5
|
+
export declare function formatTourMarkdown(tour: GuidedTour): string;
|
|
6
|
+
export declare function buildOnboardingChecklist(projectPath: string): Promise<OnboardingChecklist>;
|
|
7
|
+
export declare function formatChecklistMarkdown(checklist: OnboardingChecklist): string;
|
|
8
|
+
export declare function getQuickStart(template: QuickStartTemplate): string;
|
|
9
|
+
export declare function buildProgressSummary(projectPath: string, config: OnboardingConfig | null): Promise<OnboardingProgressSummary>;
|
|
10
|
+
export declare function formatTourStep(step: TourStep): string;
|
|
11
|
+
//# sourceMappingURL=onboarding-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding-engine.d.ts","sourceRoot":"","sources":["../../src/engine/onboarding-engine.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,gBAAgB,EAChB,mBAAmB,EAEnB,UAAU,EACV,cAAc,EACd,wBAAwB,EACxB,yBAAyB,EACzB,QAAQ,EACR,kBAAkB,EAClB,cAAc,EACd,qBAAqB,EACrB,kBAAkB,EACnB,MAAM,mBAAmB,CAAC;AAM3B,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,cAAc,EACpB,WAAW,EAAE,qBAAqB,EAClC,QAAQ,EAAE,kBAAkB,GAC3B,wBAAwB,EAAE,CAmF5B;AAED,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,gBAAgB,EACxB,eAAe,EAAE,wBAAwB,EAAE,GAC1C,MAAM,CA+BR;AAsMD,wBAAgB,aAAa,CAAC,IAAI,EAAE,cAAc,GAAG,UAAU,CAE9D;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAoB3D;AAMD,wBAAsB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA6DhG;AAED,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,mBAAmB,GAAG,MAAM,CAiB9E;AA4HD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,CAElE;AAMD,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,gBAAgB,GAAG,IAAI,GAC9B,OAAO,CAAC,yBAAyB,CAAC,CAwBpC;AAwBD,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAErD"}
|
|
@@ -0,0 +1,575 @@
|
|
|
1
|
+
// engine/onboarding-engine.ts — SPEC-360: Interactive Onboarding & Guided Tours
|
|
2
|
+
import * as fs from 'node:fs/promises';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
// Recommendations
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
export function buildRecommendations(role, projectType, teamSize) {
|
|
8
|
+
const recs = [];
|
|
9
|
+
// Role-based
|
|
10
|
+
if (role === 'solo-dev') {
|
|
11
|
+
recs.push({
|
|
12
|
+
category: 'Workflow',
|
|
13
|
+
text: 'As a solo developer, use `quick_start` with the `solo-dev` template to get started fast.',
|
|
14
|
+
toolSuggestion: 'quick_start',
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
else if (role === 'team-lead') {
|
|
18
|
+
recs.push({
|
|
19
|
+
category: 'Collaboration',
|
|
20
|
+
text: 'Set up team roles with `configure_roles` and use `plan_team_distribution` to assign specs.',
|
|
21
|
+
toolSuggestion: 'configure_roles',
|
|
22
|
+
});
|
|
23
|
+
recs.push({
|
|
24
|
+
category: 'Visibility',
|
|
25
|
+
text: 'Use `workspace_overview` to monitor all team projects from a single view.',
|
|
26
|
+
toolSuggestion: 'workspace_overview',
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
else if (role === 'pm') {
|
|
30
|
+
recs.push({
|
|
31
|
+
category: 'Planning',
|
|
32
|
+
text: 'Use `create_spec` to capture requirements and `check_readiness` before starting implementation.',
|
|
33
|
+
toolSuggestion: 'create_spec',
|
|
34
|
+
});
|
|
35
|
+
recs.push({
|
|
36
|
+
category: 'Reporting',
|
|
37
|
+
text: 'Use `workspace_report` to generate progress summaries for stakeholders.',
|
|
38
|
+
toolSuggestion: 'workspace_report',
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
// architect
|
|
43
|
+
recs.push({
|
|
44
|
+
category: 'Architecture',
|
|
45
|
+
text: 'Use `generate_diagram` to document architecture and `analyze_spec_dependencies` for dependency graphs.',
|
|
46
|
+
toolSuggestion: 'generate_diagram',
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
// Project type based
|
|
50
|
+
if (projectType === 'saas') {
|
|
51
|
+
recs.push({
|
|
52
|
+
category: 'SaaS Specifics',
|
|
53
|
+
text: 'Explore the Spec Cookbook for SaaS patterns: billing, onboarding, team management.',
|
|
54
|
+
toolSuggestion: 'cookbook_list',
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
else if (projectType === 'api') {
|
|
58
|
+
recs.push({
|
|
59
|
+
category: 'API Quality',
|
|
60
|
+
text: 'Use `validate_api_contract` to keep your OpenAPI spec aligned with implementation.',
|
|
61
|
+
toolSuggestion: 'validate_api_contract',
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
else if (projectType === 'mobile') {
|
|
65
|
+
recs.push({
|
|
66
|
+
category: 'Mobile CI',
|
|
67
|
+
text: 'Use `generate_automation_guide` with the mobile template to set up iOS/Android CI pipelines.',
|
|
68
|
+
toolSuggestion: 'generate_automation_guide',
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
// Team size based
|
|
72
|
+
if (teamSize === '1') {
|
|
73
|
+
recs.push({
|
|
74
|
+
category: 'Efficiency',
|
|
75
|
+
text: 'Enable compact mode with `set_work_mode` to minimize token usage while working solo.',
|
|
76
|
+
toolSuggestion: 'set_work_mode',
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
else if (teamSize === '6-20' || teamSize === '20+') {
|
|
80
|
+
recs.push({
|
|
81
|
+
category: 'Scale',
|
|
82
|
+
text: 'Configure approval policies with `configure_approval_policy` to enforce review workflows.',
|
|
83
|
+
toolSuggestion: 'configure_approval_policy',
|
|
84
|
+
});
|
|
85
|
+
recs.push({
|
|
86
|
+
category: 'Integrations',
|
|
87
|
+
text: 'Connect your issue tracker (Jira/Linear) to keep specs and tickets in sync.',
|
|
88
|
+
toolSuggestion: 'configure_jira',
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
return recs;
|
|
92
|
+
}
|
|
93
|
+
export function formatRecommendationsMarkdown(config, recommendations) {
|
|
94
|
+
const lines = [
|
|
95
|
+
`# Welcome to Planu!`,
|
|
96
|
+
``,
|
|
97
|
+
`**Role:** ${config.role} | **Project type:** ${config.projectType} | **Team size:** ${config.teamSize}`,
|
|
98
|
+
``,
|
|
99
|
+
`## Personalized Recommendations`,
|
|
100
|
+
``,
|
|
101
|
+
];
|
|
102
|
+
const byCategory = new Map();
|
|
103
|
+
for (const rec of recommendations) {
|
|
104
|
+
const existing = byCategory.get(rec.category) ?? [];
|
|
105
|
+
existing.push(rec);
|
|
106
|
+
byCategory.set(rec.category, existing);
|
|
107
|
+
}
|
|
108
|
+
for (const [category, recs] of byCategory) {
|
|
109
|
+
lines.push(`### ${category}`);
|
|
110
|
+
for (const rec of recs) {
|
|
111
|
+
lines.push(`- ${rec.text}`);
|
|
112
|
+
}
|
|
113
|
+
lines.push('');
|
|
114
|
+
}
|
|
115
|
+
lines.push(`## Next Steps`, ``);
|
|
116
|
+
lines.push(`1. Run \`onboarding_checklist\` to see what's already set up`);
|
|
117
|
+
lines.push(`2. Run \`guided_tour\` with area \`spec-lifecycle\` to learn the basics`);
|
|
118
|
+
lines.push(`3. Run \`quick_start\` to scaffold your first spec`);
|
|
119
|
+
return lines.join('\n');
|
|
120
|
+
}
|
|
121
|
+
// ---------------------------------------------------------------------------
|
|
122
|
+
// Guided Tours
|
|
123
|
+
// ---------------------------------------------------------------------------
|
|
124
|
+
const TOURS = {
|
|
125
|
+
'spec-lifecycle': {
|
|
126
|
+
area: 'spec-lifecycle',
|
|
127
|
+
title: 'Spec Lifecycle: From Idea to Done',
|
|
128
|
+
steps: [
|
|
129
|
+
{
|
|
130
|
+
stepNumber: 1,
|
|
131
|
+
title: 'Create a Spec',
|
|
132
|
+
description: 'Every feature starts with a spec. Use `create_spec` to define the feature title, description, and acceptance criteria.',
|
|
133
|
+
toolHint: 'create_spec',
|
|
134
|
+
example: 'create_spec with title="User login" and projectPath="/path/to/project"',
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
stepNumber: 2,
|
|
138
|
+
title: 'Challenge & Refine',
|
|
139
|
+
description: 'Use `challenge_spec` to stress-test your spec and find gaps before implementation starts.',
|
|
140
|
+
toolHint: 'challenge_spec',
|
|
141
|
+
example: 'challenge_spec with specId="SPEC-001" and projectPath="..."',
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
stepNumber: 3,
|
|
145
|
+
title: 'Check Readiness',
|
|
146
|
+
description: '`check_readiness` verifies the spec has enough detail for implementation. Fix any issues it flags.',
|
|
147
|
+
toolHint: 'check_readiness',
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
stepNumber: 4,
|
|
151
|
+
title: 'Approve & Implement',
|
|
152
|
+
description: 'Move the spec to `approved` status. Implement the feature, then move to `done`.',
|
|
153
|
+
toolHint: 'update_status',
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
stepNumber: 5,
|
|
157
|
+
title: 'Validate',
|
|
158
|
+
description: 'Run `validate` to confirm the implementation matches the spec criteria.',
|
|
159
|
+
toolHint: 'validate',
|
|
160
|
+
},
|
|
161
|
+
],
|
|
162
|
+
},
|
|
163
|
+
'team-collaboration': {
|
|
164
|
+
area: 'team-collaboration',
|
|
165
|
+
title: 'Team Collaboration Workflows',
|
|
166
|
+
steps: [
|
|
167
|
+
{
|
|
168
|
+
stepNumber: 1,
|
|
169
|
+
title: 'Configure Roles',
|
|
170
|
+
description: 'Set up roles (owner, reviewer, developer) with `configure_roles`.',
|
|
171
|
+
toolHint: 'configure_roles',
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
stepNumber: 2,
|
|
175
|
+
title: 'Assign Specs',
|
|
176
|
+
description: 'Use `assign_role` to assign specs to team members.',
|
|
177
|
+
toolHint: 'assign_role',
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
stepNumber: 3,
|
|
181
|
+
title: 'Comments & Reviews',
|
|
182
|
+
description: 'Use `add_comment` and `request_changes` to collaborate on spec details.',
|
|
183
|
+
toolHint: 'add_comment',
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
stepNumber: 4,
|
|
187
|
+
title: 'Approval Policy',
|
|
188
|
+
description: 'Configure who can approve specs with `configure_approval_policy`.',
|
|
189
|
+
toolHint: 'configure_approval_policy',
|
|
190
|
+
},
|
|
191
|
+
],
|
|
192
|
+
},
|
|
193
|
+
integrations: {
|
|
194
|
+
area: 'integrations',
|
|
195
|
+
title: 'Connecting Your Tools',
|
|
196
|
+
steps: [
|
|
197
|
+
{
|
|
198
|
+
stepNumber: 1,
|
|
199
|
+
title: 'Issue Trackers',
|
|
200
|
+
description: 'Sync specs with Jira, Linear, or Asana using the respective configure tools.',
|
|
201
|
+
toolHint: 'configure_jira',
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
stepNumber: 2,
|
|
205
|
+
title: 'CI/CD',
|
|
206
|
+
description: 'Generate CI workflows with `generate_planu_ci` for GitHub Actions.',
|
|
207
|
+
toolHint: 'generate_planu_ci',
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
stepNumber: 3,
|
|
211
|
+
title: 'Notifications',
|
|
212
|
+
description: 'Configure Slack notifications for spec status changes with `configure_slack`.',
|
|
213
|
+
toolHint: 'configure_slack',
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
stepNumber: 4,
|
|
217
|
+
title: 'Webhooks',
|
|
218
|
+
description: 'Set up outbound webhooks to trigger custom workflows on spec events.',
|
|
219
|
+
toolHint: 'configure_webhook',
|
|
220
|
+
},
|
|
221
|
+
],
|
|
222
|
+
},
|
|
223
|
+
'ai-tools': {
|
|
224
|
+
area: 'ai-tools',
|
|
225
|
+
title: 'AI-Powered Features',
|
|
226
|
+
steps: [
|
|
227
|
+
{
|
|
228
|
+
stepNumber: 1,
|
|
229
|
+
title: 'Suggest Criteria',
|
|
230
|
+
description: 'Use `suggest_criteria` to auto-generate acceptance criteria from a description.',
|
|
231
|
+
toolHint: 'suggest_criteria',
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
stepNumber: 2,
|
|
235
|
+
title: 'Clarify Requirements',
|
|
236
|
+
description: '`clarify_requirements` runs an interview-style session to uncover hidden requirements.',
|
|
237
|
+
toolHint: 'clarify_requirements',
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
stepNumber: 3,
|
|
241
|
+
title: 'Red Team',
|
|
242
|
+
description: 'Use `red_team` to adversarially challenge your spec for edge cases.',
|
|
243
|
+
toolHint: 'red_team',
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
stepNumber: 4,
|
|
247
|
+
title: 'Generate Tests',
|
|
248
|
+
description: 'Generate test scaffolds from spec criteria with `tdd_scaffold`.',
|
|
249
|
+
toolHint: 'tdd_scaffold',
|
|
250
|
+
},
|
|
251
|
+
],
|
|
252
|
+
},
|
|
253
|
+
security: {
|
|
254
|
+
area: 'security',
|
|
255
|
+
title: 'Security & Compliance',
|
|
256
|
+
steps: [
|
|
257
|
+
{
|
|
258
|
+
stepNumber: 1,
|
|
259
|
+
title: 'Security Scan',
|
|
260
|
+
description: 'Run `security_scan` to check specs for security anti-patterns.',
|
|
261
|
+
toolHint: 'security_scan',
|
|
262
|
+
},
|
|
263
|
+
{
|
|
264
|
+
stepNumber: 2,
|
|
265
|
+
title: 'Compliance',
|
|
266
|
+
description: 'Configure compliance checks (GDPR, SOC2) with `configure_compliance`.',
|
|
267
|
+
toolHint: 'configure_compliance',
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
stepNumber: 3,
|
|
271
|
+
title: 'Audit Trail',
|
|
272
|
+
description: 'View spec change history with `audit_trail` for compliance reporting.',
|
|
273
|
+
toolHint: 'audit_trail',
|
|
274
|
+
},
|
|
275
|
+
],
|
|
276
|
+
},
|
|
277
|
+
reporting: {
|
|
278
|
+
area: 'reporting',
|
|
279
|
+
title: 'Reporting & Metrics',
|
|
280
|
+
steps: [
|
|
281
|
+
{
|
|
282
|
+
stepNumber: 1,
|
|
283
|
+
title: 'Velocity Report',
|
|
284
|
+
description: 'See team velocity trends with `velocity_report`.',
|
|
285
|
+
toolHint: 'velocity_report',
|
|
286
|
+
},
|
|
287
|
+
{
|
|
288
|
+
stepNumber: 2,
|
|
289
|
+
title: 'Usage Stats',
|
|
290
|
+
description: 'View tool usage and spec activity with `usage_stats`.',
|
|
291
|
+
toolHint: 'usage_stats',
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
stepNumber: 3,
|
|
295
|
+
title: 'Workspace Report',
|
|
296
|
+
description: 'Generate a workspace-level HTML report with `workspace_report`.',
|
|
297
|
+
toolHint: 'workspace_report',
|
|
298
|
+
},
|
|
299
|
+
{
|
|
300
|
+
stepNumber: 4,
|
|
301
|
+
title: 'Export',
|
|
302
|
+
description: 'Export specs as CSV, Markdown, or PDF for external stakeholders.',
|
|
303
|
+
toolHint: 'export_specs_csv',
|
|
304
|
+
},
|
|
305
|
+
],
|
|
306
|
+
},
|
|
307
|
+
};
|
|
308
|
+
export function getGuidedTour(area) {
|
|
309
|
+
return TOURS[area];
|
|
310
|
+
}
|
|
311
|
+
export function formatTourMarkdown(tour) {
|
|
312
|
+
const lines = [
|
|
313
|
+
`# Guided Tour: ${tour.title}`,
|
|
314
|
+
``,
|
|
315
|
+
`This tour covers ${String(tour.steps.length)} steps.`,
|
|
316
|
+
``,
|
|
317
|
+
];
|
|
318
|
+
for (const step of tour.steps) {
|
|
319
|
+
lines.push(`## Step ${String(step.stepNumber)}: ${step.title}`, ``);
|
|
320
|
+
lines.push(step.description, ``);
|
|
321
|
+
if (step.example !== undefined) {
|
|
322
|
+
lines.push(`**Example:** \`${step.example}\``, ``);
|
|
323
|
+
}
|
|
324
|
+
if (step.toolHint !== undefined) {
|
|
325
|
+
lines.push(`**Tool:** \`${step.toolHint}\``, ``);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
return lines.join('\n');
|
|
329
|
+
}
|
|
330
|
+
// ---------------------------------------------------------------------------
|
|
331
|
+
// Checklist
|
|
332
|
+
// ---------------------------------------------------------------------------
|
|
333
|
+
export async function buildOnboardingChecklist(projectPath) {
|
|
334
|
+
const items = [];
|
|
335
|
+
// Check planu.json
|
|
336
|
+
const planuJson = await fileExists(path.join(projectPath, 'planu.json'));
|
|
337
|
+
items.push({
|
|
338
|
+
id: 'planu-init',
|
|
339
|
+
label: 'Project initialized (planu.json exists)',
|
|
340
|
+
completed: planuJson,
|
|
341
|
+
hint: 'Run `init_project` to initialize your project',
|
|
342
|
+
});
|
|
343
|
+
// Check CLAUDE.md or constitution
|
|
344
|
+
const constitutionExists = (await fileExists(path.join(projectPath, 'CLAUDE.md'))) ||
|
|
345
|
+
(await fileExists(path.join(projectPath, '.claude', 'CLAUDE.md')));
|
|
346
|
+
items.push({
|
|
347
|
+
id: 'constitution',
|
|
348
|
+
label: 'Project constitution (CLAUDE.md) exists',
|
|
349
|
+
completed: constitutionExists,
|
|
350
|
+
hint: 'Run `init_constitution` to create your project constitution',
|
|
351
|
+
});
|
|
352
|
+
// Check planu/ directory has specs
|
|
353
|
+
const planuDir = path.join(projectPath, 'planu', 'specs');
|
|
354
|
+
const specsExist = await dirHasContents(planuDir);
|
|
355
|
+
items.push({
|
|
356
|
+
id: 'first-spec',
|
|
357
|
+
label: 'At least one spec created',
|
|
358
|
+
completed: specsExist,
|
|
359
|
+
hint: 'Run `create_spec` to create your first spec',
|
|
360
|
+
});
|
|
361
|
+
// Check .claude/rules/ exists
|
|
362
|
+
const rulesDir = await dirHasContents(path.join(projectPath, '.claude', 'rules'));
|
|
363
|
+
items.push({
|
|
364
|
+
id: 'rules',
|
|
365
|
+
label: 'Project rules configured (.claude/rules/ exists)',
|
|
366
|
+
completed: rulesDir,
|
|
367
|
+
hint: 'Run `reconcile_rules` to set up project rules',
|
|
368
|
+
});
|
|
369
|
+
// Check .claude/skills/ exists
|
|
370
|
+
const skillsDir = await dirHasContents(path.join(projectPath, '.claude', 'skills'));
|
|
371
|
+
items.push({
|
|
372
|
+
id: 'skills',
|
|
373
|
+
label: 'Project skills configured (.claude/skills/ exists)',
|
|
374
|
+
completed: skillsDir,
|
|
375
|
+
hint: 'Run `reconcile_skills` to set up project skills',
|
|
376
|
+
});
|
|
377
|
+
const completedCount = items.filter((i) => i.completed).length;
|
|
378
|
+
const totalCount = items.length;
|
|
379
|
+
return {
|
|
380
|
+
projectPath,
|
|
381
|
+
items,
|
|
382
|
+
completedCount,
|
|
383
|
+
totalCount,
|
|
384
|
+
percentComplete: Math.round((completedCount / totalCount) * 100),
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
export function formatChecklistMarkdown(checklist) {
|
|
388
|
+
const lines = [
|
|
389
|
+
`# Onboarding Checklist`,
|
|
390
|
+
``,
|
|
391
|
+
`**Progress:** ${String(checklist.completedCount)}/${String(checklist.totalCount)} steps complete (${String(checklist.percentComplete)}%)`,
|
|
392
|
+
``,
|
|
393
|
+
];
|
|
394
|
+
for (const item of checklist.items) {
|
|
395
|
+
const icon = item.completed ? '✅' : '⬜';
|
|
396
|
+
lines.push(`${icon} **${item.label}**`);
|
|
397
|
+
if (!item.completed && item.hint !== undefined) {
|
|
398
|
+
lines.push(` > ${item.hint}`);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
return lines.join('\n');
|
|
402
|
+
}
|
|
403
|
+
// ---------------------------------------------------------------------------
|
|
404
|
+
// Quick Start Templates
|
|
405
|
+
// ---------------------------------------------------------------------------
|
|
406
|
+
const QUICK_START_CONTENT = {
|
|
407
|
+
'solo-dev': `# Solo Developer Quick Start
|
|
408
|
+
|
|
409
|
+
## 1. Initialize your project
|
|
410
|
+
\`\`\`
|
|
411
|
+
init_project projectPath="/path/to/your/project"
|
|
412
|
+
\`\`\`
|
|
413
|
+
|
|
414
|
+
## 2. Create your first spec
|
|
415
|
+
\`\`\`
|
|
416
|
+
create_spec title="My First Feature" projectPath="/path/to/your/project"
|
|
417
|
+
\`\`\`
|
|
418
|
+
|
|
419
|
+
## 3. Check readiness and implement
|
|
420
|
+
\`\`\`
|
|
421
|
+
check_readiness specId="SPEC-001" projectPath="..."
|
|
422
|
+
\`\`\`
|
|
423
|
+
|
|
424
|
+
## 4. Validate when done
|
|
425
|
+
\`\`\`
|
|
426
|
+
validate specId="SPEC-001" projectPath="..."
|
|
427
|
+
update_status specId="SPEC-001" newStatus="done" projectPath="..."
|
|
428
|
+
\`\`\`
|
|
429
|
+
`,
|
|
430
|
+
'team-project': `# Team Project Quick Start
|
|
431
|
+
|
|
432
|
+
## 1. Initialize and configure roles
|
|
433
|
+
\`\`\`
|
|
434
|
+
init_project projectPath="/path/to/your/project"
|
|
435
|
+
configure_roles projectPath="..."
|
|
436
|
+
\`\`\`
|
|
437
|
+
|
|
438
|
+
## 2. Set up approval policy
|
|
439
|
+
\`\`\`
|
|
440
|
+
configure_approval_policy projectPath="..." requiredApprovals=1
|
|
441
|
+
\`\`\`
|
|
442
|
+
|
|
443
|
+
## 3. Create specs and assign reviewers
|
|
444
|
+
\`\`\`
|
|
445
|
+
create_spec title="Feature Name" projectPath="..."
|
|
446
|
+
assign_role specId="SPEC-001" role="reviewer" userId="..."
|
|
447
|
+
\`\`\`
|
|
448
|
+
|
|
449
|
+
## 4. Connect integrations
|
|
450
|
+
\`\`\`
|
|
451
|
+
configure_slack webhookUrl="https://..."
|
|
452
|
+
configure_jira host="..." apiToken="..."
|
|
453
|
+
\`\`\`
|
|
454
|
+
`,
|
|
455
|
+
'api-first': `# API-First Development Quick Start
|
|
456
|
+
|
|
457
|
+
## 1. Initialize and set up API spec validation
|
|
458
|
+
\`\`\`
|
|
459
|
+
init_project projectPath="/path/to/your/project"
|
|
460
|
+
\`\`\`
|
|
461
|
+
|
|
462
|
+
## 2. Create API specs from cookbook
|
|
463
|
+
\`\`\`
|
|
464
|
+
cookbook_get id="api-rate-limiting"
|
|
465
|
+
cookbook_apply id="api-auth" projectName="My API"
|
|
466
|
+
\`\`\`
|
|
467
|
+
|
|
468
|
+
## 3. Validate API contract
|
|
469
|
+
\`\`\`
|
|
470
|
+
validate_api_contract projectPath="..." specFile="openapi.yaml"
|
|
471
|
+
\`\`\`
|
|
472
|
+
|
|
473
|
+
## 4. Generate tests
|
|
474
|
+
\`\`\`
|
|
475
|
+
tdd_scaffold specId="SPEC-001" projectPath="..."
|
|
476
|
+
\`\`\`
|
|
477
|
+
`,
|
|
478
|
+
'mobile-app': `# Mobile App Quick Start
|
|
479
|
+
|
|
480
|
+
## 1. Initialize project
|
|
481
|
+
\`\`\`
|
|
482
|
+
init_project projectPath="/path/to/your/project"
|
|
483
|
+
\`\`\`
|
|
484
|
+
|
|
485
|
+
## 2. Browse mobile cookbook patterns
|
|
486
|
+
\`\`\`
|
|
487
|
+
cookbook_list domain="mobile"
|
|
488
|
+
\`\`\`
|
|
489
|
+
|
|
490
|
+
## 3. Generate CI/CD pipeline
|
|
491
|
+
\`\`\`
|
|
492
|
+
generate_automation_guide projectPath="..." platform="mobile"
|
|
493
|
+
\`\`\`
|
|
494
|
+
|
|
495
|
+
## 4. Set up push notification spec
|
|
496
|
+
\`\`\`
|
|
497
|
+
cookbook_apply id="mobile-push-notifications" projectName="MyApp"
|
|
498
|
+
\`\`\`
|
|
499
|
+
`,
|
|
500
|
+
'open-source': `# Open Source Project Quick Start
|
|
501
|
+
|
|
502
|
+
## 1. Initialize project
|
|
503
|
+
\`\`\`
|
|
504
|
+
init_project projectPath="/path/to/your/project"
|
|
505
|
+
\`\`\`
|
|
506
|
+
|
|
507
|
+
## 2. Create contribution guidelines via spec
|
|
508
|
+
\`\`\`
|
|
509
|
+
create_spec title="Contribution Workflow" projectPath="..."
|
|
510
|
+
\`\`\`
|
|
511
|
+
|
|
512
|
+
## 3. Set up CI validation
|
|
513
|
+
\`\`\`
|
|
514
|
+
generate_planu_ci projectPath="..." provider="github-actions"
|
|
515
|
+
\`\`\`
|
|
516
|
+
|
|
517
|
+
## 4. Generate documentation site
|
|
518
|
+
\`\`\`
|
|
519
|
+
generate_docs_site projectPath="..."
|
|
520
|
+
\`\`\`
|
|
521
|
+
`,
|
|
522
|
+
};
|
|
523
|
+
export function getQuickStart(template) {
|
|
524
|
+
return QUICK_START_CONTENT[template];
|
|
525
|
+
}
|
|
526
|
+
// ---------------------------------------------------------------------------
|
|
527
|
+
// Progress Summary
|
|
528
|
+
// ---------------------------------------------------------------------------
|
|
529
|
+
export async function buildProgressSummary(projectPath, config) {
|
|
530
|
+
const checklist = await buildOnboardingChecklist(projectPath);
|
|
531
|
+
const nextSteps = [];
|
|
532
|
+
for (const item of checklist.items) {
|
|
533
|
+
if (!item.completed && item.hint !== undefined) {
|
|
534
|
+
nextSteps.push(item.hint);
|
|
535
|
+
}
|
|
536
|
+
if (nextSteps.length >= 3) {
|
|
537
|
+
break;
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
if (nextSteps.length === 0) {
|
|
541
|
+
nextSteps.push('All setup steps complete! Explore `guided_tour` for advanced topics.');
|
|
542
|
+
}
|
|
543
|
+
return {
|
|
544
|
+
projectPath,
|
|
545
|
+
config,
|
|
546
|
+
checklist,
|
|
547
|
+
percentComplete: checklist.percentComplete,
|
|
548
|
+
nextSteps,
|
|
549
|
+
};
|
|
550
|
+
}
|
|
551
|
+
// ---------------------------------------------------------------------------
|
|
552
|
+
// Helpers
|
|
553
|
+
// ---------------------------------------------------------------------------
|
|
554
|
+
async function fileExists(filePath) {
|
|
555
|
+
try {
|
|
556
|
+
await fs.access(filePath);
|
|
557
|
+
return true;
|
|
558
|
+
}
|
|
559
|
+
catch {
|
|
560
|
+
return false;
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
async function dirHasContents(dirPath) {
|
|
564
|
+
try {
|
|
565
|
+
const entries = await fs.readdir(dirPath);
|
|
566
|
+
return entries.length > 0;
|
|
567
|
+
}
|
|
568
|
+
catch {
|
|
569
|
+
return false;
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
export function formatTourStep(step) {
|
|
573
|
+
return `**Step ${String(step.stepNumber)}:** ${step.title} — ${step.description}`;
|
|
574
|
+
}
|
|
575
|
+
//# sourceMappingURL=onboarding-engine.js.map
|