@planu/cli 0.91.0 → 0.92.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/domain-best-practices.json +413 -0
- package/dist/config/ide-registry.json +25 -0
- package/dist/config/license-plans.json +59 -2
- package/dist/engine/ai-integration/agent-frameworks/autogen-exporter.d.ts +11 -0
- package/dist/engine/ai-integration/agent-frameworks/autogen-exporter.d.ts.map +1 -0
- package/dist/engine/ai-integration/agent-frameworks/autogen-exporter.js +52 -0
- package/dist/engine/ai-integration/agent-frameworks/autogen-exporter.js.map +1 -0
- package/dist/engine/ai-integration/agent-frameworks/crewai-exporter.d.ts +11 -0
- package/dist/engine/ai-integration/agent-frameworks/crewai-exporter.d.ts.map +1 -0
- package/dist/engine/ai-integration/agent-frameworks/crewai-exporter.js +89 -0
- package/dist/engine/ai-integration/agent-frameworks/crewai-exporter.js.map +1 -0
- package/dist/engine/ai-integration/agent-frameworks/index.d.ts +4 -0
- package/dist/engine/ai-integration/agent-frameworks/index.d.ts.map +1 -0
- package/dist/engine/ai-integration/agent-frameworks/index.js +5 -0
- package/dist/engine/ai-integration/agent-frameworks/index.js.map +1 -0
- package/dist/engine/ai-integration/agent-frameworks/langgraph-exporter.d.ts +11 -0
- package/dist/engine/ai-integration/agent-frameworks/langgraph-exporter.d.ts.map +1 -0
- package/dist/engine/ai-integration/agent-frameworks/langgraph-exporter.js +71 -0
- package/dist/engine/ai-integration/agent-frameworks/langgraph-exporter.js.map +1 -0
- package/dist/engine/ai-integration/agents-md/generator.d.ts +11 -0
- package/dist/engine/ai-integration/agents-md/generator.d.ts.map +1 -0
- package/dist/engine/ai-integration/agents-md/generator.js +139 -0
- package/dist/engine/ai-integration/agents-md/generator.js.map +1 -0
- package/dist/engine/ai-integration/agents-md/index.d.ts +3 -0
- package/dist/engine/ai-integration/agents-md/index.d.ts.map +1 -0
- package/dist/engine/ai-integration/agents-md/index.js +4 -0
- package/dist/engine/ai-integration/agents-md/index.js.map +1 -0
- package/dist/engine/ai-integration/agents-md/updater.d.ts +10 -0
- package/dist/engine/ai-integration/agents-md/updater.d.ts.map +1 -0
- package/dist/engine/ai-integration/agents-md/updater.js +33 -0
- package/dist/engine/ai-integration/agents-md/updater.js.map +1 -0
- package/dist/engine/ai-integration/aider/aider-config-generator.d.ts +5 -0
- package/dist/engine/ai-integration/aider/aider-config-generator.d.ts.map +1 -0
- package/dist/engine/ai-integration/aider/aider-config-generator.js +34 -0
- package/dist/engine/ai-integration/aider/aider-config-generator.js.map +1 -0
- package/dist/engine/ai-integration/cline/clinerules-generator.d.ts +5 -0
- package/dist/engine/ai-integration/cline/clinerules-generator.d.ts.map +1 -0
- package/dist/engine/ai-integration/cline/clinerules-generator.js +86 -0
- package/dist/engine/ai-integration/cline/clinerules-generator.js.map +1 -0
- package/dist/engine/ai-integration/cline/index.d.ts +3 -0
- package/dist/engine/ai-integration/cline/index.d.ts.map +1 -0
- package/dist/engine/ai-integration/cline/index.js +3 -0
- package/dist/engine/ai-integration/cline/index.js.map +1 -0
- package/dist/engine/ai-integration/codex/agent-roles-generator.d.ts +12 -0
- package/dist/engine/ai-integration/codex/agent-roles-generator.d.ts.map +1 -0
- package/dist/engine/ai-integration/codex/agent-roles-generator.js +62 -0
- package/dist/engine/ai-integration/codex/agent-roles-generator.js.map +1 -0
- package/dist/engine/ai-integration/codex/agents-md-generator.d.ts +10 -0
- package/dist/engine/ai-integration/codex/agents-md-generator.d.ts.map +1 -0
- package/dist/engine/ai-integration/codex/agents-md-generator.js +114 -0
- package/dist/engine/ai-integration/codex/agents-md-generator.js.map +1 -0
- package/dist/engine/ai-integration/codex/config-generator.d.ts +9 -0
- package/dist/engine/ai-integration/codex/config-generator.d.ts.map +1 -0
- package/dist/engine/ai-integration/codex/config-generator.js +66 -0
- package/dist/engine/ai-integration/codex/config-generator.js.map +1 -0
- package/dist/engine/ai-integration/codex/hooks-generator.d.ts +6 -0
- package/dist/engine/ai-integration/codex/hooks-generator.d.ts.map +1 -0
- package/dist/engine/ai-integration/codex/hooks-generator.js +55 -0
- package/dist/engine/ai-integration/codex/hooks-generator.js.map +1 -0
- package/dist/engine/ai-integration/codex/index.d.ts +5 -0
- package/dist/engine/ai-integration/codex/index.d.ts.map +1 -0
- package/dist/engine/ai-integration/codex/index.js +6 -0
- package/dist/engine/ai-integration/codex/index.js.map +1 -0
- package/dist/engine/ai-integration/continue/ai-checks-generator.d.ts +12 -0
- package/dist/engine/ai-integration/continue/ai-checks-generator.d.ts.map +1 -0
- package/dist/engine/ai-integration/continue/ai-checks-generator.js +63 -0
- package/dist/engine/ai-integration/continue/ai-checks-generator.js.map +1 -0
- package/dist/engine/ai-integration/continue/config-generator.d.ts +5 -0
- package/dist/engine/ai-integration/continue/config-generator.d.ts.map +1 -0
- package/dist/engine/ai-integration/continue/config-generator.js +56 -0
- package/dist/engine/ai-integration/continue/config-generator.js.map +1 -0
- package/dist/engine/ai-integration/continue/index.d.ts +5 -0
- package/dist/engine/ai-integration/continue/index.d.ts.map +1 -0
- package/dist/engine/ai-integration/continue/index.js +4 -0
- package/dist/engine/ai-integration/continue/index.js.map +1 -0
- package/dist/engine/ai-integration/cursor/cursorrules-generator.d.ts +5 -0
- package/dist/engine/ai-integration/cursor/cursorrules-generator.d.ts.map +1 -0
- package/dist/engine/ai-integration/cursor/cursorrules-generator.js +75 -0
- package/dist/engine/ai-integration/cursor/cursorrules-generator.js.map +1 -0
- package/dist/engine/ai-integration/detector.d.ts +5 -0
- package/dist/engine/ai-integration/detector.d.ts.map +1 -0
- package/dist/engine/ai-integration/detector.js +127 -0
- package/dist/engine/ai-integration/detector.js.map +1 -0
- package/dist/engine/ai-integration/gemini/extensions-advisor.d.ts +4 -0
- package/dist/engine/ai-integration/gemini/extensions-advisor.d.ts.map +1 -0
- package/dist/engine/ai-integration/gemini/extensions-advisor.js +64 -0
- package/dist/engine/ai-integration/gemini/extensions-advisor.js.map +1 -0
- package/dist/engine/ai-integration/gemini/gemini-md-generator.d.ts +4 -0
- package/dist/engine/ai-integration/gemini/gemini-md-generator.d.ts.map +1 -0
- package/dist/engine/ai-integration/gemini/gemini-md-generator.js +94 -0
- package/dist/engine/ai-integration/gemini/gemini-md-generator.js.map +1 -0
- package/dist/engine/ai-integration/gemini/index.d.ts +5 -0
- package/dist/engine/ai-integration/gemini/index.d.ts.map +1 -0
- package/dist/engine/ai-integration/gemini/index.js +6 -0
- package/dist/engine/ai-integration/gemini/index.js.map +1 -0
- package/dist/engine/ai-integration/gemini/policy-generator.d.ts +6 -0
- package/dist/engine/ai-integration/gemini/policy-generator.d.ts.map +1 -0
- package/dist/engine/ai-integration/gemini/policy-generator.js +63 -0
- package/dist/engine/ai-integration/gemini/policy-generator.js.map +1 -0
- package/dist/engine/ai-integration/gemini/settings-generator.d.ts +4 -0
- package/dist/engine/ai-integration/gemini/settings-generator.d.ts.map +1 -0
- package/dist/engine/ai-integration/gemini/settings-generator.js +191 -0
- package/dist/engine/ai-integration/gemini/settings-generator.js.map +1 -0
- package/dist/engine/ai-integration/github-copilot/index.d.ts +4 -0
- package/dist/engine/ai-integration/github-copilot/index.d.ts.map +1 -0
- package/dist/engine/ai-integration/github-copilot/index.js +5 -0
- package/dist/engine/ai-integration/github-copilot/index.js.map +1 -0
- package/dist/engine/ai-integration/github-copilot/instructions-generator.d.ts +5 -0
- package/dist/engine/ai-integration/github-copilot/instructions-generator.d.ts.map +1 -0
- package/dist/engine/ai-integration/github-copilot/instructions-generator.js +102 -0
- package/dist/engine/ai-integration/github-copilot/instructions-generator.js.map +1 -0
- package/dist/engine/ai-integration/github-copilot/prompt-files-generator.d.ts +11 -0
- package/dist/engine/ai-integration/github-copilot/prompt-files-generator.d.ts.map +1 -0
- package/dist/engine/ai-integration/github-copilot/prompt-files-generator.js +86 -0
- package/dist/engine/ai-integration/github-copilot/prompt-files-generator.js.map +1 -0
- package/dist/engine/ai-integration/github-copilot/workspace-bridge.d.ts +3 -0
- package/dist/engine/ai-integration/github-copilot/workspace-bridge.d.ts.map +1 -0
- package/dist/engine/ai-integration/github-copilot/workspace-bridge.js +39 -0
- package/dist/engine/ai-integration/github-copilot/workspace-bridge.js.map +1 -0
- package/dist/engine/ai-integration/kiro/hooks-generator.d.ts +6 -0
- package/dist/engine/ai-integration/kiro/hooks-generator.d.ts.map +1 -0
- package/dist/engine/ai-integration/kiro/hooks-generator.js +74 -0
- package/dist/engine/ai-integration/kiro/hooks-generator.js.map +1 -0
- package/dist/engine/ai-integration/kiro/index.d.ts +4 -0
- package/dist/engine/ai-integration/kiro/index.d.ts.map +1 -0
- package/dist/engine/ai-integration/kiro/index.js +5 -0
- package/dist/engine/ai-integration/kiro/index.js.map +1 -0
- package/dist/engine/ai-integration/kiro/spec-exporter.d.ts +6 -0
- package/dist/engine/ai-integration/kiro/spec-exporter.d.ts.map +1 -0
- package/dist/engine/ai-integration/kiro/spec-exporter.js +57 -0
- package/dist/engine/ai-integration/kiro/spec-exporter.js.map +1 -0
- package/dist/engine/ai-integration/kiro/steering-generator.d.ts +6 -0
- package/dist/engine/ai-integration/kiro/steering-generator.d.ts.map +1 -0
- package/dist/engine/ai-integration/kiro/steering-generator.js +112 -0
- package/dist/engine/ai-integration/kiro/steering-generator.js.map +1 -0
- package/dist/engine/ai-integration/mastra/agent-scaffold.d.ts +16 -0
- package/dist/engine/ai-integration/mastra/agent-scaffold.d.ts.map +1 -0
- package/dist/engine/ai-integration/mastra/agent-scaffold.js +111 -0
- package/dist/engine/ai-integration/mastra/agent-scaffold.js.map +1 -0
- package/dist/engine/ai-integration/mastra/config-generator.d.ts +12 -0
- package/dist/engine/ai-integration/mastra/config-generator.d.ts.map +1 -0
- package/dist/engine/ai-integration/mastra/config-generator.js +64 -0
- package/dist/engine/ai-integration/mastra/config-generator.js.map +1 -0
- package/dist/engine/ai-integration/mastra/index.d.ts +3 -0
- package/dist/engine/ai-integration/mastra/index.d.ts.map +1 -0
- package/dist/engine/ai-integration/mastra/index.js +4 -0
- package/dist/engine/ai-integration/mastra/index.js.map +1 -0
- package/dist/engine/ai-integration/universal-config-generator.d.ts +4 -0
- package/dist/engine/ai-integration/universal-config-generator.d.ts.map +1 -0
- package/dist/engine/ai-integration/universal-config-generator.js +87 -0
- package/dist/engine/ai-integration/universal-config-generator.js.map +1 -0
- package/dist/engine/ai-integration/windsurf/windsurfrules-generator.d.ts +5 -0
- package/dist/engine/ai-integration/windsurf/windsurfrules-generator.d.ts.map +1 -0
- package/dist/engine/ai-integration/windsurf/windsurfrules-generator.js +75 -0
- package/dist/engine/ai-integration/windsurf/windsurfrules-generator.js.map +1 -0
- package/dist/engine/api-spec-generator/ac-builder.d.ts +5 -0
- package/dist/engine/api-spec-generator/ac-builder.d.ts.map +1 -0
- package/dist/engine/api-spec-generator/ac-builder.js +114 -0
- package/dist/engine/api-spec-generator/ac-builder.js.map +1 -0
- package/dist/engine/api-spec-generator/graphql-parser.d.ts +3 -0
- package/dist/engine/api-spec-generator/graphql-parser.d.ts.map +1 -0
- package/dist/engine/api-spec-generator/graphql-parser.js +166 -0
- package/dist/engine/api-spec-generator/graphql-parser.js.map +1 -0
- package/dist/engine/api-spec-generator/openapi-parser.d.ts +3 -0
- package/dist/engine/api-spec-generator/openapi-parser.d.ts.map +1 -0
- package/dist/engine/api-spec-generator/openapi-parser.js +161 -0
- package/dist/engine/api-spec-generator/openapi-parser.js.map +1 -0
- package/dist/engine/approval-workflow.d.ts +21 -0
- package/dist/engine/approval-workflow.d.ts.map +1 -0
- package/dist/engine/approval-workflow.js +82 -0
- package/dist/engine/approval-workflow.js.map +1 -0
- package/dist/engine/best-practices-library.d.ts +31 -0
- package/dist/engine/best-practices-library.d.ts.map +1 -0
- package/dist/engine/best-practices-library.js +111 -0
- package/dist/engine/best-practices-library.js.map +1 -0
- package/dist/engine/confluence-exporter.d.ts +27 -0
- package/dist/engine/confluence-exporter.d.ts.map +1 -0
- package/dist/engine/confluence-exporter.js +238 -0
- package/dist/engine/confluence-exporter.js.map +1 -0
- package/dist/engine/cross-repo-searcher.d.ts +13 -0
- package/dist/engine/cross-repo-searcher.d.ts.map +1 -0
- package/dist/engine/cross-repo-searcher.js +51 -0
- package/dist/engine/cross-repo-searcher.js.map +1 -0
- package/dist/engine/desktop-notifier.d.ts +16 -0
- package/dist/engine/desktop-notifier.d.ts.map +1 -0
- package/dist/engine/desktop-notifier.js +64 -0
- package/dist/engine/desktop-notifier.js.map +1 -0
- package/dist/engine/domain-detector.d.ts +12 -0
- package/dist/engine/domain-detector.d.ts.map +1 -0
- package/dist/engine/domain-detector.js +286 -0
- package/dist/engine/domain-detector.js.map +1 -0
- package/dist/engine/email-digest-generator.d.ts +8 -0
- package/dist/engine/email-digest-generator.d.ts.map +1 -0
- package/dist/engine/email-digest-generator.js +192 -0
- package/dist/engine/email-digest-generator.js.map +1 -0
- package/dist/engine/email-sender.d.ts +22 -0
- package/dist/engine/email-sender.d.ts.map +1 -0
- package/dist/engine/email-sender.js +78 -0
- package/dist/engine/email-sender.js.map +1 -0
- package/dist/engine/estimation-calibrator.d.ts +19 -0
- package/dist/engine/estimation-calibrator.d.ts.map +1 -0
- package/dist/engine/estimation-calibrator.js +176 -0
- package/dist/engine/estimation-calibrator.js.map +1 -0
- package/dist/engine/hooks/custom-commands-generator.d.ts +11 -0
- package/dist/engine/hooks/custom-commands-generator.d.ts.map +1 -0
- package/dist/engine/hooks/custom-commands-generator.js +88 -0
- package/dist/engine/hooks/custom-commands-generator.js.map +1 -0
- package/dist/engine/hooks/effort-configurator.d.ts +13 -0
- package/dist/engine/hooks/effort-configurator.d.ts.map +1 -0
- package/dist/engine/hooks/effort-configurator.js +54 -0
- package/dist/engine/hooks/effort-configurator.js.map +1 -0
- package/dist/engine/hooks/full-spectrum-generator.d.ts +31 -0
- package/dist/engine/hooks/full-spectrum-generator.d.ts.map +1 -0
- package/dist/engine/hooks/full-spectrum-generator.js +115 -0
- package/dist/engine/hooks/full-spectrum-generator.js.map +1 -0
- package/dist/engine/hooks/profile-generator.d.ts +21 -0
- package/dist/engine/hooks/profile-generator.d.ts.map +1 -0
- package/dist/engine/hooks/profile-generator.js +90 -0
- package/dist/engine/hooks/profile-generator.js.map +1 -0
- package/dist/engine/ide-config/generators.d.ts.map +1 -1
- package/dist/engine/ide-config/generators.js +28 -1
- package/dist/engine/ide-config/generators.js.map +1 -1
- package/dist/engine/importers/csv-importer.d.ts +9 -0
- package/dist/engine/importers/csv-importer.d.ts.map +1 -0
- package/dist/engine/importers/csv-importer.js +116 -0
- package/dist/engine/importers/csv-importer.js.map +1 -0
- package/dist/engine/importers/jira-importer.d.ts +7 -0
- package/dist/engine/importers/jira-importer.d.ts.map +1 -0
- package/dist/engine/importers/jira-importer.js +57 -0
- package/dist/engine/importers/jira-importer.js.map +1 -0
- package/dist/engine/importers/linear-importer.d.ts +6 -0
- package/dist/engine/importers/linear-importer.d.ts.map +1 -0
- package/dist/engine/importers/linear-importer.js +59 -0
- package/dist/engine/importers/linear-importer.js.map +1 -0
- package/dist/engine/importers/markdown-importer.d.ts +7 -0
- package/dist/engine/importers/markdown-importer.d.ts.map +1 -0
- package/dist/engine/importers/markdown-importer.js +74 -0
- package/dist/engine/importers/markdown-importer.js.map +1 -0
- package/dist/engine/outbound-webhook-dispatcher.d.ts +4 -0
- package/dist/engine/outbound-webhook-dispatcher.d.ts.map +1 -0
- package/dist/engine/outbound-webhook-dispatcher.js +94 -0
- package/dist/engine/outbound-webhook-dispatcher.js.map +1 -0
- package/dist/engine/performance-analyzer.d.ts +18 -0
- package/dist/engine/performance-analyzer.d.ts.map +1 -0
- package/dist/engine/performance-analyzer.js +152 -0
- package/dist/engine/performance-analyzer.js.map +1 -0
- package/dist/engine/registry/composio-publisher.d.ts +17 -0
- package/dist/engine/registry/composio-publisher.d.ts.map +1 -0
- package/dist/engine/registry/composio-publisher.js +51 -0
- package/dist/engine/registry/composio-publisher.js.map +1 -0
- package/dist/engine/registry/glama-publisher.d.ts +17 -0
- package/dist/engine/registry/glama-publisher.d.ts.map +1 -0
- package/dist/engine/registry/glama-publisher.js +43 -0
- package/dist/engine/registry/glama-publisher.js.map +1 -0
- package/dist/engine/registry/index.d.ts +4 -0
- package/dist/engine/registry/index.d.ts.map +1 -1
- package/dist/engine/registry/index.js +5 -0
- package/dist/engine/registry/index.js.map +1 -1
- package/dist/engine/registry/mcp-official-publisher.d.ts +16 -0
- package/dist/engine/registry/mcp-official-publisher.d.ts.map +1 -0
- package/dist/engine/registry/mcp-official-publisher.js +44 -0
- package/dist/engine/registry/mcp-official-publisher.js.map +1 -0
- package/dist/engine/registry/smithery-generator.d.ts +16 -0
- package/dist/engine/registry/smithery-generator.d.ts.map +1 -0
- package/dist/engine/registry/smithery-generator.js +71 -0
- package/dist/engine/registry/smithery-generator.js.map +1 -0
- package/dist/engine/reverse-engineer/test-file-parser.d.ts +26 -0
- package/dist/engine/reverse-engineer/test-file-parser.d.ts.map +1 -0
- package/dist/engine/reverse-engineer/test-file-parser.js +165 -0
- package/dist/engine/reverse-engineer/test-file-parser.js.map +1 -0
- package/dist/engine/slack-dispatcher.d.ts +15 -0
- package/dist/engine/slack-dispatcher.d.ts.map +1 -0
- package/dist/engine/slack-dispatcher.js +73 -0
- package/dist/engine/slack-dispatcher.js.map +1 -0
- package/dist/engine/spec-differ.d.ts +15 -0
- package/dist/engine/spec-differ.d.ts.map +1 -0
- package/dist/engine/spec-differ.js +115 -0
- package/dist/engine/spec-differ.js.map +1 -0
- package/dist/engine/spec-exporter.d.ts +27 -0
- package/dist/engine/spec-exporter.d.ts.map +1 -0
- package/dist/engine/spec-exporter.js +122 -0
- package/dist/engine/spec-exporter.js.map +1 -0
- package/dist/engine/spec-searcher.d.ts +31 -0
- package/dist/engine/spec-searcher.d.ts.map +1 -0
- package/dist/engine/spec-searcher.js +240 -0
- package/dist/engine/spec-searcher.js.map +1 -0
- package/dist/engine/spec-splitter.d.ts +11 -1
- package/dist/engine/spec-splitter.d.ts.map +1 -1
- package/dist/engine/spec-splitter.js +178 -0
- package/dist/engine/spec-splitter.js.map +1 -1
- package/dist/engine/team-analytics-calculator.d.ts +14 -0
- package/dist/engine/team-analytics-calculator.d.ts.map +1 -0
- package/dist/engine/team-analytics-calculator.js +114 -0
- package/dist/engine/team-analytics-calculator.js.map +1 -0
- package/dist/engine/telemetry/error-reporter.d.ts +16 -0
- package/dist/engine/telemetry/error-reporter.d.ts.map +1 -0
- package/dist/engine/telemetry/error-reporter.js +46 -0
- package/dist/engine/telemetry/error-reporter.js.map +1 -0
- package/dist/engine/velocity-calculator.d.ts +44 -0
- package/dist/engine/velocity-calculator.d.ts.map +1 -0
- package/dist/engine/velocity-calculator.js +425 -0
- package/dist/engine/velocity-calculator.js.map +1 -0
- package/dist/index.js +44 -2
- package/dist/index.js.map +1 -1
- package/dist/storage/actuals-store.d.ts +8 -0
- package/dist/storage/actuals-store.d.ts.map +1 -0
- package/dist/storage/actuals-store.js +57 -0
- package/dist/storage/actuals-store.js.map +1 -0
- package/dist/storage/approval-store.d.ts +12 -0
- package/dist/storage/approval-store.d.ts.map +1 -0
- package/dist/storage/approval-store.js +46 -0
- package/dist/storage/approval-store.js.map +1 -0
- package/dist/storage/comments-store.d.ts +38 -0
- package/dist/storage/comments-store.d.ts.map +1 -0
- package/dist/storage/comments-store.js +167 -0
- package/dist/storage/comments-store.js.map +1 -0
- package/dist/storage/confluence-store.d.ts +35 -0
- package/dist/storage/confluence-store.d.ts.map +1 -0
- package/dist/storage/confluence-store.js +85 -0
- package/dist/storage/confluence-store.js.map +1 -0
- package/dist/storage/desktop-notification-store.d.ts +19 -0
- package/dist/storage/desktop-notification-store.d.ts.map +1 -0
- package/dist/storage/desktop-notification-store.js +44 -0
- package/dist/storage/desktop-notification-store.js.map +1 -0
- package/dist/storage/email-digest-store.d.ts +19 -0
- package/dist/storage/email-digest-store.d.ts.map +1 -0
- package/dist/storage/email-digest-store.js +51 -0
- package/dist/storage/email-digest-store.js.map +1 -0
- package/dist/storage/global-projects-store.d.ts +27 -0
- package/dist/storage/global-projects-store.d.ts.map +1 -0
- package/dist/storage/global-projects-store.js +78 -0
- package/dist/storage/global-projects-store.js.map +1 -0
- package/dist/storage/index.d.ts +2 -0
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +2 -0
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/outbound-webhook-store.d.ts +9 -0
- package/dist/storage/outbound-webhook-store.d.ts.map +1 -0
- package/dist/storage/outbound-webhook-store.js +105 -0
- package/dist/storage/outbound-webhook-store.js.map +1 -0
- package/dist/storage/slack-store.d.ts +22 -0
- package/dist/storage/slack-store.d.ts.map +1 -0
- package/dist/storage/slack-store.js +55 -0
- package/dist/storage/slack-store.js.map +1 -0
- package/dist/storage/spec-lock-store.d.ts +22 -0
- package/dist/storage/spec-lock-store.d.ts.map +1 -0
- package/dist/storage/spec-lock-store.js +99 -0
- package/dist/storage/spec-lock-store.js.map +1 -0
- package/dist/tools/ai-ecosystem-status.d.ts +13 -0
- package/dist/tools/ai-ecosystem-status.d.ts.map +1 -0
- package/dist/tools/ai-ecosystem-status.js +219 -0
- package/dist/tools/ai-ecosystem-status.js.map +1 -0
- package/dist/tools/api-spec-generator-handler.d.ts +3 -0
- package/dist/tools/api-spec-generator-handler.d.ts.map +1 -0
- package/dist/tools/api-spec-generator-handler.js +193 -0
- package/dist/tools/api-spec-generator-handler.js.map +1 -0
- package/dist/tools/approval-handler.d.ts +6 -0
- package/dist/tools/approval-handler.d.ts.map +1 -0
- package/dist/tools/approval-handler.js +193 -0
- package/dist/tools/approval-handler.js.map +1 -0
- package/dist/tools/checkpoint-handler.d.ts.map +1 -1
- package/dist/tools/checkpoint-handler.js +20 -0
- package/dist/tools/checkpoint-handler.js.map +1 -1
- package/dist/tools/comments-handler.d.ts +6 -0
- package/dist/tools/comments-handler.d.ts.map +1 -0
- package/dist/tools/comments-handler.js +137 -0
- package/dist/tools/comments-handler.js.map +1 -0
- package/dist/tools/confluence-handler.d.ts +6 -0
- package/dist/tools/confluence-handler.d.ts.map +1 -0
- package/dist/tools/confluence-handler.js +220 -0
- package/dist/tools/confluence-handler.js.map +1 -0
- package/dist/tools/cross-repo-search-handler.d.ts +19 -0
- package/dist/tools/cross-repo-search-handler.d.ts.map +1 -0
- package/dist/tools/cross-repo-search-handler.js +151 -0
- package/dist/tools/cross-repo-search-handler.js.map +1 -0
- package/dist/tools/desktop-notification-handler.d.ts +17 -0
- package/dist/tools/desktop-notification-handler.d.ts.map +1 -0
- package/dist/tools/desktop-notification-handler.js +90 -0
- package/dist/tools/desktop-notification-handler.js.map +1 -0
- package/dist/tools/domain-criteria-handler.d.ts +16 -0
- package/dist/tools/domain-criteria-handler.d.ts.map +1 -0
- package/dist/tools/domain-criteria-handler.js +216 -0
- package/dist/tools/domain-criteria-handler.js.map +1 -0
- package/dist/tools/email-digest-handler.d.ts +6 -0
- package/dist/tools/email-digest-handler.d.ts.map +1 -0
- package/dist/tools/email-digest-handler.js +198 -0
- package/dist/tools/email-digest-handler.js.map +1 -0
- package/dist/tools/estimate.d.ts.map +1 -1
- package/dist/tools/estimate.js +22 -0
- package/dist/tools/estimate.js.map +1 -1
- package/dist/tools/estimation-accuracy-handler.d.ts +5 -0
- package/dist/tools/estimation-accuracy-handler.d.ts.map +1 -0
- package/dist/tools/estimation-accuracy-handler.js +171 -0
- package/dist/tools/estimation-accuracy-handler.js.map +1 -0
- package/dist/tools/generate-automation-guide.d.ts.map +1 -1
- package/dist/tools/generate-automation-guide.js +44 -0
- package/dist/tools/generate-automation-guide.js.map +1 -1
- package/dist/tools/import-spec-handler.d.ts +10 -0
- package/dist/tools/import-spec-handler.d.ts.map +1 -0
- package/dist/tools/import-spec-handler.js +242 -0
- package/dist/tools/import-spec-handler.js.map +1 -0
- package/dist/tools/init-project/claude-md-generator.d.ts +1 -0
- package/dist/tools/init-project/claude-md-generator.d.ts.map +1 -1
- package/dist/tools/init-project/claude-md-generator.js +35 -0
- package/dist/tools/init-project/claude-md-generator.js.map +1 -1
- package/dist/tools/init-project/planu-workflow-generator.d.ts.map +1 -1
- package/dist/tools/init-project/planu-workflow-generator.js +11 -0
- package/dist/tools/init-project/planu-workflow-generator.js.map +1 -1
- package/dist/tools/init-project/rules-generator.d.ts +11 -0
- package/dist/tools/init-project/rules-generator.d.ts.map +1 -1
- package/dist/tools/init-project/rules-generator.js +79 -0
- package/dist/tools/init-project/rules-generator.js.map +1 -1
- package/dist/tools/init-project/scaffold-writer.d.ts +1 -0
- package/dist/tools/init-project/scaffold-writer.d.ts.map +1 -1
- package/dist/tools/init-project/scaffold-writer.js +10 -1
- package/dist/tools/init-project/scaffold-writer.js.map +1 -1
- package/dist/tools/list-specs.d.ts.map +1 -1
- package/dist/tools/list-specs.js +11 -1
- package/dist/tools/list-specs.js.map +1 -1
- package/dist/tools/outbound-webhook-handler.d.ts +13 -0
- package/dist/tools/outbound-webhook-handler.d.ts.map +1 -0
- package/dist/tools/outbound-webhook-handler.js +161 -0
- package/dist/tools/outbound-webhook-handler.js.map +1 -0
- package/dist/tools/performance-analysis-handler.d.ts +3 -0
- package/dist/tools/performance-analysis-handler.d.ts.map +1 -0
- package/dist/tools/performance-analysis-handler.js +95 -0
- package/dist/tools/performance-analysis-handler.js.map +1 -0
- package/dist/tools/register-api-spec-generator.d.ts +3 -0
- package/dist/tools/register-api-spec-generator.d.ts.map +1 -0
- package/dist/tools/register-api-spec-generator.js +49 -0
- package/dist/tools/register-api-spec-generator.js.map +1 -0
- package/dist/tools/register-approval-tools.d.ts +3 -0
- package/dist/tools/register-approval-tools.d.ts.map +1 -0
- package/dist/tools/register-approval-tools.js +87 -0
- package/dist/tools/register-approval-tools.js.map +1 -0
- package/dist/tools/register-comments-tools.d.ts +3 -0
- package/dist/tools/register-comments-tools.d.ts.map +1 -0
- package/dist/tools/register-comments-tools.js +79 -0
- package/dist/tools/register-comments-tools.js.map +1 -0
- package/dist/tools/register-confluence-tools.d.ts +3 -0
- package/dist/tools/register-confluence-tools.d.ts.map +1 -0
- package/dist/tools/register-confluence-tools.js +62 -0
- package/dist/tools/register-confluence-tools.js.map +1 -0
- package/dist/tools/register-cross-repo-search-tools.d.ts +10 -0
- package/dist/tools/register-cross-repo-search-tools.d.ts.map +1 -0
- package/dist/tools/register-cross-repo-search-tools.js +82 -0
- package/dist/tools/register-cross-repo-search-tools.js.map +1 -0
- package/dist/tools/register-desktop-notification-tools.d.ts +3 -0
- package/dist/tools/register-desktop-notification-tools.d.ts.map +1 -0
- package/dist/tools/register-desktop-notification-tools.js +56 -0
- package/dist/tools/register-desktop-notification-tools.js.map +1 -0
- package/dist/tools/register-domain-criteria-tools.d.ts +3 -0
- package/dist/tools/register-domain-criteria-tools.d.ts.map +1 -0
- package/dist/tools/register-domain-criteria-tools.js +46 -0
- package/dist/tools/register-domain-criteria-tools.js.map +1 -0
- package/dist/tools/register-email-digest-tools.d.ts +3 -0
- package/dist/tools/register-email-digest-tools.d.ts.map +1 -0
- package/dist/tools/register-email-digest-tools.js +109 -0
- package/dist/tools/register-email-digest-tools.js.map +1 -0
- package/dist/tools/register-estimation-accuracy-tools.d.ts +3 -0
- package/dist/tools/register-estimation-accuracy-tools.d.ts.map +1 -0
- package/dist/tools/register-estimation-accuracy-tools.js +71 -0
- package/dist/tools/register-estimation-accuracy-tools.js.map +1 -0
- package/dist/tools/register-import-tools.d.ts +3 -0
- package/dist/tools/register-import-tools.d.ts.map +1 -0
- package/dist/tools/register-import-tools.js +63 -0
- package/dist/tools/register-import-tools.js.map +1 -0
- package/dist/tools/register-outbound-webhook-tools.d.ts +3 -0
- package/dist/tools/register-outbound-webhook-tools.d.ts.map +1 -0
- package/dist/tools/register-outbound-webhook-tools.js +79 -0
- package/dist/tools/register-outbound-webhook-tools.js.map +1 -0
- package/dist/tools/register-performance-analysis-tools.d.ts +3 -0
- package/dist/tools/register-performance-analysis-tools.d.ts.map +1 -0
- package/dist/tools/register-performance-analysis-tools.js +24 -0
- package/dist/tools/register-performance-analysis-tools.js.map +1 -0
- package/dist/tools/register-slack-tools.d.ts +3 -0
- package/dist/tools/register-slack-tools.d.ts.map +1 -0
- package/dist/tools/register-slack-tools.js +55 -0
- package/dist/tools/register-slack-tools.js.map +1 -0
- package/dist/tools/register-spec-export-tools.d.ts +3 -0
- package/dist/tools/register-spec-export-tools.d.ts.map +1 -0
- package/dist/tools/register-spec-export-tools.js +67 -0
- package/dist/tools/register-spec-export-tools.js.map +1 -0
- package/dist/tools/register-spec-lock-tools.d.ts +3 -0
- package/dist/tools/register-spec-lock-tools.d.ts.map +1 -0
- package/dist/tools/register-spec-lock-tools.js +72 -0
- package/dist/tools/register-spec-lock-tools.js.map +1 -0
- package/dist/tools/register-spec-search-tools.d.ts +3 -0
- package/dist/tools/register-spec-search-tools.d.ts.map +1 -0
- package/dist/tools/register-spec-search-tools.js +122 -0
- package/dist/tools/register-spec-search-tools.js.map +1 -0
- package/dist/tools/register-spec-split-tools.d.ts +3 -0
- package/dist/tools/register-spec-split-tools.d.ts.map +1 -0
- package/dist/tools/register-spec-split-tools.js +51 -0
- package/dist/tools/register-spec-split-tools.js.map +1 -0
- package/dist/tools/register-spec-tools/core-spec-tools.d.ts.map +1 -1
- package/dist/tools/register-spec-tools/core-spec-tools.js +20 -2
- package/dist/tools/register-spec-tools/core-spec-tools.js.map +1 -1
- package/dist/tools/register-team-analytics-tools.d.ts +3 -0
- package/dist/tools/register-team-analytics-tools.d.ts.map +1 -0
- package/dist/tools/register-team-analytics-tools.js +37 -0
- package/dist/tools/register-team-analytics-tools.js.map +1 -0
- package/dist/tools/register-test-reverse-engineer-tools.d.ts +3 -0
- package/dist/tools/register-test-reverse-engineer-tools.d.ts.map +1 -0
- package/dist/tools/register-test-reverse-engineer-tools.js +10 -0
- package/dist/tools/register-test-reverse-engineer-tools.js.map +1 -0
- package/dist/tools/register-velocity-tools.d.ts +3 -0
- package/dist/tools/register-velocity-tools.d.ts.map +1 -0
- package/dist/tools/register-velocity-tools.js +72 -0
- package/dist/tools/register-velocity-tools.js.map +1 -0
- package/dist/tools/register-versioning-tools.d.ts.map +1 -1
- package/dist/tools/register-versioning-tools.js +55 -0
- package/dist/tools/register-versioning-tools.js.map +1 -1
- package/dist/tools/safe-handler.d.ts.map +1 -1
- package/dist/tools/safe-handler.js +5 -0
- package/dist/tools/safe-handler.js.map +1 -1
- package/dist/tools/schemas/ide-config.d.ts +2 -0
- package/dist/tools/schemas/ide-config.d.ts.map +1 -1
- package/dist/tools/schemas/ide-config.js +2 -1
- package/dist/tools/schemas/ide-config.js.map +1 -1
- package/dist/tools/schemas/output-schemas.d.ts +24 -0
- package/dist/tools/schemas/output-schemas.d.ts.map +1 -1
- package/dist/tools/schemas/output-schemas.js +30 -0
- package/dist/tools/schemas/output-schemas.js.map +1 -1
- package/dist/tools/search-handler.d.ts +4 -0
- package/dist/tools/search-handler.d.ts.map +1 -0
- package/dist/tools/search-handler.js +62 -0
- package/dist/tools/search-handler.js.map +1 -0
- package/dist/tools/slack-handler.d.ts +6 -0
- package/dist/tools/slack-handler.d.ts.map +1 -0
- package/dist/tools/slack-handler.js +162 -0
- package/dist/tools/slack-handler.js.map +1 -0
- package/dist/tools/spec-diff-handler.d.ts +6 -0
- package/dist/tools/spec-diff-handler.d.ts.map +1 -0
- package/dist/tools/spec-diff-handler.js +94 -0
- package/dist/tools/spec-diff-handler.js.map +1 -0
- package/dist/tools/spec-export-handler.d.ts +5 -0
- package/dist/tools/spec-export-handler.d.ts.map +1 -0
- package/dist/tools/spec-export-handler.js +64 -0
- package/dist/tools/spec-export-handler.js.map +1 -0
- package/dist/tools/spec-lock-handler.d.ts +10 -0
- package/dist/tools/spec-lock-handler.d.ts.map +1 -0
- package/dist/tools/spec-lock-handler.js +163 -0
- package/dist/tools/spec-lock-handler.js.map +1 -0
- package/dist/tools/spec-split-handler.d.ts +4 -0
- package/dist/tools/spec-split-handler.d.ts.map +1 -0
- package/dist/tools/spec-split-handler.js +250 -0
- package/dist/tools/spec-split-handler.js.map +1 -0
- package/dist/tools/status-handler.d.ts.map +1 -1
- package/dist/tools/status-handler.js +40 -3
- package/dist/tools/status-handler.js.map +1 -1
- package/dist/tools/sync-ai-configs.d.ts +15 -0
- package/dist/tools/sync-ai-configs.d.ts.map +1 -0
- package/dist/tools/sync-ai-configs.js +86 -0
- package/dist/tools/sync-ai-configs.js.map +1 -0
- package/dist/tools/team-analytics-handler.d.ts +5 -0
- package/dist/tools/team-analytics-handler.d.ts.map +1 -0
- package/dist/tools/team-analytics-handler.js +67 -0
- package/dist/tools/team-analytics-handler.js.map +1 -0
- package/dist/tools/test-reverse-engineer-handler.d.ts +15 -0
- package/dist/tools/test-reverse-engineer-handler.d.ts.map +1 -0
- package/dist/tools/test-reverse-engineer-handler.js +94 -0
- package/dist/tools/test-reverse-engineer-handler.js.map +1 -0
- package/dist/tools/update-status/index.d.ts.map +1 -1
- package/dist/tools/update-status/index.js +135 -20
- package/dist/tools/update-status/index.js.map +1 -1
- package/dist/tools/update-status/response-builder.d.ts +1 -1
- package/dist/tools/update-status/response-builder.d.ts.map +1 -1
- package/dist/tools/update-status/response-builder.js +4 -1
- package/dist/tools/update-status/response-builder.js.map +1 -1
- package/dist/tools/update-status/side-effects.d.ts.map +1 -1
- package/dist/tools/update-status/side-effects.js +71 -0
- package/dist/tools/update-status/side-effects.js.map +1 -1
- package/dist/tools/update-status/transition-guard.d.ts +8 -0
- package/dist/tools/update-status/transition-guard.d.ts.map +1 -1
- package/dist/tools/update-status/transition-guard.js +23 -0
- package/dist/tools/update-status/transition-guard.js.map +1 -1
- package/dist/tools/update-status-actions.d.ts +1 -0
- package/dist/tools/update-status-actions.d.ts.map +1 -1
- package/dist/tools/update-status-actions.js +15 -1
- package/dist/tools/update-status-actions.js.map +1 -1
- package/dist/tools/velocity-handler.d.ts +4 -0
- package/dist/tools/velocity-handler.d.ts.map +1 -0
- package/dist/tools/velocity-handler.js +103 -0
- package/dist/tools/velocity-handler.js.map +1 -0
- package/dist/types/actuals.d.ts +100 -0
- package/dist/types/actuals.d.ts.map +1 -0
- package/dist/types/actuals.js +2 -0
- package/dist/types/actuals.js.map +1 -0
- package/dist/types/agent-frameworks.d.ts +62 -0
- package/dist/types/agent-frameworks.d.ts.map +1 -0
- package/dist/types/agent-frameworks.js +3 -0
- package/dist/types/agent-frameworks.js.map +1 -0
- package/dist/types/agents-md.d.ts +20 -0
- package/dist/types/agents-md.d.ts.map +1 -0
- package/dist/types/agents-md.js +3 -0
- package/dist/types/agents-md.js.map +1 -0
- package/dist/types/ai-integration.d.ts +65 -0
- package/dist/types/ai-integration.d.ts.map +1 -0
- package/dist/types/ai-integration.js +3 -0
- package/dist/types/ai-integration.js.map +1 -0
- package/dist/types/api-contract.d.ts +154 -0
- package/dist/types/api-contract.d.ts.map +1 -0
- package/dist/types/api-contract.js +3 -0
- package/dist/types/api-contract.js.map +1 -0
- package/dist/types/approval.d.ts +82 -0
- package/dist/types/approval.d.ts.map +1 -0
- package/dist/types/approval.js +3 -0
- package/dist/types/approval.js.map +1 -0
- package/dist/types/cline-integration.d.ts +30 -0
- package/dist/types/cline-integration.d.ts.map +1 -0
- package/dist/types/cline-integration.js +3 -0
- package/dist/types/cline-integration.js.map +1 -0
- package/dist/types/codex-integration.d.ts +55 -0
- package/dist/types/codex-integration.d.ts.map +1 -0
- package/dist/types/codex-integration.js +3 -0
- package/dist/types/codex-integration.js.map +1 -0
- package/dist/types/comments.d.ts +68 -0
- package/dist/types/comments.d.ts.map +1 -0
- package/dist/types/comments.js +3 -0
- package/dist/types/comments.js.map +1 -0
- package/dist/types/confluence.d.ts +102 -0
- package/dist/types/confluence.d.ts.map +1 -0
- package/dist/types/confluence.js +3 -0
- package/dist/types/confluence.js.map +1 -0
- package/dist/types/cross-repo-search.d.ts +104 -0
- package/dist/types/cross-repo-search.d.ts.map +1 -0
- package/dist/types/cross-repo-search.js +2 -0
- package/dist/types/cross-repo-search.js.map +1 -0
- package/dist/types/desktop-notification.d.ts +38 -0
- package/dist/types/desktop-notification.d.ts.map +1 -0
- package/dist/types/desktop-notification.js +3 -0
- package/dist/types/desktop-notification.js.map +1 -0
- package/dist/types/domain-criteria.d.ts +62 -0
- package/dist/types/domain-criteria.d.ts.map +1 -0
- package/dist/types/domain-criteria.js +3 -0
- package/dist/types/domain-criteria.js.map +1 -0
- package/dist/types/email-digest.d.ts +119 -0
- package/dist/types/email-digest.d.ts.map +1 -0
- package/dist/types/email-digest.js +3 -0
- package/dist/types/email-digest.js.map +1 -0
- package/dist/types/gemini-integration.d.ts +40 -0
- package/dist/types/gemini-integration.d.ts.map +1 -0
- package/dist/types/gemini-integration.js +3 -0
- package/dist/types/gemini-integration.js.map +1 -0
- package/dist/types/github-copilot-integration.d.ts +30 -0
- package/dist/types/github-copilot-integration.d.ts.map +1 -0
- package/dist/types/github-copilot-integration.js +3 -0
- package/dist/types/github-copilot-integration.js.map +1 -0
- package/dist/types/hooks-advanced.d.ts +34 -0
- package/dist/types/hooks-advanced.d.ts.map +1 -0
- package/dist/types/hooks-advanced.js +3 -0
- package/dist/types/hooks-advanced.js.map +1 -0
- package/dist/types/ide.d.ts +1 -1
- package/dist/types/ide.d.ts.map +1 -1
- package/dist/types/import-spec.d.ts +123 -0
- package/dist/types/import-spec.d.ts.map +1 -0
- package/dist/types/import-spec.js +3 -0
- package/dist/types/import-spec.js.map +1 -0
- package/dist/types/index.d.ts +29 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +29 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/kiro-integration.d.ts +44 -0
- package/dist/types/kiro-integration.d.ts.map +1 -0
- package/dist/types/kiro-integration.js +3 -0
- package/dist/types/kiro-integration.js.map +1 -0
- package/dist/types/outbound-webhook.d.ts +51 -0
- package/dist/types/outbound-webhook.d.ts.map +1 -0
- package/dist/types/outbound-webhook.js +3 -0
- package/dist/types/outbound-webhook.js.map +1 -0
- package/dist/types/performance-analysis.d.ts +33 -0
- package/dist/types/performance-analysis.d.ts.map +1 -0
- package/dist/types/performance-analysis.js +3 -0
- package/dist/types/performance-analysis.js.map +1 -0
- package/dist/types/registry-publishers.d.ts +63 -0
- package/dist/types/registry-publishers.d.ts.map +1 -0
- package/dist/types/registry-publishers.js +4 -0
- package/dist/types/registry-publishers.js.map +1 -0
- package/dist/types/search.d.ts +49 -0
- package/dist/types/search.d.ts.map +1 -0
- package/dist/types/search.js +3 -0
- package/dist/types/search.js.map +1 -0
- package/dist/types/slack.d.ts +41 -0
- package/dist/types/slack.d.ts.map +1 -0
- package/dist/types/slack.js +3 -0
- package/dist/types/slack.js.map +1 -0
- package/dist/types/spec/inputs.d.ts +46 -2
- package/dist/types/spec/inputs.d.ts.map +1 -1
- package/dist/types/spec-export.d.ts +18 -0
- package/dist/types/spec-export.d.ts.map +1 -0
- package/dist/types/spec-export.js +3 -0
- package/dist/types/spec-export.js.map +1 -0
- package/dist/types/spec-lock.d.ts +42 -0
- package/dist/types/spec-lock.d.ts.map +1 -0
- package/dist/types/spec-lock.js +3 -0
- package/dist/types/spec-lock.js.map +1 -0
- package/dist/types/spec-versioning.d.ts +35 -0
- package/dist/types/spec-versioning.d.ts.map +1 -1
- package/dist/types/team-analytics.d.ts +52 -0
- package/dist/types/team-analytics.d.ts.map +1 -0
- package/dist/types/team-analytics.js +3 -0
- package/dist/types/team-analytics.js.map +1 -0
- package/dist/types/telemetry.d.ts +1 -1
- package/dist/types/telemetry.d.ts.map +1 -1
- package/dist/types/test-reverse-engineer.d.ts +32 -0
- package/dist/types/test-reverse-engineer.d.ts.map +1 -0
- package/dist/types/test-reverse-engineer.js +3 -0
- package/dist/types/test-reverse-engineer.js.map +1 -0
- package/dist/types/velocity.d.ts +147 -0
- package/dist/types/velocity.d.ts.map +1 -0
- package/dist/types/velocity.js +4 -0
- package/dist/types/velocity.js.map +1 -0
- package/package.json +1 -1
- package/src/config/domain-best-practices.json +413 -0
- package/src/config/ide-registry.json +25 -0
- package/src/config/license-plans.json +59 -2
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
// engine/domain-detector.ts — Detects spec domains from title + description (SPEC-290)
|
|
2
|
+
//
|
|
3
|
+
// Analyzes spec text to identify which technical domains apply.
|
|
4
|
+
// Detection is keyword-based and returns evidence for each domain found.
|
|
5
|
+
const DOMAIN_KEYWORDS = [
|
|
6
|
+
{
|
|
7
|
+
domain: 'payments',
|
|
8
|
+
keywords: [
|
|
9
|
+
'payment',
|
|
10
|
+
'payments',
|
|
11
|
+
'stripe',
|
|
12
|
+
'paypal',
|
|
13
|
+
'billing',
|
|
14
|
+
'invoice',
|
|
15
|
+
'checkout',
|
|
16
|
+
'subscription',
|
|
17
|
+
'transaction',
|
|
18
|
+
'charge',
|
|
19
|
+
'refund',
|
|
20
|
+
'pci',
|
|
21
|
+
'credit card',
|
|
22
|
+
'debit card',
|
|
23
|
+
'wallet',
|
|
24
|
+
'purchase',
|
|
25
|
+
],
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
domain: 'authentication',
|
|
29
|
+
keywords: [
|
|
30
|
+
'authentication',
|
|
31
|
+
'login',
|
|
32
|
+
'logout',
|
|
33
|
+
'sign in',
|
|
34
|
+
'sign up',
|
|
35
|
+
'register',
|
|
36
|
+
'password',
|
|
37
|
+
'credentials',
|
|
38
|
+
'jwt',
|
|
39
|
+
'oauth',
|
|
40
|
+
'saml',
|
|
41
|
+
'sso',
|
|
42
|
+
'mfa',
|
|
43
|
+
'2fa',
|
|
44
|
+
'two factor',
|
|
45
|
+
'magic link',
|
|
46
|
+
],
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
domain: 'authorization',
|
|
50
|
+
keywords: [
|
|
51
|
+
'authorization',
|
|
52
|
+
'permission',
|
|
53
|
+
'role',
|
|
54
|
+
'rbac',
|
|
55
|
+
'abac',
|
|
56
|
+
'access control',
|
|
57
|
+
'acl',
|
|
58
|
+
'privilege',
|
|
59
|
+
'grant',
|
|
60
|
+
'revoke',
|
|
61
|
+
'policy',
|
|
62
|
+
'can i',
|
|
63
|
+
],
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
domain: 'file-upload',
|
|
67
|
+
keywords: [
|
|
68
|
+
'file upload',
|
|
69
|
+
'upload',
|
|
70
|
+
'attachment',
|
|
71
|
+
'file storage',
|
|
72
|
+
'blob',
|
|
73
|
+
's3',
|
|
74
|
+
'gcs',
|
|
75
|
+
'azure blob',
|
|
76
|
+
'media upload',
|
|
77
|
+
'image upload',
|
|
78
|
+
'document upload',
|
|
79
|
+
'multipart',
|
|
80
|
+
],
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
domain: 'email',
|
|
84
|
+
keywords: [
|
|
85
|
+
'email',
|
|
86
|
+
'e-mail',
|
|
87
|
+
'smtp',
|
|
88
|
+
'sendgrid',
|
|
89
|
+
'mailgun',
|
|
90
|
+
'ses',
|
|
91
|
+
'newsletter',
|
|
92
|
+
'transactional email',
|
|
93
|
+
'email template',
|
|
94
|
+
'inbox',
|
|
95
|
+
'mailer',
|
|
96
|
+
],
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
domain: 'notifications',
|
|
100
|
+
keywords: [
|
|
101
|
+
'notification',
|
|
102
|
+
'push notification',
|
|
103
|
+
'fcm',
|
|
104
|
+
'apns',
|
|
105
|
+
'alert',
|
|
106
|
+
'in-app notification',
|
|
107
|
+
'toast',
|
|
108
|
+
'bell icon',
|
|
109
|
+
'notify',
|
|
110
|
+
],
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
domain: 'search',
|
|
114
|
+
keywords: [
|
|
115
|
+
'search',
|
|
116
|
+
'full-text search',
|
|
117
|
+
'elasticsearch',
|
|
118
|
+
'algolia',
|
|
119
|
+
'meilisearch',
|
|
120
|
+
'typesense',
|
|
121
|
+
'solr',
|
|
122
|
+
'query',
|
|
123
|
+
'filter results',
|
|
124
|
+
'autocomplete',
|
|
125
|
+
'typeahead',
|
|
126
|
+
],
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
domain: 'mobile-offline',
|
|
130
|
+
keywords: [
|
|
131
|
+
'offline',
|
|
132
|
+
'offline first',
|
|
133
|
+
'offline mode',
|
|
134
|
+
'sync',
|
|
135
|
+
'synchronization',
|
|
136
|
+
'local database',
|
|
137
|
+
'sqlite',
|
|
138
|
+
'realm',
|
|
139
|
+
'pouchdb',
|
|
140
|
+
'service worker',
|
|
141
|
+
'cache first',
|
|
142
|
+
'background sync',
|
|
143
|
+
],
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
domain: 'realtime',
|
|
147
|
+
keywords: [
|
|
148
|
+
'realtime',
|
|
149
|
+
'real-time',
|
|
150
|
+
'websocket',
|
|
151
|
+
'socket.io',
|
|
152
|
+
'sse',
|
|
153
|
+
'server-sent events',
|
|
154
|
+
'live update',
|
|
155
|
+
'live feed',
|
|
156
|
+
'pub/sub',
|
|
157
|
+
'presence',
|
|
158
|
+
'collaborative',
|
|
159
|
+
'live collaboration',
|
|
160
|
+
],
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
domain: 'background-jobs',
|
|
164
|
+
keywords: [
|
|
165
|
+
'background job',
|
|
166
|
+
'queue',
|
|
167
|
+
'worker',
|
|
168
|
+
'cron',
|
|
169
|
+
'scheduled task',
|
|
170
|
+
'bull',
|
|
171
|
+
'celery',
|
|
172
|
+
'sidekiq',
|
|
173
|
+
'job processor',
|
|
174
|
+
'async job',
|
|
175
|
+
'job runner',
|
|
176
|
+
'task queue',
|
|
177
|
+
'message queue',
|
|
178
|
+
],
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
domain: 'api-public',
|
|
182
|
+
keywords: [
|
|
183
|
+
'public api',
|
|
184
|
+
'rest api',
|
|
185
|
+
'graphql api',
|
|
186
|
+
'api key',
|
|
187
|
+
'third-party integration',
|
|
188
|
+
'webhook',
|
|
189
|
+
'sdk',
|
|
190
|
+
'developer portal',
|
|
191
|
+
'external api',
|
|
192
|
+
'openapi',
|
|
193
|
+
],
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
domain: 'data-export',
|
|
197
|
+
keywords: [
|
|
198
|
+
'export',
|
|
199
|
+
'download',
|
|
200
|
+
'report',
|
|
201
|
+
'csv export',
|
|
202
|
+
'excel export',
|
|
203
|
+
'data export',
|
|
204
|
+
'bulk export',
|
|
205
|
+
'generate report',
|
|
206
|
+
'export data',
|
|
207
|
+
],
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
domain: 'multi-tenant',
|
|
211
|
+
keywords: [
|
|
212
|
+
'multi-tenant',
|
|
213
|
+
'multitenant',
|
|
214
|
+
'tenant',
|
|
215
|
+
'organization',
|
|
216
|
+
'workspace',
|
|
217
|
+
'team isolation',
|
|
218
|
+
'account isolation',
|
|
219
|
+
'saas',
|
|
220
|
+
],
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
domain: 'gdpr',
|
|
224
|
+
keywords: [
|
|
225
|
+
'gdpr',
|
|
226
|
+
'privacy',
|
|
227
|
+
'personal data',
|
|
228
|
+
'pii',
|
|
229
|
+
'data protection',
|
|
230
|
+
'right to erasure',
|
|
231
|
+
'right to be forgotten',
|
|
232
|
+
'consent',
|
|
233
|
+
'dpa',
|
|
234
|
+
'data subject',
|
|
235
|
+
'data processor',
|
|
236
|
+
'ccpa',
|
|
237
|
+
'lgpd',
|
|
238
|
+
],
|
|
239
|
+
},
|
|
240
|
+
];
|
|
241
|
+
// ---------------------------------------------------------------------------
|
|
242
|
+
// Public API
|
|
243
|
+
// ---------------------------------------------------------------------------
|
|
244
|
+
/**
|
|
245
|
+
* Detect domains from spec title + description text.
|
|
246
|
+
* Returns each detected domain with the matching keywords as evidence.
|
|
247
|
+
*/
|
|
248
|
+
export function detectDomains(title, description) {
|
|
249
|
+
const combinedText = `${title} ${description}`;
|
|
250
|
+
const lower = combinedText.toLowerCase();
|
|
251
|
+
const domains = [];
|
|
252
|
+
const evidence = {};
|
|
253
|
+
for (const entry of DOMAIN_KEYWORDS) {
|
|
254
|
+
const matched = entry.keywords.filter((kw) => lower.includes(kw.toLowerCase()));
|
|
255
|
+
if (matched.length > 0) {
|
|
256
|
+
domains.push(entry.domain);
|
|
257
|
+
evidence[entry.domain] = matched;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return { domains, evidence, analyzedText: combinedText };
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Detect a single dominant domain (highest keyword hit count).
|
|
264
|
+
* Returns null if no domain is detected.
|
|
265
|
+
*/
|
|
266
|
+
export function detectPrimaryDomain(title, description) {
|
|
267
|
+
const result = detectDomains(title, description);
|
|
268
|
+
if (result.domains.length === 0) {
|
|
269
|
+
return null;
|
|
270
|
+
}
|
|
271
|
+
const firstDomain = result.domains[0];
|
|
272
|
+
if (!firstDomain) {
|
|
273
|
+
return null;
|
|
274
|
+
}
|
|
275
|
+
let best = firstDomain;
|
|
276
|
+
let bestCount = result.evidence[best]?.length ?? 0;
|
|
277
|
+
for (const domain of result.domains.slice(1)) {
|
|
278
|
+
const count = result.evidence[domain]?.length ?? 0;
|
|
279
|
+
if (count > bestCount) {
|
|
280
|
+
best = domain;
|
|
281
|
+
bestCount = count;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
return best;
|
|
285
|
+
}
|
|
286
|
+
//# sourceMappingURL=domain-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domain-detector.js","sourceRoot":"","sources":["../../src/engine/domain-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Spec, DigestContent } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Build a DigestContent from the given list of specs and period (days).
|
|
4
|
+
* Only specs with updatedAt within the last `periodDays` days are considered
|
|
5
|
+
* "recent" for the completedInPeriod stat.
|
|
6
|
+
*/
|
|
7
|
+
export declare function generateDigestContent(specs: Spec[], periodDays: number): DigestContent;
|
|
8
|
+
//# sourceMappingURL=email-digest-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-digest-generator.d.ts","sourceRoot":"","sources":["../../src/engine/email-digest-generator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,aAAa,EAAkC,MAAM,mBAAmB,CAAC;AAuK7F;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,aAAa,CA8CtF"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Helpers
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
function toSummary(spec) {
|
|
5
|
+
return {
|
|
6
|
+
id: spec.id,
|
|
7
|
+
title: spec.title,
|
|
8
|
+
status: spec.status,
|
|
9
|
+
updatedAt: spec.updatedAt,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
function isWithinPeriod(updatedAt, periodDays) {
|
|
13
|
+
if (!updatedAt) {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
const cutoff = Date.now() - periodDays * 24 * 60 * 60 * 1000;
|
|
17
|
+
return new Date(updatedAt).getTime() >= cutoff;
|
|
18
|
+
}
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// HTML template (inline CSS — no external dependencies)
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
function buildHtml(content) {
|
|
23
|
+
const { subject, stats, completedSpecs, wipSpecs, blockedSpecs, upcomingSpecs, periodDays } = content;
|
|
24
|
+
const specRows = (specs) => {
|
|
25
|
+
if (specs.length === 0) {
|
|
26
|
+
return '<p style="color:#888;font-size:14px;">None</p>';
|
|
27
|
+
}
|
|
28
|
+
return specs
|
|
29
|
+
.map((s) => `<tr>
|
|
30
|
+
<td style="padding:6px 10px;font-family:monospace;font-size:13px;">${s.id}</td>
|
|
31
|
+
<td style="padding:6px 10px;font-size:13px;">${s.title}</td>
|
|
32
|
+
<td style="padding:6px 10px;font-size:12px;color:#555;">${s.status}</td>
|
|
33
|
+
</tr>`)
|
|
34
|
+
.join('\n');
|
|
35
|
+
};
|
|
36
|
+
const section = (title, specs, color) => `
|
|
37
|
+
<h2 style="color:${color};font-size:16px;margin-top:24px;">${title} (${specs.length})</h2>
|
|
38
|
+
<table style="width:100%;border-collapse:collapse;background:#fff;">
|
|
39
|
+
<thead>
|
|
40
|
+
<tr style="background:#f5f5f5;">
|
|
41
|
+
<th style="padding:6px 10px;text-align:left;font-size:12px;color:#555;">ID</th>
|
|
42
|
+
<th style="padding:6px 10px;text-align:left;font-size:12px;color:#555;">Title</th>
|
|
43
|
+
<th style="padding:6px 10px;text-align:left;font-size:12px;color:#555;">Status</th>
|
|
44
|
+
</tr>
|
|
45
|
+
</thead>
|
|
46
|
+
<tbody>${specRows(specs)}</tbody>
|
|
47
|
+
</table>`;
|
|
48
|
+
return `<!DOCTYPE html>
|
|
49
|
+
<html lang="en">
|
|
50
|
+
<head><meta charset="UTF-8"><title>${subject}</title></head>
|
|
51
|
+
<body style="font-family:Arial,sans-serif;background:#f9f9f9;margin:0;padding:20px;">
|
|
52
|
+
<div style="max-width:700px;margin:0 auto;background:#fff;border-radius:8px;
|
|
53
|
+
padding:32px;box-shadow:0 2px 8px rgba(0,0,0,0.08);">
|
|
54
|
+
|
|
55
|
+
<h1 style="font-size:22px;color:#333;border-bottom:2px solid #e2e8f0;
|
|
56
|
+
padding-bottom:12px;">${subject}</h1>
|
|
57
|
+
|
|
58
|
+
<p style="color:#666;font-size:14px;">
|
|
59
|
+
Planu digest for the last <strong>${periodDays} day${periodDays === 1 ? '' : 's'}</strong>.
|
|
60
|
+
Generated on <strong>${content.generatedAt.slice(0, 10)}</strong>.
|
|
61
|
+
</p>
|
|
62
|
+
|
|
63
|
+
<h2 style="color:#333;font-size:16px;margin-top:24px;">Overview</h2>
|
|
64
|
+
<table style="border-collapse:collapse;">
|
|
65
|
+
<tr>
|
|
66
|
+
<td style="padding:4px 16px 4px 0;font-size:14px;color:#555;">Total specs</td>
|
|
67
|
+
<td style="padding:4px 0;font-size:14px;font-weight:bold;">${stats.total}</td>
|
|
68
|
+
</tr>
|
|
69
|
+
<tr>
|
|
70
|
+
<td style="padding:4px 16px 4px 0;font-size:14px;color:#555;">
|
|
71
|
+
Completed in period</td>
|
|
72
|
+
<td style="padding:4px 0;font-size:14px;font-weight:bold;color:#22c55e;">
|
|
73
|
+
${stats.completedInPeriod}</td>
|
|
74
|
+
</tr>
|
|
75
|
+
<tr>
|
|
76
|
+
<td style="padding:4px 16px 4px 0;font-size:14px;color:#555;">In progress</td>
|
|
77
|
+
<td style="padding:4px 0;font-size:14px;font-weight:bold;color:#3b82f6;">
|
|
78
|
+
${stats.wipCount}</td>
|
|
79
|
+
</tr>
|
|
80
|
+
<tr>
|
|
81
|
+
<td style="padding:4px 16px 4px 0;font-size:14px;color:#555;">Blocked</td>
|
|
82
|
+
<td style="padding:4px 0;font-size:14px;font-weight:bold;color:#ef4444;">
|
|
83
|
+
${stats.blockedCount}</td>
|
|
84
|
+
</tr>
|
|
85
|
+
<tr>
|
|
86
|
+
<td style="padding:4px 16px 4px 0;font-size:14px;color:#555;">Upcoming (approved)</td>
|
|
87
|
+
<td style="padding:4px 0;font-size:14px;font-weight:bold;color:#f59e0b;">
|
|
88
|
+
${stats.upcomingCount}</td>
|
|
89
|
+
</tr>
|
|
90
|
+
</table>
|
|
91
|
+
|
|
92
|
+
${section('Completed', completedSpecs, '#22c55e')}
|
|
93
|
+
${section('In Progress', wipSpecs, '#3b82f6')}
|
|
94
|
+
${section('Blocked', blockedSpecs, '#ef4444')}
|
|
95
|
+
${section('Upcoming', upcomingSpecs, '#f59e0b')}
|
|
96
|
+
|
|
97
|
+
<p style="margin-top:32px;font-size:11px;color:#aaa;border-top:1px solid #e2e8f0;
|
|
98
|
+
padding-top:12px;">
|
|
99
|
+
Generated by <a href="https://planu.dev" style="color:#aaa;">Planu</a>
|
|
100
|
+
</p>
|
|
101
|
+
</div>
|
|
102
|
+
</body>
|
|
103
|
+
</html>`;
|
|
104
|
+
}
|
|
105
|
+
// ---------------------------------------------------------------------------
|
|
106
|
+
// Plain text template
|
|
107
|
+
// ---------------------------------------------------------------------------
|
|
108
|
+
function buildText(content) {
|
|
109
|
+
const { subject, stats, completedSpecs, wipSpecs, blockedSpecs, upcomingSpecs, periodDays } = content;
|
|
110
|
+
const specLines = (specs) => {
|
|
111
|
+
if (specs.length === 0) {
|
|
112
|
+
return ' (none)';
|
|
113
|
+
}
|
|
114
|
+
return specs.map((s) => ` - ${s.id}: ${s.title} [${s.status}]`).join('\n');
|
|
115
|
+
};
|
|
116
|
+
return [
|
|
117
|
+
subject,
|
|
118
|
+
'='.repeat(subject.length),
|
|
119
|
+
'',
|
|
120
|
+
`Planu digest — last ${periodDays} day${periodDays === 1 ? '' : 's'}`,
|
|
121
|
+
`Generated: ${content.generatedAt.slice(0, 10)}`,
|
|
122
|
+
'',
|
|
123
|
+
'OVERVIEW',
|
|
124
|
+
` Total specs: ${stats.total}`,
|
|
125
|
+
` Completed in period: ${stats.completedInPeriod}`,
|
|
126
|
+
` In progress: ${stats.wipCount}`,
|
|
127
|
+
` Blocked: ${stats.blockedCount}`,
|
|
128
|
+
` Upcoming (approved): ${stats.upcomingCount}`,
|
|
129
|
+
'',
|
|
130
|
+
`COMPLETED (${completedSpecs.length})`,
|
|
131
|
+
specLines(completedSpecs),
|
|
132
|
+
'',
|
|
133
|
+
`IN PROGRESS (${wipSpecs.length})`,
|
|
134
|
+
specLines(wipSpecs),
|
|
135
|
+
'',
|
|
136
|
+
`BLOCKED (${blockedSpecs.length})`,
|
|
137
|
+
specLines(blockedSpecs),
|
|
138
|
+
'',
|
|
139
|
+
`UPCOMING (${upcomingSpecs.length})`,
|
|
140
|
+
specLines(upcomingSpecs),
|
|
141
|
+
'',
|
|
142
|
+
'-- Generated by Planu (https://planu.dev)',
|
|
143
|
+
].join('\n');
|
|
144
|
+
}
|
|
145
|
+
// ---------------------------------------------------------------------------
|
|
146
|
+
// Public API
|
|
147
|
+
// ---------------------------------------------------------------------------
|
|
148
|
+
/**
|
|
149
|
+
* Build a DigestContent from the given list of specs and period (days).
|
|
150
|
+
* Only specs with updatedAt within the last `periodDays` days are considered
|
|
151
|
+
* "recent" for the completedInPeriod stat.
|
|
152
|
+
*/
|
|
153
|
+
export function generateDigestContent(specs, periodDays) {
|
|
154
|
+
const days = Math.max(1, periodDays);
|
|
155
|
+
const completedSpecs = specs
|
|
156
|
+
.filter((s) => s.status === 'done' && isWithinPeriod(s.updatedAt, days))
|
|
157
|
+
.map(toSummary);
|
|
158
|
+
const wipSpecs = specs
|
|
159
|
+
.filter((s) => s.status === 'implementing' || s.status === 'review')
|
|
160
|
+
.map(toSummary);
|
|
161
|
+
// Specs considered "blocked" are those with implementing/review status
|
|
162
|
+
// that have non-empty blockedBy dependencies
|
|
163
|
+
const blockedSpecs = specs
|
|
164
|
+
.filter((s) => Array.isArray(s.blockedBy) && s.blockedBy.length > 0)
|
|
165
|
+
.map(toSummary);
|
|
166
|
+
const upcomingSpecs = specs.filter((s) => s.status === 'approved').map(toSummary);
|
|
167
|
+
const stats = {
|
|
168
|
+
total: specs.length,
|
|
169
|
+
completedInPeriod: completedSpecs.length,
|
|
170
|
+
wipCount: wipSpecs.length,
|
|
171
|
+
blockedCount: blockedSpecs.length,
|
|
172
|
+
upcomingCount: upcomingSpecs.length,
|
|
173
|
+
};
|
|
174
|
+
const generatedAt = new Date().toISOString();
|
|
175
|
+
const subject = `Planu Digest — ${days === 1 ? 'Last 24h' : `Last ${days} days`}`;
|
|
176
|
+
const partial = {
|
|
177
|
+
subject,
|
|
178
|
+
stats,
|
|
179
|
+
completedSpecs,
|
|
180
|
+
wipSpecs,
|
|
181
|
+
blockedSpecs,
|
|
182
|
+
upcomingSpecs,
|
|
183
|
+
periodDays: days,
|
|
184
|
+
generatedAt,
|
|
185
|
+
};
|
|
186
|
+
return {
|
|
187
|
+
...partial,
|
|
188
|
+
html: buildHtml(partial),
|
|
189
|
+
text: buildText(partial),
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=email-digest-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-digest-generator.js","sourceRoot":"","sources":["../../src/engine/email-digest-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { DigestContent, EmailDigestConfig } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Save digest HTML to disk at data/projects/{hash}/digests/YYYY-MM-DD.html
|
|
4
|
+
* Returns the file path that was written.
|
|
5
|
+
*/
|
|
6
|
+
export declare function sendViaFile(content: DigestContent, projectHash: string): Promise<string>;
|
|
7
|
+
/**
|
|
8
|
+
* Send digest via SendGrid transactional email API.
|
|
9
|
+
* Uses globalThis.fetch (Node 18+).
|
|
10
|
+
*/
|
|
11
|
+
export declare function sendViaSendGrid(content: DigestContent, config: EmailDigestConfig): Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* SMTP delivery is not implemented in this build.
|
|
14
|
+
* Node's built-in `net` module can open a raw TCP connection but does not
|
|
15
|
+
* handle TLS negotiation or SMTP AUTH without a third-party library, which
|
|
16
|
+
* is not permitted in this project.
|
|
17
|
+
*
|
|
18
|
+
* Use provider='file' to write digests locally, or provider='sendgrid' for
|
|
19
|
+
* transactional email.
|
|
20
|
+
*/
|
|
21
|
+
export declare function sendViaSmtp(_content: DigestContent, _config: EmailDigestConfig): Promise<void>;
|
|
22
|
+
//# sourceMappingURL=email-sender.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-sender.d.ts","sourceRoot":"","sources":["../../src/engine/email-sender.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAM1E;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ9F;AAMD;;;GAGG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,IAAI,CAAC,CA4Cf;AAMD;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ9F"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
// engine/email-sender.ts — Email delivery adapters (SPEC-293)
|
|
2
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { join, dirname } from 'node:path';
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
// File provider
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
/**
|
|
8
|
+
* Save digest HTML to disk at data/projects/{hash}/digests/YYYY-MM-DD.html
|
|
9
|
+
* Returns the file path that was written.
|
|
10
|
+
*/
|
|
11
|
+
export async function sendViaFile(content, projectHash) {
|
|
12
|
+
const dateSlug = content.generatedAt.slice(0, 10);
|
|
13
|
+
const filePath = join('data', 'projects', projectHash, 'digests', `${dateSlug}.html`);
|
|
14
|
+
await mkdir(dirname(filePath), { recursive: true });
|
|
15
|
+
await writeFile(filePath, content.html, 'utf-8');
|
|
16
|
+
return filePath;
|
|
17
|
+
}
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// SendGrid provider
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
/**
|
|
22
|
+
* Send digest via SendGrid transactional email API.
|
|
23
|
+
* Uses globalThis.fetch (Node 18+).
|
|
24
|
+
*/
|
|
25
|
+
export async function sendViaSendGrid(content, config) {
|
|
26
|
+
const { apiKey, fromEmail = 'digest@planu.dev', fromName = 'Planu Digest' } = config.credentials;
|
|
27
|
+
if (!apiKey) {
|
|
28
|
+
throw new Error('SendGrid API key is not configured. ' +
|
|
29
|
+
'Run configure_email_digest with provider=sendgrid and credentials.apiKey.');
|
|
30
|
+
}
|
|
31
|
+
if (config.recipients.length === 0) {
|
|
32
|
+
throw new Error('No recipients configured. Add at least one recipient email address.');
|
|
33
|
+
}
|
|
34
|
+
const body = {
|
|
35
|
+
personalizations: [
|
|
36
|
+
{
|
|
37
|
+
to: config.recipients.map((email) => ({ email })),
|
|
38
|
+
subject: content.subject,
|
|
39
|
+
},
|
|
40
|
+
],
|
|
41
|
+
from: { email: fromEmail, name: fromName },
|
|
42
|
+
content: [
|
|
43
|
+
{ type: 'text/plain', value: content.text },
|
|
44
|
+
{ type: 'text/html', value: content.html },
|
|
45
|
+
],
|
|
46
|
+
};
|
|
47
|
+
const response = await globalThis.fetch('https://api.sendgrid.com/v3/mail/send', {
|
|
48
|
+
method: 'POST',
|
|
49
|
+
headers: {
|
|
50
|
+
Authorization: `Bearer ${apiKey}`,
|
|
51
|
+
'Content-Type': 'application/json',
|
|
52
|
+
},
|
|
53
|
+
body: JSON.stringify(body),
|
|
54
|
+
});
|
|
55
|
+
if (!response.ok) {
|
|
56
|
+
const errorText = await response.text().catch(() => '(no body)');
|
|
57
|
+
throw new Error(`SendGrid API returned ${response.status}: ${errorText}. ` +
|
|
58
|
+
'Check your API key and sender domain verification.');
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
// SMTP provider (not implemented — requires external library)
|
|
63
|
+
// ---------------------------------------------------------------------------
|
|
64
|
+
/**
|
|
65
|
+
* SMTP delivery is not implemented in this build.
|
|
66
|
+
* Node's built-in `net` module can open a raw TCP connection but does not
|
|
67
|
+
* handle TLS negotiation or SMTP AUTH without a third-party library, which
|
|
68
|
+
* is not permitted in this project.
|
|
69
|
+
*
|
|
70
|
+
* Use provider='file' to write digests locally, or provider='sendgrid' for
|
|
71
|
+
* transactional email.
|
|
72
|
+
*/
|
|
73
|
+
export function sendViaSmtp(_content, _config) {
|
|
74
|
+
return Promise.reject(new Error('SMTP delivery is not supported without an external SMTP library. ' +
|
|
75
|
+
"Please use provider='sendgrid' for transactional email " +
|
|
76
|
+
"or provider='file' to save digests locally."));
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=email-sender.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-sender.js","sourceRoot":"","sources":["../../src/engine/email-sender.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ActualRecord, EstimationAccuracyReport, CalibrationFactors, SpecScope, SpecType } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Compute deviation percentage: positive = over estimate, negative = under estimate.
|
|
4
|
+
* Returns 0 when estimatedHours is 0 to avoid division by zero.
|
|
5
|
+
*/
|
|
6
|
+
export declare function computeDeviationPct(estimatedHours: number, actualHours: number): number;
|
|
7
|
+
export declare function generateAccuracyReport(projectId: string, records: ActualRecord[]): EstimationAccuracyReport;
|
|
8
|
+
/**
|
|
9
|
+
* Compute calibration factors from historical actuals.
|
|
10
|
+
* Only creates a multiplier when sample size >= minSamples.
|
|
11
|
+
* A positive avg deviation means we historically underestimate → multiplier > 1.
|
|
12
|
+
*/
|
|
13
|
+
export declare function computeCalibrationFactors(projectId: string, records: ActualRecord[], minSamples: number): CalibrationFactors;
|
|
14
|
+
/**
|
|
15
|
+
* Apply stored calibration factors to a base estimation hours value.
|
|
16
|
+
* Returns the adjusted hours (or the original if no factor found).
|
|
17
|
+
*/
|
|
18
|
+
export declare function applyCalibration(baseHours: number, scope: SpecScope, type: SpecType, factors: CalibrationFactors | null): number;
|
|
19
|
+
//# sourceMappingURL=estimation-calibrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"estimation-calibrator.d.ts","sourceRoot":"","sources":["../../src/engine/estimation-calibrator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,YAAY,EACZ,wBAAwB,EACxB,kBAAkB,EAIlB,SAAS,EACT,QAAQ,EACT,MAAM,mBAAmB,CAAC;AAM3B;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAKvF;AA6ED,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,YAAY,EAAE,GACtB,wBAAwB,CAgC1B;AAMD;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,YAAY,EAAE,EACvB,UAAU,EAAE,MAAM,GACjB,kBAAkB,CA6CpB;AAMD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,QAAQ,EACd,OAAO,EAAE,kBAAkB,GAAG,IAAI,GACjC,MAAM,CAcR"}
|