@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,692 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Security Design Patterns
|
|
3
|
+
description: Apply OWASP-aligned security patterns during architecture design to prevent vulnerabilities from the start
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
trigger_keywords: [security, auth, authorization, encryption, OWASP, vulnerability, authentication, password, token, session]
|
|
6
|
+
author: Zen Architecture
|
|
7
|
+
applies_to: [architecture-concept]
|
|
8
|
+
priority: P0
|
|
9
|
+
impact: critical
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Security Design Patterns - Expert Skill
|
|
13
|
+
|
|
14
|
+
Apply security best practices during architecture design to prevent vulnerabilities before they're implemented.
|
|
15
|
+
|
|
16
|
+
## Purpose
|
|
17
|
+
|
|
18
|
+
Security design patterns provide:
|
|
19
|
+
- **Prevention over detection**: Catch security issues at design time, not production
|
|
20
|
+
- **OWASP alignment**: Industry-standard security checklist
|
|
21
|
+
- **Cost savings**: Security retrofits are 10x more expensive than design-time fixes
|
|
22
|
+
- **Compliance readiness**: Meet security audit requirements from the start
|
|
23
|
+
|
|
24
|
+
## When to Use
|
|
25
|
+
|
|
26
|
+
Use security design patterns when:
|
|
27
|
+
- ✅ Designing authentication or authorization systems
|
|
28
|
+
- ✅ Handling sensitive data (PII, credentials, financial)
|
|
29
|
+
- ✅ Creating API endpoints exposed to users
|
|
30
|
+
- ✅ Integrating with third-party services
|
|
31
|
+
- ✅ Processing user input of any kind
|
|
32
|
+
- ✅ Storing or transmitting secrets
|
|
33
|
+
|
|
34
|
+
## OWASP Top 10 Checklist
|
|
35
|
+
|
|
36
|
+
### A01: Broken Access Control
|
|
37
|
+
|
|
38
|
+
**Design Checklist**:
|
|
39
|
+
```yaml
|
|
40
|
+
access_control:
|
|
41
|
+
- principle: "Deny by default"
|
|
42
|
+
implementation: "All endpoints require explicit authorization"
|
|
43
|
+
pattern: |
|
|
44
|
+
// Middleware-first authorization
|
|
45
|
+
router.use(authMiddleware);
|
|
46
|
+
router.use(authzMiddleware);
|
|
47
|
+
|
|
48
|
+
- principle: "Least privilege"
|
|
49
|
+
implementation: "Users get minimum permissions needed"
|
|
50
|
+
pattern: |
|
|
51
|
+
// Role-based with minimal grants
|
|
52
|
+
const permissions = {
|
|
53
|
+
viewer: ['read'],
|
|
54
|
+
editor: ['read', 'write'],
|
|
55
|
+
admin: ['read', 'write', 'delete', 'admin']
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
- principle: "Ownership verification"
|
|
59
|
+
implementation: "Verify user owns resource before access"
|
|
60
|
+
pattern: |
|
|
61
|
+
// Always check ownership
|
|
62
|
+
async function getResource(userId, resourceId) {
|
|
63
|
+
const resource = await db.find(resourceId);
|
|
64
|
+
if (resource.ownerId !== userId) {
|
|
65
|
+
throw new ForbiddenError();
|
|
66
|
+
}
|
|
67
|
+
return resource;
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### A02: Cryptographic Failures
|
|
72
|
+
|
|
73
|
+
**Design Checklist**:
|
|
74
|
+
```yaml
|
|
75
|
+
cryptography:
|
|
76
|
+
- principle: "Encrypt sensitive data at rest"
|
|
77
|
+
implementation: "Use AES-256 for data at rest"
|
|
78
|
+
pattern: |
|
|
79
|
+
// Encrypt before storing
|
|
80
|
+
const encrypted = await encrypt(sensitiveData, key);
|
|
81
|
+
await db.store({ data: encrypted, iv: iv });
|
|
82
|
+
|
|
83
|
+
- principle: "TLS everywhere"
|
|
84
|
+
implementation: "HTTPS only, no HTTP fallback"
|
|
85
|
+
pattern: |
|
|
86
|
+
// Force HTTPS in production
|
|
87
|
+
if (process.env.NODE_ENV === 'production') {
|
|
88
|
+
app.use(helmet.hsts());
|
|
89
|
+
app.use(redirectToHttps());
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
- principle: "No hardcoded secrets"
|
|
93
|
+
implementation: "Use environment variables or secret managers"
|
|
94
|
+
pattern: |
|
|
95
|
+
// Load from environment
|
|
96
|
+
const config = {
|
|
97
|
+
dbPassword: process.env.DB_PASSWORD,
|
|
98
|
+
apiKey: process.env.API_KEY,
|
|
99
|
+
jwtSecret: process.env.JWT_SECRET
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
- principle: "Secure password storage"
|
|
103
|
+
implementation: "bcrypt with cost factor >= 12"
|
|
104
|
+
pattern: |
|
|
105
|
+
// Hash passwords properly
|
|
106
|
+
const BCRYPT_ROUNDS = 12;
|
|
107
|
+
const hash = await bcrypt.hash(password, BCRYPT_ROUNDS);
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### A03: Injection
|
|
111
|
+
|
|
112
|
+
**Design Checklist**:
|
|
113
|
+
```yaml
|
|
114
|
+
injection_prevention:
|
|
115
|
+
- principle: "Parameterized queries only"
|
|
116
|
+
implementation: "Never concatenate user input into queries"
|
|
117
|
+
pattern: |
|
|
118
|
+
// GOOD: Parameterized
|
|
119
|
+
const result = await db.query(
|
|
120
|
+
'SELECT * FROM users WHERE id = $1',
|
|
121
|
+
[userId]
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
// BAD: Concatenation (NEVER DO THIS)
|
|
125
|
+
// const result = await db.query(
|
|
126
|
+
// `SELECT * FROM users WHERE id = ${userId}`
|
|
127
|
+
// );
|
|
128
|
+
|
|
129
|
+
- principle: "Input validation"
|
|
130
|
+
implementation: "Validate and sanitize all input"
|
|
131
|
+
pattern: |
|
|
132
|
+
// Validate with schema
|
|
133
|
+
const schema = Joi.object({
|
|
134
|
+
email: Joi.string().email().required(),
|
|
135
|
+
age: Joi.number().integer().min(0).max(150)
|
|
136
|
+
});
|
|
137
|
+
const validated = await schema.validateAsync(input);
|
|
138
|
+
|
|
139
|
+
- principle: "Output encoding"
|
|
140
|
+
implementation: "Encode output based on context"
|
|
141
|
+
pattern: |
|
|
142
|
+
// HTML context
|
|
143
|
+
const safeHtml = escapeHtml(userInput);
|
|
144
|
+
|
|
145
|
+
// URL context
|
|
146
|
+
const safeUrl = encodeURIComponent(userInput);
|
|
147
|
+
|
|
148
|
+
// JavaScript context
|
|
149
|
+
const safeJs = JSON.stringify(userInput);
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### A04: Insecure Design
|
|
153
|
+
|
|
154
|
+
**Design Checklist**:
|
|
155
|
+
```yaml
|
|
156
|
+
secure_design:
|
|
157
|
+
- principle: "Threat modeling"
|
|
158
|
+
implementation: "Identify threats during design"
|
|
159
|
+
questions:
|
|
160
|
+
- "What data is sensitive?"
|
|
161
|
+
- "Who should access what?"
|
|
162
|
+
- "What could an attacker try?"
|
|
163
|
+
- "What's the blast radius of a breach?"
|
|
164
|
+
|
|
165
|
+
- principle: "Defense in depth"
|
|
166
|
+
implementation: "Multiple layers of security"
|
|
167
|
+
layers:
|
|
168
|
+
- "Network: Firewall, VPN"
|
|
169
|
+
- "Application: Auth, authz, validation"
|
|
170
|
+
- "Data: Encryption, access controls"
|
|
171
|
+
- "Monitoring: Logging, alerting"
|
|
172
|
+
|
|
173
|
+
- principle: "Fail securely"
|
|
174
|
+
implementation: "Errors don't leak information"
|
|
175
|
+
pattern: |
|
|
176
|
+
// Don't reveal internal details
|
|
177
|
+
catch (error) {
|
|
178
|
+
logger.error('Internal error', { error, userId });
|
|
179
|
+
return res.status(500).json({
|
|
180
|
+
error: 'An error occurred',
|
|
181
|
+
// NOT: error.message, error.stack
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### A05: Security Misconfiguration
|
|
187
|
+
|
|
188
|
+
**Design Checklist**:
|
|
189
|
+
```yaml
|
|
190
|
+
configuration:
|
|
191
|
+
- principle: "Secure defaults"
|
|
192
|
+
implementation: "Default to most secure option"
|
|
193
|
+
examples:
|
|
194
|
+
- "CORS: Deny all origins by default"
|
|
195
|
+
- "Headers: Enable security headers"
|
|
196
|
+
- "Permissions: No access by default"
|
|
197
|
+
|
|
198
|
+
- principle: "Remove unnecessary features"
|
|
199
|
+
implementation: "Disable unused endpoints, methods, features"
|
|
200
|
+
pattern: |
|
|
201
|
+
// Only enable needed HTTP methods
|
|
202
|
+
router.route('/users/:id')
|
|
203
|
+
.get(getUser)
|
|
204
|
+
.put(updateUser);
|
|
205
|
+
// DELETE not enabled unless needed
|
|
206
|
+
|
|
207
|
+
- principle: "Security headers"
|
|
208
|
+
implementation: "Use helmet.js or equivalent"
|
|
209
|
+
pattern: |
|
|
210
|
+
app.use(helmet({
|
|
211
|
+
contentSecurityPolicy: true,
|
|
212
|
+
crossOriginEmbedderPolicy: true,
|
|
213
|
+
crossOriginOpenerPolicy: true,
|
|
214
|
+
crossOriginResourcePolicy: true,
|
|
215
|
+
dnsPrefetchControl: true,
|
|
216
|
+
frameguard: true,
|
|
217
|
+
hidePoweredBy: true,
|
|
218
|
+
hsts: true,
|
|
219
|
+
ieNoOpen: true,
|
|
220
|
+
noSniff: true,
|
|
221
|
+
originAgentCluster: true,
|
|
222
|
+
permittedCrossDomainPolicies: true,
|
|
223
|
+
referrerPolicy: true,
|
|
224
|
+
xssFilter: true
|
|
225
|
+
}));
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
### A06: Vulnerable Components
|
|
229
|
+
|
|
230
|
+
**Design Checklist**:
|
|
231
|
+
```yaml
|
|
232
|
+
dependencies:
|
|
233
|
+
- principle: "Minimal dependencies"
|
|
234
|
+
implementation: "Only add necessary packages"
|
|
235
|
+
|
|
236
|
+
- principle: "Regular updates"
|
|
237
|
+
implementation: "Automated dependency updates"
|
|
238
|
+
tools:
|
|
239
|
+
- "Dependabot"
|
|
240
|
+
- "Renovate"
|
|
241
|
+
- "npm audit"
|
|
242
|
+
|
|
243
|
+
- principle: "Vulnerability scanning"
|
|
244
|
+
implementation: "CI/CD security scanning"
|
|
245
|
+
pattern: |
|
|
246
|
+
# In CI pipeline
|
|
247
|
+
- name: Security audit
|
|
248
|
+
run: npm audit --audit-level=high
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
### A07: Authentication Failures
|
|
252
|
+
|
|
253
|
+
**Design Checklist**:
|
|
254
|
+
```yaml
|
|
255
|
+
authentication:
|
|
256
|
+
- principle: "Strong password policy"
|
|
257
|
+
implementation: "Minimum requirements + breach check"
|
|
258
|
+
pattern: |
|
|
259
|
+
const passwordPolicy = {
|
|
260
|
+
minLength: 12,
|
|
261
|
+
requireUppercase: true,
|
|
262
|
+
requireLowercase: true,
|
|
263
|
+
requireNumber: true,
|
|
264
|
+
requireSpecial: true,
|
|
265
|
+
checkBreached: true // Check haveibeenpwned
|
|
266
|
+
};
|
|
267
|
+
|
|
268
|
+
- principle: "Rate limiting"
|
|
269
|
+
implementation: "Limit auth attempts"
|
|
270
|
+
pattern: |
|
|
271
|
+
const loginLimiter = rateLimit({
|
|
272
|
+
windowMs: 15 * 60 * 1000, // 15 minutes
|
|
273
|
+
max: 5, // 5 attempts
|
|
274
|
+
message: 'Too many login attempts'
|
|
275
|
+
});
|
|
276
|
+
app.post('/login', loginLimiter, loginHandler);
|
|
277
|
+
|
|
278
|
+
- principle: "Multi-factor authentication"
|
|
279
|
+
implementation: "MFA for sensitive operations"
|
|
280
|
+
triggers:
|
|
281
|
+
- "New device login"
|
|
282
|
+
- "Password change"
|
|
283
|
+
- "Financial transactions"
|
|
284
|
+
- "Admin operations"
|
|
285
|
+
|
|
286
|
+
- principle: "Secure session management"
|
|
287
|
+
implementation: "HTTP-only, secure cookies"
|
|
288
|
+
pattern: |
|
|
289
|
+
app.use(session({
|
|
290
|
+
cookie: {
|
|
291
|
+
httpOnly: true,
|
|
292
|
+
secure: true,
|
|
293
|
+
sameSite: 'strict',
|
|
294
|
+
maxAge: 3600000 // 1 hour
|
|
295
|
+
},
|
|
296
|
+
resave: false,
|
|
297
|
+
saveUninitialized: false
|
|
298
|
+
}));
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
### A08: Software and Data Integrity
|
|
302
|
+
|
|
303
|
+
**Design Checklist**:
|
|
304
|
+
```yaml
|
|
305
|
+
integrity:
|
|
306
|
+
- principle: "Verify dependencies"
|
|
307
|
+
implementation: "Lock files and integrity checks"
|
|
308
|
+
pattern: |
|
|
309
|
+
# package-lock.json with integrity hashes
|
|
310
|
+
npm ci # Use ci, not install
|
|
311
|
+
|
|
312
|
+
- principle: "Code signing"
|
|
313
|
+
implementation: "Sign releases and verify signatures"
|
|
314
|
+
|
|
315
|
+
- principle: "CI/CD security"
|
|
316
|
+
implementation: "Secure pipeline configuration"
|
|
317
|
+
checks:
|
|
318
|
+
- "Protected branches"
|
|
319
|
+
- "Required reviews"
|
|
320
|
+
- "Signed commits"
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
### A09: Security Logging and Monitoring
|
|
324
|
+
|
|
325
|
+
**Design Checklist**:
|
|
326
|
+
```yaml
|
|
327
|
+
logging:
|
|
328
|
+
- principle: "Log security events"
|
|
329
|
+
implementation: "Audit trail for sensitive operations"
|
|
330
|
+
events_to_log:
|
|
331
|
+
- "Login success/failure"
|
|
332
|
+
- "Password changes"
|
|
333
|
+
- "Permission changes"
|
|
334
|
+
- "Data access"
|
|
335
|
+
- "Admin operations"
|
|
336
|
+
|
|
337
|
+
- principle: "Don't log sensitive data"
|
|
338
|
+
implementation: "Redact PII and secrets"
|
|
339
|
+
pattern: |
|
|
340
|
+
function sanitizeForLog(data) {
|
|
341
|
+
return {
|
|
342
|
+
...data,
|
|
343
|
+
password: '[REDACTED]',
|
|
344
|
+
ssn: '[REDACTED]',
|
|
345
|
+
creditCard: '[REDACTED]'
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
- principle: "Alerting"
|
|
350
|
+
implementation: "Alert on suspicious patterns"
|
|
351
|
+
triggers:
|
|
352
|
+
- "Multiple failed logins"
|
|
353
|
+
- "Unusual access patterns"
|
|
354
|
+
- "Privilege escalation attempts"
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
### A10: Server-Side Request Forgery (SSRF)
|
|
358
|
+
|
|
359
|
+
**Design Checklist**:
|
|
360
|
+
```yaml
|
|
361
|
+
ssrf_prevention:
|
|
362
|
+
- principle: "URL validation"
|
|
363
|
+
implementation: "Whitelist allowed destinations"
|
|
364
|
+
pattern: |
|
|
365
|
+
const allowedHosts = ['api.trusted.com', 'cdn.trusted.com'];
|
|
366
|
+
|
|
367
|
+
function validateUrl(url) {
|
|
368
|
+
const parsed = new URL(url);
|
|
369
|
+
if (!allowedHosts.includes(parsed.host)) {
|
|
370
|
+
throw new Error('URL not allowed');
|
|
371
|
+
}
|
|
372
|
+
return parsed;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
- principle: "No internal access"
|
|
376
|
+
implementation: "Block requests to internal IPs"
|
|
377
|
+
blocked:
|
|
378
|
+
- "127.0.0.0/8"
|
|
379
|
+
- "10.0.0.0/8"
|
|
380
|
+
- "172.16.0.0/12"
|
|
381
|
+
- "192.168.0.0/16"
|
|
382
|
+
- "169.254.0.0/16"
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
## Authentication Pattern Selection
|
|
386
|
+
|
|
387
|
+
### Pattern: OAuth 2.0 / OIDC
|
|
388
|
+
|
|
389
|
+
**When to Use**:
|
|
390
|
+
- Third-party identity provider integration
|
|
391
|
+
- "Sign in with Google/GitHub/etc"
|
|
392
|
+
- Delegated authorization
|
|
393
|
+
|
|
394
|
+
**Architecture**:
|
|
395
|
+
```yaml
|
|
396
|
+
oauth_architecture:
|
|
397
|
+
components:
|
|
398
|
+
- name: "OAuth Client"
|
|
399
|
+
purpose: "Initiate auth flow, handle callbacks"
|
|
400
|
+
|
|
401
|
+
- name: "Token Store"
|
|
402
|
+
purpose: "Secure storage of access/refresh tokens"
|
|
403
|
+
encryption: "AES-256"
|
|
404
|
+
|
|
405
|
+
- name: "Token Refresh Service"
|
|
406
|
+
purpose: "Automatic token refresh before expiry"
|
|
407
|
+
|
|
408
|
+
flow:
|
|
409
|
+
1. "User clicks 'Sign in with Provider'"
|
|
410
|
+
2. "Redirect to provider with client_id, scope, state"
|
|
411
|
+
3. "User authenticates with provider"
|
|
412
|
+
4. "Provider redirects back with authorization code"
|
|
413
|
+
5. "Exchange code for tokens (server-side)"
|
|
414
|
+
6. "Store tokens securely"
|
|
415
|
+
7. "Create local session"
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
### Pattern: JWT Authentication
|
|
419
|
+
|
|
420
|
+
**When to Use**:
|
|
421
|
+
- Stateless authentication
|
|
422
|
+
- Microservices architecture
|
|
423
|
+
- Mobile app backends
|
|
424
|
+
|
|
425
|
+
**Architecture**:
|
|
426
|
+
```yaml
|
|
427
|
+
jwt_architecture:
|
|
428
|
+
token_structure:
|
|
429
|
+
header: "Algorithm, type"
|
|
430
|
+
payload: "Claims (sub, exp, iat, custom)"
|
|
431
|
+
signature: "HMAC or RSA signature"
|
|
432
|
+
|
|
433
|
+
best_practices:
|
|
434
|
+
- algorithm: "RS256 (asymmetric) or HS256 (symmetric)"
|
|
435
|
+
- expiry: "Short-lived (15-60 minutes)"
|
|
436
|
+
- refresh: "Separate refresh token with longer life"
|
|
437
|
+
- storage: "HTTP-only cookie (web) or secure storage (mobile)"
|
|
438
|
+
- revocation: "Token blacklist or short expiry + refresh"
|
|
439
|
+
|
|
440
|
+
pattern: |
|
|
441
|
+
// Generate token
|
|
442
|
+
const token = jwt.sign(
|
|
443
|
+
{ sub: userId, role: userRole },
|
|
444
|
+
privateKey,
|
|
445
|
+
{ algorithm: 'RS256', expiresIn: '15m' }
|
|
446
|
+
);
|
|
447
|
+
|
|
448
|
+
// Verify token
|
|
449
|
+
const decoded = jwt.verify(token, publicKey, {
|
|
450
|
+
algorithms: ['RS256']
|
|
451
|
+
});
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
### Pattern: Session-Based Authentication
|
|
455
|
+
|
|
456
|
+
**When to Use**:
|
|
457
|
+
- Traditional web applications
|
|
458
|
+
- When server state is acceptable
|
|
459
|
+
- Simpler security model needed
|
|
460
|
+
|
|
461
|
+
**Architecture**:
|
|
462
|
+
```yaml
|
|
463
|
+
session_architecture:
|
|
464
|
+
storage: "Redis or database"
|
|
465
|
+
|
|
466
|
+
best_practices:
|
|
467
|
+
- "Regenerate session ID on login"
|
|
468
|
+
- "Set appropriate expiry"
|
|
469
|
+
- "Use secure, HTTP-only cookies"
|
|
470
|
+
- "Implement session fixation protection"
|
|
471
|
+
|
|
472
|
+
pattern: |
|
|
473
|
+
// Session configuration
|
|
474
|
+
app.use(session({
|
|
475
|
+
store: new RedisStore({ client: redisClient }),
|
|
476
|
+
secret: process.env.SESSION_SECRET,
|
|
477
|
+
name: 'sessionId',
|
|
478
|
+
resave: false,
|
|
479
|
+
saveUninitialized: false,
|
|
480
|
+
cookie: {
|
|
481
|
+
secure: true,
|
|
482
|
+
httpOnly: true,
|
|
483
|
+
sameSite: 'strict',
|
|
484
|
+
maxAge: 3600000
|
|
485
|
+
}
|
|
486
|
+
}));
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
## Authorization Model Selection
|
|
490
|
+
|
|
491
|
+
### Model: Role-Based Access Control (RBAC)
|
|
492
|
+
|
|
493
|
+
**When to Use**:
|
|
494
|
+
- Simple permission structure
|
|
495
|
+
- Users fit into clear roles
|
|
496
|
+
- Permissions don't vary by resource
|
|
497
|
+
|
|
498
|
+
**Architecture**:
|
|
499
|
+
```yaml
|
|
500
|
+
rbac_architecture:
|
|
501
|
+
structure:
|
|
502
|
+
roles:
|
|
503
|
+
- admin: [create, read, update, delete, manage_users]
|
|
504
|
+
- editor: [create, read, update]
|
|
505
|
+
- viewer: [read]
|
|
506
|
+
|
|
507
|
+
implementation: |
|
|
508
|
+
function hasPermission(user, permission) {
|
|
509
|
+
const rolePermissions = permissions[user.role];
|
|
510
|
+
return rolePermissions.includes(permission);
|
|
511
|
+
}
|
|
512
|
+
```
|
|
513
|
+
|
|
514
|
+
### Model: Attribute-Based Access Control (ABAC)
|
|
515
|
+
|
|
516
|
+
**When to Use**:
|
|
517
|
+
- Complex permission rules
|
|
518
|
+
- Permissions depend on resource attributes
|
|
519
|
+
- Context-aware access control
|
|
520
|
+
|
|
521
|
+
**Architecture**:
|
|
522
|
+
```yaml
|
|
523
|
+
abac_architecture:
|
|
524
|
+
attributes:
|
|
525
|
+
subject: [role, department, clearance]
|
|
526
|
+
resource: [owner, classification, type]
|
|
527
|
+
action: [read, write, delete]
|
|
528
|
+
environment: [time, location, ip]
|
|
529
|
+
|
|
530
|
+
policy_example: |
|
|
531
|
+
// User can edit if:
|
|
532
|
+
// - They are the owner, OR
|
|
533
|
+
// - They are an editor AND resource is not confidential
|
|
534
|
+
function canEdit(user, resource) {
|
|
535
|
+
if (resource.ownerId === user.id) return true;
|
|
536
|
+
if (user.role === 'editor' && !resource.confidential) return true;
|
|
537
|
+
return false;
|
|
538
|
+
}
|
|
539
|
+
```
|
|
540
|
+
|
|
541
|
+
## Data Protection Patterns
|
|
542
|
+
|
|
543
|
+
### Pattern: Encryption at Rest
|
|
544
|
+
|
|
545
|
+
```yaml
|
|
546
|
+
encryption_at_rest:
|
|
547
|
+
database:
|
|
548
|
+
method: "Transparent Data Encryption (TDE) or application-level"
|
|
549
|
+
algorithm: "AES-256"
|
|
550
|
+
key_management: "AWS KMS, HashiCorp Vault, or equivalent"
|
|
551
|
+
|
|
552
|
+
files:
|
|
553
|
+
method: "Encrypt before storage"
|
|
554
|
+
pattern: |
|
|
555
|
+
async function storeSecurely(data) {
|
|
556
|
+
const key = await kms.getKey('data-encryption-key');
|
|
557
|
+
const iv = crypto.randomBytes(16);
|
|
558
|
+
const cipher = crypto.createCipheriv('aes-256-gcm', key, iv);
|
|
559
|
+
const encrypted = Buffer.concat([
|
|
560
|
+
cipher.update(data),
|
|
561
|
+
cipher.final()
|
|
562
|
+
]);
|
|
563
|
+
const tag = cipher.getAuthTag();
|
|
564
|
+
return { encrypted, iv, tag };
|
|
565
|
+
}
|
|
566
|
+
```
|
|
567
|
+
|
|
568
|
+
### Pattern: Data Masking
|
|
569
|
+
|
|
570
|
+
```yaml
|
|
571
|
+
data_masking:
|
|
572
|
+
purposes:
|
|
573
|
+
- "Display in UI"
|
|
574
|
+
- "Logging"
|
|
575
|
+
- "Non-production environments"
|
|
576
|
+
|
|
577
|
+
patterns:
|
|
578
|
+
email: "j***@example.com"
|
|
579
|
+
phone: "***-***-1234"
|
|
580
|
+
ssn: "***-**-1234"
|
|
581
|
+
credit_card: "****-****-****-1234"
|
|
582
|
+
|
|
583
|
+
implementation: |
|
|
584
|
+
function maskEmail(email) {
|
|
585
|
+
const [local, domain] = email.split('@');
|
|
586
|
+
return `${local[0]}***@${domain}`;
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
function maskCreditCard(cc) {
|
|
590
|
+
return `****-****-****-${cc.slice(-4)}`;
|
|
591
|
+
}
|
|
592
|
+
```
|
|
593
|
+
|
|
594
|
+
## Security Architecture Decision Template
|
|
595
|
+
|
|
596
|
+
When designing security for a feature, use this template:
|
|
597
|
+
|
|
598
|
+
```yaml
|
|
599
|
+
security_design:
|
|
600
|
+
feature: "${feature_name}"
|
|
601
|
+
|
|
602
|
+
threat_model:
|
|
603
|
+
assets:
|
|
604
|
+
- description: "What sensitive data is involved?"
|
|
605
|
+
data_types: []
|
|
606
|
+
sensitivity: "low|medium|high|critical"
|
|
607
|
+
|
|
608
|
+
threats:
|
|
609
|
+
- threat: "What could an attacker try?"
|
|
610
|
+
likelihood: "low|medium|high"
|
|
611
|
+
impact: "low|medium|high|critical"
|
|
612
|
+
mitigations: []
|
|
613
|
+
|
|
614
|
+
authentication:
|
|
615
|
+
method: "oauth|jwt|session|api_key"
|
|
616
|
+
mfa_required: true|false
|
|
617
|
+
session_duration: ""
|
|
618
|
+
|
|
619
|
+
authorization:
|
|
620
|
+
model: "rbac|abac|acl"
|
|
621
|
+
permissions: []
|
|
622
|
+
ownership_checks: []
|
|
623
|
+
|
|
624
|
+
data_protection:
|
|
625
|
+
encryption_at_rest: true|false
|
|
626
|
+
encryption_in_transit: true|false
|
|
627
|
+
pii_fields: []
|
|
628
|
+
masking_required: []
|
|
629
|
+
|
|
630
|
+
input_validation:
|
|
631
|
+
schemas: []
|
|
632
|
+
sanitization: []
|
|
633
|
+
|
|
634
|
+
logging:
|
|
635
|
+
security_events: []
|
|
636
|
+
pii_redaction: []
|
|
637
|
+
|
|
638
|
+
compliance:
|
|
639
|
+
requirements: [] # GDPR, HIPAA, PCI-DSS, etc.
|
|
640
|
+
```
|
|
641
|
+
|
|
642
|
+
## Integration with Architecture Concept
|
|
643
|
+
|
|
644
|
+
When the architecture concept designs a feature with security implications:
|
|
645
|
+
|
|
646
|
+
1. **Identify Security Requirements**
|
|
647
|
+
- What data is sensitive?
|
|
648
|
+
- Who needs access?
|
|
649
|
+
- What regulations apply?
|
|
650
|
+
|
|
651
|
+
2. **Apply OWASP Checklist**
|
|
652
|
+
- Review each of the Top 10
|
|
653
|
+
- Document mitigations
|
|
654
|
+
|
|
655
|
+
3. **Select Patterns**
|
|
656
|
+
- Choose authentication method
|
|
657
|
+
- Choose authorization model
|
|
658
|
+
- Design data protection
|
|
659
|
+
|
|
660
|
+
4. **Document in Architecture Output**
|
|
661
|
+
```yaml
|
|
662
|
+
architecture:
|
|
663
|
+
# ... other sections ...
|
|
664
|
+
|
|
665
|
+
security_considerations:
|
|
666
|
+
authentication: "OAuth 2.0 with Google provider"
|
|
667
|
+
authorization: "RBAC with viewer/editor/admin roles"
|
|
668
|
+
data_protection:
|
|
669
|
+
- "PII encrypted at rest with AES-256"
|
|
670
|
+
- "All traffic over TLS 1.3"
|
|
671
|
+
owasp_mitigations:
|
|
672
|
+
- "A01: Middleware-based authorization on all routes"
|
|
673
|
+
- "A03: Parameterized queries, Joi validation"
|
|
674
|
+
- "A07: Rate limiting on auth endpoints"
|
|
675
|
+
```
|
|
676
|
+
|
|
677
|
+
## Best Practices Summary
|
|
678
|
+
|
|
679
|
+
1. ✅ **Design security in, don't bolt it on**
|
|
680
|
+
2. ✅ **Apply principle of least privilege**
|
|
681
|
+
3. ✅ **Validate all input, encode all output**
|
|
682
|
+
4. ✅ **Use parameterized queries exclusively**
|
|
683
|
+
5. ✅ **Encrypt sensitive data at rest and in transit**
|
|
684
|
+
6. ✅ **Implement proper authentication and session management**
|
|
685
|
+
7. ✅ **Log security events, but never log sensitive data**
|
|
686
|
+
8. ✅ **Keep dependencies updated and audited**
|
|
687
|
+
9. ✅ **Fail securely - don't leak information in errors**
|
|
688
|
+
10. ✅ **Defense in depth - multiple layers of protection**
|
|
689
|
+
|
|
690
|
+
---
|
|
691
|
+
|
|
692
|
+
**Use this skill when**: Designing any feature that handles user data, authentication, authorization, or external input. Security should be considered at architecture time, not as an afterthought.
|