@dragonflymcp/plugin 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +26 -0
- package/LICENSE +21 -0
- package/README.md +126 -0
- package/dist/core/annotations.d.ts +71 -0
- package/dist/core/annotations.d.ts.map +1 -0
- package/dist/core/annotations.js +61 -0
- package/dist/core/annotations.js.map +1 -0
- package/dist/core/config.d.ts +66 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +131 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/dispatcher.d.ts +77 -0
- package/dist/core/dispatcher.d.ts.map +1 -0
- package/dist/core/dispatcher.js +132 -0
- package/dist/core/dispatcher.js.map +1 -0
- package/dist/core/server.d.ts +24 -0
- package/dist/core/server.d.ts.map +1 -0
- package/dist/core/server.js +41 -0
- package/dist/core/server.js.map +1 -0
- package/dist/core/store.d.ts +91 -0
- package/dist/core/store.d.ts.map +1 -0
- package/dist/core/store.js +157 -0
- package/dist/core/store.js.map +1 -0
- package/dist/core/types.d.ts +128 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +5 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +81 -0
- package/dist/index.js.map +1 -0
- package/dist/test-utils/store-harness.d.ts +41 -0
- package/dist/test-utils/store-harness.d.ts.map +1 -0
- package/dist/test-utils/store-harness.js +61 -0
- package/dist/test-utils/store-harness.js.map +1 -0
- package/dist/tools/analytics/aggregators.d.ts +18 -0
- package/dist/tools/analytics/aggregators.d.ts.map +1 -0
- package/dist/tools/analytics/aggregators.js +260 -0
- package/dist/tools/analytics/aggregators.js.map +1 -0
- package/dist/tools/analytics/aggregators.test.d.ts +2 -0
- package/dist/tools/analytics/aggregators.test.d.ts.map +1 -0
- package/dist/tools/analytics/aggregators.test.js +177 -0
- package/dist/tools/analytics/aggregators.test.js.map +1 -0
- package/dist/tools/analytics/drift.d.ts +15 -0
- package/dist/tools/analytics/drift.d.ts.map +1 -0
- package/dist/tools/analytics/drift.js +135 -0
- package/dist/tools/analytics/drift.js.map +1 -0
- package/dist/tools/analytics/drift.test.d.ts +2 -0
- package/dist/tools/analytics/drift.test.d.ts.map +1 -0
- package/dist/tools/analytics/drift.test.js +99 -0
- package/dist/tools/analytics/drift.test.js.map +1 -0
- package/dist/tools/analytics/index.d.ts +10 -0
- package/dist/tools/analytics/index.d.ts.map +1 -0
- package/dist/tools/analytics/index.js +192 -0
- package/dist/tools/analytics/index.js.map +1 -0
- package/dist/tools/analytics/learner.d.ts +29 -0
- package/dist/tools/analytics/learner.d.ts.map +1 -0
- package/dist/tools/analytics/learner.js +135 -0
- package/dist/tools/analytics/learner.js.map +1 -0
- package/dist/tools/analytics/learner.test.d.ts +2 -0
- package/dist/tools/analytics/learner.test.d.ts.map +1 -0
- package/dist/tools/analytics/learner.test.js +118 -0
- package/dist/tools/analytics/learner.test.js.map +1 -0
- package/dist/tools/analytics/observe.d.ts +22 -0
- package/dist/tools/analytics/observe.d.ts.map +1 -0
- package/dist/tools/analytics/observe.js +143 -0
- package/dist/tools/analytics/observe.js.map +1 -0
- package/dist/tools/analytics/observe.test.d.ts +2 -0
- package/dist/tools/analytics/observe.test.d.ts.map +1 -0
- package/dist/tools/analytics/observe.test.js +95 -0
- package/dist/tools/analytics/observe.test.js.map +1 -0
- package/dist/tools/analytics/store.d.ts +29 -0
- package/dist/tools/analytics/store.d.ts.map +1 -0
- package/dist/tools/analytics/store.js +192 -0
- package/dist/tools/analytics/store.js.map +1 -0
- package/dist/tools/analytics/types.d.ts +290 -0
- package/dist/tools/analytics/types.d.ts.map +1 -0
- package/dist/tools/analytics/types.js +7 -0
- package/dist/tools/analytics/types.js.map +1 -0
- package/dist/tools/ast/index.d.ts +8 -0
- package/dist/tools/ast/index.d.ts.map +1 -0
- package/dist/tools/ast/index.js +242 -0
- package/dist/tools/ast/index.js.map +1 -0
- package/dist/tools/ast/indexer.d.ts +41 -0
- package/dist/tools/ast/indexer.d.ts.map +1 -0
- package/dist/tools/ast/indexer.js +617 -0
- package/dist/tools/ast/indexer.js.map +1 -0
- package/dist/tools/ast/store.d.ts +87 -0
- package/dist/tools/ast/store.d.ts.map +1 -0
- package/dist/tools/ast/store.js +280 -0
- package/dist/tools/ast/store.js.map +1 -0
- package/dist/tools/ast/store.test.d.ts +6 -0
- package/dist/tools/ast/store.test.d.ts.map +1 -0
- package/dist/tools/ast/store.test.js +257 -0
- package/dist/tools/ast/store.test.js.map +1 -0
- package/dist/tools/bridge/bridge.d.ts +37 -0
- package/dist/tools/bridge/bridge.d.ts.map +1 -0
- package/dist/tools/bridge/bridge.js +82 -0
- package/dist/tools/bridge/bridge.js.map +1 -0
- package/dist/tools/bridge/bridge.test.d.ts +2 -0
- package/dist/tools/bridge/bridge.test.d.ts.map +1 -0
- package/dist/tools/bridge/bridge.test.js +119 -0
- package/dist/tools/bridge/bridge.test.js.map +1 -0
- package/dist/tools/bridge/index.d.ts +8 -0
- package/dist/tools/bridge/index.d.ts.map +1 -0
- package/dist/tools/bridge/index.js +153 -0
- package/dist/tools/bridge/index.js.map +1 -0
- package/dist/tools/bridge/store.d.ts +45 -0
- package/dist/tools/bridge/store.d.ts.map +1 -0
- package/dist/tools/bridge/store.js +307 -0
- package/dist/tools/bridge/store.js.map +1 -0
- package/dist/tools/bridge/store.test.d.ts +2 -0
- package/dist/tools/bridge/store.test.d.ts.map +1 -0
- package/dist/tools/bridge/store.test.js +180 -0
- package/dist/tools/bridge/store.test.js.map +1 -0
- package/dist/tools/bridge/types.d.ts +44 -0
- package/dist/tools/bridge/types.d.ts.map +1 -0
- package/dist/tools/bridge/types.js +6 -0
- package/dist/tools/bridge/types.js.map +1 -0
- package/dist/tools/evolve/algorithm.d.ts +33 -0
- package/dist/tools/evolve/algorithm.d.ts.map +1 -0
- package/dist/tools/evolve/algorithm.js +64 -0
- package/dist/tools/evolve/algorithm.js.map +1 -0
- package/dist/tools/evolve/algorithm.test.d.ts +6 -0
- package/dist/tools/evolve/algorithm.test.d.ts.map +1 -0
- package/dist/tools/evolve/algorithm.test.js +138 -0
- package/dist/tools/evolve/algorithm.test.js.map +1 -0
- package/dist/tools/evolve/index.d.ts +11 -0
- package/dist/tools/evolve/index.d.ts.map +1 -0
- package/dist/tools/evolve/index.js +300 -0
- package/dist/tools/evolve/index.js.map +1 -0
- package/dist/tools/evolve/store.d.ts +27 -0
- package/dist/tools/evolve/store.d.ts.map +1 -0
- package/dist/tools/evolve/store.js +147 -0
- package/dist/tools/evolve/store.js.map +1 -0
- package/dist/tools/evolve/store.test.d.ts +6 -0
- package/dist/tools/evolve/store.test.d.ts.map +1 -0
- package/dist/tools/evolve/store.test.js +162 -0
- package/dist/tools/evolve/store.test.js.map +1 -0
- package/dist/tools/evolve/types.d.ts +38 -0
- package/dist/tools/evolve/types.d.ts.map +1 -0
- package/dist/tools/evolve/types.js +6 -0
- package/dist/tools/evolve/types.js.map +1 -0
- package/dist/tools/framework/content-loader.d.ts +45 -0
- package/dist/tools/framework/content-loader.d.ts.map +1 -0
- package/dist/tools/framework/content-loader.js +258 -0
- package/dist/tools/framework/content-loader.js.map +1 -0
- package/dist/tools/framework/content-loader.test.d.ts +5 -0
- package/dist/tools/framework/content-loader.test.d.ts.map +1 -0
- package/dist/tools/framework/content-loader.test.js +262 -0
- package/dist/tools/framework/content-loader.test.js.map +1 -0
- package/dist/tools/framework/index.d.ts +30 -0
- package/dist/tools/framework/index.d.ts.map +1 -0
- package/dist/tools/framework/index.js +517 -0
- package/dist/tools/framework/index.js.map +1 -0
- package/dist/tools/framework/session.d.ts +85 -0
- package/dist/tools/framework/session.d.ts.map +1 -0
- package/dist/tools/framework/session.js +311 -0
- package/dist/tools/framework/session.js.map +1 -0
- package/dist/tools/framework/session.test.d.ts +5 -0
- package/dist/tools/framework/session.test.d.ts.map +1 -0
- package/dist/tools/framework/session.test.js +291 -0
- package/dist/tools/framework/session.test.js.map +1 -0
- package/dist/tools/framework/sync-evaluator.d.ts +41 -0
- package/dist/tools/framework/sync-evaluator.d.ts.map +1 -0
- package/dist/tools/framework/sync-evaluator.js +298 -0
- package/dist/tools/framework/sync-evaluator.js.map +1 -0
- package/dist/tools/framework/sync-evaluator.test.d.ts +5 -0
- package/dist/tools/framework/sync-evaluator.test.d.ts.map +1 -0
- package/dist/tools/framework/sync-evaluator.test.js +288 -0
- package/dist/tools/framework/sync-evaluator.test.js.map +1 -0
- package/dist/tools/framework/types.d.ts +279 -0
- package/dist/tools/framework/types.d.ts.map +1 -0
- package/dist/tools/framework/types.js +6 -0
- package/dist/tools/framework/types.js.map +1 -0
- package/dist/tools/framework/workflow-intelligence.d.ts +55 -0
- package/dist/tools/framework/workflow-intelligence.d.ts.map +1 -0
- package/dist/tools/framework/workflow-intelligence.js +199 -0
- package/dist/tools/framework/workflow-intelligence.js.map +1 -0
- package/dist/tools/framework/workflow-intelligence.test.d.ts +6 -0
- package/dist/tools/framework/workflow-intelligence.test.d.ts.map +1 -0
- package/dist/tools/framework/workflow-intelligence.test.js +257 -0
- package/dist/tools/framework/workflow-intelligence.test.js.map +1 -0
- package/dist/tools/framework/workflow-planner.d.ts +10 -0
- package/dist/tools/framework/workflow-planner.d.ts.map +1 -0
- package/dist/tools/framework/workflow-planner.js +214 -0
- package/dist/tools/framework/workflow-planner.js.map +1 -0
- package/dist/tools/framework/workflow-planner.test.d.ts +5 -0
- package/dist/tools/framework/workflow-planner.test.d.ts.map +1 -0
- package/dist/tools/framework/workflow-planner.test.js +137 -0
- package/dist/tools/framework/workflow-planner.test.js.map +1 -0
- package/dist/tools/knowledge/bridge.d.ts +34 -0
- package/dist/tools/knowledge/bridge.d.ts.map +1 -0
- package/dist/tools/knowledge/bridge.js +249 -0
- package/dist/tools/knowledge/bridge.js.map +1 -0
- package/dist/tools/knowledge/bridge.test.d.ts +5 -0
- package/dist/tools/knowledge/bridge.test.d.ts.map +1 -0
- package/dist/tools/knowledge/bridge.test.js +221 -0
- package/dist/tools/knowledge/bridge.test.js.map +1 -0
- package/dist/tools/knowledge/extractor.d.ts +22 -0
- package/dist/tools/knowledge/extractor.d.ts.map +1 -0
- package/dist/tools/knowledge/extractor.js +154 -0
- package/dist/tools/knowledge/extractor.js.map +1 -0
- package/dist/tools/knowledge/index.d.ts +12 -0
- package/dist/tools/knowledge/index.d.ts.map +1 -0
- package/dist/tools/knowledge/index.js +505 -0
- package/dist/tools/knowledge/index.js.map +1 -0
- package/dist/tools/knowledge/retrieval.d.ts +28 -0
- package/dist/tools/knowledge/retrieval.d.ts.map +1 -0
- package/dist/tools/knowledge/retrieval.js +164 -0
- package/dist/tools/knowledge/retrieval.js.map +1 -0
- package/dist/tools/knowledge/store.d.ts +96 -0
- package/dist/tools/knowledge/store.d.ts.map +1 -0
- package/dist/tools/knowledge/store.js +562 -0
- package/dist/tools/knowledge/store.js.map +1 -0
- package/dist/tools/knowledge/store.test.d.ts +6 -0
- package/dist/tools/knowledge/store.test.d.ts.map +1 -0
- package/dist/tools/knowledge/store.test.js +385 -0
- package/dist/tools/knowledge/store.test.js.map +1 -0
- package/dist/tools/knowledge/types.d.ts +168 -0
- package/dist/tools/knowledge/types.d.ts.map +1 -0
- package/dist/tools/knowledge/types.js +6 -0
- package/dist/tools/knowledge/types.js.map +1 -0
- package/dist/tools/memory/evolution.d.ts +31 -0
- package/dist/tools/memory/evolution.d.ts.map +1 -0
- package/dist/tools/memory/evolution.js +130 -0
- package/dist/tools/memory/evolution.js.map +1 -0
- package/dist/tools/memory/index.d.ts +11 -0
- package/dist/tools/memory/index.d.ts.map +1 -0
- package/dist/tools/memory/index.js +239 -0
- package/dist/tools/memory/index.js.map +1 -0
- package/dist/tools/memory/store.d.ts +75 -0
- package/dist/tools/memory/store.d.ts.map +1 -0
- package/dist/tools/memory/store.js +398 -0
- package/dist/tools/memory/store.js.map +1 -0
- package/dist/tools/memory/store.test.d.ts +6 -0
- package/dist/tools/memory/store.test.d.ts.map +1 -0
- package/dist/tools/memory/store.test.js +429 -0
- package/dist/tools/memory/store.test.js.map +1 -0
- package/dist/tools/memory/types.d.ts +171 -0
- package/dist/tools/memory/types.d.ts.map +1 -0
- package/dist/tools/memory/types.js +6 -0
- package/dist/tools/memory/types.js.map +1 -0
- package/dist/tools/pipeline/composer.d.ts +29 -0
- package/dist/tools/pipeline/composer.d.ts.map +1 -0
- package/dist/tools/pipeline/composer.js +225 -0
- package/dist/tools/pipeline/composer.js.map +1 -0
- package/dist/tools/pipeline/composer.test.d.ts +2 -0
- package/dist/tools/pipeline/composer.test.d.ts.map +1 -0
- package/dist/tools/pipeline/composer.test.js +162 -0
- package/dist/tools/pipeline/composer.test.js.map +1 -0
- package/dist/tools/pipeline/index.d.ts +8 -0
- package/dist/tools/pipeline/index.d.ts.map +1 -0
- package/dist/tools/pipeline/index.js +102 -0
- package/dist/tools/pipeline/index.js.map +1 -0
- package/dist/tools/pipeline/planner.d.ts +10 -0
- package/dist/tools/pipeline/planner.d.ts.map +1 -0
- package/dist/tools/pipeline/planner.js +147 -0
- package/dist/tools/pipeline/planner.js.map +1 -0
- package/dist/tools/pipeline/planner.test.d.ts +2 -0
- package/dist/tools/pipeline/planner.test.d.ts.map +1 -0
- package/dist/tools/pipeline/planner.test.js +96 -0
- package/dist/tools/pipeline/planner.test.js.map +1 -0
- package/dist/tools/pipeline/preconditions.d.ts +14 -0
- package/dist/tools/pipeline/preconditions.d.ts.map +1 -0
- package/dist/tools/pipeline/preconditions.js +65 -0
- package/dist/tools/pipeline/preconditions.js.map +1 -0
- package/dist/tools/pipeline/preconditions.test.d.ts +2 -0
- package/dist/tools/pipeline/preconditions.test.d.ts.map +1 -0
- package/dist/tools/pipeline/preconditions.test.js +74 -0
- package/dist/tools/pipeline/preconditions.test.js.map +1 -0
- package/dist/tools/pipeline/types.d.ts +105 -0
- package/dist/tools/pipeline/types.d.ts.map +1 -0
- package/dist/tools/pipeline/types.js +6 -0
- package/dist/tools/pipeline/types.js.map +1 -0
- package/dist/tools/repair/index.d.ts +8 -0
- package/dist/tools/repair/index.d.ts.map +1 -0
- package/dist/tools/repair/index.js +384 -0
- package/dist/tools/repair/index.js.map +1 -0
- package/dist/tools/repair/repairer.d.ts +67 -0
- package/dist/tools/repair/repairer.d.ts.map +1 -0
- package/dist/tools/repair/repairer.js +257 -0
- package/dist/tools/repair/repairer.js.map +1 -0
- package/dist/tools/repair/repairer.test.d.ts +6 -0
- package/dist/tools/repair/repairer.test.d.ts.map +1 -0
- package/dist/tools/repair/repairer.test.js +159 -0
- package/dist/tools/repair/repairer.test.js.map +1 -0
- package/dist/tools/semantic/chunker.d.ts +23 -0
- package/dist/tools/semantic/chunker.d.ts.map +1 -0
- package/dist/tools/semantic/chunker.js +244 -0
- package/dist/tools/semantic/chunker.js.map +1 -0
- package/dist/tools/semantic/embedder.d.ts +16 -0
- package/dist/tools/semantic/embedder.d.ts.map +1 -0
- package/dist/tools/semantic/embedder.js +88 -0
- package/dist/tools/semantic/embedder.js.map +1 -0
- package/dist/tools/semantic/index.d.ts +8 -0
- package/dist/tools/semantic/index.d.ts.map +1 -0
- package/dist/tools/semantic/index.js +144 -0
- package/dist/tools/semantic/index.js.map +1 -0
- package/dist/tools/semantic/store.d.ts +31 -0
- package/dist/tools/semantic/store.d.ts.map +1 -0
- package/dist/tools/semantic/store.js +168 -0
- package/dist/tools/semantic/store.js.map +1 -0
- package/dist/tools/semantic/store.test.d.ts +6 -0
- package/dist/tools/semantic/store.test.d.ts.map +1 -0
- package/dist/tools/semantic/store.test.js +240 -0
- package/dist/tools/semantic/store.test.js.map +1 -0
- package/dist/tools/spec/generator.d.ts +32 -0
- package/dist/tools/spec/generator.d.ts.map +1 -0
- package/dist/tools/spec/generator.js +278 -0
- package/dist/tools/spec/generator.js.map +1 -0
- package/dist/tools/spec/generator.test.d.ts +6 -0
- package/dist/tools/spec/generator.test.d.ts.map +1 -0
- package/dist/tools/spec/generator.test.js +208 -0
- package/dist/tools/spec/generator.test.js.map +1 -0
- package/dist/tools/spec/index.d.ts +11 -0
- package/dist/tools/spec/index.d.ts.map +1 -0
- package/dist/tools/spec/index.js +426 -0
- package/dist/tools/spec/index.js.map +1 -0
- package/dist/tools/spec/store.d.ts +24 -0
- package/dist/tools/spec/store.d.ts.map +1 -0
- package/dist/tools/spec/store.js +104 -0
- package/dist/tools/spec/store.js.map +1 -0
- package/dist/tools/spec/store.test.d.ts +6 -0
- package/dist/tools/spec/store.test.d.ts.map +1 -0
- package/dist/tools/spec/store.test.js +173 -0
- package/dist/tools/spec/store.test.js.map +1 -0
- package/dist/tools/spec/types.d.ts +61 -0
- package/dist/tools/spec/types.d.ts.map +1 -0
- package/dist/tools/spec/types.js +6 -0
- package/dist/tools/spec/types.js.map +1 -0
- package/dist/tools/state/index.d.ts +11 -0
- package/dist/tools/state/index.d.ts.map +1 -0
- package/dist/tools/state/index.js +386 -0
- package/dist/tools/state/index.js.map +1 -0
- package/dist/tools/state/migrate.d.ts +39 -0
- package/dist/tools/state/migrate.d.ts.map +1 -0
- package/dist/tools/state/migrate.js +242 -0
- package/dist/tools/state/migrate.js.map +1 -0
- package/dist/tools/state/migrate.test.d.ts +2 -0
- package/dist/tools/state/migrate.test.d.ts.map +1 -0
- package/dist/tools/state/migrate.test.js +265 -0
- package/dist/tools/state/migrate.test.js.map +1 -0
- package/dist/tools/state/store.d.ts +107 -0
- package/dist/tools/state/store.d.ts.map +1 -0
- package/dist/tools/state/store.js +365 -0
- package/dist/tools/state/store.js.map +1 -0
- package/dist/tools/state/store.test.d.ts +5 -0
- package/dist/tools/state/store.test.d.ts.map +1 -0
- package/dist/tools/state/store.test.js +293 -0
- package/dist/tools/state/store.test.js.map +1 -0
- package/dist/tools/state/types.d.ts +90 -0
- package/dist/tools/state/types.d.ts.map +1 -0
- package/dist/tools/state/types.js +6 -0
- package/dist/tools/state/types.js.map +1 -0
- package/dist/tools/testing/analyzer.d.ts +44 -0
- package/dist/tools/testing/analyzer.d.ts.map +1 -0
- package/dist/tools/testing/analyzer.js +280 -0
- package/dist/tools/testing/analyzer.js.map +1 -0
- package/dist/tools/testing/generator.d.ts +57 -0
- package/dist/tools/testing/generator.d.ts.map +1 -0
- package/dist/tools/testing/generator.js +478 -0
- package/dist/tools/testing/generator.js.map +1 -0
- package/dist/tools/testing/generator.test.d.ts +6 -0
- package/dist/tools/testing/generator.test.d.ts.map +1 -0
- package/dist/tools/testing/generator.test.js +285 -0
- package/dist/tools/testing/generator.test.js.map +1 -0
- package/dist/tools/testing/index.d.ts +8 -0
- package/dist/tools/testing/index.d.ts.map +1 -0
- package/dist/tools/testing/index.js +373 -0
- package/dist/tools/testing/index.js.map +1 -0
- package/dist/utils/embedder.d.ts +7 -0
- package/dist/utils/embedder.d.ts.map +1 -0
- package/dist/utils/embedder.js +13 -0
- package/dist/utils/embedder.js.map +1 -0
- package/dist/utils/execution.d.ts +68 -0
- package/dist/utils/execution.d.ts.map +1 -0
- package/dist/utils/execution.js +467 -0
- package/dist/utils/execution.js.map +1 -0
- package/dist/utils/graph.d.ts +26 -0
- package/dist/utils/graph.d.ts.map +1 -0
- package/dist/utils/graph.js +32 -0
- package/dist/utils/graph.js.map +1 -0
- package/dist/utils/guards.d.ts +32 -0
- package/dist/utils/guards.d.ts.map +1 -0
- package/dist/utils/guards.js +40 -0
- package/dist/utils/guards.js.map +1 -0
- package/dist/utils/ids.d.ts +5 -0
- package/dist/utils/ids.d.ts.map +1 -0
- package/dist/utils/ids.js +7 -0
- package/dist/utils/ids.js.map +1 -0
- package/dist/utils/languages.d.ts +34 -0
- package/dist/utils/languages.d.ts.map +1 -0
- package/dist/utils/languages.js +153 -0
- package/dist/utils/languages.js.map +1 -0
- package/dist/utils/lazy.d.ts +17 -0
- package/dist/utils/lazy.d.ts.map +1 -0
- package/dist/utils/lazy.js +35 -0
- package/dist/utils/lazy.js.map +1 -0
- package/dist/utils/project.d.ts +41 -0
- package/dist/utils/project.d.ts.map +1 -0
- package/dist/utils/project.js +82 -0
- package/dist/utils/project.js.map +1 -0
- package/dist/utils/responses.d.ts +27 -0
- package/dist/utils/responses.d.ts.map +1 -0
- package/dist/utils/responses.js +72 -0
- package/dist/utils/responses.js.map +1 -0
- package/dist/utils/vectors.d.ts +33 -0
- package/dist/utils/vectors.d.ts.map +1 -0
- package/dist/utils/vectors.js +80 -0
- package/dist/utils/vectors.js.map +1 -0
- package/dist/utils/vectors.test.d.ts +6 -0
- package/dist/utils/vectors.test.d.ts.map +1 -0
- package/dist/utils/vectors.test.js +96 -0
- package/dist/utils/vectors.test.js.map +1 -0
- package/package.json +69 -0
- package/scripts/init.js +142 -0
- package/templates/CLAUDE.md.template +96 -0
- package/templates/agents/architecture-concept.md +237 -0
- package/templates/agents/checkpoint-concept.md +218 -0
- package/templates/agents/code-analysis-concept.md +171 -0
- package/templates/agents/compete-control.md +44 -0
- package/templates/agents/compete-evaluator.md +87 -0
- package/templates/agents/compete-treatment.md +55 -0
- package/templates/agents/context-concept.md +254 -0
- package/templates/agents/debate-advocate.md +127 -0
- package/templates/agents/debate-critic.md +119 -0
- package/templates/agents/debate-synthesis.md +160 -0
- package/templates/agents/documentation-concept.md +294 -0
- package/templates/agents/implementation-concept.md +165 -0
- package/templates/agents/quality-concept.md +299 -0
- package/templates/agents/research-concept.md +169 -0
- package/templates/agents/security-concept.md +255 -0
- package/templates/agents/story-concept.md +207 -0
- package/templates/agents/verification-concept.md +456 -0
- package/templates/agents/version-concept.md +163 -0
- package/templates/anchors/directory.anchor.yaml.template +53 -0
- package/templates/anchors/rules.anchor.yaml.template +70 -0
- package/templates/anchors/safety.anchor.yaml.template +96 -0
- package/templates/claude-md-managed.template +105 -0
- package/templates/commands/cache.md.template +439 -0
- package/templates/commands/checkpoint.md.template +121 -0
- package/templates/commands/classify.md.template +138 -0
- package/templates/commands/compete.md.template +90 -0
- package/templates/commands/costs.md.template +111 -0
- package/templates/commands/estimate.md.template +196 -0
- package/templates/commands/explore.md.template +186 -0
- package/templates/commands/feature.md.template +216 -0
- package/templates/commands/forget.md.template +104 -0
- package/templates/commands/global-recall.md.template +250 -0
- package/templates/commands/global-remember.md.template +187 -0
- package/templates/commands/health.md.template +107 -0
- package/templates/commands/help.md.template +253 -0
- package/templates/commands/observe.md.template +211 -0
- package/templates/commands/pr-review.md.template +164 -0
- package/templates/commands/predict-cost.md.template +251 -0
- package/templates/commands/profile.md.template +142 -0
- package/templates/commands/reasoning.md.template +228 -0
- package/templates/commands/recall.md.template +197 -0
- package/templates/commands/remember.md.template +148 -0
- package/templates/commands/replay.md.template +449 -0
- package/templates/commands/restore.md.template +87 -0
- package/templates/commands/retrospective.md.template +47 -0
- package/templates/commands/slo.md.template +286 -0
- package/templates/commands/spec.md.template +164 -0
- package/templates/commands/status.md.template +53 -0
- package/templates/commands/sync.md.template +321 -0
- package/templates/commands/task.md.template +86 -0
- package/templates/commands/trace.md.template +86 -0
- package/templates/commands/visualize.md.template +216 -0
- package/templates/commands/workflow.md.template +375 -0
- package/templates/concepts/README.md +329 -0
- package/templates/concepts/architecture.md.template +74 -0
- package/templates/concepts/code-analysis.md.template +186 -0
- package/templates/concepts/context-compactor.md.template +393 -0
- package/templates/concepts/context.md.template +62 -0
- package/templates/concepts/documentation.md.template +452 -0
- package/templates/concepts/estimator.md.template +214 -0
- package/templates/concepts/exploration.md.template +257 -0
- package/templates/concepts/global-memory.md.template +222 -0
- package/templates/concepts/implementation.md.template +62 -0
- package/templates/concepts/pr-review.md.template +277 -0
- package/templates/concepts/project-profile.md.template +358 -0
- package/templates/concepts/quality.md.template +63 -0
- package/templates/concepts/react-fallback.md.template +286 -0
- package/templates/concepts/research.md.template +221 -0
- package/templates/concepts/retrospective.md.template +93 -0
- package/templates/concepts/security.md.template +442 -0
- package/templates/concepts/slo.md.template +274 -0
- package/templates/concepts/spec.md.template +71 -0
- package/templates/concepts/story.md.template +50 -0
- package/templates/concepts/tool-router.md.template +289 -0
- package/templates/concepts/verification-synthesizer.md.template +279 -0
- package/templates/concepts/version.md.template +61 -0
- package/templates/config.yaml.template +347 -0
- package/templates/examples/README.md +77 -0
- package/templates/examples/architecture/api-design.yaml.template +286 -0
- package/templates/examples/architecture/oauth-authentication.yaml.template +305 -0
- package/templates/health/status.yaml.template +120 -0
- package/templates/hooks/concept-complete.sh.template +45 -0
- package/templates/hooks/lib/common.sh.template +160 -0
- package/templates/hooks/post-commit.sh.template +37 -0
- package/templates/hooks/post-concept-action.template +39 -0
- package/templates/hooks/post-tool-structure-check.sh.template +138 -0
- package/templates/hooks/post-tool-use.sh.template +51 -0
- package/templates/hooks/pre-compact.sh.template +48 -0
- package/templates/hooks/pre-tool-grounding.template +148 -0
- package/templates/hooks/session-exit-checkpoint.sh.template +35 -0
- package/templates/hooks/session-start.sh.template +67 -0
- package/templates/hooks/statusline.sh.template +148 -0
- package/templates/hooks/stop.sh.template +45 -0
- package/templates/hooks/subagent-stop.sh.template +40 -0
- package/templates/hooks/sync-blocked.sh.template +45 -0
- package/templates/hooks/timeout.sh.template +48 -0
- package/templates/hooks/user-prompt-submit.sh.template +68 -0
- package/templates/koan/README.md +58 -0
- package/templates/memory/index.yaml.template +48 -0
- package/templates/memory/procedural/debugging.yaml.template +24 -0
- package/templates/memory/procedural/workflows.yaml.template +22 -0
- package/templates/memory/semantic/architecture.yaml.template +21 -0
- package/templates/memory/semantic/conventions.yaml.template +18 -0
- package/templates/memory/semantic/patterns.yaml.template +21 -0
- package/templates/memory/semantic/preferences.yaml.template +18 -0
- package/templates/prompts/architecture.yaml.template +349 -0
- package/templates/prompts/context.yaml.template +384 -0
- package/templates/prompts/implementation.yaml.template +365 -0
- package/templates/prompts/planning.yaml.template +303 -0
- package/templates/prompts/quality.yaml.template +345 -0
- package/templates/prompts/retrospective.yaml.template +231 -0
- package/templates/prompts/slo.yaml.template +360 -0
- package/templates/prompts/story.yaml.template +236 -0
- package/templates/prompts/tree-of-thoughts.yaml.template +299 -0
- package/templates/prompts/verification.yaml.template +286 -0
- package/templates/prompts/version.yaml.template +279 -0
- package/templates/schemas/agent-schema.json +98 -0
- package/templates/schemas/architecture.schema.json +69 -0
- package/templates/schemas/config-schema.json +165 -0
- package/templates/schemas/implementation.schema.json +75 -0
- package/templates/schemas/planning.schema.json +243 -0
- package/templates/schemas/provenance.schema.json +111 -0
- package/templates/schemas/retrospective.schema.json +174 -0
- package/templates/schemas/review.schema.json +284 -0
- package/templates/schemas/slo.schema.json +443 -0
- package/templates/schemas/story.schema.json +68 -0
- package/templates/schemas/sync-schema.json +196 -0
- package/templates/schemas/task.schema.json +127 -0
- package/templates/schemas/tree-of-thoughts.schema.json +175 -0
- package/templates/schemas/verification.schema.json +106 -0
- package/templates/settings.full.json.template +135 -0
- package/templates/settings.minimal.json.template +68 -0
- package/templates/settings.standard.json.template +135 -0
- package/templates/skills/acceptance-criteria-generation.md.template +330 -0
- package/templates/skills/accessibility-checking.md.template +341 -0
- package/templates/skills/api-design-patterns.md.template +395 -0
- package/templates/skills/batch-processing.md.template +605 -0
- package/templates/skills/branch-strategy.md.template +362 -0
- package/templates/skills/changelog-generation.md.template +403 -0
- package/templates/skills/code-coverage-analysis.md.template +362 -0
- package/templates/skills/code-style-enforcement.md.template +294 -0
- package/templates/skills/code-template-patterns.md.template +419 -0
- package/templates/skills/concept-development.md.template +159 -0
- package/templates/skills/context-prioritization.md.template +306 -0
- package/templates/skills/cost-optimization.md.template +482 -0
- package/templates/skills/cross-project-knowledge.md.template +316 -0
- package/templates/skills/dependency-impact-analysis.md.template +263 -0
- package/templates/skills/documentation-generation.md.template +409 -0
- package/templates/skills/effort-estimation.md.template +350 -0
- package/templates/skills/error-classification.md.template +709 -0
- package/templates/skills/error-messages.md.template +339 -0
- package/templates/skills/ide-diagnostics.md.template +480 -0
- package/templates/skills/incremental-loading.md.template +574 -0
- package/templates/skills/output-caching.md.template +524 -0
- package/templates/skills/performance-estimation.md.template +325 -0
- package/templates/skills/performance-testing-patterns.md.template +341 -0
- package/templates/skills/phase2-optimizations-summary.md.template +458 -0
- package/templates/skills/progressive-disclosure-pattern.md.template +190 -0
- package/templates/skills/project-structure.md.template +372 -0
- package/templates/skills/provenance-analysis.md.template +609 -0
- package/templates/skills/react-executor.md.template +366 -0
- package/templates/skills/refactoring-patterns.md.template +422 -0
- package/templates/skills/release-management.md.template +373 -0
- package/templates/skills/requirement-prioritization.md.template +357 -0
- package/templates/skills/schema-validation.md.template +321 -0
- package/templates/skills/security-design-patterns.md.template +692 -0
- package/templates/skills/security-vulnerability-scanning.md.template +663 -0
- package/templates/skills/semantic-memory.md.template +266 -0
- package/templates/skills/semantic-versioning.md.template +371 -0
- package/templates/skills/smart-retry.md.template +676 -0
- package/templates/skills/smart-summarization.md.template +358 -0
- package/templates/skills/story-decomposition.md.template +278 -0
- package/templates/skills/synchronization-patterns.md.template +303 -0
- package/templates/skills/test-generation-strategy.md.template +247 -0
- package/templates/skills/workflow-replay.md.template +478 -0
- package/templates/skills/wysiwid-principles.md.template +364 -0
- package/templates/skills-manifest.yaml.template +526 -0
- package/templates/stubs/agents/architecture-concept.md +20 -0
- package/templates/stubs/agents/checkpoint-concept.md +19 -0
- package/templates/stubs/agents/code-analysis-concept.md +36 -0
- package/templates/stubs/agents/context-concept.md +37 -0
- package/templates/stubs/agents/debate-advocate.md +12 -0
- package/templates/stubs/agents/debate-critic.md +12 -0
- package/templates/stubs/agents/debate-synthesis.md +12 -0
- package/templates/stubs/agents/documentation-concept.md +39 -0
- package/templates/stubs/agents/implementation-concept.md +41 -0
- package/templates/stubs/agents/quality-concept.md +41 -0
- package/templates/stubs/agents/research-concept.md +35 -0
- package/templates/stubs/agents/security-concept.md +40 -0
- package/templates/stubs/agents/spec-concept.md +35 -0
- package/templates/stubs/agents/story-concept.md +36 -0
- package/templates/stubs/agents/verification-concept.md +39 -0
- package/templates/stubs/agents/version-concept.md +37 -0
- package/templates/stubs/commands/cache.md.template +2 -0
- package/templates/stubs/commands/checkpoint.md.template +2 -0
- package/templates/stubs/commands/classify.md.template +2 -0
- package/templates/stubs/commands/compete.md.template +2 -0
- package/templates/stubs/commands/costs.md.template +2 -0
- package/templates/stubs/commands/estimate.md.template +2 -0
- package/templates/stubs/commands/explore.md.template +2 -0
- package/templates/stubs/commands/feature.md.template +2 -0
- package/templates/stubs/commands/forget.md.template +2 -0
- package/templates/stubs/commands/global-recall.md.template +2 -0
- package/templates/stubs/commands/global-remember.md.template +2 -0
- package/templates/stubs/commands/health.md.template +2 -0
- package/templates/stubs/commands/help.md.template +2 -0
- package/templates/stubs/commands/observe.md.template +2 -0
- package/templates/stubs/commands/pr-review.md.template +2 -0
- package/templates/stubs/commands/predict-cost.md.template +2 -0
- package/templates/stubs/commands/profile.md.template +2 -0
- package/templates/stubs/commands/reasoning.md.template +2 -0
- package/templates/stubs/commands/recall.md.template +2 -0
- package/templates/stubs/commands/remember.md.template +2 -0
- package/templates/stubs/commands/replay.md.template +2 -0
- package/templates/stubs/commands/restore.md.template +2 -0
- package/templates/stubs/commands/retrospective.md.template +2 -0
- package/templates/stubs/commands/slo.md.template +2 -0
- package/templates/stubs/commands/spec.md.template +2 -0
- package/templates/stubs/commands/sync.md.template +2 -0
- package/templates/stubs/commands/task.md.template +2 -0
- package/templates/stubs/commands/trace.md.template +2 -0
- package/templates/stubs/commands/visualize.md.template +2 -0
- package/templates/stubs/commands/workflow.md.template +2 -0
- package/templates/synchronizations/archive/adaptive-learning.yaml.template +595 -0
- package/templates/synchronizations/archive/code-understanding-flow.yaml.template +533 -0
- package/templates/synchronizations/archive/collaboration-flow.yaml.template +521 -0
- package/templates/synchronizations/archive/context-folding.yaml.template +353 -0
- package/templates/synchronizations/archive/dead-letter-queue.yaml.template +530 -0
- package/templates/synchronizations/archive/documentation-flow.yaml.template +560 -0
- package/templates/synchronizations/archive/error-recovery-flow.yaml.template +1031 -0
- package/templates/synchronizations/archive/execution-loop.yaml.template +336 -0
- package/templates/synchronizations/archive/exploration-flow.yaml.template +369 -0
- package/templates/synchronizations/archive/feature-development.yaml.template +2145 -0
- package/templates/synchronizations/archive/learning-loop.yaml.template +657 -0
- package/templates/synchronizations/archive/multi-verify.yaml.template +346 -0
- package/templates/synchronizations/archive/planning-flow.yaml.template +312 -0
- package/templates/synchronizations/archive/retrospective-flow.yaml.template +277 -0
- package/templates/synchronizations/archive/security-flow.yaml.template +477 -0
- package/templates/synchronizations/archive/slo-monitoring.yaml.template +209 -0
- package/templates/synchronizations/archive/task-routing.yaml.template +489 -0
- package/templates/synchronizations/archive/test-driven.yaml.template +291 -0
- package/templates/synchronizations/archive/tool-routing.yaml.template +326 -0
- package/templates/synchronizations/archive/verification-flow.yaml.template +407 -0
- package/templates/synchronizations/error-policy.yaml.template +188 -0
- package/templates/synchronizations/main.sync.template +319 -0
- package/templates/synchronizations/slo-registry.yaml.template +229 -0
- package/templates/tasks/task.yaml.template +67 -0
- package/templates/zen-profile.yaml.template +14 -0
|
@@ -0,0 +1,663 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Security Vulnerability Scanning
|
|
3
|
+
description: Detect common security vulnerabilities in generated code during quality review
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
trigger_keywords: [security, vulnerability, CVE, injection, XSS, CSRF, scan, audit]
|
|
6
|
+
author: Zen Architecture
|
|
7
|
+
applies_to: [quality-concept]
|
|
8
|
+
priority: P0
|
|
9
|
+
impact: critical
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Security Vulnerability Scanning - Expert Skill
|
|
13
|
+
|
|
14
|
+
Detect common security vulnerabilities in generated code before they reach production.
|
|
15
|
+
|
|
16
|
+
## Purpose
|
|
17
|
+
|
|
18
|
+
Security vulnerability scanning provides:
|
|
19
|
+
- **Early detection**: Catch vulnerabilities at review time, not in production
|
|
20
|
+
- **Automated checks**: Consistent security review across all code
|
|
21
|
+
- **OWASP coverage**: Check for industry-standard vulnerability patterns
|
|
22
|
+
- **Actionable feedback**: Specific remediation guidance for each issue
|
|
23
|
+
|
|
24
|
+
## When to Use
|
|
25
|
+
|
|
26
|
+
Use security scanning during quality review when code involves:
|
|
27
|
+
- ✅ User input handling
|
|
28
|
+
- ✅ Database queries
|
|
29
|
+
- ✅ Authentication/authorization
|
|
30
|
+
- ✅ File operations
|
|
31
|
+
- ✅ External API calls
|
|
32
|
+
- ✅ HTML/template rendering
|
|
33
|
+
- ✅ Cryptographic operations
|
|
34
|
+
- ✅ Session management
|
|
35
|
+
|
|
36
|
+
## Vulnerability Detection Patterns
|
|
37
|
+
|
|
38
|
+
### 1. SQL Injection (CWE-89)
|
|
39
|
+
|
|
40
|
+
**Detection Patterns**:
|
|
41
|
+
```javascript
|
|
42
|
+
// VULNERABLE: String concatenation in query
|
|
43
|
+
const query = `SELECT * FROM users WHERE id = ${userId}`;
|
|
44
|
+
const query = "SELECT * FROM users WHERE id = " + userId;
|
|
45
|
+
const query = `SELECT * FROM users WHERE name = '${name}'`;
|
|
46
|
+
|
|
47
|
+
// SAFE: Parameterized queries
|
|
48
|
+
const query = 'SELECT * FROM users WHERE id = $1';
|
|
49
|
+
await db.query(query, [userId]);
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**Scan Rules**:
|
|
53
|
+
```yaml
|
|
54
|
+
sql_injection:
|
|
55
|
+
patterns:
|
|
56
|
+
- regex: 'SELECT.*FROM.*WHERE.*\$\{.*\}'
|
|
57
|
+
severity: critical
|
|
58
|
+
message: "Potential SQL injection: String interpolation in query"
|
|
59
|
+
|
|
60
|
+
- regex: '"SELECT.*".*\+.*[a-zA-Z]+'
|
|
61
|
+
severity: critical
|
|
62
|
+
message: "Potential SQL injection: String concatenation in query"
|
|
63
|
+
|
|
64
|
+
- regex: "query\\(['\"].*\\$\\{"
|
|
65
|
+
severity: critical
|
|
66
|
+
message: "Potential SQL injection: Template literal in query"
|
|
67
|
+
|
|
68
|
+
safe_patterns:
|
|
69
|
+
- 'query($1, $2)'
|
|
70
|
+
- 'query(?, ?)'
|
|
71
|
+
- 'where({ id: })'
|
|
72
|
+
- 'findById('
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### 2. Cross-Site Scripting (XSS) (CWE-79)
|
|
76
|
+
|
|
77
|
+
**Detection Patterns**:
|
|
78
|
+
```javascript
|
|
79
|
+
// VULNERABLE: Unescaped user input in HTML
|
|
80
|
+
element.innerHTML = userInput;
|
|
81
|
+
document.write(userInput);
|
|
82
|
+
`<div>${userInput}</div>`;
|
|
83
|
+
|
|
84
|
+
// SAFE: Escaped output
|
|
85
|
+
element.textContent = userInput;
|
|
86
|
+
escapeHtml(userInput);
|
|
87
|
+
DOMPurify.sanitize(userInput);
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
**Scan Rules**:
|
|
91
|
+
```yaml
|
|
92
|
+
xss:
|
|
93
|
+
patterns:
|
|
94
|
+
- regex: 'innerHTML\s*=\s*[a-zA-Z]+'
|
|
95
|
+
severity: high
|
|
96
|
+
message: "Potential XSS: Unescaped assignment to innerHTML"
|
|
97
|
+
|
|
98
|
+
- regex: 'document\.write\('
|
|
99
|
+
severity: high
|
|
100
|
+
message: "Potential XSS: document.write with user input"
|
|
101
|
+
|
|
102
|
+
- regex: 'dangerouslySetInnerHTML'
|
|
103
|
+
severity: medium
|
|
104
|
+
message: "React dangerouslySetInnerHTML - ensure input is sanitized"
|
|
105
|
+
|
|
106
|
+
- regex: '\{\{\{.*\}\}\}'
|
|
107
|
+
severity: medium
|
|
108
|
+
message: "Handlebars unescaped output - ensure input is sanitized"
|
|
109
|
+
|
|
110
|
+
safe_patterns:
|
|
111
|
+
- 'textContent'
|
|
112
|
+
- 'escapeHtml('
|
|
113
|
+
- 'DOMPurify.sanitize('
|
|
114
|
+
- 'sanitizeHtml('
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### 3. Command Injection (CWE-78)
|
|
118
|
+
|
|
119
|
+
**Detection Patterns**:
|
|
120
|
+
```javascript
|
|
121
|
+
// VULNERABLE: User input in shell commands
|
|
122
|
+
exec(`ls ${userInput}`);
|
|
123
|
+
spawn('bash', ['-c', userInput]);
|
|
124
|
+
system(userInput);
|
|
125
|
+
|
|
126
|
+
// SAFE: Validated input, no shell
|
|
127
|
+
execFile('ls', [validatedPath]);
|
|
128
|
+
spawn('ls', ['-la', validatedPath], { shell: false });
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
**Scan Rules**:
|
|
132
|
+
```yaml
|
|
133
|
+
command_injection:
|
|
134
|
+
patterns:
|
|
135
|
+
- regex: 'exec\([`"\'].*\$\{'
|
|
136
|
+
severity: critical
|
|
137
|
+
message: "Potential command injection: User input in exec()"
|
|
138
|
+
|
|
139
|
+
- regex: 'spawn\([^,]+,.*shell:\s*true'
|
|
140
|
+
severity: high
|
|
141
|
+
message: "Potential command injection: spawn with shell: true"
|
|
142
|
+
|
|
143
|
+
- regex: 'child_process.*\+.*[a-zA-Z]+'
|
|
144
|
+
severity: critical
|
|
145
|
+
message: "Potential command injection: String concatenation in command"
|
|
146
|
+
|
|
147
|
+
safe_patterns:
|
|
148
|
+
- 'execFile('
|
|
149
|
+
- 'shell: false'
|
|
150
|
+
- 'spawnSync(cmd, args)'
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### 4. Path Traversal (CWE-22)
|
|
154
|
+
|
|
155
|
+
**Detection Patterns**:
|
|
156
|
+
```javascript
|
|
157
|
+
// VULNERABLE: User input in file paths
|
|
158
|
+
fs.readFile(userInput);
|
|
159
|
+
path.join(baseDir, userInput); // if userInput contains ../
|
|
160
|
+
|
|
161
|
+
// SAFE: Validated and normalized paths
|
|
162
|
+
const safePath = path.resolve(baseDir, userInput);
|
|
163
|
+
if (!safePath.startsWith(baseDir)) throw new Error('Invalid path');
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
**Scan Rules**:
|
|
167
|
+
```yaml
|
|
168
|
+
path_traversal:
|
|
169
|
+
patterns:
|
|
170
|
+
- regex: 'readFile\([a-zA-Z]+\)'
|
|
171
|
+
severity: high
|
|
172
|
+
message: "Potential path traversal: Unvalidated path in readFile"
|
|
173
|
+
|
|
174
|
+
- regex: 'path\.join\(.*,\s*req\.'
|
|
175
|
+
severity: high
|
|
176
|
+
message: "Potential path traversal: Request input in path.join"
|
|
177
|
+
|
|
178
|
+
- regex: '__dirname.*\+.*req\.'
|
|
179
|
+
severity: high
|
|
180
|
+
message: "Potential path traversal: Request input concatenated to path"
|
|
181
|
+
|
|
182
|
+
safe_patterns:
|
|
183
|
+
- 'path.resolve('
|
|
184
|
+
- 'startsWith(baseDir)'
|
|
185
|
+
- 'path.normalize('
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### 5. Insecure Deserialization (CWE-502)
|
|
189
|
+
|
|
190
|
+
**Detection Patterns**:
|
|
191
|
+
```javascript
|
|
192
|
+
// VULNERABLE: Deserializing untrusted data
|
|
193
|
+
eval(userInput);
|
|
194
|
+
new Function(userInput);
|
|
195
|
+
JSON.parse(userInput); // Only dangerous if result is used unsafely
|
|
196
|
+
|
|
197
|
+
// SAFE: Validated deserialization
|
|
198
|
+
const data = JSON.parse(userInput);
|
|
199
|
+
const validated = schema.validate(data);
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
**Scan Rules**:
|
|
203
|
+
```yaml
|
|
204
|
+
insecure_deserialization:
|
|
205
|
+
patterns:
|
|
206
|
+
- regex: 'eval\('
|
|
207
|
+
severity: critical
|
|
208
|
+
message: "Critical: eval() with potential user input"
|
|
209
|
+
|
|
210
|
+
- regex: 'new Function\('
|
|
211
|
+
severity: critical
|
|
212
|
+
message: "Critical: new Function() with potential user input"
|
|
213
|
+
|
|
214
|
+
- regex: 'serialize-javascript.*uneval'
|
|
215
|
+
severity: high
|
|
216
|
+
message: "Potential insecure deserialization"
|
|
217
|
+
|
|
218
|
+
safe_patterns:
|
|
219
|
+
- 'JSON.parse' # With validation
|
|
220
|
+
- 'schema.validate'
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### 6. Hardcoded Secrets (CWE-798)
|
|
224
|
+
|
|
225
|
+
**Detection Patterns**:
|
|
226
|
+
```javascript
|
|
227
|
+
// VULNERABLE: Hardcoded credentials
|
|
228
|
+
const password = "secretpassword123";
|
|
229
|
+
const apiKey = "sk-1234567890abcdef";
|
|
230
|
+
const token = "eyJhbGciOiJIUzI1NiIs...";
|
|
231
|
+
|
|
232
|
+
// SAFE: Environment variables
|
|
233
|
+
const password = process.env.DB_PASSWORD;
|
|
234
|
+
const apiKey = process.env.API_KEY;
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
**Scan Rules**:
|
|
238
|
+
```yaml
|
|
239
|
+
hardcoded_secrets:
|
|
240
|
+
patterns:
|
|
241
|
+
- regex: '(password|passwd|pwd)\s*[=:]\s*["\'][^"\']{8,}'
|
|
242
|
+
severity: critical
|
|
243
|
+
message: "Hardcoded password detected"
|
|
244
|
+
|
|
245
|
+
- regex: '(api[_-]?key|apikey)\s*[=:]\s*["\'][a-zA-Z0-9]{16,}'
|
|
246
|
+
severity: critical
|
|
247
|
+
message: "Hardcoded API key detected"
|
|
248
|
+
|
|
249
|
+
- regex: '(secret|token)\s*[=:]\s*["\'][a-zA-Z0-9+/=]{20,}'
|
|
250
|
+
severity: critical
|
|
251
|
+
message: "Hardcoded secret/token detected"
|
|
252
|
+
|
|
253
|
+
- regex: 'Bearer\s+[a-zA-Z0-9._-]{20,}'
|
|
254
|
+
severity: high
|
|
255
|
+
message: "Hardcoded bearer token detected"
|
|
256
|
+
|
|
257
|
+
- regex: '-----BEGIN (RSA |EC )?PRIVATE KEY-----'
|
|
258
|
+
severity: critical
|
|
259
|
+
message: "Private key in source code"
|
|
260
|
+
|
|
261
|
+
safe_patterns:
|
|
262
|
+
- 'process.env.'
|
|
263
|
+
- 'config.get('
|
|
264
|
+
- 'secrets.get('
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
### 7. Insecure Random (CWE-330)
|
|
268
|
+
|
|
269
|
+
**Detection Patterns**:
|
|
270
|
+
```javascript
|
|
271
|
+
// VULNERABLE: Weak randomness for security
|
|
272
|
+
const token = Math.random().toString(36);
|
|
273
|
+
const id = Math.floor(Math.random() * 1000000);
|
|
274
|
+
|
|
275
|
+
// SAFE: Cryptographically secure random
|
|
276
|
+
const token = crypto.randomBytes(32).toString('hex');
|
|
277
|
+
const id = crypto.randomUUID();
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
**Scan Rules**:
|
|
281
|
+
```yaml
|
|
282
|
+
insecure_random:
|
|
283
|
+
patterns:
|
|
284
|
+
- regex: 'Math\.random\(\).*token'
|
|
285
|
+
severity: high
|
|
286
|
+
message: "Insecure random for token generation"
|
|
287
|
+
|
|
288
|
+
- regex: 'Math\.random\(\).*password'
|
|
289
|
+
severity: critical
|
|
290
|
+
message: "Insecure random for password generation"
|
|
291
|
+
|
|
292
|
+
- regex: 'Math\.random\(\).*secret'
|
|
293
|
+
severity: critical
|
|
294
|
+
message: "Insecure random for secret generation"
|
|
295
|
+
|
|
296
|
+
safe_patterns:
|
|
297
|
+
- 'crypto.randomBytes'
|
|
298
|
+
- 'crypto.randomUUID'
|
|
299
|
+
- 'crypto.getRandomValues'
|
|
300
|
+
- 'uuid.v4()'
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
### 8. Missing Authentication (CWE-306)
|
|
304
|
+
|
|
305
|
+
**Detection Patterns**:
|
|
306
|
+
```javascript
|
|
307
|
+
// VULNERABLE: Unprotected routes
|
|
308
|
+
app.post('/api/admin/users', createUser);
|
|
309
|
+
router.delete('/api/items/:id', deleteItem);
|
|
310
|
+
|
|
311
|
+
// SAFE: Authentication middleware
|
|
312
|
+
app.post('/api/admin/users', authMiddleware, createUser);
|
|
313
|
+
router.delete('/api/items/:id', authenticate, authorize, deleteItem);
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
**Scan Rules**:
|
|
317
|
+
```yaml
|
|
318
|
+
missing_authentication:
|
|
319
|
+
patterns:
|
|
320
|
+
- regex: 'app\.(post|put|delete|patch)\([^,]+,\s*[a-zA-Z]+\)'
|
|
321
|
+
context: "Check if route needs authentication"
|
|
322
|
+
severity: medium
|
|
323
|
+
message: "Route may be missing authentication middleware"
|
|
324
|
+
|
|
325
|
+
- regex: '/api/(admin|user|account)'
|
|
326
|
+
context: "Sensitive routes"
|
|
327
|
+
severity: medium
|
|
328
|
+
message: "Sensitive route - verify authentication is in place"
|
|
329
|
+
|
|
330
|
+
safe_patterns:
|
|
331
|
+
- 'authMiddleware'
|
|
332
|
+
- 'authenticate'
|
|
333
|
+
- 'requireAuth'
|
|
334
|
+
- 'isAuthenticated'
|
|
335
|
+
- 'passport.authenticate'
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
### 9. CSRF Vulnerabilities (CWE-352)
|
|
339
|
+
|
|
340
|
+
**Detection Patterns**:
|
|
341
|
+
```javascript
|
|
342
|
+
// VULNERABLE: State-changing without CSRF protection
|
|
343
|
+
app.post('/api/transfer', handleTransfer);
|
|
344
|
+
|
|
345
|
+
// SAFE: CSRF token validation
|
|
346
|
+
app.post('/api/transfer', csrfProtection, handleTransfer);
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
**Scan Rules**:
|
|
350
|
+
```yaml
|
|
351
|
+
csrf:
|
|
352
|
+
patterns:
|
|
353
|
+
- regex: 'app\.post\([^,]+,\s*(?!.*csrf)'
|
|
354
|
+
severity: medium
|
|
355
|
+
message: "POST route may need CSRF protection"
|
|
356
|
+
|
|
357
|
+
safe_patterns:
|
|
358
|
+
- 'csrf'
|
|
359
|
+
- 'csurf'
|
|
360
|
+
- 'csrfProtection'
|
|
361
|
+
- 'verifyCsrfToken'
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
### 10. Insecure Cookie Settings (CWE-614)
|
|
365
|
+
|
|
366
|
+
**Detection Patterns**:
|
|
367
|
+
```javascript
|
|
368
|
+
// VULNERABLE: Insecure cookie
|
|
369
|
+
res.cookie('session', value);
|
|
370
|
+
res.cookie('token', value, { httpOnly: false });
|
|
371
|
+
|
|
372
|
+
// SAFE: Secure cookie settings
|
|
373
|
+
res.cookie('session', value, {
|
|
374
|
+
httpOnly: true,
|
|
375
|
+
secure: true,
|
|
376
|
+
sameSite: 'strict'
|
|
377
|
+
});
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
**Scan Rules**:
|
|
381
|
+
```yaml
|
|
382
|
+
insecure_cookies:
|
|
383
|
+
patterns:
|
|
384
|
+
- regex: 'cookie\([^)]+\)(?!.*httpOnly)'
|
|
385
|
+
severity: medium
|
|
386
|
+
message: "Cookie missing httpOnly flag"
|
|
387
|
+
|
|
388
|
+
- regex: 'cookie\([^)]+\)(?!.*secure)'
|
|
389
|
+
severity: medium
|
|
390
|
+
message: "Cookie missing secure flag"
|
|
391
|
+
|
|
392
|
+
- regex: 'httpOnly:\s*false'
|
|
393
|
+
severity: high
|
|
394
|
+
message: "Cookie explicitly set httpOnly: false"
|
|
395
|
+
|
|
396
|
+
safe_patterns:
|
|
397
|
+
- 'httpOnly: true'
|
|
398
|
+
- 'secure: true'
|
|
399
|
+
- "sameSite: 'strict'"
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
## Scan Process
|
|
403
|
+
|
|
404
|
+
### 1. Pre-Scan Setup
|
|
405
|
+
|
|
406
|
+
```yaml
|
|
407
|
+
scan_configuration:
|
|
408
|
+
enabled_checks:
|
|
409
|
+
- sql_injection
|
|
410
|
+
- xss
|
|
411
|
+
- command_injection
|
|
412
|
+
- path_traversal
|
|
413
|
+
- hardcoded_secrets
|
|
414
|
+
- insecure_random
|
|
415
|
+
- missing_authentication
|
|
416
|
+
- csrf
|
|
417
|
+
- insecure_cookies
|
|
418
|
+
|
|
419
|
+
severity_threshold: medium # Report medium and above
|
|
420
|
+
|
|
421
|
+
file_patterns:
|
|
422
|
+
include:
|
|
423
|
+
- "**/*.js"
|
|
424
|
+
- "**/*.ts"
|
|
425
|
+
- "**/*.jsx"
|
|
426
|
+
- "**/*.tsx"
|
|
427
|
+
- "**/*.py"
|
|
428
|
+
- "**/*.java"
|
|
429
|
+
exclude:
|
|
430
|
+
- "node_modules/**"
|
|
431
|
+
- "**/*.test.*"
|
|
432
|
+
- "**/*.spec.*"
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
### 2. Scan Execution
|
|
436
|
+
|
|
437
|
+
```python
|
|
438
|
+
def scan_for_vulnerabilities(files, rules):
|
|
439
|
+
"""
|
|
440
|
+
Scan files for security vulnerabilities.
|
|
441
|
+
|
|
442
|
+
Args:
|
|
443
|
+
files: List of file paths to scan
|
|
444
|
+
rules: Security scan rules
|
|
445
|
+
|
|
446
|
+
Returns:
|
|
447
|
+
List of findings with severity and remediation
|
|
448
|
+
"""
|
|
449
|
+
findings = []
|
|
450
|
+
|
|
451
|
+
for file_path in files:
|
|
452
|
+
content = read_file(file_path)
|
|
453
|
+
|
|
454
|
+
for rule_category, rule_config in rules.items():
|
|
455
|
+
for pattern in rule_config['patterns']:
|
|
456
|
+
matches = re.findall(pattern['regex'], content)
|
|
457
|
+
|
|
458
|
+
for match in matches:
|
|
459
|
+
# Check if safe pattern present
|
|
460
|
+
is_safe = any(
|
|
461
|
+
safe in content[match.start-100:match.end+100]
|
|
462
|
+
for safe in rule_config.get('safe_patterns', [])
|
|
463
|
+
)
|
|
464
|
+
|
|
465
|
+
if not is_safe:
|
|
466
|
+
findings.append({
|
|
467
|
+
'file': file_path,
|
|
468
|
+
'line': get_line_number(content, match),
|
|
469
|
+
'category': rule_category,
|
|
470
|
+
'severity': pattern['severity'],
|
|
471
|
+
'message': pattern['message'],
|
|
472
|
+
'code': get_code_snippet(content, match),
|
|
473
|
+
'remediation': get_remediation(rule_category)
|
|
474
|
+
})
|
|
475
|
+
|
|
476
|
+
return sorted(findings, key=lambda x: severity_order[x['severity']])
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
### 3. Report Generation
|
|
480
|
+
|
|
481
|
+
```yaml
|
|
482
|
+
# koan/reviews/security-scan-{id}.yaml
|
|
483
|
+
|
|
484
|
+
scan_id: "security-scan-001"
|
|
485
|
+
timestamp: "2025-11-11T10:00:00Z"
|
|
486
|
+
implementation_id: "impl-001"
|
|
487
|
+
status: "findings_detected"
|
|
488
|
+
|
|
489
|
+
summary:
|
|
490
|
+
total_findings: 5
|
|
491
|
+
critical: 1
|
|
492
|
+
high: 2
|
|
493
|
+
medium: 2
|
|
494
|
+
low: 0
|
|
495
|
+
|
|
496
|
+
findings:
|
|
497
|
+
- id: "finding-001"
|
|
498
|
+
severity: critical
|
|
499
|
+
category: "sql_injection"
|
|
500
|
+
file: "src/services/user.service.ts"
|
|
501
|
+
line: 45
|
|
502
|
+
message: "Potential SQL injection: String interpolation in query"
|
|
503
|
+
code: |
|
|
504
|
+
const query = `SELECT * FROM users WHERE id = ${userId}`;
|
|
505
|
+
remediation: |
|
|
506
|
+
Use parameterized queries:
|
|
507
|
+
const query = 'SELECT * FROM users WHERE id = $1';
|
|
508
|
+
await db.query(query, [userId]);
|
|
509
|
+
|
|
510
|
+
- id: "finding-002"
|
|
511
|
+
severity: high
|
|
512
|
+
category: "hardcoded_secrets"
|
|
513
|
+
file: "src/config/database.ts"
|
|
514
|
+
line: 12
|
|
515
|
+
message: "Hardcoded password detected"
|
|
516
|
+
code: |
|
|
517
|
+
const password = "db_password_123";
|
|
518
|
+
remediation: |
|
|
519
|
+
Use environment variables:
|
|
520
|
+
const password = process.env.DB_PASSWORD;
|
|
521
|
+
|
|
522
|
+
blocked: true # Critical findings block merge
|
|
523
|
+
```
|
|
524
|
+
|
|
525
|
+
## Integration with Quality Concept
|
|
526
|
+
|
|
527
|
+
### In Quality Review Action
|
|
528
|
+
|
|
529
|
+
```yaml
|
|
530
|
+
# Add to quality.review process
|
|
531
|
+
|
|
532
|
+
quality_review:
|
|
533
|
+
steps:
|
|
534
|
+
- name: "Code Style Check"
|
|
535
|
+
tool: "eslint"
|
|
536
|
+
|
|
537
|
+
- name: "Security Vulnerability Scan"
|
|
538
|
+
tool: "security-scanner"
|
|
539
|
+
config:
|
|
540
|
+
severity_threshold: "medium"
|
|
541
|
+
block_on_critical: true
|
|
542
|
+
block_on_high: true
|
|
543
|
+
|
|
544
|
+
- name: "Type Check"
|
|
545
|
+
tool: "tsc"
|
|
546
|
+
|
|
547
|
+
blocking_conditions:
|
|
548
|
+
- "security.critical > 0"
|
|
549
|
+
- "security.high > 0"
|
|
550
|
+
```
|
|
551
|
+
|
|
552
|
+
### Scan Output in Review
|
|
553
|
+
|
|
554
|
+
```yaml
|
|
555
|
+
# koan/reviews/review-{id}.yaml
|
|
556
|
+
|
|
557
|
+
review_id: "review-001"
|
|
558
|
+
implementation_id: "impl-001"
|
|
559
|
+
status: "needs_changes" # Blocked by security findings
|
|
560
|
+
|
|
561
|
+
security_scan:
|
|
562
|
+
status: "failed"
|
|
563
|
+
critical: 1
|
|
564
|
+
high: 2
|
|
565
|
+
findings:
|
|
566
|
+
- "SQL injection in user.service.ts:45"
|
|
567
|
+
- "Hardcoded password in database.ts:12"
|
|
568
|
+
- "Missing CSRF protection on /api/transfer"
|
|
569
|
+
|
|
570
|
+
remediation_required:
|
|
571
|
+
- file: "src/services/user.service.ts"
|
|
572
|
+
action: "Use parameterized queries"
|
|
573
|
+
|
|
574
|
+
- file: "src/config/database.ts"
|
|
575
|
+
action: "Move password to environment variable"
|
|
576
|
+
|
|
577
|
+
- file: "src/routes/transfer.ts"
|
|
578
|
+
action: "Add CSRF middleware"
|
|
579
|
+
|
|
580
|
+
code_review:
|
|
581
|
+
status: "approved"
|
|
582
|
+
# Security issues override code approval
|
|
583
|
+
```
|
|
584
|
+
|
|
585
|
+
## Remediation Guidance
|
|
586
|
+
|
|
587
|
+
### For Each Vulnerability Type
|
|
588
|
+
|
|
589
|
+
```yaml
|
|
590
|
+
remediation_guides:
|
|
591
|
+
sql_injection:
|
|
592
|
+
title: "Fix SQL Injection"
|
|
593
|
+
steps:
|
|
594
|
+
- "Replace string concatenation with parameterized queries"
|
|
595
|
+
- "Use ORM methods instead of raw SQL where possible"
|
|
596
|
+
- "Validate input types before query construction"
|
|
597
|
+
examples:
|
|
598
|
+
before: |
|
|
599
|
+
const query = `SELECT * FROM users WHERE id = ${userId}`;
|
|
600
|
+
after: |
|
|
601
|
+
const query = 'SELECT * FROM users WHERE id = $1';
|
|
602
|
+
await db.query(query, [userId]);
|
|
603
|
+
|
|
604
|
+
xss:
|
|
605
|
+
title: "Fix Cross-Site Scripting"
|
|
606
|
+
steps:
|
|
607
|
+
- "Use textContent instead of innerHTML for plain text"
|
|
608
|
+
- "Sanitize HTML with DOMPurify before rendering"
|
|
609
|
+
- "Use framework's built-in escaping (React, Vue, etc.)"
|
|
610
|
+
examples:
|
|
611
|
+
before: |
|
|
612
|
+
element.innerHTML = userInput;
|
|
613
|
+
after: |
|
|
614
|
+
element.textContent = userInput;
|
|
615
|
+
// Or if HTML is needed:
|
|
616
|
+
element.innerHTML = DOMPurify.sanitize(userInput);
|
|
617
|
+
|
|
618
|
+
hardcoded_secrets:
|
|
619
|
+
title: "Fix Hardcoded Secrets"
|
|
620
|
+
steps:
|
|
621
|
+
- "Move secrets to environment variables"
|
|
622
|
+
- "Use a secret manager (Vault, AWS Secrets Manager)"
|
|
623
|
+
- "Add secret patterns to .gitignore"
|
|
624
|
+
examples:
|
|
625
|
+
before: |
|
|
626
|
+
const apiKey = "sk-1234567890";
|
|
627
|
+
after: |
|
|
628
|
+
const apiKey = process.env.API_KEY;
|
|
629
|
+
// In .env (not committed):
|
|
630
|
+
// API_KEY=sk-1234567890
|
|
631
|
+
```
|
|
632
|
+
|
|
633
|
+
## SLO Expectations
|
|
634
|
+
|
|
635
|
+
```yaml
|
|
636
|
+
security_scan_slo:
|
|
637
|
+
expected_duration_ms: 5000
|
|
638
|
+
max_duration_ms: 30000
|
|
639
|
+
|
|
640
|
+
blocking_policy:
|
|
641
|
+
critical: "always_block"
|
|
642
|
+
high: "always_block"
|
|
643
|
+
medium: "warn_and_continue"
|
|
644
|
+
low: "log_only"
|
|
645
|
+
|
|
646
|
+
metrics:
|
|
647
|
+
target_false_positive_rate: "< 10%"
|
|
648
|
+
target_coverage: "> 95% of OWASP Top 10"
|
|
649
|
+
```
|
|
650
|
+
|
|
651
|
+
## Best Practices
|
|
652
|
+
|
|
653
|
+
1. ✅ **Run on every code change** - Security scan in CI/CD pipeline
|
|
654
|
+
2. ✅ **Block critical/high findings** - Don't merge vulnerable code
|
|
655
|
+
3. ✅ **Provide clear remediation** - Actionable fix guidance
|
|
656
|
+
4. ✅ **Track metrics** - False positive rate, time to remediate
|
|
657
|
+
5. ✅ **Update rules regularly** - New vulnerability patterns emerge
|
|
658
|
+
6. ✅ **Context-aware scanning** - Reduce false positives with context
|
|
659
|
+
7. ✅ **Developer education** - Help developers understand why
|
|
660
|
+
|
|
661
|
+
---
|
|
662
|
+
|
|
663
|
+
**Use this skill when**: Reviewing any code that handles user input, authentication, data storage, or external communication. Security scanning should be automatic in the quality review phase.
|