@planu/cli 0.43.1 → 0.44.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/cli/colors.d.ts +14 -0
- package/dist/cli/colors.d.ts.map +1 -0
- package/dist/cli/colors.js +26 -0
- package/dist/cli/colors.js.map +1 -0
- package/dist/cli/commands/audit.d.ts +3 -0
- package/dist/cli/commands/audit.d.ts.map +1 -0
- package/dist/cli/commands/audit.js +38 -0
- package/dist/cli/commands/audit.js.map +1 -0
- package/dist/cli/commands/create.d.ts +3 -0
- package/dist/cli/commands/create.d.ts.map +1 -0
- package/dist/cli/commands/create.js +50 -0
- package/dist/cli/commands/create.js.map +1 -0
- package/dist/cli/commands/dashboard.d.ts +3 -0
- package/dist/cli/commands/dashboard.d.ts.map +1 -0
- package/dist/cli/commands/dashboard.js +29 -0
- package/dist/cli/commands/dashboard.js.map +1 -0
- package/dist/cli/commands/estimate.d.ts +3 -0
- package/dist/cli/commands/estimate.d.ts.map +1 -0
- package/dist/cli/commands/estimate.js +36 -0
- package/dist/cli/commands/estimate.js.map +1 -0
- package/dist/cli/commands/handoff.d.ts +3 -0
- package/dist/cli/commands/handoff.d.ts.map +1 -0
- package/dist/cli/commands/handoff.js +49 -0
- package/dist/cli/commands/handoff.js.map +1 -0
- package/dist/cli/commands/init.d.ts +3 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +43 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/list.d.ts +3 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +36 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +3 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +34 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/status.d.ts +3 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +49 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +3 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +36 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/commands/watch.d.ts +3 -0
- package/dist/cli/commands/watch.d.ts.map +1 -0
- package/dist/cli/commands/watch.js +156 -0
- package/dist/cli/commands/watch.js.map +1 -0
- package/dist/cli/formatter.d.ts +18 -0
- package/dist/cli/formatter.d.ts.map +1 -0
- package/dist/cli/formatter.js +78 -0
- package/dist/cli/formatter.js.map +1 -0
- package/dist/cli/index.d.ts +6 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +7 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/interactive.d.ts +13 -0
- package/dist/cli/interactive.d.ts.map +1 -0
- package/dist/cli/interactive.js +42 -0
- package/dist/cli/interactive.js.map +1 -0
- package/dist/cli/project-detector.d.ts +6 -0
- package/dist/cli/project-detector.d.ts.map +1 -0
- package/dist/cli/project-detector.js +12 -0
- package/dist/cli/project-detector.js.map +1 -0
- package/dist/cli/router.d.ts +5 -0
- package/dist/cli/router.d.ts.map +1 -0
- package/dist/cli/router.js +104 -0
- package/dist/cli/router.js.map +1 -0
- package/dist/config/hook-defaults.json +19 -0
- package/dist/config/license-plans.json +16 -1
- package/dist/config/tool-groups.json +12 -1
- package/dist/engine/analyzer/analyze-project.d.ts +15 -0
- package/dist/engine/analyzer/analyze-project.d.ts.map +1 -0
- package/dist/engine/analyzer/analyze-project.js +101 -0
- package/dist/engine/analyzer/analyze-project.js.map +1 -0
- package/dist/engine/analyzer/completeness-checker.d.ts +6 -0
- package/dist/engine/analyzer/completeness-checker.d.ts.map +1 -0
- package/dist/engine/analyzer/completeness-checker.js +79 -0
- package/dist/engine/analyzer/completeness-checker.js.map +1 -0
- package/dist/engine/analyzer/db-engine.d.ts +9 -0
- package/dist/engine/analyzer/db-engine.d.ts.map +1 -0
- package/dist/engine/analyzer/db-engine.js +137 -0
- package/dist/engine/analyzer/db-engine.js.map +1 -0
- package/dist/engine/analyzer/detectors.d.ts +7 -0
- package/dist/engine/analyzer/detectors.d.ts.map +1 -0
- package/dist/engine/analyzer/detectors.js +234 -0
- package/dist/engine/analyzer/detectors.js.map +1 -0
- package/dist/engine/analyzer/env-setup.d.ts +6 -0
- package/dist/engine/analyzer/env-setup.d.ts.map +1 -0
- package/dist/engine/analyzer/env-setup.js +174 -0
- package/dist/engine/analyzer/env-setup.js.map +1 -0
- package/dist/engine/analyzer/index.d.ts +6 -0
- package/dist/engine/analyzer/index.d.ts.map +1 -0
- package/dist/engine/analyzer/index.js +8 -0
- package/dist/engine/analyzer/index.js.map +1 -0
- package/dist/engine/analyzer-db.d.ts +1 -8
- package/dist/engine/analyzer-db.d.ts.map +1 -1
- package/dist/engine/analyzer-db.js +3 -136
- package/dist/engine/analyzer-db.js.map +1 -1
- package/dist/engine/analyzer-detectors.d.ts +1 -6
- package/dist/engine/analyzer-detectors.d.ts.map +1 -1
- package/dist/engine/analyzer-detectors.js +3 -231
- package/dist/engine/analyzer-detectors.js.map +1 -1
- package/dist/engine/analyzer-env.d.ts +1 -5
- package/dist/engine/analyzer-env.d.ts.map +1 -1
- package/dist/engine/analyzer-env.js +3 -173
- package/dist/engine/analyzer-env.js.map +1 -1
- package/dist/engine/analyzer.d.ts +2 -18
- package/dist/engine/analyzer.d.ts.map +1 -1
- package/dist/engine/analyzer.js +4 -172
- package/dist/engine/analyzer.js.map +1 -1
- package/dist/engine/dashboard/data-loader.d.ts +16 -1
- package/dist/engine/dashboard/data-loader.d.ts.map +1 -1
- package/dist/engine/dashboard/data-loader.js +140 -2
- package/dist/engine/dashboard/data-loader.js.map +1 -1
- package/dist/engine/dashboard/index.d.ts +2 -0
- package/dist/engine/dashboard/index.d.ts.map +1 -1
- package/dist/engine/dashboard/index.js +2 -0
- package/dist/engine/dashboard/index.js.map +1 -1
- package/dist/engine/dashboard/kanban-logic.d.ts +31 -0
- package/dist/engine/dashboard/kanban-logic.d.ts.map +1 -0
- package/dist/engine/dashboard/kanban-logic.js +122 -0
- package/dist/engine/dashboard/kanban-logic.js.map +1 -0
- package/dist/engine/dashboard/routes.d.ts +2 -0
- package/dist/engine/dashboard/routes.d.ts.map +1 -1
- package/dist/engine/dashboard/routes.js +112 -23
- package/dist/engine/dashboard/routes.js.map +1 -1
- package/dist/engine/dashboard/server.d.ts +5 -0
- package/dist/engine/dashboard/server.d.ts.map +1 -1
- package/dist/engine/dashboard/server.js +48 -0
- package/dist/engine/dashboard/server.js.map +1 -1
- package/dist/engine/dashboard/spec-updater.d.ts +8 -0
- package/dist/engine/dashboard/spec-updater.d.ts.map +1 -0
- package/dist/engine/dashboard/spec-updater.js +37 -0
- package/dist/engine/dashboard/spec-updater.js.map +1 -0
- package/dist/engine/dashboard/templates-kanban.d.ts +6 -0
- package/dist/engine/dashboard/templates-kanban.d.ts.map +1 -0
- package/dist/engine/dashboard/templates-kanban.js +100 -0
- package/dist/engine/dashboard/templates-kanban.js.map +1 -0
- package/dist/engine/dashboard/templates-layout.d.ts +3 -3
- package/dist/engine/dashboard/templates-layout.d.ts.map +1 -1
- package/dist/engine/dashboard/templates-layout.js +167 -44
- package/dist/engine/dashboard/templates-layout.js.map +1 -1
- package/dist/engine/dashboard/templates-project.d.ts +1 -1
- package/dist/engine/dashboard/templates-project.d.ts.map +1 -1
- package/dist/engine/dashboard/templates-project.js +109 -3
- package/dist/engine/dashboard/templates-project.js.map +1 -1
- package/dist/engine/dashboard/templates.d.ts +1 -0
- package/dist/engine/dashboard/templates.d.ts.map +1 -1
- package/dist/engine/dashboard/templates.js +1 -0
- package/dist/engine/dashboard/templates.js.map +1 -1
- package/dist/engine/hooks/config-loader.d.ts +36 -0
- package/dist/engine/hooks/config-loader.d.ts.map +1 -0
- package/dist/engine/hooks/config-loader.js +142 -0
- package/dist/engine/hooks/config-loader.js.map +1 -0
- package/dist/engine/hooks/debouncer.d.ts +30 -0
- package/dist/engine/hooks/debouncer.d.ts.map +1 -0
- package/dist/engine/hooks/debouncer.js +124 -0
- package/dist/engine/hooks/debouncer.js.map +1 -0
- package/dist/engine/hooks/event-bus.d.ts +40 -0
- package/dist/engine/hooks/event-bus.d.ts.map +1 -0
- package/dist/engine/hooks/event-bus.js +83 -0
- package/dist/engine/hooks/event-bus.js.map +1 -0
- package/dist/engine/hooks/file-watcher.d.ts +48 -0
- package/dist/engine/hooks/file-watcher.d.ts.map +1 -0
- package/dist/engine/hooks/file-watcher.js +193 -0
- package/dist/engine/hooks/file-watcher.js.map +1 -0
- package/dist/engine/hooks/handlers/on-commit.d.ts +26 -0
- package/dist/engine/hooks/handlers/on-commit.d.ts.map +1 -0
- package/dist/engine/hooks/handlers/on-commit.js +198 -0
- package/dist/engine/hooks/handlers/on-commit.js.map +1 -0
- package/dist/engine/hooks/handlers/on-create.d.ts +8 -0
- package/dist/engine/hooks/handlers/on-create.d.ts.map +1 -0
- package/dist/engine/hooks/handlers/on-create.js +30 -0
- package/dist/engine/hooks/handlers/on-create.js.map +1 -0
- package/dist/engine/hooks/handlers/on-delete.d.ts +9 -0
- package/dist/engine/hooks/handlers/on-delete.d.ts.map +1 -0
- package/dist/engine/hooks/handlers/on-delete.js +33 -0
- package/dist/engine/hooks/handlers/on-delete.js.map +1 -0
- package/dist/engine/hooks/handlers/on-save.d.ts +29 -0
- package/dist/engine/hooks/handlers/on-save.d.ts.map +1 -0
- package/dist/engine/hooks/handlers/on-save.js +118 -0
- package/dist/engine/hooks/handlers/on-save.js.map +1 -0
- package/dist/engine/hooks/handlers/on-test-pass.d.ts +33 -0
- package/dist/engine/hooks/handlers/on-test-pass.d.ts.map +1 -0
- package/dist/engine/hooks/handlers/on-test-pass.js +103 -0
- package/dist/engine/hooks/handlers/on-test-pass.js.map +1 -0
- package/dist/engine/hooks/hook-engine.d.ts +50 -0
- package/dist/engine/hooks/hook-engine.d.ts.map +1 -0
- package/dist/engine/hooks/hook-engine.js +159 -0
- package/dist/engine/hooks/hook-engine.js.map +1 -0
- package/dist/engine/hooks/index.d.ts +10 -0
- package/dist/engine/hooks/index.d.ts.map +1 -1
- package/dist/engine/hooks/index.js +12 -0
- package/dist/engine/hooks/index.js.map +1 -1
- package/dist/engine/living-spec/annotation-parser.d.ts +18 -0
- package/dist/engine/living-spec/annotation-parser.d.ts.map +1 -0
- package/dist/engine/living-spec/annotation-parser.js +105 -0
- package/dist/engine/living-spec/annotation-parser.js.map +1 -0
- package/dist/engine/living-spec/auto-reconciler.d.ts +28 -0
- package/dist/engine/living-spec/auto-reconciler.d.ts.map +1 -0
- package/dist/engine/living-spec/auto-reconciler.js +103 -0
- package/dist/engine/living-spec/auto-reconciler.js.map +1 -0
- package/dist/engine/living-spec/bidirectional-sync.d.ts +26 -0
- package/dist/engine/living-spec/bidirectional-sync.d.ts.map +1 -0
- package/dist/engine/living-spec/bidirectional-sync.js +160 -0
- package/dist/engine/living-spec/bidirectional-sync.js.map +1 -0
- package/dist/engine/living-spec/dashboard-collector.d.ts +22 -0
- package/dist/engine/living-spec/dashboard-collector.d.ts.map +1 -0
- package/dist/engine/living-spec/dashboard-collector.js +97 -0
- package/dist/engine/living-spec/dashboard-collector.js.map +1 -0
- package/dist/engine/living-spec/drift-watcher.d.ts +15 -0
- package/dist/engine/living-spec/drift-watcher.d.ts.map +1 -0
- package/dist/engine/living-spec/drift-watcher.js +126 -0
- package/dist/engine/living-spec/drift-watcher.js.map +1 -0
- package/dist/engine/living-spec/hash-tracker.d.ts +24 -0
- package/dist/engine/living-spec/hash-tracker.d.ts.map +1 -0
- package/dist/engine/living-spec/hash-tracker.js +123 -0
- package/dist/engine/living-spec/hash-tracker.js.map +1 -0
- package/dist/engine/living-spec/index.d.ts +9 -0
- package/dist/engine/living-spec/index.d.ts.map +1 -0
- package/dist/engine/living-spec/index.js +10 -0
- package/dist/engine/living-spec/index.js.map +1 -0
- package/dist/engine/living-spec/signature-tracker.d.ts +18 -0
- package/dist/engine/living-spec/signature-tracker.d.ts.map +1 -0
- package/dist/engine/living-spec/signature-tracker.js +136 -0
- package/dist/engine/living-spec/signature-tracker.js.map +1 -0
- package/dist/engine/living-spec/test-coverage-correlator.d.ts +22 -0
- package/dist/engine/living-spec/test-coverage-correlator.d.ts.map +1 -0
- package/dist/engine/living-spec/test-coverage-correlator.js +130 -0
- package/dist/engine/living-spec/test-coverage-correlator.js.map +1 -0
- package/dist/engine/plugins/extensions/worker-extension.d.ts.map +1 -1
- package/dist/engine/plugins/extensions/worker-extension.js +3 -1
- package/dist/engine/plugins/extensions/worker-extension.js.map +1 -1
- package/dist/engine/safety/file-mutex.d.ts.map +1 -1
- package/dist/engine/safety/file-mutex.js +3 -0
- package/dist/engine/safety/file-mutex.js.map +1 -1
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -1
- package/dist/storage/hash-snapshot-store.d.ts +18 -0
- package/dist/storage/hash-snapshot-store.d.ts.map +1 -0
- package/dist/storage/hash-snapshot-store.js +43 -0
- package/dist/storage/hash-snapshot-store.js.map +1 -0
- package/dist/storage/index.d.ts +3 -0
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +3 -0
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/living-dashboard-store.d.ts +10 -0
- package/dist/storage/living-dashboard-store.d.ts.map +1 -0
- package/dist/storage/living-dashboard-store.js +31 -0
- package/dist/storage/living-dashboard-store.js.map +1 -0
- package/dist/storage/sync-log-store.d.ts +26 -0
- package/dist/storage/sync-log-store.d.ts.map +1 -0
- package/dist/storage/sync-log-store.js +60 -0
- package/dist/storage/sync-log-store.js.map +1 -0
- package/dist/tools/auto-reconcile.d.ts +3 -0
- package/dist/tools/auto-reconcile.d.ts.map +1 -0
- package/dist/tools/auto-reconcile.js +81 -0
- package/dist/tools/auto-reconcile.js.map +1 -0
- package/dist/tools/challenge-spec/platform-challenge-scenarios-b2.d.ts.map +1 -1
- package/dist/tools/challenge-spec/platform-challenge-scenarios-b2.js +6 -0
- package/dist/tools/challenge-spec/platform-challenge-scenarios-b2.js.map +1 -1
- package/dist/tools/create-spec/spec-builder.js +2 -0
- package/dist/tools/create-spec/spec-builder.js.map +1 -1
- package/dist/tools/dashboard.d.ts.map +1 -1
- package/dist/tools/dashboard.js +20 -13
- package/dist/tools/dashboard.js.map +1 -1
- package/dist/tools/generate-annotations.d.ts +3 -0
- package/dist/tools/generate-annotations.d.ts.map +1 -0
- package/dist/tools/generate-annotations.js +70 -0
- package/dist/tools/generate-annotations.js.map +1 -0
- package/dist/tools/generate-execution-plan.d.ts.map +1 -1
- package/dist/tools/generate-execution-plan.js +1 -0
- package/dist/tools/generate-execution-plan.js.map +1 -1
- package/dist/tools/github-pr-handler.d.ts.map +1 -1
- package/dist/tools/github-pr-handler.js +1 -0
- package/dist/tools/github-pr-handler.js.map +1 -1
- package/dist/tools/github-review-handler.d.ts.map +1 -1
- package/dist/tools/github-review-handler.js +1 -0
- package/dist/tools/github-review-handler.js.map +1 -1
- package/dist/tools/ide-config-handler.d.ts.map +1 -1
- package/dist/tools/ide-config-handler.js +3 -0
- package/dist/tools/ide-config-handler.js.map +1 -1
- package/dist/tools/init-project/handler.d.ts.map +1 -1
- package/dist/tools/init-project/handler.js +0 -3
- package/dist/tools/init-project/handler.js.map +1 -1
- package/dist/tools/living-spec-coverage.d.ts +3 -0
- package/dist/tools/living-spec-coverage.d.ts.map +1 -0
- package/dist/tools/living-spec-coverage.js +100 -0
- package/dist/tools/living-spec-coverage.js.map +1 -0
- package/dist/tools/living-spec-watch.d.ts +4 -0
- package/dist/tools/living-spec-watch.d.ts.map +1 -0
- package/dist/tools/living-spec-watch.js +94 -0
- package/dist/tools/living-spec-watch.js.map +1 -0
- package/dist/tools/manage-plugins-handler.d.ts.map +1 -1
- package/dist/tools/manage-plugins-handler.js +2 -1
- package/dist/tools/manage-plugins-handler.js.map +1 -1
- package/dist/tools/orchestrate-distribution.d.ts.map +1 -1
- package/dist/tools/orchestrate-distribution.js +1 -0
- package/dist/tools/orchestrate-distribution.js.map +1 -1
- package/dist/tools/orchestrate-runtime.js +2 -0
- package/dist/tools/orchestrate-runtime.js.map +1 -1
- package/dist/tools/plan-team-distribution.d.ts.map +1 -1
- package/dist/tools/plan-team-distribution.js +2 -0
- package/dist/tools/plan-team-distribution.js.map +1 -1
- package/dist/tools/register-dashboard-tools.d.ts.map +1 -1
- package/dist/tools/register-dashboard-tools.js +5 -1
- package/dist/tools/register-dashboard-tools.js.map +1 -1
- package/dist/tools/register-hooks-tools.d.ts.map +1 -1
- package/dist/tools/register-hooks-tools.js +82 -1
- package/dist/tools/register-hooks-tools.js.map +1 -1
- package/dist/tools/register-living-spec-advanced-tools.d.ts +6 -0
- package/dist/tools/register-living-spec-advanced-tools.d.ts.map +1 -0
- package/dist/tools/register-living-spec-advanced-tools.js +113 -0
- package/dist/tools/register-living-spec-advanced-tools.js.map +1 -0
- package/dist/tools/register-living-spec-tools.d.ts +6 -0
- package/dist/tools/register-living-spec-tools.d.ts.map +1 -0
- package/dist/tools/register-living-spec-tools.js +67 -0
- package/dist/tools/register-living-spec-tools.js.map +1 -0
- package/dist/tools/resolve-sync-conflict.d.ts +3 -0
- package/dist/tools/resolve-sync-conflict.d.ts.map +1 -0
- package/dist/tools/resolve-sync-conflict.js +38 -0
- package/dist/tools/resolve-sync-conflict.js.map +1 -0
- package/dist/tools/snapshot-spec-hashes.d.ts +3 -0
- package/dist/tools/snapshot-spec-hashes.d.ts.map +1 -0
- package/dist/tools/snapshot-spec-hashes.js +100 -0
- package/dist/tools/snapshot-spec-hashes.js.map +1 -0
- package/dist/tools/spec-diff.d.ts +3 -0
- package/dist/tools/spec-diff.d.ts.map +1 -0
- package/dist/tools/spec-diff.js +58 -0
- package/dist/tools/spec-diff.js.map +1 -0
- package/dist/tools/start-hooks.d.ts +17 -0
- package/dist/tools/start-hooks.d.ts.map +1 -0
- package/dist/tools/start-hooks.js +209 -0
- package/dist/tools/start-hooks.js.map +1 -0
- package/dist/tools/sync-code-to-spec.d.ts +3 -0
- package/dist/tools/sync-code-to-spec.d.ts.map +1 -0
- package/dist/tools/sync-code-to-spec.js +51 -0
- package/dist/tools/sync-code-to-spec.js.map +1 -0
- package/dist/tools/sync-spec-to-code.d.ts +3 -0
- package/dist/tools/sync-spec-to-code.d.ts.map +1 -0
- package/dist/tools/sync-spec-to-code.js +58 -0
- package/dist/tools/sync-spec-to-code.js.map +1 -0
- package/dist/tools/validate-annotations.d.ts +3 -0
- package/dist/tools/validate-annotations.d.ts.map +1 -0
- package/dist/tools/validate-annotations.js +90 -0
- package/dist/tools/validate-annotations.js.map +1 -0
- package/dist/types/cli.d.ts +14 -0
- package/dist/types/cli.d.ts.map +1 -0
- package/dist/types/cli.js +3 -0
- package/dist/types/cli.js.map +1 -0
- package/dist/types/dashboard.d.ts +86 -1
- package/dist/types/dashboard.d.ts.map +1 -1
- package/dist/types/file-hooks.d.ts +230 -0
- package/dist/types/file-hooks.d.ts.map +1 -0
- package/dist/types/file-hooks.js +3 -0
- package/dist/types/file-hooks.js.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/living-spec.d.ts +382 -0
- package/dist/types/living-spec.d.ts.map +1 -0
- package/dist/types/living-spec.js +3 -0
- package/dist/types/living-spec.js.map +1 -0
- package/package.json +1 -1
- package/src/config/hook-defaults.json +19 -0
- package/src/config/license-plans.json +16 -1
- package/src/config/tool-groups.json +12 -1
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
// Planu — Analyzer: Env Setup, MCP Discovery, and Stack Helpers
|
|
2
|
+
// Internal helpers extracted from analyzer.ts to keep file sizes manageable.
|
|
3
|
+
import { readFile } from 'node:fs/promises';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { fileExists } from '../detection-utils.js';
|
|
6
|
+
// === Env Setup Analysis ===
|
|
7
|
+
export async function analyzeEnvSetup(projectPath, projectId) {
|
|
8
|
+
const variables = [];
|
|
9
|
+
const issues = [];
|
|
10
|
+
for (const envFile of ['.env.example', '.env.local.example', '.env.sample']) {
|
|
11
|
+
try {
|
|
12
|
+
const content = await readFile(join(projectPath, envFile), 'utf-8');
|
|
13
|
+
const parsed = parseEnvFile(content);
|
|
14
|
+
variables.push(...parsed);
|
|
15
|
+
break;
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
// File doesn't exist
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
const gitignoreHasEnv = await checkGitignoreForEnv(projectPath);
|
|
22
|
+
const noEnvInGit = !(await fileExists(projectPath, '.env'));
|
|
23
|
+
if (!gitignoreHasEnv) {
|
|
24
|
+
issues.push({
|
|
25
|
+
severity: 'critical',
|
|
26
|
+
issue: '.env files are not in .gitignore',
|
|
27
|
+
fix: 'Add .env* to .gitignore immediately',
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
const security = {
|
|
31
|
+
gitignoreHasEnv,
|
|
32
|
+
noSecretsInCode: true,
|
|
33
|
+
noEnvInGit,
|
|
34
|
+
noSecretsInLogs: true,
|
|
35
|
+
usesSecretManager: false,
|
|
36
|
+
issues,
|
|
37
|
+
};
|
|
38
|
+
const missing = variables.filter((v) => v.required);
|
|
39
|
+
return { projectId, variables, missing, security, setupSteps: [] };
|
|
40
|
+
}
|
|
41
|
+
function parseEnvFile(content) {
|
|
42
|
+
const variables = [];
|
|
43
|
+
for (const line of content.split('\n')) {
|
|
44
|
+
const trimmed = line.trim();
|
|
45
|
+
if (!trimmed || trimmed.startsWith('#')) {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
const eqIndex = trimmed.indexOf('=');
|
|
49
|
+
if (eqIndex === -1) {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
const name = trimmed.substring(0, eqIndex).trim();
|
|
53
|
+
const value = trimmed.substring(eqIndex + 1).trim();
|
|
54
|
+
const sensitive = /secret|key|password|token|api_key|private/i.test(name);
|
|
55
|
+
variables.push({
|
|
56
|
+
name,
|
|
57
|
+
service: inferServiceFromEnvName(name),
|
|
58
|
+
required: true,
|
|
59
|
+
sensitive,
|
|
60
|
+
description: '',
|
|
61
|
+
howToGet: '',
|
|
62
|
+
exampleValue: value || undefined,
|
|
63
|
+
environments: ['development', 'staging', 'production'],
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
return variables;
|
|
67
|
+
}
|
|
68
|
+
function inferServiceFromEnvName(name) {
|
|
69
|
+
const upper = name.toUpperCase();
|
|
70
|
+
if (upper.includes('SUPABASE')) {
|
|
71
|
+
return 'supabase';
|
|
72
|
+
}
|
|
73
|
+
if (upper.includes('STRIPE')) {
|
|
74
|
+
return 'stripe';
|
|
75
|
+
}
|
|
76
|
+
if (upper.includes('FIREBASE')) {
|
|
77
|
+
return 'firebase';
|
|
78
|
+
}
|
|
79
|
+
if (upper.includes('AWS')) {
|
|
80
|
+
return 'aws';
|
|
81
|
+
}
|
|
82
|
+
if (upper.includes('DATABASE') || upper.includes('DB_')) {
|
|
83
|
+
return 'database';
|
|
84
|
+
}
|
|
85
|
+
if (upper.includes('REDIS')) {
|
|
86
|
+
return 'redis';
|
|
87
|
+
}
|
|
88
|
+
if (upper.includes('SENTRY')) {
|
|
89
|
+
return 'sentry';
|
|
90
|
+
}
|
|
91
|
+
if (upper.includes('GITHUB')) {
|
|
92
|
+
return 'github';
|
|
93
|
+
}
|
|
94
|
+
if (upper.includes('OPENAI') || upper.includes('ANTHROPIC')) {
|
|
95
|
+
return 'ai';
|
|
96
|
+
}
|
|
97
|
+
return 'app';
|
|
98
|
+
}
|
|
99
|
+
async function checkGitignoreForEnv(projectPath) {
|
|
100
|
+
try {
|
|
101
|
+
const content = await readFile(join(projectPath, '.gitignore'), 'utf-8');
|
|
102
|
+
return content.includes('.env');
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// === MCP Discovery ===
|
|
109
|
+
export async function discoverMcps(projectPath) {
|
|
110
|
+
const mcps = [];
|
|
111
|
+
const mcpConfigPaths = [
|
|
112
|
+
join(projectPath, '.claude', 'settings.json'),
|
|
113
|
+
join(projectPath, '.claude', 'settings.local.json'),
|
|
114
|
+
];
|
|
115
|
+
for (const configPath of mcpConfigPaths) {
|
|
116
|
+
try {
|
|
117
|
+
const content = await readFile(configPath, 'utf-8');
|
|
118
|
+
const config = JSON.parse(content);
|
|
119
|
+
if (config.mcpServers && typeof config.mcpServers === 'object') {
|
|
120
|
+
for (const [name, serverConfig] of Object.entries(config.mcpServers)) {
|
|
121
|
+
const sc = serverConfig;
|
|
122
|
+
mcps.push({
|
|
123
|
+
name,
|
|
124
|
+
command: typeof sc.command === 'string' ? sc.command : '',
|
|
125
|
+
tools: Array.isArray(sc.tools) ? sc.tools : [],
|
|
126
|
+
relevantFor: [],
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
// Config doesn't exist or is invalid
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return mcps;
|
|
136
|
+
}
|
|
137
|
+
// === Stack and Quality Helpers ===
|
|
138
|
+
export function buildStackList(language, framework, database, packageManager) {
|
|
139
|
+
const stack = [language];
|
|
140
|
+
if (framework) {
|
|
141
|
+
stack.push(framework);
|
|
142
|
+
}
|
|
143
|
+
if (database !== 'unknown') {
|
|
144
|
+
stack.push(database);
|
|
145
|
+
}
|
|
146
|
+
if (packageManager) {
|
|
147
|
+
stack.push(packageManager);
|
|
148
|
+
}
|
|
149
|
+
return stack;
|
|
150
|
+
}
|
|
151
|
+
export function buildQualityProfile(linting, conventions) {
|
|
152
|
+
const enabledCategories = [
|
|
153
|
+
'solid',
|
|
154
|
+
'clean-code',
|
|
155
|
+
'architecture',
|
|
156
|
+
'security',
|
|
157
|
+
'error-handling',
|
|
158
|
+
];
|
|
159
|
+
const principles = ['SOLID', 'Clean Code', 'Fail Fast', 'DRY'];
|
|
160
|
+
let strictness = 'standard';
|
|
161
|
+
// Auto-configure based on project rules
|
|
162
|
+
if (conventions['ai-rules'] ?? conventions['commit-convention']) {
|
|
163
|
+
strictness = 'strict';
|
|
164
|
+
}
|
|
165
|
+
if (linting.maturityScore >= 80) {
|
|
166
|
+
enabledCategories.push('testing', 'performance');
|
|
167
|
+
}
|
|
168
|
+
const configuredLinterCount = linting.detectedLinters.filter((l) => l.status === 'configured').length;
|
|
169
|
+
if (configuredLinterCount >= 3) {
|
|
170
|
+
strictness = 'strict';
|
|
171
|
+
}
|
|
172
|
+
return { enabledCategories, customRules: [], principles, strictness };
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=env-setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-setup.js","sourceRoot":"","sources":["../../../src/engine/analyzer/env-setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { analyzeProject, quickAnalyze } from './analyze-project.js';
|
|
2
|
+
export { checkProjectCompleteness } from './completeness-checker.js';
|
|
3
|
+
export { analyzeLinting, detectConventions, detectEnvironments, detectExternalServices, detectTooling, } from './detectors.js';
|
|
4
|
+
export { analyzeEnvSetup, discoverMcps, buildStackList, buildQualityProfile } from './env-setup.js';
|
|
5
|
+
export { resetDbRegistryCache, detectDBEngine, getSQLSyntaxForEngine, generateFirestoreRules, generateMongoSchema, generateSupabaseRLS, } from './db-engine.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/engine/analyzer/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,aAAa,GACd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACpG,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// Planu — Analyzer barrel re-exports
|
|
2
|
+
// All public API from the analyzer module
|
|
3
|
+
export { analyzeProject, quickAnalyze } from './analyze-project.js';
|
|
4
|
+
export { checkProjectCompleteness } from './completeness-checker.js';
|
|
5
|
+
export { analyzeLinting, detectConventions, detectEnvironments, detectExternalServices, detectTooling, } from './detectors.js';
|
|
6
|
+
export { analyzeEnvSetup, discoverMcps, buildStackList, buildQualityProfile } from './env-setup.js';
|
|
7
|
+
export { resetDbRegistryCache, detectDBEngine, getSQLSyntaxForEngine, generateFirestoreRules, generateMongoSchema, generateSupabaseRLS, } from './db-engine.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engine/analyzer/index.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,0CAA0C;AAE1C,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,aAAa,GACd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACpG,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC"}
|
|
@@ -1,9 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
/** Resets the in-memory cache — used in tests to force reload */
|
|
3
|
-
export declare function resetDbRegistryCache(): void;
|
|
4
|
-
export declare function detectDBEngine(projectPath: string): Promise<DBEngineConfig | null>;
|
|
5
|
-
export declare function getSQLSyntaxForEngine(engine: DBEngine): SQLSyntaxConfig;
|
|
6
|
-
export declare function generateFirestoreRules(collections: string[]): string;
|
|
7
|
-
export declare function generateMongoSchema(collections: string[]): string;
|
|
8
|
-
export declare function generateSupabaseRLS(tables: string[]): string;
|
|
1
|
+
export { resetDbRegistryCache, detectDBEngine, getSQLSyntaxForEngine, generateFirestoreRules, generateMongoSchema, generateSupabaseRLS, } from './analyzer/db-engine.js';
|
|
9
2
|
//# sourceMappingURL=analyzer-db.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyzer-db.d.ts","sourceRoot":"","sources":["../../src/engine/analyzer-db.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"analyzer-db.d.ts","sourceRoot":"","sources":["../../src/engine/analyzer-db.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,yBAAyB,CAAC"}
|
|
@@ -1,137 +1,4 @@
|
|
|
1
|
-
// Planu — DB
|
|
2
|
-
//
|
|
3
|
-
|
|
4
|
-
import { collectDependencies } from './detection-utils.js';
|
|
5
|
-
// === Registry loading ===
|
|
6
|
-
let registryCache = null;
|
|
7
|
-
/** Resets the in-memory cache — used in tests to force reload */
|
|
8
|
-
export function resetDbRegistryCache() {
|
|
9
|
-
registryCache = null;
|
|
10
|
-
}
|
|
11
|
-
async function loadDbRegistry() {
|
|
12
|
-
if (registryCache) {
|
|
13
|
-
return registryCache;
|
|
14
|
-
}
|
|
15
|
-
try {
|
|
16
|
-
const configPath = new URL('../config/db-engines.json', import.meta.url);
|
|
17
|
-
const content = await readFile(configPath, 'utf-8');
|
|
18
|
-
registryCache = JSON.parse(content);
|
|
19
|
-
return registryCache;
|
|
20
|
-
}
|
|
21
|
-
catch {
|
|
22
|
-
return {
|
|
23
|
-
engines: {},
|
|
24
|
-
sqlSyntax: { createTable: {}, primaryKeyConstraint: {}, autoTimestamps: {} },
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
// === DB Engine detection ===
|
|
29
|
-
export async function detectDBEngine(projectPath) {
|
|
30
|
-
const registry = await loadDbRegistry();
|
|
31
|
-
const deps = await collectDependencies(projectPath);
|
|
32
|
-
for (const [engineKey, engine] of Object.entries(registry.engines)) {
|
|
33
|
-
const allDeps = [...engine.detectionDeps, ...(engine.prismaDeps ?? [])];
|
|
34
|
-
for (const dep of allDeps) {
|
|
35
|
-
if (deps.has(dep)) {
|
|
36
|
-
return {
|
|
37
|
-
engine: engineKey,
|
|
38
|
-
detectedFrom: dep,
|
|
39
|
-
features: engine.features,
|
|
40
|
-
securityRules: engine.securityRules,
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
return null;
|
|
46
|
-
}
|
|
47
|
-
// === SQL syntax adapters ===
|
|
48
|
-
export function getSQLSyntaxForEngine(engine) {
|
|
49
|
-
const defaults = {
|
|
50
|
-
createTable: 'CREATE TABLE IF NOT EXISTS',
|
|
51
|
-
primaryKey: 'PRIMARY KEY',
|
|
52
|
-
autoTimestamp: 'DEFAULT now()',
|
|
53
|
-
idType: 'uuid DEFAULT gen_random_uuid()',
|
|
54
|
-
jsonType: 'jsonb',
|
|
55
|
-
autoIncrement: 'GENERATED ALWAYS AS IDENTITY',
|
|
56
|
-
};
|
|
57
|
-
switch (engine) {
|
|
58
|
-
case 'supabase':
|
|
59
|
-
case 'postgresql':
|
|
60
|
-
return {
|
|
61
|
-
createTable: 'CREATE TABLE IF NOT EXISTS',
|
|
62
|
-
primaryKey: 'PRIMARY KEY',
|
|
63
|
-
autoTimestamp: 'DEFAULT now()',
|
|
64
|
-
idType: 'uuid DEFAULT gen_random_uuid()',
|
|
65
|
-
jsonType: 'jsonb',
|
|
66
|
-
autoIncrement: 'GENERATED ALWAYS AS IDENTITY',
|
|
67
|
-
};
|
|
68
|
-
case 'mysql':
|
|
69
|
-
return {
|
|
70
|
-
createTable: 'CREATE TABLE IF NOT EXISTS',
|
|
71
|
-
primaryKey: 'PRIMARY KEY',
|
|
72
|
-
autoTimestamp: 'DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP',
|
|
73
|
-
idType: 'CHAR(36) DEFAULT (UUID())',
|
|
74
|
-
jsonType: 'JSON',
|
|
75
|
-
autoIncrement: 'AUTO_INCREMENT',
|
|
76
|
-
};
|
|
77
|
-
case 'sqlite':
|
|
78
|
-
return {
|
|
79
|
-
createTable: 'CREATE TABLE IF NOT EXISTS',
|
|
80
|
-
primaryKey: 'PRIMARY KEY',
|
|
81
|
-
autoTimestamp: "DEFAULT (datetime('now'))",
|
|
82
|
-
idType: 'TEXT DEFAULT (lower(hex(randomblob(16))))',
|
|
83
|
-
jsonType: 'TEXT',
|
|
84
|
-
autoIncrement: 'AUTOINCREMENT',
|
|
85
|
-
};
|
|
86
|
-
case 'mongodb':
|
|
87
|
-
return {
|
|
88
|
-
createTable: 'db.createCollection',
|
|
89
|
-
primaryKey: '_id',
|
|
90
|
-
autoTimestamp: 'ISODate()',
|
|
91
|
-
idType: 'ObjectId',
|
|
92
|
-
jsonType: 'BSON',
|
|
93
|
-
autoIncrement: 'ObjectId()',
|
|
94
|
-
};
|
|
95
|
-
case 'firebase':
|
|
96
|
-
return {
|
|
97
|
-
createTable: '// Firestore collection (no DDL)',
|
|
98
|
-
primaryKey: 'document.id',
|
|
99
|
-
autoTimestamp: 'FieldValue.serverTimestamp()',
|
|
100
|
-
idType: 'string (auto-generated)',
|
|
101
|
-
jsonType: 'Map<string, any>',
|
|
102
|
-
autoIncrement: 'Firestore auto-ID',
|
|
103
|
-
};
|
|
104
|
-
default:
|
|
105
|
-
return defaults;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
// === Firestore security rules generation ===
|
|
109
|
-
export function generateFirestoreRules(collections) {
|
|
110
|
-
const rules = [
|
|
111
|
-
"rules_version = '2';",
|
|
112
|
-
'service cloud.firestore {',
|
|
113
|
-
' match /databases/{database}/documents {',
|
|
114
|
-
];
|
|
115
|
-
for (const collection of collections) {
|
|
116
|
-
rules.push(` match /${collection}/{document=**} {`, ` allow read: if request.auth != null;`, ` allow write: if request.auth != null && request.auth.uid == resource.data.userId;`, ` }`);
|
|
117
|
-
}
|
|
118
|
-
rules.push(' }', '}');
|
|
119
|
-
return rules.join('\n');
|
|
120
|
-
}
|
|
121
|
-
// === MongoDB schema generation ===
|
|
122
|
-
export function generateMongoSchema(collections) {
|
|
123
|
-
const lines = ['// MongoDB Collection Schemas', ''];
|
|
124
|
-
for (const collection of collections) {
|
|
125
|
-
lines.push(`// ${collection} collection`, `db.createCollection("${collection}", {`, ` validator: {`, ` $jsonSchema: {`, ` bsonType: "object",`, ` required: ["_id", "createdAt", "updatedAt"],`, ` properties: {`, ` _id: { bsonType: "objectId", description: "Primary key" },`, ` createdAt: { bsonType: "date", description: "Creation timestamp" },`, ` updatedAt: { bsonType: "date", description: "Last update timestamp" }`, ` }`, ` }`, ` }`, `});`, ``, `db.${collection}.createIndex({ createdAt: -1 });`, ``);
|
|
126
|
-
}
|
|
127
|
-
return lines.join('\n');
|
|
128
|
-
}
|
|
129
|
-
// === Supabase RLS helper ===
|
|
130
|
-
export function generateSupabaseRLS(tables) {
|
|
131
|
-
const lines = ['-- Supabase RLS Policies', ''];
|
|
132
|
-
for (const table of tables) {
|
|
133
|
-
lines.push(`-- Enable RLS on ${table}`, `ALTER TABLE ${table} ENABLE ROW LEVEL SECURITY;`, ``, `-- Allow authenticated users to read`, `CREATE POLICY "${table}_select_authenticated"`, ` ON ${table} FOR SELECT`, ` USING (auth.role() = 'authenticated');`, ``, `-- Allow users to manage their own records`, `CREATE POLICY "${table}_all_owner"`, ` ON ${table} FOR ALL`, ` USING (auth.uid() = user_id)`, ` WITH CHECK (auth.uid() = user_id);`, ``);
|
|
134
|
-
}
|
|
135
|
-
return lines.join('\n');
|
|
136
|
-
}
|
|
1
|
+
// Planu — Analyzer DB barrel re-export (SOLID split)
|
|
2
|
+
// Implementation moved to src/engine/analyzer/ subdirectory
|
|
3
|
+
export { resetDbRegistryCache, detectDBEngine, getSQLSyntaxForEngine, generateFirestoreRules, generateMongoSchema, generateSupabaseRLS, } from './analyzer/db-engine.js';
|
|
137
4
|
//# sourceMappingURL=analyzer-db.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyzer-db.js","sourceRoot":"","sources":["../../src/engine/analyzer-db.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"analyzer-db.js","sourceRoot":"","sources":["../../src/engine/analyzer-db.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,4DAA4D;AAC5D,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,yBAAyB,CAAC"}
|
|
@@ -1,7 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
export declare function analyzeLinting(projectPath: string): Promise<LintingAnalysis>;
|
|
3
|
-
export declare function detectConventions(projectPath: string): Promise<Record<string, string>>;
|
|
4
|
-
export declare function detectEnvironments(projectPath: string): Promise<string[]>;
|
|
5
|
-
export declare function detectExternalServices(projectPath: string): Promise<string[]>;
|
|
6
|
-
export declare function detectTooling(projectPath: string): Promise<Record<string, string>>;
|
|
1
|
+
export { analyzeLinting, detectConventions, detectEnvironments, detectExternalServices, detectTooling, } from './analyzer/detectors.js';
|
|
7
2
|
//# sourceMappingURL=analyzer-detectors.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyzer-detectors.d.ts","sourceRoot":"","sources":["../../src/engine/analyzer-detectors.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"analyzer-detectors.d.ts","sourceRoot":"","sources":["../../src/engine/analyzer-detectors.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,aAAa,GACd,MAAM,yBAAyB,CAAC"}
|
|
@@ -1,232 +1,4 @@
|
|
|
1
|
-
// Planu — Analyzer
|
|
2
|
-
//
|
|
3
|
-
|
|
4
|
-
import { analyzeLintingEnhanced } from './analyzer-linting.js';
|
|
5
|
-
// === Linting Analysis — delegates to enhanced module (SPEC-025) ===
|
|
6
|
-
export async function analyzeLinting(projectPath) {
|
|
7
|
-
return analyzeLintingEnhanced(projectPath);
|
|
8
|
-
}
|
|
9
|
-
// === Convention Detection ===
|
|
10
|
-
export async function detectConventions(projectPath) {
|
|
11
|
-
const conventions = {};
|
|
12
|
-
// AI agent configs — detect all major AI coding platforms
|
|
13
|
-
if (await fileExists(projectPath, 'CLAUDE.md')) {
|
|
14
|
-
conventions['ai-rules'] = 'CLAUDE.md';
|
|
15
|
-
}
|
|
16
|
-
if (await fileExists(projectPath, '.cursorrules')) {
|
|
17
|
-
conventions['cursor-rules'] = '.cursorrules';
|
|
18
|
-
}
|
|
19
|
-
if (await fileExists(projectPath, '.windsurfrules')) {
|
|
20
|
-
conventions['windsurf-rules'] = '.windsurfrules';
|
|
21
|
-
}
|
|
22
|
-
if (await fileExists(projectPath, '.clinerules')) {
|
|
23
|
-
conventions['cline-rules'] = '.clinerules';
|
|
24
|
-
}
|
|
25
|
-
if (await fileExists(projectPath, '.github/copilot-instructions.md')) {
|
|
26
|
-
conventions['copilot-rules'] = '.github/copilot-instructions.md';
|
|
27
|
-
}
|
|
28
|
-
if (await fileExists(projectPath, 'AGENTS.md')) {
|
|
29
|
-
conventions['codex-rules'] = 'AGENTS.md';
|
|
30
|
-
}
|
|
31
|
-
if (await fileExists(projectPath, 'devin.md')) {
|
|
32
|
-
conventions['devin-rules'] = 'devin.md';
|
|
33
|
-
}
|
|
34
|
-
if (await hasAnyFile(projectPath, ['.continue/config.json', '.continuerc.json'])) {
|
|
35
|
-
conventions['continue-rules'] = '.continue/config.json';
|
|
36
|
-
}
|
|
37
|
-
if (await hasAnyFile(projectPath, ['.aider.conf.yml'])) {
|
|
38
|
-
conventions['aider-rules'] = '.aider.conf.yml';
|
|
39
|
-
}
|
|
40
|
-
if (await hasAnyFile(projectPath, ['.gemini/settings.json', '.idx/dev.nix'])) {
|
|
41
|
-
conventions['gemini-rules'] = '.gemini/settings.json';
|
|
42
|
-
}
|
|
43
|
-
if (await hasAnyFile(projectPath, ['.amazonq/rules.md', '.amazonq/settings.json'])) {
|
|
44
|
-
conventions['amazon-q-rules'] = '.amazonq/rules.md';
|
|
45
|
-
}
|
|
46
|
-
if (await fileExists(projectPath, '.junie/guidelines.md')) {
|
|
47
|
-
conventions['junie-rules'] = '.junie/guidelines.md';
|
|
48
|
-
}
|
|
49
|
-
if (await fileExists(projectPath, '.sourcegraph/cody.json')) {
|
|
50
|
-
conventions['cody-rules'] = '.sourcegraph/cody.json';
|
|
51
|
-
}
|
|
52
|
-
if (await fileExists(projectPath, '.replit')) {
|
|
53
|
-
conventions['replit-rules'] = '.replit';
|
|
54
|
-
}
|
|
55
|
-
if (await hasAnyFile(projectPath, ['.zed/settings.json'])) {
|
|
56
|
-
conventions['zed-rules'] = '.zed/settings.json';
|
|
57
|
-
}
|
|
58
|
-
if (await hasAnyFile(projectPath, ['.augment/config.json', '.augmentignore'])) {
|
|
59
|
-
conventions['augment-rules'] = '.augment/config.json';
|
|
60
|
-
}
|
|
61
|
-
if (await fileExists(projectPath, '.qodo/config.json')) {
|
|
62
|
-
conventions['qodo-rules'] = '.qodo/config.json';
|
|
63
|
-
}
|
|
64
|
-
if (await fileExists(projectPath, '.kilocode/rules')) {
|
|
65
|
-
conventions['kilo-code-rules'] = '.kilocode/rules';
|
|
66
|
-
}
|
|
67
|
-
if (await fileExists(projectPath, '.tabnine/config.json')) {
|
|
68
|
-
conventions['tabnine-rules'] = '.tabnine/config.json';
|
|
69
|
-
}
|
|
70
|
-
if (await hasAnyFile(projectPath, ['.agent/rules/*', '.agent/workflows/*'])) {
|
|
71
|
-
conventions['antigravity-rules'] = '.agent/rules/';
|
|
72
|
-
}
|
|
73
|
-
if (await fileExists(projectPath, 'GEMINI.md')) {
|
|
74
|
-
// GEMINI.md is used by both Antigravity and Gemini CLI
|
|
75
|
-
conventions['antigravity-rules'] ??= 'GEMINI.md';
|
|
76
|
-
conventions['gemini-rules'] = 'GEMINI.md';
|
|
77
|
-
}
|
|
78
|
-
// Editor config
|
|
79
|
-
if (await fileExists(projectPath, '.editorconfig')) {
|
|
80
|
-
conventions['editor-config'] = '.editorconfig';
|
|
81
|
-
}
|
|
82
|
-
// Commit conventions
|
|
83
|
-
if (await hasAnyFile(projectPath, ['commitlint.config.*', '.commitlintrc*'])) {
|
|
84
|
-
conventions['commit-convention'] = 'conventional-commits';
|
|
85
|
-
}
|
|
86
|
-
// Git hooks
|
|
87
|
-
if (await fileExists(projectPath, '.husky')) {
|
|
88
|
-
conventions['git-hooks'] = 'husky';
|
|
89
|
-
}
|
|
90
|
-
if (await hasAnyFile(projectPath, ['.lefthook.yml', 'lefthook.yml'])) {
|
|
91
|
-
conventions['git-hooks'] = 'lefthook';
|
|
92
|
-
}
|
|
93
|
-
if (await hasAnyFile(projectPath, ['.pre-commit-config.yaml'])) {
|
|
94
|
-
conventions['git-hooks'] = 'pre-commit';
|
|
95
|
-
}
|
|
96
|
-
// Lint-staged
|
|
97
|
-
if (await hasAnyFile(projectPath, ['.lintstagedrc*', 'lint-staged.config.*'])) {
|
|
98
|
-
conventions['lint-staged'] = 'lint-staged';
|
|
99
|
-
}
|
|
100
|
-
return conventions;
|
|
101
|
-
}
|
|
102
|
-
// === Environment Detection ===
|
|
103
|
-
export async function detectEnvironments(projectPath) {
|
|
104
|
-
const environments = ['development'];
|
|
105
|
-
if (await hasAnyFile(projectPath, ['.env.staging', '.env.test', '.env.production'])) {
|
|
106
|
-
if (await fileExists(projectPath, '.env.staging')) {
|
|
107
|
-
environments.push('staging');
|
|
108
|
-
}
|
|
109
|
-
if (await fileExists(projectPath, '.env.test')) {
|
|
110
|
-
environments.push('test');
|
|
111
|
-
}
|
|
112
|
-
if (await fileExists(projectPath, '.env.production')) {
|
|
113
|
-
environments.push('production');
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
else {
|
|
117
|
-
environments.push('staging', 'production');
|
|
118
|
-
}
|
|
119
|
-
return environments;
|
|
120
|
-
}
|
|
121
|
-
// === External Services Detection ===
|
|
122
|
-
export async function detectExternalServices(projectPath) {
|
|
123
|
-
const services = new Set();
|
|
124
|
-
const deps = await collectDependencies(projectPath);
|
|
125
|
-
const serviceMap = {
|
|
126
|
-
stripe: ['stripe', '@stripe/stripe-js'],
|
|
127
|
-
aws: ['aws-sdk', '@aws-sdk/client-s3', '@aws-sdk/client-ses'],
|
|
128
|
-
'google-cloud': ['@google-cloud/storage', '@google-cloud/pubsub', '@google-cloud/firestore'],
|
|
129
|
-
azure: ['@azure/storage-blob', '@azure/cosmos'],
|
|
130
|
-
supabase: ['@supabase/supabase-js', '@supabase/ssr'],
|
|
131
|
-
firebase: ['firebase', 'firebase-admin'],
|
|
132
|
-
twilio: ['twilio'],
|
|
133
|
-
sendgrid: ['@sendgrid/mail'],
|
|
134
|
-
resend: ['resend'],
|
|
135
|
-
cloudflare: ['@cloudflare/workers-types', 'wrangler'],
|
|
136
|
-
vercel: ['@vercel/analytics', '@vercel/og'],
|
|
137
|
-
sentry: ['@sentry/node', '@sentry/nextjs', '@sentry/react'],
|
|
138
|
-
datadog: ['dd-trace'],
|
|
139
|
-
'new-relic': ['newrelic'],
|
|
140
|
-
redis: ['redis', 'ioredis'],
|
|
141
|
-
elasticsearch: ['@elastic/elasticsearch'],
|
|
142
|
-
algolia: ['algoliasearch'],
|
|
143
|
-
openai: ['openai'],
|
|
144
|
-
anthropic: ['@anthropic-ai/sdk'],
|
|
145
|
-
auth0: ['@auth0/nextjs-auth0', 'auth0'],
|
|
146
|
-
clerk: ['@clerk/nextjs', '@clerk/clerk-sdk-node'],
|
|
147
|
-
};
|
|
148
|
-
for (const [service, packages] of Object.entries(serviceMap)) {
|
|
149
|
-
for (const pkg of packages) {
|
|
150
|
-
if (deps.has(pkg)) {
|
|
151
|
-
services.add(service);
|
|
152
|
-
break;
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
return [...services];
|
|
157
|
-
}
|
|
158
|
-
// === Tooling Detection ===
|
|
159
|
-
export async function detectTooling(projectPath) {
|
|
160
|
-
const tooling = {};
|
|
161
|
-
// CI/CD
|
|
162
|
-
if (await hasAnyFile(projectPath, ['.github/workflows/*'])) {
|
|
163
|
-
tooling.ci = 'github-actions';
|
|
164
|
-
}
|
|
165
|
-
else if (await fileExists(projectPath, '.gitlab-ci.yml')) {
|
|
166
|
-
tooling.ci = 'gitlab-ci';
|
|
167
|
-
}
|
|
168
|
-
else if (await fileExists(projectPath, 'Jenkinsfile')) {
|
|
169
|
-
tooling.ci = 'jenkins';
|
|
170
|
-
}
|
|
171
|
-
else if (await hasAnyFile(projectPath, ['.circleci/config.yml'])) {
|
|
172
|
-
tooling.ci = 'circleci';
|
|
173
|
-
}
|
|
174
|
-
// Containers
|
|
175
|
-
if (await fileExists(projectPath, 'Dockerfile')) {
|
|
176
|
-
tooling.container = 'docker';
|
|
177
|
-
}
|
|
178
|
-
if (await hasAnyFile(projectPath, ['docker-compose.yml', 'docker-compose.yaml'])) {
|
|
179
|
-
tooling.orchestration = 'docker-compose';
|
|
180
|
-
}
|
|
181
|
-
if (await hasAnyFile(projectPath, ['k8s/**/*', 'kubernetes/**/*'])) {
|
|
182
|
-
tooling.orchestration = 'kubernetes';
|
|
183
|
-
}
|
|
184
|
-
// Build tools / task runners
|
|
185
|
-
if (await fileExists(projectPath, 'turbo.json')) {
|
|
186
|
-
tooling.monorepo = 'turborepo';
|
|
187
|
-
}
|
|
188
|
-
else if (await fileExists(projectPath, 'nx.json')) {
|
|
189
|
-
tooling.monorepo = 'nx';
|
|
190
|
-
}
|
|
191
|
-
else if (await fileExists(projectPath, 'lerna.json')) {
|
|
192
|
-
tooling.monorepo = 'lerna';
|
|
193
|
-
}
|
|
194
|
-
// Bundlers
|
|
195
|
-
const deps = await collectDependencies(projectPath);
|
|
196
|
-
if (deps.has('vite')) {
|
|
197
|
-
tooling.bundler = 'vite';
|
|
198
|
-
}
|
|
199
|
-
else if (deps.has('webpack')) {
|
|
200
|
-
tooling.bundler = 'webpack';
|
|
201
|
-
}
|
|
202
|
-
else if (deps.has('esbuild')) {
|
|
203
|
-
tooling.bundler = 'esbuild';
|
|
204
|
-
}
|
|
205
|
-
else if (deps.has('rollup')) {
|
|
206
|
-
tooling.bundler = 'rollup';
|
|
207
|
-
}
|
|
208
|
-
else if (deps.has('tsup')) {
|
|
209
|
-
tooling.bundler = 'tsup';
|
|
210
|
-
}
|
|
211
|
-
else if (deps.has('turbopack')) {
|
|
212
|
-
tooling.bundler = 'turbopack';
|
|
213
|
-
}
|
|
214
|
-
// Testing
|
|
215
|
-
if (deps.has('vitest')) {
|
|
216
|
-
tooling.testing = 'vitest';
|
|
217
|
-
}
|
|
218
|
-
else if (deps.has('jest')) {
|
|
219
|
-
tooling.testing = 'jest';
|
|
220
|
-
}
|
|
221
|
-
else if (deps.has('mocha')) {
|
|
222
|
-
tooling.testing = 'mocha';
|
|
223
|
-
}
|
|
224
|
-
else if (await fileExists(projectPath, 'pytest.ini')) {
|
|
225
|
-
tooling.testing = 'pytest';
|
|
226
|
-
}
|
|
227
|
-
else if (await fileExists(projectPath, 'Cargo.toml')) {
|
|
228
|
-
tooling.testing = 'cargo-test';
|
|
229
|
-
}
|
|
230
|
-
return tooling;
|
|
231
|
-
}
|
|
1
|
+
// Planu — Analyzer Detectors barrel re-export (SOLID split)
|
|
2
|
+
// Implementation moved to src/engine/analyzer/ subdirectory
|
|
3
|
+
export { analyzeLinting, detectConventions, detectEnvironments, detectExternalServices, detectTooling, } from './analyzer/detectors.js';
|
|
232
4
|
//# sourceMappingURL=analyzer-detectors.js.map
|