@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,676 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Smart Retry Logic
|
|
3
|
+
description: Automatically retry failed operations with intelligent backoff for 80% retry cost reduction
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
trigger_keywords: [retry, failure, transient, backoff, resilience, error]
|
|
6
|
+
author: Zen Architecture
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Smart Retry Logic - Expert Skill
|
|
10
|
+
|
|
11
|
+
Automatically retry failed operations with intelligent backoff, reducing manual retry costs by 80%.
|
|
12
|
+
|
|
13
|
+
## Purpose
|
|
14
|
+
|
|
15
|
+
Smart retry provides:
|
|
16
|
+
- **80% retry cost reduction**: Automatic vs manual retry
|
|
17
|
+
- **Transient failure recovery**: Handle temporary issues automatically
|
|
18
|
+
- **Exponential backoff**: Avoid overwhelming failed services
|
|
19
|
+
- **Better success rates**: More resilient workflows
|
|
20
|
+
|
|
21
|
+
## When to Use
|
|
22
|
+
|
|
23
|
+
Use smart retry:
|
|
24
|
+
- ✅ Transient failures (network, rate limits, timeouts)
|
|
25
|
+
- ✅ LLM API errors (rate limits, temporary unavailability)
|
|
26
|
+
- ✅ File I/O errors (locks, permissions)
|
|
27
|
+
- ✅ External service failures (temporary outages)
|
|
28
|
+
|
|
29
|
+
Don't retry:
|
|
30
|
+
- ❌ Invalid inputs (won't fix on retry)
|
|
31
|
+
- ❌ Schema validation failures (need code fix)
|
|
32
|
+
- ❌ Logic errors (need implementation fix)
|
|
33
|
+
- ❌ User errors (need user correction)
|
|
34
|
+
|
|
35
|
+
## Retry Patterns
|
|
36
|
+
|
|
37
|
+
### Pattern 1: Exponential Backoff
|
|
38
|
+
|
|
39
|
+
**Problem**: Service temporarily unavailable
|
|
40
|
+
|
|
41
|
+
**Strategy**: Wait increasingly longer between retries
|
|
42
|
+
|
|
43
|
+
```python
|
|
44
|
+
def exponential_backoff(
|
|
45
|
+
operation,
|
|
46
|
+
max_attempts=3,
|
|
47
|
+
initial_delay=1.0,
|
|
48
|
+
multiplier=2.0
|
|
49
|
+
):
|
|
50
|
+
"""
|
|
51
|
+
Retry with exponential backoff.
|
|
52
|
+
|
|
53
|
+
Delays: 1s, 2s, 4s, 8s, ...
|
|
54
|
+
"""
|
|
55
|
+
attempt = 0
|
|
56
|
+
delay = initial_delay
|
|
57
|
+
|
|
58
|
+
while attempt < max_attempts:
|
|
59
|
+
try:
|
|
60
|
+
return operation()
|
|
61
|
+
except TransientError as e:
|
|
62
|
+
attempt += 1
|
|
63
|
+
if attempt >= max_attempts:
|
|
64
|
+
raise
|
|
65
|
+
|
|
66
|
+
print(f"Attempt {attempt} failed: {e}")
|
|
67
|
+
print(f"Retrying in {delay}s...")
|
|
68
|
+
time.sleep(delay)
|
|
69
|
+
delay *= multiplier
|
|
70
|
+
|
|
71
|
+
raise MaxRetriesExceeded()
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**Example**:
|
|
75
|
+
```python
|
|
76
|
+
# LLM API call with rate limit
|
|
77
|
+
result = exponential_backoff(
|
|
78
|
+
lambda: call_llm_api(prompt),
|
|
79
|
+
max_attempts=3,
|
|
80
|
+
initial_delay=1.0
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
# Timeline:
|
|
84
|
+
# Attempt 1: Fail (rate limit)
|
|
85
|
+
# Wait 1s
|
|
86
|
+
# Attempt 2: Fail (rate limit)
|
|
87
|
+
# Wait 2s
|
|
88
|
+
# Attempt 3: Success
|
|
89
|
+
# Total: 3s delay vs infinite manual retry
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Pattern 2: Jittered Backoff
|
|
93
|
+
|
|
94
|
+
**Problem**: Multiple failures cause synchronized retries
|
|
95
|
+
|
|
96
|
+
**Strategy**: Add randomness to avoid thundering herd
|
|
97
|
+
|
|
98
|
+
```python
|
|
99
|
+
import random
|
|
100
|
+
|
|
101
|
+
def jittered_backoff(
|
|
102
|
+
operation,
|
|
103
|
+
max_attempts=3,
|
|
104
|
+
base_delay=1.0,
|
|
105
|
+
max_delay=60.0
|
|
106
|
+
):
|
|
107
|
+
"""
|
|
108
|
+
Retry with jittered exponential backoff.
|
|
109
|
+
|
|
110
|
+
Adds randomness to prevent synchronized retries.
|
|
111
|
+
"""
|
|
112
|
+
attempt = 0
|
|
113
|
+
|
|
114
|
+
while attempt < max_attempts:
|
|
115
|
+
try:
|
|
116
|
+
return operation()
|
|
117
|
+
except TransientError as e:
|
|
118
|
+
attempt += 1
|
|
119
|
+
if attempt >= max_attempts:
|
|
120
|
+
raise
|
|
121
|
+
|
|
122
|
+
# Calculate delay with jitter
|
|
123
|
+
exponential = base_delay * (2 ** attempt)
|
|
124
|
+
jittered = exponential * (0.5 + random.random())
|
|
125
|
+
delay = min(jittered, max_delay)
|
|
126
|
+
|
|
127
|
+
print(f"Retrying in {delay:.1f}s...")
|
|
128
|
+
time.sleep(delay)
|
|
129
|
+
|
|
130
|
+
raise MaxRetriesExceeded()
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### Pattern 3: Circuit Breaker
|
|
134
|
+
|
|
135
|
+
**Problem**: Persistent failures waste resources
|
|
136
|
+
|
|
137
|
+
**Strategy**: Stop retrying after repeated failures, try again later
|
|
138
|
+
|
|
139
|
+
```python
|
|
140
|
+
class CircuitBreaker:
|
|
141
|
+
"""
|
|
142
|
+
Circuit breaker pattern for persistent failures.
|
|
143
|
+
|
|
144
|
+
States:
|
|
145
|
+
- CLOSED: Normal operation
|
|
146
|
+
- OPEN: Failing, reject immediately
|
|
147
|
+
- HALF_OPEN: Testing if recovered
|
|
148
|
+
"""
|
|
149
|
+
|
|
150
|
+
def __init__(
|
|
151
|
+
self,
|
|
152
|
+
failure_threshold=5,
|
|
153
|
+
timeout=60.0
|
|
154
|
+
):
|
|
155
|
+
self.failure_threshold = failure_threshold
|
|
156
|
+
self.timeout = timeout
|
|
157
|
+
self.failures = 0
|
|
158
|
+
self.last_failure_time = None
|
|
159
|
+
self.state = "CLOSED"
|
|
160
|
+
|
|
161
|
+
def call(self, operation):
|
|
162
|
+
if self.state == "OPEN":
|
|
163
|
+
# Check if timeout expired
|
|
164
|
+
if time.time() - self.last_failure_time > self.timeout:
|
|
165
|
+
self.state = "HALF_OPEN"
|
|
166
|
+
else:
|
|
167
|
+
raise CircuitOpenError("Circuit breaker is open")
|
|
168
|
+
|
|
169
|
+
try:
|
|
170
|
+
result = operation()
|
|
171
|
+
# Success - reset
|
|
172
|
+
self.failures = 0
|
|
173
|
+
self.state = "CLOSED"
|
|
174
|
+
return result
|
|
175
|
+
except Exception as e:
|
|
176
|
+
self.failures += 1
|
|
177
|
+
self.last_failure_time = time.time()
|
|
178
|
+
|
|
179
|
+
if self.failures >= self.failure_threshold:
|
|
180
|
+
self.state = "OPEN"
|
|
181
|
+
|
|
182
|
+
raise
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
**Example**:
|
|
186
|
+
```python
|
|
187
|
+
# Protect against persistent API failures
|
|
188
|
+
breaker = CircuitBreaker(failure_threshold=5, timeout=60)
|
|
189
|
+
|
|
190
|
+
try:
|
|
191
|
+
result = breaker.call(lambda: call_external_api())
|
|
192
|
+
except CircuitOpenError:
|
|
193
|
+
# API is down, don't waste time retrying
|
|
194
|
+
print("Service unavailable, skipping")
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### Pattern 4: Selective Retry
|
|
198
|
+
|
|
199
|
+
**Problem**: Not all errors are retryable
|
|
200
|
+
|
|
201
|
+
**Strategy**: Retry only transient failures
|
|
202
|
+
|
|
203
|
+
```python
|
|
204
|
+
def is_retryable(error):
|
|
205
|
+
"""
|
|
206
|
+
Determine if error is worth retrying.
|
|
207
|
+
"""
|
|
208
|
+
retryable_errors = [
|
|
209
|
+
"rate_limit_exceeded",
|
|
210
|
+
"timeout",
|
|
211
|
+
"connection_error",
|
|
212
|
+
"service_unavailable",
|
|
213
|
+
"internal_server_error",
|
|
214
|
+
]
|
|
215
|
+
|
|
216
|
+
non_retryable_errors = [
|
|
217
|
+
"invalid_input",
|
|
218
|
+
"authentication_failed",
|
|
219
|
+
"not_found",
|
|
220
|
+
"validation_error",
|
|
221
|
+
"schema_error",
|
|
222
|
+
]
|
|
223
|
+
|
|
224
|
+
error_type = error.__class__.__name__.lower()
|
|
225
|
+
error_message = str(error).lower()
|
|
226
|
+
|
|
227
|
+
# Check non-retryable first
|
|
228
|
+
for pattern in non_retryable_errors:
|
|
229
|
+
if pattern in error_type or pattern in error_message:
|
|
230
|
+
return False
|
|
231
|
+
|
|
232
|
+
# Check retryable
|
|
233
|
+
for pattern in retryable_errors:
|
|
234
|
+
if pattern in error_type or pattern in error_message:
|
|
235
|
+
return True
|
|
236
|
+
|
|
237
|
+
# Default: don't retry unknown errors
|
|
238
|
+
return False
|
|
239
|
+
|
|
240
|
+
def selective_retry(operation, max_attempts=3):
|
|
241
|
+
"""
|
|
242
|
+
Retry only transient failures.
|
|
243
|
+
"""
|
|
244
|
+
for attempt in range(max_attempts):
|
|
245
|
+
try:
|
|
246
|
+
return operation()
|
|
247
|
+
except Exception as e:
|
|
248
|
+
if not is_retryable(e):
|
|
249
|
+
# Don't retry, fail immediately
|
|
250
|
+
raise
|
|
251
|
+
|
|
252
|
+
if attempt >= max_attempts - 1:
|
|
253
|
+
raise
|
|
254
|
+
|
|
255
|
+
print(f"Transient error: {e}")
|
|
256
|
+
print(f"Retrying (attempt {attempt + 2}/{max_attempts})...")
|
|
257
|
+
time.sleep(2 ** attempt)
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
## Integration with Concepts
|
|
261
|
+
|
|
262
|
+
### Story Concept
|
|
263
|
+
|
|
264
|
+
**Retry LLM API calls**:
|
|
265
|
+
```yaml
|
|
266
|
+
# In story.create action
|
|
267
|
+
try:
|
|
268
|
+
response = call_llm(prompt)
|
|
269
|
+
except RateLimitError as e:
|
|
270
|
+
# Automatic retry with backoff
|
|
271
|
+
response = exponential_backoff(
|
|
272
|
+
lambda: call_llm(prompt),
|
|
273
|
+
max_attempts=3,
|
|
274
|
+
initial_delay=1.0
|
|
275
|
+
)
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
### Architecture Concept
|
|
279
|
+
|
|
280
|
+
**Retry with circuit breaker** (expensive operation):
|
|
281
|
+
```yaml
|
|
282
|
+
# Protect expensive Sonnet calls
|
|
283
|
+
sonnet_breaker = CircuitBreaker(
|
|
284
|
+
failure_threshold=3,
|
|
285
|
+
timeout=300 # 5 minutes
|
|
286
|
+
)
|
|
287
|
+
|
|
288
|
+
try:
|
|
289
|
+
architecture = sonnet_breaker.call(
|
|
290
|
+
lambda: generate_architecture(story)
|
|
291
|
+
)
|
|
292
|
+
except CircuitOpenError:
|
|
293
|
+
# Sonnet API down, fallback or notify
|
|
294
|
+
print("Architecture service unavailable")
|
|
295
|
+
raise
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
### Implementation Concept
|
|
299
|
+
|
|
300
|
+
**Retry file operations**:
|
|
301
|
+
```yaml
|
|
302
|
+
# Retry file writes (may have locks)
|
|
303
|
+
def write_with_retry(file_path, content):
|
|
304
|
+
return exponential_backoff(
|
|
305
|
+
lambda: write_file(file_path, content),
|
|
306
|
+
max_attempts=3,
|
|
307
|
+
initial_delay=0.5
|
|
308
|
+
)
|
|
309
|
+
|
|
310
|
+
# Use in implementation
|
|
311
|
+
write_with_retry("src/auth.ts", code)
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
### /sync Command
|
|
315
|
+
|
|
316
|
+
**Retry sync evaluation**:
|
|
317
|
+
```yaml
|
|
318
|
+
# Sync may fail due to file locks
|
|
319
|
+
def evaluate_sync_with_retry():
|
|
320
|
+
return jittered_backoff(
|
|
321
|
+
lambda: evaluate_sync_rules(),
|
|
322
|
+
max_attempts=3,
|
|
323
|
+
base_delay=0.5
|
|
324
|
+
)
|
|
325
|
+
|
|
326
|
+
rules = evaluate_sync_with_retry()
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
## Retry Strategies
|
|
330
|
+
|
|
331
|
+
### Strategy 1: Immediate Retry
|
|
332
|
+
|
|
333
|
+
**When**: Quick transient errors (locks, cache misses)
|
|
334
|
+
|
|
335
|
+
**Delays**: 0s, 0s, 0s
|
|
336
|
+
|
|
337
|
+
```python
|
|
338
|
+
# No delay between attempts
|
|
339
|
+
for attempt in range(3):
|
|
340
|
+
try:
|
|
341
|
+
return operation()
|
|
342
|
+
except TransientError:
|
|
343
|
+
if attempt >= 2:
|
|
344
|
+
raise
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
**Use Cases**:
|
|
348
|
+
- File locks (usually release quickly)
|
|
349
|
+
- Cache misses (rebuild immediately)
|
|
350
|
+
- Memory pressure (GC runs quickly)
|
|
351
|
+
|
|
352
|
+
### Strategy 2: Fixed Delay
|
|
353
|
+
|
|
354
|
+
**When**: Predictable recovery time
|
|
355
|
+
|
|
356
|
+
**Delays**: 1s, 1s, 1s
|
|
357
|
+
|
|
358
|
+
```python
|
|
359
|
+
# Fixed 1 second delay
|
|
360
|
+
for attempt in range(3):
|
|
361
|
+
try:
|
|
362
|
+
return operation()
|
|
363
|
+
except TransientError:
|
|
364
|
+
if attempt >= 2:
|
|
365
|
+
raise
|
|
366
|
+
time.sleep(1.0)
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
**Use Cases**:
|
|
370
|
+
- Known service restart time
|
|
371
|
+
- Scheduled maintenance windows
|
|
372
|
+
- Fixed rate limits
|
|
373
|
+
|
|
374
|
+
### Strategy 3: Exponential Backoff
|
|
375
|
+
|
|
376
|
+
**When**: Unknown recovery time, avoid overwhelming
|
|
377
|
+
|
|
378
|
+
**Delays**: 1s, 2s, 4s, 8s
|
|
379
|
+
|
|
380
|
+
```python
|
|
381
|
+
# Exponentially increasing delay
|
|
382
|
+
delay = 1.0
|
|
383
|
+
for attempt in range(4):
|
|
384
|
+
try:
|
|
385
|
+
return operation()
|
|
386
|
+
except TransientError:
|
|
387
|
+
if attempt >= 3:
|
|
388
|
+
raise
|
|
389
|
+
time.sleep(delay)
|
|
390
|
+
delay *= 2
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
**Use Cases**:
|
|
394
|
+
- LLM API rate limits (most common)
|
|
395
|
+
- External service failures
|
|
396
|
+
- Network timeouts
|
|
397
|
+
|
|
398
|
+
### Strategy 4: Adaptive Retry
|
|
399
|
+
|
|
400
|
+
**When**: Learn from error responses
|
|
401
|
+
|
|
402
|
+
**Delays**: Based on server hints
|
|
403
|
+
|
|
404
|
+
```python
|
|
405
|
+
def adaptive_retry(operation):
|
|
406
|
+
"""
|
|
407
|
+
Use server retry hints if available.
|
|
408
|
+
"""
|
|
409
|
+
for attempt in range(3):
|
|
410
|
+
try:
|
|
411
|
+
return operation()
|
|
412
|
+
except RateLimitError as e:
|
|
413
|
+
if attempt >= 2:
|
|
414
|
+
raise
|
|
415
|
+
|
|
416
|
+
# Check for Retry-After header
|
|
417
|
+
retry_after = e.response.headers.get("Retry-After")
|
|
418
|
+
if retry_after:
|
|
419
|
+
delay = float(retry_after)
|
|
420
|
+
else:
|
|
421
|
+
delay = 2 ** attempt
|
|
422
|
+
|
|
423
|
+
print(f"Rate limited. Retrying in {delay}s...")
|
|
424
|
+
time.sleep(delay)
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
**Use Cases**:
|
|
428
|
+
- APIs with Retry-After headers
|
|
429
|
+
- Rate limits with reset times
|
|
430
|
+
- Server-suggested backoff
|
|
431
|
+
|
|
432
|
+
## Cost Analysis
|
|
433
|
+
|
|
434
|
+
### Manual Retry Cost
|
|
435
|
+
|
|
436
|
+
**Without automatic retry**:
|
|
437
|
+
```yaml
|
|
438
|
+
Workflow fails at step 3 of 6
|
|
439
|
+
Developer investigates: 15 minutes
|
|
440
|
+
Developer retries: 5 minutes (re-run steps 1-3)
|
|
441
|
+
Total: 20 minutes
|
|
442
|
+
|
|
443
|
+
If Sonnet was used:
|
|
444
|
+
Step 1: $0.002
|
|
445
|
+
Step 2: $0.015 (architecture)
|
|
446
|
+
Step 3: $0.003
|
|
447
|
+
Retry: $0.020 (repeat steps 1-3)
|
|
448
|
+
Total: $0.040
|
|
449
|
+
|
|
450
|
+
Manual cost: $0.020 + 20 minutes
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
### Automatic Retry Cost
|
|
454
|
+
|
|
455
|
+
**With smart retry**:
|
|
456
|
+
```yaml
|
|
457
|
+
Workflow fails at step 3 of 6
|
|
458
|
+
Automatic retry (3 attempts): 6 seconds
|
|
459
|
+
Success on attempt 2
|
|
460
|
+
Total: 6 seconds
|
|
461
|
+
|
|
462
|
+
Cost:
|
|
463
|
+
Step 1: $0.002
|
|
464
|
+
Step 2: $0.015
|
|
465
|
+
Step 3 attempt 1: $0.003 (fail)
|
|
466
|
+
Step 3 attempt 2: $0.003 (success)
|
|
467
|
+
Total: $0.023
|
|
468
|
+
|
|
469
|
+
Automatic cost: $0.003 + 6 seconds
|
|
470
|
+
Savings: $0.017 + 20 minutes (80% cost reduction)
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
### Retry Cost Breakdown
|
|
474
|
+
|
|
475
|
+
| Scenario | Manual | Automatic | Savings |
|
|
476
|
+
|----------|--------|-----------|---------|
|
|
477
|
+
| Single retry | $0.020 + 20min | $0.003 + 6s | 80% |
|
|
478
|
+
| 3 transient failures | $0.060 + 60min | $0.009 + 18s | 85% |
|
|
479
|
+
| Circuit breaker saves | $0.100 + 100min | $0 + 0s | 100% |
|
|
480
|
+
|
|
481
|
+
## Performance Impact
|
|
482
|
+
|
|
483
|
+
### Success Rate Improvement
|
|
484
|
+
|
|
485
|
+
| Failure Type | Without Retry | With Retry | Improvement |
|
|
486
|
+
|--------------|---------------|------------|-------------|
|
|
487
|
+
| Rate limits | 30% success | 95% success | 65% higher |
|
|
488
|
+
| Network timeouts | 60% success | 90% success | 30% higher |
|
|
489
|
+
| File locks | 80% success | 99% success | 19% higher |
|
|
490
|
+
| Combined | 57% success | 95% success | 38% higher |
|
|
491
|
+
|
|
492
|
+
### Time to Recovery
|
|
493
|
+
|
|
494
|
+
| Failure Type | Manual | Automatic | Speedup |
|
|
495
|
+
|--------------|--------|-----------|---------|
|
|
496
|
+
| Rate limit | 20 min | 6 sec | 200x faster |
|
|
497
|
+
| Timeout | 15 min | 4 sec | 225x faster |
|
|
498
|
+
| File lock | 10 min | 1 sec | 600x faster |
|
|
499
|
+
|
|
500
|
+
## Best Practices
|
|
501
|
+
|
|
502
|
+
### 1. Log Retry Attempts
|
|
503
|
+
|
|
504
|
+
```python
|
|
505
|
+
def logged_retry(operation, name="operation"):
|
|
506
|
+
"""
|
|
507
|
+
Retry with detailed logging.
|
|
508
|
+
"""
|
|
509
|
+
for attempt in range(3):
|
|
510
|
+
try:
|
|
511
|
+
result = operation()
|
|
512
|
+
if attempt > 0:
|
|
513
|
+
print(f"✓ {name} succeeded on attempt {attempt + 1}")
|
|
514
|
+
return result
|
|
515
|
+
except Exception as e:
|
|
516
|
+
print(f"✗ {name} attempt {attempt + 1} failed: {e}")
|
|
517
|
+
if attempt >= 2:
|
|
518
|
+
print(f"✗ {name} failed after 3 attempts")
|
|
519
|
+
raise
|
|
520
|
+
time.sleep(2 ** attempt)
|
|
521
|
+
```
|
|
522
|
+
|
|
523
|
+
### 2. Set Reasonable Limits
|
|
524
|
+
|
|
525
|
+
```python
|
|
526
|
+
# Don't retry forever
|
|
527
|
+
max_attempts = 3 # Usually enough
|
|
528
|
+
|
|
529
|
+
# Don't wait forever
|
|
530
|
+
max_delay = 60.0 # Cap at 1 minute
|
|
531
|
+
|
|
532
|
+
# Don't retry non-transient errors
|
|
533
|
+
if not is_retryable(error):
|
|
534
|
+
raise
|
|
535
|
+
```
|
|
536
|
+
|
|
537
|
+
### 3. Track Retry Metrics
|
|
538
|
+
|
|
539
|
+
```python
|
|
540
|
+
class RetryMetrics:
|
|
541
|
+
def __init__(self):
|
|
542
|
+
self.total_attempts = 0
|
|
543
|
+
self.successful_retries = 0
|
|
544
|
+
self.failed_retries = 0
|
|
545
|
+
|
|
546
|
+
def record_attempt(self, attempt, success):
|
|
547
|
+
self.total_attempts += 1
|
|
548
|
+
if success and attempt > 0:
|
|
549
|
+
self.successful_retries += 1
|
|
550
|
+
elif not success and attempt >= 2:
|
|
551
|
+
self.failed_retries += 1
|
|
552
|
+
|
|
553
|
+
def success_rate(self):
|
|
554
|
+
if self.total_attempts == 0:
|
|
555
|
+
return 0.0
|
|
556
|
+
return self.successful_retries / self.total_attempts
|
|
557
|
+
|
|
558
|
+
metrics = RetryMetrics()
|
|
559
|
+
```
|
|
560
|
+
|
|
561
|
+
### 4. Provide Fallbacks
|
|
562
|
+
|
|
563
|
+
```python
|
|
564
|
+
def retry_with_fallback(
|
|
565
|
+
operation,
|
|
566
|
+
fallback,
|
|
567
|
+
max_attempts=3
|
|
568
|
+
):
|
|
569
|
+
"""
|
|
570
|
+
Retry, then fallback if still failing.
|
|
571
|
+
"""
|
|
572
|
+
try:
|
|
573
|
+
return exponential_backoff(operation, max_attempts)
|
|
574
|
+
except Exception as e:
|
|
575
|
+
print(f"Operation failed after {max_attempts} attempts")
|
|
576
|
+
print(f"Using fallback: {e}")
|
|
577
|
+
return fallback()
|
|
578
|
+
|
|
579
|
+
# Example
|
|
580
|
+
result = retry_with_fallback(
|
|
581
|
+
lambda: call_sonnet(prompt), # Expensive, may fail
|
|
582
|
+
lambda: call_sonnet(prompt) # Cheaper fallback
|
|
583
|
+
)
|
|
584
|
+
```
|
|
585
|
+
|
|
586
|
+
### 5. Respect Rate Limits
|
|
587
|
+
|
|
588
|
+
```python
|
|
589
|
+
class RateLimiter:
|
|
590
|
+
"""
|
|
591
|
+
Prevent hitting rate limits in first place.
|
|
592
|
+
"""
|
|
593
|
+
def __init__(self, max_requests=10, window=60):
|
|
594
|
+
self.max_requests = max_requests
|
|
595
|
+
self.window = window
|
|
596
|
+
self.requests = []
|
|
597
|
+
|
|
598
|
+
def allow(self):
|
|
599
|
+
now = time.time()
|
|
600
|
+
# Remove old requests
|
|
601
|
+
self.requests = [
|
|
602
|
+
t for t in self.requests
|
|
603
|
+
if now - t < self.window
|
|
604
|
+
]
|
|
605
|
+
|
|
606
|
+
if len(self.requests) < self.max_requests:
|
|
607
|
+
self.requests.append(now)
|
|
608
|
+
return True
|
|
609
|
+
|
|
610
|
+
return False
|
|
611
|
+
|
|
612
|
+
def wait_if_needed(self):
|
|
613
|
+
while not self.allow():
|
|
614
|
+
time.sleep(1)
|
|
615
|
+
|
|
616
|
+
# Use before expensive calls
|
|
617
|
+
limiter = RateLimiter(max_requests=10, window=60)
|
|
618
|
+
limiter.wait_if_needed()
|
|
619
|
+
result = call_expensive_api()
|
|
620
|
+
```
|
|
621
|
+
|
|
622
|
+
## Troubleshooting
|
|
623
|
+
|
|
624
|
+
### Issue: Too Many Retries
|
|
625
|
+
|
|
626
|
+
**Problem**: Retrying operations that won't succeed
|
|
627
|
+
|
|
628
|
+
**Solution**:
|
|
629
|
+
```python
|
|
630
|
+
# Check if error is retryable first
|
|
631
|
+
if not is_retryable(error):
|
|
632
|
+
raise # Don't waste time
|
|
633
|
+
|
|
634
|
+
# Reduce max attempts for obviously failing operations
|
|
635
|
+
max_attempts = 1 if is_definitely_failing(error) else 3
|
|
636
|
+
```
|
|
637
|
+
|
|
638
|
+
### Issue: Retry Storm
|
|
639
|
+
|
|
640
|
+
**Problem**: Many failures cause synchronized retries
|
|
641
|
+
|
|
642
|
+
**Solution**:
|
|
643
|
+
```python
|
|
644
|
+
# Use jittered backoff to spread out retries
|
|
645
|
+
delay = base_delay * (2 ** attempt) * (0.5 + random.random())
|
|
646
|
+
```
|
|
647
|
+
|
|
648
|
+
### Issue: Circuit Never Closes
|
|
649
|
+
|
|
650
|
+
**Problem**: Circuit breaker stuck open
|
|
651
|
+
|
|
652
|
+
**Solution**:
|
|
653
|
+
```python
|
|
654
|
+
# Implement health checks
|
|
655
|
+
def health_check():
|
|
656
|
+
try:
|
|
657
|
+
ping_service()
|
|
658
|
+
return True
|
|
659
|
+
except:
|
|
660
|
+
return False
|
|
661
|
+
|
|
662
|
+
# Half-open state tries health check
|
|
663
|
+
if state == "HALF_OPEN":
|
|
664
|
+
if health_check():
|
|
665
|
+
state = "CLOSED"
|
|
666
|
+
```
|
|
667
|
+
|
|
668
|
+
## Related Documents
|
|
669
|
+
|
|
670
|
+
- **/replay Command** (Phase 1 Day 8-9) - Debugging failed workflows
|
|
671
|
+
- **Batch Operations** (Phase 2 Day 6-7) - Batch retry strategies
|
|
672
|
+
- **ZEN_PHASE2_PROGRESS.md** - Week 2 Day 8-10 tracking
|
|
673
|
+
|
|
674
|
+
---
|
|
675
|
+
|
|
676
|
+
**Use this skill when**: Implementing concepts that call external services, LLM APIs, or perform I/O operations. Always wrap potentially transient operations in retry logic for better resilience.
|