wicked-garden 12.27.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/archetypes.json +166 -0
- package/.claude-plugin/components.json +75 -0
- package/.claude-plugin/marketplace.json +15 -0
- package/.claude-plugin/plugin.json +174 -0
- package/.claude-plugin/specialist.json +48 -0
- package/.claude-plugin/stack-registry.json +96 -0
- package/AGENTS.md +13 -0
- package/CHANGELOG.md +712 -0
- package/CONTRIBUTING.md +99 -0
- package/ETHOS.md +83 -0
- package/LICENSE +21 -0
- package/README.md +115 -0
- package/WICKED_GARDEN_BUS_EVENTS.md +149 -0
- package/agents/agentic/architect.md +449 -0
- package/agents/agentic/performance-analyst.md +702 -0
- package/agents/agentic/safety-reviewer.md +662 -0
- package/agents/crew/implementer.md +163 -0
- package/agents/crew/researcher.md +94 -0
- package/agents/crew/reviewer.md +184 -0
- package/agents/data/data-engineer.md +227 -0
- package/agents/engineering/api-documentarian.md +440 -0
- package/agents/engineering/migration-engineer.md +301 -0
- package/agents/engineering/solution-architect.md +208 -0
- package/agents/jam/brainstorm-facilitator.md +297 -0
- package/agents/jam/council.md +322 -0
- package/agents/jam/quick-facilitator.md +85 -0
- package/agents/persona/persona-agent.md +121 -0
- package/agents/platform/compliance-officer.md +266 -0
- package/agents/platform/privacy-expert.md +496 -0
- package/agents/platform/security-engineer.md +287 -0
- package/agents/product/a11y-expert.md +323 -0
- package/agents/product/requirements-analyst.md +238 -0
- package/agents/product/ui-reviewer.md +180 -0
- package/agents/product/ux-designer.md +199 -0
- package/agents/product/value-strategist.md +269 -0
- package/agents/qe/semantic-reviewer.md +78 -0
- package/commands/agentic/audit.md +24 -0
- package/commands/agentic/design.md +24 -0
- package/commands/agentic/frameworks.md +25 -0
- package/commands/agentic/review.md +27 -0
- package/commands/archetype/build.md +12 -0
- package/commands/archetype/decide.md +12 -0
- package/commands/archetype/explore.md +12 -0
- package/commands/archetype/incident.md +12 -0
- package/commands/archetype/migrate.md +12 -0
- package/commands/archetype/modernize.md +12 -0
- package/commands/archetype/review.md +14 -0
- package/commands/archetype/ship.md +12 -0
- package/commands/archetype/specify.md +12 -0
- package/commands/archetype/triage.md +12 -0
- package/commands/compile.md +37 -0
- package/commands/data/analyze.md +18 -0
- package/commands/data/data.md +21 -0
- package/commands/data/ml.md +18 -0
- package/commands/data/ontology.md +22 -0
- package/commands/data/pipeline.md +17 -0
- package/commands/deliberate.md +181 -0
- package/commands/engineering/add-field.md +77 -0
- package/commands/engineering/apply.md +58 -0
- package/commands/engineering/arch.md +26 -0
- package/commands/engineering/debug.md +27 -0
- package/commands/engineering/docs.md +27 -0
- package/commands/engineering/new-generator.md +257 -0
- package/commands/engineering/patch-plan.md +59 -0
- package/commands/engineering/plan.md +29 -0
- package/commands/engineering/remove.md +48 -0
- package/commands/engineering/rename.md +44 -0
- package/commands/engineering/review.md +32 -0
- package/commands/help.md +128 -0
- package/commands/install.md +118 -0
- package/commands/intent.md +54 -0
- package/commands/jam/brainstorm.md +37 -0
- package/commands/jam/council.md +49 -0
- package/commands/jam/quick.md +21 -0
- package/commands/jam/revisit.md +79 -0
- package/commands/persona/as.md +136 -0
- package/commands/persona/define.md +24 -0
- package/commands/persona/list.md +118 -0
- package/commands/platform/actions.md +20 -0
- package/commands/platform/assert.md +18 -0
- package/commands/platform/audit.md +23 -0
- package/commands/platform/compliance.md +20 -0
- package/commands/platform/gh.md +22 -0
- package/commands/platform/health.md +22 -0
- package/commands/platform/incident.md +23 -0
- package/commands/platform/infra.md +24 -0
- package/commands/platform/peer-health.md +103 -0
- package/commands/platform/plugin-health.md +58 -0
- package/commands/platform/security.md +38 -0
- package/commands/platform/toolchain.md +96 -0
- package/commands/platform/traces.md +20 -0
- package/commands/product/a11y.md +19 -0
- package/commands/product/acceptance.md +19 -0
- package/commands/product/align.md +20 -0
- package/commands/product/analyze.md +23 -0
- package/commands/product/elicit.md +19 -0
- package/commands/product/listen.md +24 -0
- package/commands/product/mockup.md +20 -0
- package/commands/product/screenshot.md +19 -0
- package/commands/product/strategy.md +40 -0
- package/commands/product/synthesize.md +23 -0
- package/commands/product/ux-review.md +42 -0
- package/commands/product/ux.md +20 -0
- package/commands/product/visual-direction.md +34 -0
- package/commands/prove.md +47 -0
- package/commands/report-issue.md +243 -0
- package/commands/reset.md +144 -0
- package/commands/search/blast-radius.md +58 -0
- package/commands/search/hotspots.md +55 -0
- package/commands/search/index.md +38 -0
- package/commands/search/lineage.md +47 -0
- package/commands/search/service-map.md +79 -0
- package/commands/setup.md +363 -0
- package/commands/smaht/briefing.md +200 -0
- package/commands/smaht/events-import.md +95 -0
- package/commands/smaht/state.md +19 -0
- package/commands/where-am-i.md +58 -0
- package/docs/README.md +32 -0
- package/docs/adr/0001-code-relationship-graph-engine.md +116 -0
- package/docs/adr/0002-major-cleanup-keep-cut.md +91 -0
- package/docs/adr/0003-peers-gate-required-layers-optin.md +41 -0
- package/docs/adr/0004-code-graph-moves-to-wicked-brain.md +47 -0
- package/docs/brain-chunk-format.md +135 -0
- package/docs/compiler.md +95 -0
- package/docs/daemon-api.md +70 -0
- package/docs/domains.md +197 -0
- package/docs/getting-started.md +208 -0
- package/docs/plans/2026-06-08-wicked-loom-conduct.md +1337 -0
- package/docs/plans/2026-06-08-wicked-loom-contract.md +638 -0
- package/docs/plans/2026-06-08-wicked-loom-cutover.md +1300 -0
- package/docs/plans/2026-06-08-wicked-loom-expand-compose.md +843 -0
- package/docs/plans/2026-06-08-wicked-loom-flow-cutover.md +403 -0
- package/docs/plans/2026-06-10-codegraph-to-brain-phase1a-graph-core.md +838 -0
- package/docs/plans/2026-06-10-codegraph-to-brain-phase1b-injected-edges.md +44 -0
- package/docs/required-peers.md +60 -0
- package/docs/specs/2026-06-08-wicked-loom-extraction.md +225 -0
- package/docs/specs/2026-06-10-codegraph-to-brain-migration.md +168 -0
- package/docs/v11/archetypes.md +231 -0
- package/hooks/hooks.json +275 -0
- package/hooks/scripts/bootstrap.py +1797 -0
- package/hooks/scripts/invoke.py +62 -0
- package/hooks/scripts/notification.py +166 -0
- package/hooks/scripts/permission_request.py +223 -0
- package/hooks/scripts/post_tool.py +1374 -0
- package/hooks/scripts/pre_compact.py +272 -0
- package/hooks/scripts/pre_tool.py +1278 -0
- package/hooks/scripts/prompt_submit.py +1109 -0
- package/hooks/scripts/session_end.py +95 -0
- package/hooks/scripts/stop.py +624 -0
- package/hooks/scripts/subagent_lifecycle.py +464 -0
- package/hooks/scripts/subscribers/on_gate_decided.py +84 -0
- package/hooks/scripts/task_completed.py +322 -0
- package/hooks/scripts/worktree_guard.py +148 -0
- package/hooks/subscriptions/on_gate_decided.json +9 -0
- package/install.mjs +128 -0
- package/package.json +41 -0
- package/pyproject.toml +59 -0
- package/schemas/README.md +32 -0
- package/schemas/assert_contracts.json +37 -0
- package/schemas/health_probe.json +46 -0
- package/schemas/plugin_status.json +37 -0
- package/scripts/_adapters/__init__.py +166 -0
- package/scripts/_adapters/jira_adapter.py +18 -0
- package/scripts/_adapters/linear_adapter.py +18 -0
- package/scripts/_adapters/miro_adapter.py +18 -0
- package/scripts/_adapters/notion_adapter.py +18 -0
- package/scripts/_agents.py +357 -0
- package/scripts/_brain_ingest/__init__.py +2 -0
- package/scripts/_brain_ingest/session_fact_extractor.py +341 -0
- package/scripts/_brain_port.py +163 -0
- package/scripts/_bus.py +1081 -0
- package/scripts/_bus_catalog_gen.py +93 -0
- package/scripts/_bus_consumers.json +46 -0
- package/scripts/_bus_emit.py +43 -0
- package/scripts/_capability_registry.py +334 -0
- package/scripts/_capability_resolver.py +322 -0
- package/scripts/_domain_store.py +559 -0
- package/scripts/_event_log_reader.py +154 -0
- package/scripts/_event_schema.py +305 -0
- package/scripts/_event_store.py +397 -0
- package/scripts/_heavy_cadence.py +324 -0
- package/scripts/_integration_resolver.py +321 -0
- package/scripts/_logger.py +151 -0
- package/scripts/_loom.py +482 -0
- package/scripts/_paths.py +133 -0
- package/scripts/_python.sh +22 -0
- package/scripts/_run.py +137 -0
- package/scripts/_session.py +502 -0
- package/scripts/_validate_registry.py +1042 -0
- package/scripts/_wicked_testing_probe.py +277 -0
- package/scripts/agentic/analyze_agents.py +391 -0
- package/scripts/agentic/detect_framework.py +420 -0
- package/scripts/agentic/issue_taxonomy.py +357 -0
- package/scripts/agentic/pattern_scorer.py +434 -0
- package/scripts/classify/persist.py +169 -0
- package/scripts/compiler/compile.py +552 -0
- package/scripts/compiler/phase0/VERDICT.md +60 -0
- package/scripts/compiler/phase0/detect.py +292 -0
- package/scripts/compiler/phase0/emit.py +228 -0
- package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.bindings.json +30 -0
- package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.lint-output.txt +17 -0
- package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/.wg/evidence/failing-tests.txt +4 -0
- package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/.wg/evidence/honest-tests.txt +2 -0
- package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/fab-fail.build.md +8 -0
- package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/fab-missing.build.md +8 -0
- package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/honest.build.md +8 -0
- package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/wg_check_claims.py +174 -0
- package/scripts/compiler/phase0/evidence/command_iq.bindings.json +45 -0
- package/scripts/compiler/phase0/evidence/command_iq.lint-output.txt +17 -0
- package/scripts/compiler/phase0/evidence/command_iq.stage/.projects/evidence-domain/phase-1-clarify/evidence/failing-tests.txt +4 -0
- package/scripts/compiler/phase0/evidence/command_iq.stage/.projects/evidence-domain/phase-1-clarify/evidence/honest-tests.txt +3 -0
- package/scripts/compiler/phase0/evidence/command_iq.stage/fab-fail.build.md +8 -0
- package/scripts/compiler/phase0/evidence/command_iq.stage/fab-missing.build.md +8 -0
- package/scripts/compiler/phase0/evidence/command_iq.stage/honest.build.md +8 -0
- package/scripts/compiler/phase0/evidence/command_iq.stage/wg_check_claims.py +174 -0
- package/scripts/compiler/phase0/evidence/memos.bindings.json +28 -0
- package/scripts/compiler/phase0/evidence/memos.lint-output.txt +17 -0
- package/scripts/compiler/phase0/evidence/memos.stage/.wg/evidence/failing-tests.txt +4 -0
- package/scripts/compiler/phase0/evidence/memos.stage/.wg/evidence/honest-tests.txt +2 -0
- package/scripts/compiler/phase0/evidence/memos.stage/fab-fail.build.md +8 -0
- package/scripts/compiler/phase0/evidence/memos.stage/fab-missing.build.md +8 -0
- package/scripts/compiler/phase0/evidence/memos.stage/honest.build.md +8 -0
- package/scripts/compiler/phase0/evidence/memos.stage/wg_check_claims.py +174 -0
- package/scripts/compiler/phase0/evidence/verdict.json +104 -0
- package/scripts/compiler/phase0/evidence/wicked-bus.bindings.json +29 -0
- package/scripts/compiler/phase0/evidence/wicked-bus.lint-output.txt +17 -0
- package/scripts/compiler/phase0/evidence/wicked-bus.stage/coverage/failing-tests.txt +4 -0
- package/scripts/compiler/phase0/evidence/wicked-bus.stage/coverage/honest-tests.txt +3 -0
- package/scripts/compiler/phase0/evidence/wicked-bus.stage/fab-fail.build.md +8 -0
- package/scripts/compiler/phase0/evidence/wicked-bus.stage/fab-missing.build.md +8 -0
- package/scripts/compiler/phase0/evidence/wicked-bus.stage/honest.build.md +8 -0
- package/scripts/compiler/phase0/evidence/wicked-bus.stage/wg_check_claims.py +174 -0
- package/scripts/compiler/phase0/evidence/wire-vault-transcript.txt +60 -0
- package/scripts/compiler/phase0/run_probe.py +234 -0
- package/scripts/compiler/phase0/wire_vault.py +310 -0
- package/scripts/crew/__init__.py +0 -0
- package/scripts/crew/_task_audit_writer.py +243 -0
- package/scripts/crew/_task_reader.py +389 -0
- package/scripts/crew/archetypes_v11.py +348 -0
- package/scripts/crew/detectors/__init__.py +12 -0
- package/scripts/crew/flow_compiler.py +121 -0
- package/scripts/crew/phase_manager.py +703 -0
- package/scripts/crew/scope_delta.py +264 -0
- package/scripts/crew/specialist_resolver.py +218 -0
- package/scripts/crew/stack_registry.py +189 -0
- package/scripts/data/data_profiler.py +271 -0
- package/scripts/data/ontology_recommender.py +231 -0
- package/scripts/data/schema_validator.py +267 -0
- package/scripts/delivery/drift.py +739 -0
- package/scripts/delivery/telemetry.py +614 -0
- package/scripts/engineering/patch/codegraph_db.py +125 -0
- package/scripts/engineering/patch/generators/__init__.py +56 -0
- package/scripts/engineering/patch/generators/base.py +373 -0
- package/scripts/engineering/patch/generators/csharp_generator.py +494 -0
- package/scripts/engineering/patch/generators/go_generator.py +430 -0
- package/scripts/engineering/patch/generators/java_generator.py +928 -0
- package/scripts/engineering/patch/generators/jsp_generator.py +454 -0
- package/scripts/engineering/patch/generators/kotlin_generator.py +561 -0
- package/scripts/engineering/patch/generators/perl_generator.py +510 -0
- package/scripts/engineering/patch/generators/php_generator.py +644 -0
- package/scripts/engineering/patch/generators/propagation_engine.py +929 -0
- package/scripts/engineering/patch/generators/python_generator.py +487 -0
- package/scripts/engineering/patch/generators/ruby_generator.py +463 -0
- package/scripts/engineering/patch/generators/rust_generator.py +400 -0
- package/scripts/engineering/patch/generators/sql_generator.py +594 -0
- package/scripts/engineering/patch/generators/typescript_generator.py +439 -0
- package/scripts/engineering/patch/patch.py +800 -0
- package/scripts/engineering/patch/safety.py +429 -0
- package/scripts/jam/__init__.py +0 -0
- package/scripts/jam/_bus_consumers.py +271 -0
- package/scripts/jam/agentic_cli_registry.py +703 -0
- package/scripts/jam/consensus.py +737 -0
- package/scripts/jam/detect_clis.py +409 -0
- package/scripts/jam/jam.py +283 -0
- package/scripts/jam/save_transcript.py +171 -0
- package/scripts/loom/__init__.py +22 -0
- package/scripts/loom/cli.py +170 -0
- package/scripts/loom/compose.py +180 -0
- package/scripts/loom/gate.py +120 -0
- package/scripts/loom/manifest.py +140 -0
- package/scripts/loom/resolve.py +59 -0
- package/scripts/persona/__init__.py +0 -0
- package/scripts/persona/registry.py +688 -0
- package/scripts/platform/guard_pipeline.py +1214 -0
- package/scripts/platform/guard_profiles.py +216 -0
- package/scripts/platform/observability/assert_contracts.py +434 -0
- package/scripts/platform/observability/health_probe.py +915 -0
- package/scripts/platform/observability/ops_log_viewer.py +209 -0
- package/scripts/platform/prereq_doctor.py +567 -0
- package/scripts/qe/conditions_manifest.py +260 -0
- package/scripts/qe/content_sanitizer.py +160 -0
- package/scripts/qe/coverage_tracker.py +535 -0
- package/scripts/qe/discover_scenarios.py +243 -0
- package/scripts/qe/evidence_tracker.py +232 -0
- package/scripts/qe/prove.py +196 -0
- package/scripts/qe/registry_lookup.py +80 -0
- package/scripts/qe/registry_store.py +176 -0
- package/scripts/qe/semantic_review.py +1005 -0
- package/scripts/qe/vault_gate.py +382 -0
- package/scripts/qe/verdict_audit.py +175 -0
- package/scripts/qe/verdict_schema.py +335 -0
- package/scripts/reset.py +220 -0
- package/scripts/resolve_path.py +22 -0
- package/scripts/sentinel/invariants.py +402 -0
- package/scripts/sentinel/pre_push.py +73 -0
- package/scripts/setup/__init__.py +1 -0
- package/scripts/setup/detect_state.py +114 -0
- package/scripts/setup/migrate_legacy.py +67 -0
- package/scripts/setup/migrate_v6_projects.py +232 -0
- package/scripts/setup/onboarding.py +114 -0
- package/scripts/smaht/_bus_consumers.py +98 -0
- package/scripts/smaht/adapters/__init__.py +83 -0
- package/scripts/smaht/adapters/brain_adapter.py +254 -0
- package/scripts/smaht/adapters/context7_adapter.py +438 -0
- package/scripts/smaht/adapters/delegation_adapter.py +104 -0
- package/scripts/smaht/adapters/domain_adapter.py +206 -0
- package/scripts/smaht/adapters/events_adapter.py +231 -0
- package/scripts/smaht/adapters/tools_adapter.py +49 -0
- package/scripts/smaht/cheatsheet_store.py +236 -0
- package/scripts/smaht/context_package.py +386 -0
- package/scripts/smaht/knowledge_graph.py +395 -0
- package/scripts/smaht/propose_skills.py +856 -0
- package/scripts/smaht/test_cheatsheet_store.py +428 -0
- package/scripts/statusline.py +151 -0
- package/scripts/where_am_i.py +236 -0
- package/skills/agentic/agentic-patterns/SKILL.md +91 -0
- package/skills/agentic/agentic-patterns/refs/anti-patterns-design.md +283 -0
- package/skills/agentic/agentic-patterns/refs/anti-patterns-operational.md +216 -0
- package/skills/agentic/agentic-patterns/refs/pattern-catalog.md +329 -0
- package/skills/agentic/context-engineering/SKILL.md +142 -0
- package/skills/agentic/context-engineering/refs/caching-and-optimization.md +251 -0
- package/skills/agentic/context-engineering/refs/compression-techniques.md +171 -0
- package/skills/agentic/context-engineering/refs/cost-calculation-budget.md +250 -0
- package/skills/agentic/context-engineering/refs/cost-optimization-reporting.md +300 -0
- package/skills/agentic/context-engineering/refs/selective-loading.md +179 -0
- package/skills/agentic/frameworks/SKILL.md +191 -0
- package/skills/agentic/frameworks/refs/framework-profiles-1.md +209 -0
- package/skills/agentic/frameworks/refs/framework-profiles-2.md +214 -0
- package/skills/agentic/frameworks/refs/migration-patterns-paths.md +267 -0
- package/skills/agentic/frameworks/refs/migration-patterns-testing.md +208 -0
- package/skills/agentic/refs/audit.md +134 -0
- package/skills/agentic/refs/design.md +137 -0
- package/skills/agentic/refs/frameworks.md +102 -0
- package/skills/agentic/refs/review.md +160 -0
- package/skills/agentic/review-methodology/SKILL.md +186 -0
- package/skills/agentic/review-methodology/refs/deliverable-templates.md +246 -0
- package/skills/agentic/review-methodology/refs/issue-taxonomy-quality-testing.md +277 -0
- package/skills/agentic/review-methodology/refs/issue-taxonomy-reliability-safety.md +253 -0
- package/skills/agentic/trust-and-safety/SKILL.md +177 -0
- package/skills/agentic/trust-and-safety/refs/guardrails-actions.md +246 -0
- package/skills/agentic/trust-and-safety/refs/guardrails-input-output.md +238 -0
- package/skills/agentic/trust-and-safety/refs/guardrails-resources.md +209 -0
- package/skills/agentic/trust-and-safety/refs/safety-checklist-advanced.md +209 -0
- package/skills/agentic/trust-and-safety/refs/safety-checklist-core.md +215 -0
- package/skills/archetype/SKILL.md +104 -0
- package/skills/archetype/refs/build.md +142 -0
- package/skills/archetype/refs/decide.md +117 -0
- package/skills/archetype/refs/explore.md +66 -0
- package/skills/archetype/refs/incident.md +149 -0
- package/skills/archetype/refs/migrate.md +170 -0
- package/skills/archetype/refs/modernize.md +187 -0
- package/skills/archetype/refs/review.md +145 -0
- package/skills/archetype/refs/ship.md +117 -0
- package/skills/archetype/refs/specify.md +108 -0
- package/skills/archetype/refs/triage.md +62 -0
- package/skills/classify/SKILL.md +157 -0
- package/skills/data/analysis/SKILL.md +125 -0
- package/skills/data/analysis/refs/templates.md +170 -0
- package/skills/data/data/SKILL.md +118 -0
- package/skills/data/data/refs/examples.md +235 -0
- package/skills/data/ml/SKILL.md +125 -0
- package/skills/data/ml/refs/templates.md +172 -0
- package/skills/data/pipeline/SKILL.md +136 -0
- package/skills/data/pipeline/refs/templates.md +175 -0
- package/skills/data/refs/analyze.md +123 -0
- package/skills/data/refs/data.md +95 -0
- package/skills/data/refs/ml.md +118 -0
- package/skills/data/refs/pipeline.md +92 -0
- package/skills/deliberate/SKILL.md +125 -0
- package/skills/deliberate/refs/architecture-lens.md +37 -0
- package/skills/deliberate/refs/assumptions-lens.md +43 -0
- package/skills/deliberate/refs/code-lens.md +38 -0
- package/skills/deliberate/refs/content-lens.md +37 -0
- package/skills/deliberate/refs/data-lens.md +43 -0
- package/skills/deliberate/refs/design-lens.md +37 -0
- package/skills/deliberate/refs/opportunity-patterns.md +107 -0
- package/skills/deliberate/refs/ops-lens.md +43 -0
- package/skills/deliberate/refs/product-lens.md +46 -0
- package/skills/deliberate/refs/rethink-framework.md +77 -0
- package/skills/deliberate/refs/security-lens.md +47 -0
- package/skills/deliberate/refs/testing-lens.md +45 -0
- package/skills/deliberate/refs/timing-lens.md +42 -0
- package/skills/engineering/architecture/SKILL.md +177 -0
- package/skills/engineering/architecture/refs/adr-template.md +268 -0
- package/skills/engineering/architecture/refs/architecture-template-deployment.md +176 -0
- package/skills/engineering/architecture/refs/architecture-template-design.md +300 -0
- package/skills/engineering/architecture/refs/examples-ecommerce-analytics.md +299 -0
- package/skills/engineering/architecture/refs/examples-saas-trading.md +291 -0
- package/skills/engineering/architecture/refs/patterns-advanced.md +238 -0
- package/skills/engineering/architecture/refs/patterns-structural.md +303 -0
- package/skills/engineering/backend/SKILL.md +102 -0
- package/skills/engineering/backend/refs/checklists.md +146 -0
- package/skills/engineering/backend/refs/patterns.md +181 -0
- package/skills/engineering/debugging/SKILL.md +99 -0
- package/skills/engineering/debugging/refs/patterns.md +248 -0
- package/skills/engineering/debugging/refs/process.md +203 -0
- package/skills/engineering/docs/SKILL.md +97 -0
- package/skills/engineering/engineering/SKILL.md +88 -0
- package/skills/engineering/engineering/refs/checklists.md +91 -0
- package/skills/engineering/engineering/refs/templates.md +71 -0
- package/skills/engineering/frontend/SKILL.md +92 -0
- package/skills/engineering/frontend/refs/checklists.md +96 -0
- package/skills/engineering/frontend/refs/patterns.md +167 -0
- package/skills/engineering/integration/SKILL.md +183 -0
- package/skills/engineering/integration/refs/error-handling-best-practices.md +139 -0
- package/skills/engineering/integration/refs/error-handling-error-classes-typescript.md +212 -0
- package/skills/engineering/integration/refs/error-handling-error-response-format.md +301 -0
- package/skills/engineering/integration/refs/error-handling-retry-strategies.md +190 -0
- package/skills/engineering/integration/refs/event-schemas-best-practices.md +225 -0
- package/skills/engineering/integration/refs/event-schemas-event-naming-conventions.md +303 -0
- package/skills/engineering/integration/refs/event-schemas-event-structure.md +288 -0
- package/skills/engineering/integration/refs/graphql-best-practices.md +138 -0
- package/skills/engineering/integration/refs/graphql-error-handling.md +198 -0
- package/skills/engineering/integration/refs/graphql-graphql-basics.md +197 -0
- package/skills/engineering/integration/refs/graphql-query-examples.md +226 -0
- package/skills/engineering/integration/refs/graphql-schema-design-patterns.md +280 -0
- package/skills/engineering/integration/refs/grpc-grpc-overview.md +246 -0
- package/skills/engineering/integration/refs/grpc-implementation-examples.md +269 -0
- package/skills/engineering/integration/refs/grpc-metadata-headers.md +304 -0
- package/skills/engineering/integration/refs/grpc-testing.md +49 -0
- package/skills/engineering/integration/refs/openapi-template.yaml +682 -0
- package/skills/engineering/integration/refs/resilience-best-practices.md +109 -0
- package/skills/engineering/integration/refs/resilience-circuit-breaker-pattern.md +302 -0
- package/skills/engineering/integration/refs/resilience-rate-limiting.md +245 -0
- package/skills/engineering/integration/refs/resilience-timeout-pattern.md +212 -0
- package/skills/engineering/integration/refs/rest-api-fundamentals.md +299 -0
- package/skills/engineering/integration/refs/rest-api-responses-security.md +302 -0
- package/skills/engineering/integration/refs/versioning-breaking-changes.md +237 -0
- package/skills/engineering/integration/refs/versioning-migration-strategies.md +257 -0
- package/skills/engineering/integration/refs/versioning-versioning-strategies.md +296 -0
- package/skills/engineering/large-scale-migration/SKILL.md +65 -0
- package/skills/engineering/patch/SKILL.md +184 -0
- package/skills/engineering/refs/arch.md +126 -0
- package/skills/engineering/refs/debug.md +142 -0
- package/skills/engineering/refs/docs.md +190 -0
- package/skills/engineering/refs/plan.md +109 -0
- package/skills/engineering/refs/review.md +138 -0
- package/skills/engineering/system-design/SKILL.md +154 -0
- package/skills/engineering/system-design/refs/anti-patterns-big-ball-of-mud.md +254 -0
- package/skills/engineering/system-design/refs/anti-patterns-circular-dependencies.md +241 -0
- package/skills/engineering/system-design/refs/anti-patterns-feature-envy.md +168 -0
- package/skills/engineering/system-design/refs/anti-patterns-god-object.md +247 -0
- package/skills/engineering/system-design/refs/component-template-lifecycle.md +210 -0
- package/skills/engineering/system-design/refs/component-template-maintenance.md +219 -0
- package/skills/engineering/system-design/refs/component-template-structure.md +276 -0
- package/skills/engineering/system-design/refs/dependencies-best-practices.md +260 -0
- package/skills/engineering/system-design/refs/dependencies-dependency-principles.md +295 -0
- package/skills/engineering/system-design/refs/dependencies-dependency-tracking.md +261 -0
- package/skills/engineering/system-design/refs/interface-template-lifecycle.md +211 -0
- package/skills/engineering/system-design/refs/interface-template-maintenance.md +212 -0
- package/skills/engineering/system-design/refs/interface-template-structure.md +269 -0
- package/skills/engineering/system-design/refs/patterns-dependency-injection.md +151 -0
- package/skills/engineering/system-design/refs/patterns-facade-pattern.md +257 -0
- package/skills/engineering/system-design/refs/patterns-layered-pattern.md +204 -0
- package/skills/engineering/system-design/refs/patterns-plugin-architecture.md +229 -0
- package/skills/engineering/unit-test-quality/SKILL.md +194 -0
- package/skills/ground/SKILL.md +130 -0
- package/skills/integration-discovery/SKILL.md +168 -0
- package/skills/integration-discovery/refs/capabilities.md +282 -0
- package/skills/integration-discovery/refs/cli-detection.md +295 -0
- package/skills/integration-discovery/refs/discovery-sources.md +233 -0
- package/skills/integration-discovery/refs/task-patterns.md +206 -0
- package/skills/jam/SKILL.md +45 -0
- package/skills/jam/refs/facilitation-patterns.md +125 -0
- package/skills/jam/refs/quick.md +64 -0
- package/skills/jam/refs/synthesis-patterns.md +114 -0
- package/skills/multi-model/SKILL.md +168 -0
- package/skills/multi-model/refs/aichat.md +119 -0
- package/skills/multi-model/refs/aider.md +100 -0
- package/skills/multi-model/refs/auditability.md +238 -0
- package/skills/multi-model/refs/codex.md +169 -0
- package/skills/multi-model/refs/context.md +306 -0
- package/skills/multi-model/refs/copilot.md +161 -0
- package/skills/multi-model/refs/examples.md +224 -0
- package/skills/multi-model/refs/gemini.md +185 -0
- package/skills/multi-model/refs/goose.md +112 -0
- package/skills/multi-model/refs/llm.md +124 -0
- package/skills/multi-model/refs/opencode.md +196 -0
- package/skills/multi-model/refs/orchestration.md +188 -0
- package/skills/multi-model/refs/pi.md +208 -0
- package/skills/persona/SKILL.md +144 -0
- package/skills/persona/refs/define.md +133 -0
- package/skills/platform/actions/refs/actions.md +114 -0
- package/skills/platform/audit/SKILL.md +174 -0
- package/skills/platform/audit/refs/audit.md +145 -0
- package/skills/platform/audit/refs/checklists-evidence-operations.md +144 -0
- package/skills/platform/audit/refs/checklists-gdpr-pci-evidence.md +213 -0
- package/skills/platform/audit/refs/checklists-soc2-hipaa.md +120 -0
- package/skills/platform/audit/refs/frameworks-gdpr-pci.md +225 -0
- package/skills/platform/audit/refs/frameworks-soc2-hipaa.md +228 -0
- package/skills/platform/compliance/SKILL.md +169 -0
- package/skills/platform/compliance/refs/checklists.md +303 -0
- package/skills/platform/compliance/refs/compliance.md +117 -0
- package/skills/platform/compliance/refs/frameworks.md +282 -0
- package/skills/platform/errors/SKILL.md +183 -0
- package/skills/platform/errors/refs/patterns.md +271 -0
- package/skills/platform/errors/refs/severity.md +264 -0
- package/skills/platform/gate-benchmark-rebaseline/SKILL.md +108 -0
- package/skills/platform/gh/refs/gh.md +105 -0
- package/skills/platform/gh-cli/SKILL.md +120 -0
- package/skills/platform/gh-cli/refs/automation.md +63 -0
- package/skills/platform/gh-cli/refs/gh-ops.md +103 -0
- package/skills/platform/gh-cli/refs/patterns.md +132 -0
- package/skills/platform/gh-cli/scripts/gh_ops.py +454 -0
- package/skills/platform/github-actions/SKILL.md +159 -0
- package/skills/platform/github-actions/refs/security.md +150 -0
- package/skills/platform/github-actions/refs/templates.md +230 -0
- package/skills/platform/github-actions/refs/troubleshooting.md +174 -0
- package/skills/platform/github-actions/scripts/workflow_gen.py +215 -0
- package/skills/platform/gitlab-ci/SKILL.md +140 -0
- package/skills/platform/gitlab-ci/refs/templates.md +223 -0
- package/skills/platform/gitlab-ci/refs/troubleshooting.md +213 -0
- package/skills/platform/glab-cli/SKILL.md +133 -0
- package/skills/platform/glab-cli/refs/ci-debugging.md +95 -0
- package/skills/platform/glab-cli/refs/glab-ops.md +78 -0
- package/skills/platform/glab-cli/refs/patterns.md +131 -0
- package/skills/platform/glab-cli/scripts/glab_ops.py +313 -0
- package/skills/platform/health/SKILL.md +177 -0
- package/skills/platform/health/refs/health.md +72 -0
- package/skills/platform/health/refs/sources.md +302 -0
- package/skills/platform/incident/refs/incident.md +136 -0
- package/skills/platform/infra/refs/infra.md +104 -0
- package/skills/platform/observability/SKILL.md +128 -0
- package/skills/platform/observability/refs/toolchain-discovery.md +243 -0
- package/skills/platform/prereq-doctor/SKILL.md +57 -0
- package/skills/platform/prereq-doctor/refs/tool-registry.md +58 -0
- package/skills/platform/traces/refs/traces.md +101 -0
- package/skills/product/acceptance-criteria/SKILL.md +193 -0
- package/skills/product/acceptance-criteria/refs/ac-anti-patterns.md +291 -0
- package/skills/product/acceptance-criteria/refs/ac-examples.md +277 -0
- package/skills/product/accessibility/SKILL.md +197 -0
- package/skills/product/accessibility/refs/aria-patterns-basics.md +250 -0
- package/skills/product/accessibility/refs/aria-patterns-dynamic.md +187 -0
- package/skills/product/accessibility/refs/aria-patterns-interactive.md +246 -0
- package/skills/product/accessibility/refs/audit-report-findings.md +248 -0
- package/skills/product/accessibility/refs/audit-report-results.md +276 -0
- package/skills/product/accessibility/refs/common-violations-html-css.md +270 -0
- package/skills/product/accessibility/refs/common-violations-interactive.md +303 -0
- package/skills/product/accessibility/refs/keyboard-testing-basics.md +222 -0
- package/skills/product/accessibility/refs/keyboard-testing-patterns.md +173 -0
- package/skills/product/accessibility/refs/screen-reader-testing-advanced.md +294 -0
- package/skills/product/accessibility/refs/screen-reader-testing-commands.md +255 -0
- package/skills/product/accessibility/refs/wcag-checklist.md +262 -0
- package/skills/product/analyze/SKILL.md +164 -0
- package/skills/product/analyze/refs/algorithms.md +238 -0
- package/skills/product/analyze/refs/sentiment-patterns.md +180 -0
- package/skills/product/imagery/SKILL.md +97 -0
- package/skills/product/imagery/alter/SKILL.md +105 -0
- package/skills/product/imagery/alter/refs/editing-reference.md +146 -0
- package/skills/product/imagery/create/SKILL.md +109 -0
- package/skills/product/imagery/create/refs/prompt-engineering.md +112 -0
- package/skills/product/imagery/create/refs/provider-reference.md +219 -0
- package/skills/product/imagery/review/SKILL.md +101 -0
- package/skills/product/imagery/review/refs/analysis-lenses.md +136 -0
- package/skills/product/imagery/review/refs/quality-gates.md +153 -0
- package/skills/product/imagery/scripts/analyze.sh +23 -0
- package/skills/product/imagery/scripts/edit.sh +14 -0
- package/skills/product/imagery/scripts/generate.sh +13 -0
- package/skills/product/imagery/scripts/provider.py +787 -0
- package/skills/product/listen/SKILL.md +175 -0
- package/skills/product/listen/refs/channels.md +220 -0
- package/skills/product/mockup/SKILL.md +106 -0
- package/skills/product/mockup/refs/templates.md +95 -0
- package/skills/product/refs/a11y.md +109 -0
- package/skills/product/refs/acceptance.md +79 -0
- package/skills/product/refs/align.md +67 -0
- package/skills/product/refs/analyze.md +77 -0
- package/skills/product/refs/elicit.md +67 -0
- package/skills/product/refs/listen.md +58 -0
- package/skills/product/refs/mockup.md +77 -0
- package/skills/product/refs/screenshot.md +59 -0
- package/skills/product/refs/strategy.md +77 -0
- package/skills/product/refs/synthesize.md +54 -0
- package/skills/product/refs/ux-review.md +68 -0
- package/skills/product/refs/ux.md +101 -0
- package/skills/product/requirements-analysis/SKILL.md +136 -0
- package/skills/product/requirements-analysis/refs/requirements-example-auth.md +264 -0
- package/skills/product/requirements-analysis/refs/requirements-example-export-integration.md +88 -0
- package/skills/product/requirements-analysis/refs/requirements-output-format-template.md +247 -0
- package/skills/product/requirements-analysis/refs/user-story-guide.md +296 -0
- package/skills/product/requirements-graph/SKILL.md +155 -0
- package/skills/product/requirements-graph/refs/examples.md +223 -0
- package/skills/product/requirements-graph/refs/schema.md +162 -0
- package/skills/product/requirements-migrate/SKILL.md +90 -0
- package/skills/product/requirements-navigate/SKILL.md +141 -0
- package/skills/product/requirements-navigate/refs/meta-templates.md +141 -0
- package/skills/product/screenshot/SKILL.md +147 -0
- package/skills/product/strategy/SKILL.md +198 -0
- package/skills/product/strategy/refs/frameworks.md +295 -0
- package/skills/product/strategy/refs/templates-competitive-market.md +299 -0
- package/skills/product/strategy/refs/templates-roi-value.md +207 -0
- package/skills/product/synthesize/SKILL.md +116 -0
- package/skills/product/synthesize/refs/journey-mapping.md +212 -0
- package/skills/product/synthesize/refs/prioritization.md +193 -0
- package/skills/product/ux-review/SKILL.md +164 -0
- package/skills/product/visual-direction/SKILL.md +137 -0
- package/skills/product/visual-review/SKILL.md +131 -0
- package/skills/runtime-exec/SKILL.md +138 -0
- package/skills/search/codebase-narrator/SKILL.md +131 -0
- package/skills/search/codebase-narrator/refs/output-template.md +100 -0
- package/skills/smaht/SKILL.md +72 -0
- package/skills/smaht/discovery/SKILL.md +65 -0
- package/skills/smaht/intent/SKILL.md +89 -0
- package/skills/smaht/propose-skills/SKILL.md +142 -0
- package/skills/smaht/refs/state.md +76 -0
- package/skills/swarm/SKILL.md +132 -0
- package/skills/swarm/refs/fan-out.md +104 -0
- package/skills/swarm/refs/independent-verification.md +86 -0
- package/skills/swarm/refs/receipts-and-evidence.md +69 -0
- package/skills/swarm/refs/recon-synthesis.md +87 -0
- package/skills/swarm/refs/ship-discipline.md +90 -0
- package/skills/wickedizer/SKILL.md +147 -0
- package/skills/wickedizer/refs/artifact-types.md +238 -0
- package/skills/wickedizer/refs/complexity.md +278 -0
- package/skills/wickedizer/refs/de-ai-pass.md +140 -0
- package/skills/wickedizer/refs/failure-modes.md +249 -0
- package/skills/wickedizer/refs/patterns.md +282 -0
- package/skills/wickedizer/refs/review.md +221 -0
- package/skills/wickedizer/refs/structure.md +282 -0
- package/skills/wickedizer/refs/voice-profile.md +125 -0
- package/skills/workflow/SKILL.md +132 -0
- package/skills/workflow/refs/archetype-adjustments.md +205 -0
- package/skills/workflow/refs/evidence.md +58 -0
- package/skills/workflow/refs/integration.md +130 -0
- package/skills/workflow/refs/risk-dimension-signals.md +260 -0
- package/skills/workflow/refs/scoring-rubric.md +49 -0
- package/skills/workflow/refs/signal-keywords.md +176 -0
- package/skills/workflow/refs/specialist-routing-rules.md +159 -0
- package/skills/worktrees/SKILL.md +87 -0
- package/skills/worktrees/refs/recipes.md +96 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Delegation advisor adapter for wicked-smaht.
|
|
3
|
+
|
|
4
|
+
Analyzes prompts to suggest specialist delegation when domain-specific work is detected.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import sys
|
|
8
|
+
from typing import List
|
|
9
|
+
|
|
10
|
+
from . import ContextItem
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
# Domain-to-specialist mapping for delegation hints
|
|
14
|
+
DOMAIN_HINTS = {
|
|
15
|
+
"security": ("wicked-garden:platform", "security-engineer", "Security review"),
|
|
16
|
+
"architecture": ("wicked-garden:engineering", "solution-architect", "Architecture analysis"),
|
|
17
|
+
"test": ("wicked-garden:qe", "test-strategist", "Test strategy"),
|
|
18
|
+
"data": ("wicked-garden:data", "data-engineer", "Data analysis"),
|
|
19
|
+
"brainstorm": ("wicked-garden:jam", "facilitator", "Brainstorming session"),
|
|
20
|
+
"requirements": ("wicked-garden:product", "requirements-analyst", "Requirements elicitation"),
|
|
21
|
+
"agent": ("wicked-garden:agentic", "architect", "Agentic system review"),
|
|
22
|
+
|
|
23
|
+
"review": ("wicked-garden:crew", "reviewer", "Code review"),
|
|
24
|
+
"debug": ("wicked-garden:engineering", "solution-architect", "Debugging / root-cause analysis"),
|
|
25
|
+
"performance": ("wicked-garden:platform", "performance-engineer", "Performance analysis"),
|
|
26
|
+
"ux": ("wicked-garden:product", "ux-researcher", "UX research"),
|
|
27
|
+
"compliance": ("wicked-garden:platform", "compliance-auditor", "Compliance review"),
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
# Keywords that suggest delegatable work
|
|
31
|
+
DOMAIN_KEYWORDS = {
|
|
32
|
+
"security": ["security", "auth", "encrypt", "vulnerability", "owasp", "csrf", "xss", "secure", "authentication", "authorization"],
|
|
33
|
+
"architecture": ["architecture", "design", "system design", "component", "api contract", "scalability", "microservice"],
|
|
34
|
+
"test": ["test", "testing", "coverage", "scenario", "qa", "quality", "e2e", "integration test", "unit test"],
|
|
35
|
+
"data": ["data", "analytics", "pipeline", "etl", "database", "query", "csv", "sql", "warehouse"],
|
|
36
|
+
"brainstorm": ["brainstorm", "ideas", "explore", "alternatives", "perspectives", "ideation"],
|
|
37
|
+
"requirements": ["requirements", "user story", "acceptance criteria", "stakeholder", "feature request"],
|
|
38
|
+
"agent": ["agent", "agentic", "llm", "prompt", "guardrail", "tool use", "subagent"],
|
|
39
|
+
"review": ["review", "code review", "pull request", "pr review", "peer review"],
|
|
40
|
+
"debug": ["debug", "error", "bug", "stacktrace", "root cause", "investigate", "troubleshoot"],
|
|
41
|
+
"performance": ["performance", "latency", "throughput", "bottleneck", "optimize", "profiling"],
|
|
42
|
+
"ux": ["ux", "user experience", "usability", "user research", "user flow", "interaction"],
|
|
43
|
+
"compliance": ["compliance", "audit", "regulatory", "gdpr", "hipaa", "sox", "policy"],
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
async def query(prompt: str, **kwargs) -> List[ContextItem]:
|
|
48
|
+
"""Return delegation hints for the given prompt."""
|
|
49
|
+
prompt_lower = prompt.lower()
|
|
50
|
+
items = []
|
|
51
|
+
detected_domains = []
|
|
52
|
+
|
|
53
|
+
# Detect all matching domains
|
|
54
|
+
for domain, keywords in DOMAIN_KEYWORDS.items():
|
|
55
|
+
if any(kw in prompt_lower for kw in keywords):
|
|
56
|
+
detected_domains.append(domain)
|
|
57
|
+
|
|
58
|
+
# Create delegation hints for each detected domain
|
|
59
|
+
for domain in detected_domains:
|
|
60
|
+
plugin, agent, desc = DOMAIN_HINTS[domain]
|
|
61
|
+
hint_text = (
|
|
62
|
+
f"{desc} detected — consider delegating to specialist:\n"
|
|
63
|
+
f"Task(subagent_type=\"{plugin}:{agent}\", prompt=\"...\")"
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
items.append(ContextItem(
|
|
67
|
+
id=f"delegation-{domain}",
|
|
68
|
+
source="delegation",
|
|
69
|
+
title=f"Delegation: {desc}",
|
|
70
|
+
summary=f"Consider: {plugin}:{agent}",
|
|
71
|
+
excerpt=hint_text,
|
|
72
|
+
relevance=0.7, # High relevance for actionable delegation advice
|
|
73
|
+
age_days=0,
|
|
74
|
+
metadata={
|
|
75
|
+
"domain": domain,
|
|
76
|
+
"plugin": plugin,
|
|
77
|
+
"agent": agent,
|
|
78
|
+
"type": "delegation_hint",
|
|
79
|
+
}
|
|
80
|
+
))
|
|
81
|
+
|
|
82
|
+
# Suggest parallel dispatch if multiple specialists applicable
|
|
83
|
+
if len(detected_domains) > 1:
|
|
84
|
+
parallel_hint = (
|
|
85
|
+
f"{len(detected_domains)} specialist domains detected "
|
|
86
|
+
f"({', '.join(detected_domains)}) — "
|
|
87
|
+
f"use parallel Task dispatches for efficiency"
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
items.append(ContextItem(
|
|
91
|
+
id="delegation-parallel",
|
|
92
|
+
source="delegation",
|
|
93
|
+
title="Parallel Delegation Opportunity",
|
|
94
|
+
summary=f"{len(detected_domains)} specialists applicable",
|
|
95
|
+
excerpt=parallel_hint,
|
|
96
|
+
relevance=0.8, # Higher relevance for efficiency pattern
|
|
97
|
+
age_days=0,
|
|
98
|
+
metadata={
|
|
99
|
+
"domains": detected_domains,
|
|
100
|
+
"type": "parallel_hint",
|
|
101
|
+
}
|
|
102
|
+
))
|
|
103
|
+
|
|
104
|
+
return items
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
"""
|
|
2
|
+
DomainStore adapter for wicked-smaht.
|
|
3
|
+
|
|
4
|
+
Queries crew projects and jam sessions via DomainStore directly (local
|
|
5
|
+
JSON with optional MCP routing). Replaces cp_adapter.py which queried
|
|
6
|
+
the same data via HTTP.
|
|
7
|
+
|
|
8
|
+
Strategy:
|
|
9
|
+
1. Query each domain using DomainStore (local JSON primary store)
|
|
10
|
+
2. Apply generic relevance scoring (keyword matching + status/type boosts)
|
|
11
|
+
3. Return ContextItems sorted by relevance
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
import asyncio
|
|
15
|
+
import sys
|
|
16
|
+
import time
|
|
17
|
+
from datetime import datetime, timezone
|
|
18
|
+
from pathlib import Path
|
|
19
|
+
from typing import List
|
|
20
|
+
|
|
21
|
+
from . import ContextItem, _SCRIPTS_ROOT, run_in_thread
|
|
22
|
+
|
|
23
|
+
if str(_SCRIPTS_ROOT) not in sys.path:
|
|
24
|
+
sys.path.insert(0, str(_SCRIPTS_ROOT))
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
# ---------------------------------------------------------------------------
|
|
28
|
+
# Stop words for keyword extraction
|
|
29
|
+
# ---------------------------------------------------------------------------
|
|
30
|
+
|
|
31
|
+
_STOP_WORDS = frozenset({
|
|
32
|
+
"the", "a", "an", "is", "are", "was", "were", "be", "been", "have", "has",
|
|
33
|
+
"had", "do", "does", "did", "will", "would", "could", "should", "can",
|
|
34
|
+
"may", "might", "must", "i", "you", "we", "they", "me", "my", "your",
|
|
35
|
+
"this", "that", "these", "those", "what", "which", "who", "how", "why",
|
|
36
|
+
"when", "where", "and", "or", "but", "if", "for", "of", "to", "from",
|
|
37
|
+
"in", "on", "at", "by", "with", "about", "not", "so", "just", "also",
|
|
38
|
+
"need", "want", "let", "get", "make", "test", "check", "fix", "work",
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
# ---------------------------------------------------------------------------
|
|
43
|
+
# Domain query configuration (mirrors cp_adapter._DOMAIN_QUERIES structure)
|
|
44
|
+
# Each entry defines how to fetch data from a DomainStore domain.
|
|
45
|
+
#
|
|
46
|
+
# domain_name: DomainStore("wicked-{name}") argument
|
|
47
|
+
# source: DomainStore collection name (first arg to .list()/.search())
|
|
48
|
+
# label: ContextItem source label
|
|
49
|
+
# project_key: record field used for project scoping (None = no scoping)
|
|
50
|
+
# title_fn: callable(record) → title string
|
|
51
|
+
# summary_fn: callable(record) → summary string
|
|
52
|
+
# boost_fn: callable(record) → float bonus (0.0-0.5)
|
|
53
|
+
# ---------------------------------------------------------------------------
|
|
54
|
+
|
|
55
|
+
_DOMAIN_QUERIES = [
|
|
56
|
+
{
|
|
57
|
+
"domain_name": "wicked-crew",
|
|
58
|
+
"source": "projects",
|
|
59
|
+
"label": "crew",
|
|
60
|
+
"project_key": None, # crew projects are not sub-scoped
|
|
61
|
+
"title_fn": lambda r: f"Project: {r.get('name', '?')} ({r.get('current_phase', '?')} phase)",
|
|
62
|
+
"summary_fn": lambda r: f"Phase: {r.get('current_phase', '?')}, Complexity: {r.get('complexity_score', 0)}/7",
|
|
63
|
+
"boost_fn": lambda r: (
|
|
64
|
+
0.4 if not r.get("archived", False) and r.get("current_phase") not in ("done", "review") else 0.0
|
|
65
|
+
),
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"domain_name": "jam",
|
|
69
|
+
"source": "sessions",
|
|
70
|
+
"label": "jam",
|
|
71
|
+
"project_key": "project",
|
|
72
|
+
"title_fn": lambda r: f"Brainstorm: {r.get('topic', '')}",
|
|
73
|
+
"summary_fn": lambda r: (r.get("summary") or r.get("synthesis", {}).get("summary", ""))[:200],
|
|
74
|
+
"boost_fn": lambda r: 0.0,
|
|
75
|
+
},
|
|
76
|
+
]
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
# ---------------------------------------------------------------------------
|
|
80
|
+
# Helpers
|
|
81
|
+
# ---------------------------------------------------------------------------
|
|
82
|
+
|
|
83
|
+
def _extract_keywords(prompt: str) -> str:
|
|
84
|
+
words = prompt.lower().split()
|
|
85
|
+
keywords = [w for w in words if w not in _STOP_WORDS and len(w) > 2]
|
|
86
|
+
return " ".join(keywords[:5]) if keywords else ""
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def _keyword_score(prompt_lower: str, text: str, weight: float = 0.2) -> float:
|
|
90
|
+
"""Score text by keyword overlap with prompt."""
|
|
91
|
+
if not text:
|
|
92
|
+
return 0.0
|
|
93
|
+
text_lower = text.lower()
|
|
94
|
+
score = 0.0
|
|
95
|
+
for word in prompt_lower.split():
|
|
96
|
+
if len(word) > 3 and word in text_lower:
|
|
97
|
+
score += weight
|
|
98
|
+
return min(score, 0.5)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
# ---------------------------------------------------------------------------
|
|
102
|
+
# Per-domain query (runs in thread pool)
|
|
103
|
+
# ---------------------------------------------------------------------------
|
|
104
|
+
|
|
105
|
+
def _query_domain(config: dict, keywords: str, project: str = "") -> list:
|
|
106
|
+
"""Query a single DomainStore domain. Runs in thread pool.
|
|
107
|
+
|
|
108
|
+
Uses _skip_discovery=True to bypass integration-discovery (MCP routing).
|
|
109
|
+
This is a read-only context query — smaht never needs to delegate reads
|
|
110
|
+
to external tools, and discovery can block for up to 3 s when brain is
|
|
111
|
+
slow, which exceeds the fast-path 0.5 s timeout (issue #374).
|
|
112
|
+
|
|
113
|
+
Returns a list of raw record dicts, or [] on any error.
|
|
114
|
+
"""
|
|
115
|
+
try:
|
|
116
|
+
from _domain_store import DomainStore
|
|
117
|
+
|
|
118
|
+
ds = DomainStore(config["domain_name"], _skip_discovery=True)
|
|
119
|
+
|
|
120
|
+
params: dict = {}
|
|
121
|
+
if keywords:
|
|
122
|
+
params["q"] = keywords
|
|
123
|
+
if project and config.get("project_key"):
|
|
124
|
+
params[config["project_key"]] = project
|
|
125
|
+
|
|
126
|
+
records = ds.list(config["source"], **params)
|
|
127
|
+
return records if isinstance(records, list) else []
|
|
128
|
+
except Exception:
|
|
129
|
+
return []
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
# ---------------------------------------------------------------------------
|
|
133
|
+
# Public async query function
|
|
134
|
+
# ---------------------------------------------------------------------------
|
|
135
|
+
|
|
136
|
+
async def query(prompt: str, project: str = None) -> List[ContextItem]:
|
|
137
|
+
"""Query crew projects and jam sessions via DomainStore for relevant context.
|
|
138
|
+
|
|
139
|
+
Args:
|
|
140
|
+
prompt: The user's query/prompt text.
|
|
141
|
+
project: Optional project filter (applied to project-scoped domains).
|
|
142
|
+
|
|
143
|
+
Returns:
|
|
144
|
+
List of ContextItems sorted by relevance descending.
|
|
145
|
+
"""
|
|
146
|
+
keywords = _extract_keywords(prompt)
|
|
147
|
+
if not keywords:
|
|
148
|
+
return []
|
|
149
|
+
|
|
150
|
+
prompt_lower = prompt.lower()
|
|
151
|
+
items: list[ContextItem] = []
|
|
152
|
+
now = datetime.now(timezone.utc)
|
|
153
|
+
|
|
154
|
+
# Query all domains in parallel to avoid serial blocking (issue #374).
|
|
155
|
+
domain_results = await asyncio.gather(
|
|
156
|
+
*[run_in_thread(_query_domain, config, keywords, project or "")
|
|
157
|
+
for config in _DOMAIN_QUERIES],
|
|
158
|
+
return_exceptions=True,
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
for config, records in zip(_DOMAIN_QUERIES, domain_results):
|
|
162
|
+
# Skip domains that raised (run_in_thread wraps; gather returns exception objects)
|
|
163
|
+
if isinstance(records, Exception) or not isinstance(records, list):
|
|
164
|
+
continue
|
|
165
|
+
|
|
166
|
+
for record in records[:10]: # Cap per domain
|
|
167
|
+
# Skip archived or deleted records
|
|
168
|
+
if record.get("archived") or record.get("deleted"):
|
|
169
|
+
continue
|
|
170
|
+
|
|
171
|
+
title = config["title_fn"](record)
|
|
172
|
+
summary = config["summary_fn"](record)
|
|
173
|
+
|
|
174
|
+
# Score: base + keyword match + domain-specific boost
|
|
175
|
+
base = 0.3
|
|
176
|
+
kw_score = _keyword_score(prompt_lower, f"{title} {summary}")
|
|
177
|
+
boost = config["boost_fn"](record)
|
|
178
|
+
relevance = min(base + kw_score + boost, 1.0)
|
|
179
|
+
|
|
180
|
+
# Calculate age in days
|
|
181
|
+
age_days = 0.0
|
|
182
|
+
created = record.get("created_at") or record.get("created") or ""
|
|
183
|
+
if created:
|
|
184
|
+
try:
|
|
185
|
+
dt = datetime.fromisoformat(created.replace("Z", "+00:00"))
|
|
186
|
+
age_days = (now - dt).days
|
|
187
|
+
except Exception:
|
|
188
|
+
pass # fail open: age_days defaults to 0
|
|
189
|
+
|
|
190
|
+
items.append(ContextItem(
|
|
191
|
+
id=record.get("id", record.get("name", "")),
|
|
192
|
+
source=config["label"],
|
|
193
|
+
title=title,
|
|
194
|
+
summary=summary,
|
|
195
|
+
excerpt=summary,
|
|
196
|
+
relevance=relevance,
|
|
197
|
+
age_days=age_days,
|
|
198
|
+
metadata={
|
|
199
|
+
"domain": config["domain_name"],
|
|
200
|
+
"semantic_score": relevance,
|
|
201
|
+
},
|
|
202
|
+
))
|
|
203
|
+
|
|
204
|
+
# Sort by relevance descending
|
|
205
|
+
items.sort(key=lambda x: x.relevance, reverse=True)
|
|
206
|
+
return items
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Event log adapter for wicked-smaht context assembly.
|
|
3
|
+
|
|
4
|
+
Queries the unified event log (events.db) for recent cross-domain activity
|
|
5
|
+
relevant to the current prompt. Surfaces crew phase transitions, jam decisions,
|
|
6
|
+
native task changes, and other domain events alongside traditional context sources.
|
|
7
|
+
|
|
8
|
+
This adapter complements brain_adapter (which queries memories) by providing
|
|
9
|
+
the broader activity timeline that memories alone don't capture.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import json
|
|
13
|
+
import sys
|
|
14
|
+
from datetime import datetime, timezone
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
from typing import List
|
|
17
|
+
|
|
18
|
+
from . import ContextItem, _SCRIPTS_ROOT, run_in_thread
|
|
19
|
+
|
|
20
|
+
if str(_SCRIPTS_ROOT) not in sys.path:
|
|
21
|
+
sys.path.insert(0, str(_SCRIPTS_ROOT))
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
_STOP_WORDS = frozenset({
|
|
25
|
+
"the", "a", "an", "is", "are", "was", "were", "be", "been", "have", "has",
|
|
26
|
+
"had", "do", "does", "did", "will", "would", "could", "should", "can",
|
|
27
|
+
"may", "might", "must", "i", "you", "we", "they", "me", "my", "your",
|
|
28
|
+
"this", "that", "these", "those", "what", "which", "who", "how", "why",
|
|
29
|
+
"when", "where", "and", "or", "but", "if", "for", "of", "to", "from",
|
|
30
|
+
"in", "on", "at", "by", "with", "about", "not", "so", "just", "also",
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
# Action patterns that indicate high-value events for context
|
|
34
|
+
_HIGH_VALUE_ACTIONS = {
|
|
35
|
+
"phases.": 0.3, # Crew phase transitions
|
|
36
|
+
"projects.created": 0.25,
|
|
37
|
+
"sessions.created": 0.2, # Jam sessions
|
|
38
|
+
"memories.created": 0.15,
|
|
39
|
+
"tasks.": 0.1, # Native task changes (base; event_type may boost further)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
# Event type boosts (for native task events carrying event_type in metadata)
|
|
43
|
+
_EVENT_TYPE_BOOSTS = {
|
|
44
|
+
"gate-finding": 0.4,
|
|
45
|
+
"phase-transition": 0.35,
|
|
46
|
+
"procedure-trigger": 0.3,
|
|
47
|
+
"coding-task": 0.2,
|
|
48
|
+
"subtask": 0.15,
|
|
49
|
+
"task": 0.0, # regular tasks get no extra boost
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def _extract_keywords(prompt: str) -> str:
|
|
54
|
+
words = prompt.lower().split()
|
|
55
|
+
keywords = [w for w in words if w not in _STOP_WORDS and len(w) > 2]
|
|
56
|
+
return " ".join(keywords[:6]) if keywords else ""
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def _query_events(prompt: str) -> list:
|
|
60
|
+
"""Query EventStore for relevant events. Runs in thread pool."""
|
|
61
|
+
try:
|
|
62
|
+
from _event_store import EventStore
|
|
63
|
+
EventStore.ensure_schema()
|
|
64
|
+
|
|
65
|
+
results = []
|
|
66
|
+
|
|
67
|
+
# Strategy 1: FTS search with prompt keywords
|
|
68
|
+
keywords = _extract_keywords(prompt)
|
|
69
|
+
if keywords:
|
|
70
|
+
fts_results = EventStore.query(fts=keywords, since="30d", limit=10)
|
|
71
|
+
results.extend(fts_results)
|
|
72
|
+
|
|
73
|
+
# Strategy 2: Recent high-value events (last 7 days)
|
|
74
|
+
recent = EventStore.query(since="7d", limit=20)
|
|
75
|
+
seen_ids = {r.get("event_id") for r in results}
|
|
76
|
+
for event in recent:
|
|
77
|
+
if event.get("event_id") not in seen_ids:
|
|
78
|
+
results.append(event)
|
|
79
|
+
|
|
80
|
+
return results[:15] # Cap total
|
|
81
|
+
|
|
82
|
+
except Exception:
|
|
83
|
+
return []
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def _action_boost(action: str) -> float:
|
|
87
|
+
"""Score boost based on action type."""
|
|
88
|
+
for prefix, boost in _HIGH_VALUE_ACTIONS.items():
|
|
89
|
+
if action.startswith(prefix):
|
|
90
|
+
return boost
|
|
91
|
+
return 0.0
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def _chain_boost(payload_dict: dict, active_chain_id: "str | None") -> float:
|
|
95
|
+
"""Score boost when event belongs to the active chain.
|
|
96
|
+
|
|
97
|
+
Chain-matched events score 0.65 base boost (combined with 0.15 base → 0.8 total).
|
|
98
|
+
Partial chain prefix match (parent chain) scores 0.45.
|
|
99
|
+
No chain match: 0.0.
|
|
100
|
+
"""
|
|
101
|
+
if not active_chain_id:
|
|
102
|
+
return 0.0
|
|
103
|
+
event_chain = payload_dict.get("chain_id", "")
|
|
104
|
+
if not event_chain:
|
|
105
|
+
return 0.0
|
|
106
|
+
if event_chain == active_chain_id:
|
|
107
|
+
return 0.65
|
|
108
|
+
# Parent chain match: active is a.b.c, event is a.b → partial match
|
|
109
|
+
if active_chain_id.startswith(event_chain + "."):
|
|
110
|
+
return 0.45
|
|
111
|
+
# Child chain match: active is a.b, event is a.b.c → also relevant
|
|
112
|
+
if event_chain.startswith(active_chain_id + "."):
|
|
113
|
+
return 0.50
|
|
114
|
+
return 0.0
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def _get_active_chain_id() -> "str | None":
|
|
118
|
+
"""Read active chain_id from session state."""
|
|
119
|
+
try:
|
|
120
|
+
from _session import SessionState
|
|
121
|
+
state = SessionState.load()
|
|
122
|
+
return getattr(state, "active_chain_id", None)
|
|
123
|
+
except Exception:
|
|
124
|
+
return None
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def _age_days(ts_str: str) -> float:
|
|
128
|
+
"""Calculate age in days from ISO timestamp."""
|
|
129
|
+
try:
|
|
130
|
+
event_time = datetime.fromisoformat(ts_str.replace("Z", "+00:00"))
|
|
131
|
+
delta = datetime.now(timezone.utc) - event_time
|
|
132
|
+
return max(delta.total_seconds() / 86400, 0.0)
|
|
133
|
+
except Exception:
|
|
134
|
+
return 30.0 # Default to old if unparseable
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
async def query(prompt: str) -> List[ContextItem]:
|
|
138
|
+
"""Query unified event log for cross-domain activity relevant to prompt.
|
|
139
|
+
|
|
140
|
+
Returns ContextItems tagged with source="events" so the context assembler
|
|
141
|
+
can distinguish event-sourced context from memory or domain-sourced context.
|
|
142
|
+
"""
|
|
143
|
+
events = await run_in_thread(_query_events, prompt)
|
|
144
|
+
if not events:
|
|
145
|
+
return []
|
|
146
|
+
|
|
147
|
+
active_chain_id = await run_in_thread(_get_active_chain_id)
|
|
148
|
+
|
|
149
|
+
items: list[ContextItem] = []
|
|
150
|
+
prompt_lower = prompt.lower()
|
|
151
|
+
|
|
152
|
+
for event in events:
|
|
153
|
+
domain = event.get("domain", "unknown")
|
|
154
|
+
action = event.get("action", "unknown")
|
|
155
|
+
record_id = event.get("record_id", "")
|
|
156
|
+
ts = event.get("ts", "")
|
|
157
|
+
payload = event.get("payload", "")
|
|
158
|
+
project_id = event.get("project_id", "")
|
|
159
|
+
|
|
160
|
+
# Parse payload if it's a JSON string
|
|
161
|
+
payload_dict: dict = {}
|
|
162
|
+
if payload and isinstance(payload, str):
|
|
163
|
+
try:
|
|
164
|
+
payload_dict = json.loads(payload)
|
|
165
|
+
except Exception:
|
|
166
|
+
pass # fail open
|
|
167
|
+
|
|
168
|
+
# Build title and summary
|
|
169
|
+
title = f"{domain}.{action}"
|
|
170
|
+
summary_parts = []
|
|
171
|
+
|
|
172
|
+
if action == "tasks.created":
|
|
173
|
+
task_name = payload_dict.get("name", "").strip()
|
|
174
|
+
if not task_name:
|
|
175
|
+
continue # skip bare UUID entries — no meaningful name
|
|
176
|
+
title = f"{domain}.{action}: {task_name}"
|
|
177
|
+
summary_parts.append(task_name)
|
|
178
|
+
else:
|
|
179
|
+
if record_id:
|
|
180
|
+
summary_parts.append(record_id)
|
|
181
|
+
if project_id:
|
|
182
|
+
summary_parts.append(f"project: {project_id}")
|
|
183
|
+
if payload and isinstance(payload, str) and len(payload) < 200:
|
|
184
|
+
summary_parts.append(payload)
|
|
185
|
+
|
|
186
|
+
summary = " | ".join(summary_parts) if summary_parts else action
|
|
187
|
+
|
|
188
|
+
# Score: base + action boost + event_type boost + keyword match + recency + chain
|
|
189
|
+
base = 0.15
|
|
190
|
+
action_score = _action_boost(action)
|
|
191
|
+
event_type_val = payload_dict.get("event_type", "task")
|
|
192
|
+
event_type_score = _EVENT_TYPE_BOOSTS.get(event_type_val, 0.0)
|
|
193
|
+
keyword_score = 0.0
|
|
194
|
+
search_text = f"{title} {summary} {record_id} {project_id}".lower()
|
|
195
|
+
for word in prompt_lower.split():
|
|
196
|
+
if len(word) > 2 and word in search_text:
|
|
197
|
+
keyword_score += 0.1
|
|
198
|
+
|
|
199
|
+
age = _age_days(ts)
|
|
200
|
+
recency_boost = max(0.0, 0.15 - (age / 30) * 0.15) # 0.15 for today, 0 for 30d ago
|
|
201
|
+
|
|
202
|
+
chain_score = _chain_boost(payload_dict, active_chain_id)
|
|
203
|
+
relevance = min(
|
|
204
|
+
base + action_score + event_type_score + keyword_score + recency_boost + chain_score,
|
|
205
|
+
1.0,
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
items.append(ContextItem(
|
|
209
|
+
id=event.get("event_id", ""),
|
|
210
|
+
source="events",
|
|
211
|
+
title=title,
|
|
212
|
+
summary=summary,
|
|
213
|
+
excerpt=(
|
|
214
|
+
f"[{ts[:10]}] {title}"
|
|
215
|
+
if action == "tasks.created"
|
|
216
|
+
else (f"[{ts[:10]}] {title}: {record_id}" if record_id else f"[{ts[:10]}] {title}")
|
|
217
|
+
),
|
|
218
|
+
relevance=relevance,
|
|
219
|
+
age_days=age,
|
|
220
|
+
metadata={
|
|
221
|
+
"domain": domain,
|
|
222
|
+
"action": action,
|
|
223
|
+
"project_id": project_id,
|
|
224
|
+
"event_ts": ts,
|
|
225
|
+
"chain_id": payload_dict.get("chain_id", ""),
|
|
226
|
+
},
|
|
227
|
+
))
|
|
228
|
+
|
|
229
|
+
# Sort by relevance descending
|
|
230
|
+
items.sort(key=lambda x: x.relevance, reverse=True)
|
|
231
|
+
return items[:10]
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"""Tools adapter — surfaces available third-party CLIs for context assembly."""
|
|
2
|
+
import subprocess
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def _check_cli(name):
|
|
6
|
+
"""Check if a CLI tool is available."""
|
|
7
|
+
try:
|
|
8
|
+
result = subprocess.run(
|
|
9
|
+
["which", name], capture_output=True, text=True, timeout=2
|
|
10
|
+
)
|
|
11
|
+
return result.returncode == 0
|
|
12
|
+
except Exception:
|
|
13
|
+
return False
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
# Known third-party CLIs that wicked-garden skills orchestrate
|
|
17
|
+
KNOWN_CLIS = {
|
|
18
|
+
"codex": {"skill": "wicked-garden:jam:council", "desc": "OpenAI Codex for code review and generation"},
|
|
19
|
+
"gemini": {"skill": "wicked-garden:jam:council", "desc": "Google Gemini for multi-modal AI tasks"},
|
|
20
|
+
"copilot": {"skill": "wicked-garden:jam:council", "desc": "GitHub Copilot CLI for AI-assisted coding"},
|
|
21
|
+
"opencode": {"skill": "wicked-garden:jam:council", "desc": "OpenCode for AI-assisted coding"},
|
|
22
|
+
"agent-browser": {"skill": "wicked-garden:agent-browser", "desc": "Browser automation and scraping"},
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
async def query(prompt: str, **kwargs) -> list:
|
|
27
|
+
"""Return available CLI tools that could help with the current task."""
|
|
28
|
+
from dataclasses import dataclass
|
|
29
|
+
|
|
30
|
+
@dataclass
|
|
31
|
+
class ContextItem:
|
|
32
|
+
source: str
|
|
33
|
+
title: str
|
|
34
|
+
summary: str
|
|
35
|
+
|
|
36
|
+
results = []
|
|
37
|
+
available = []
|
|
38
|
+
|
|
39
|
+
for cli_name, info in KNOWN_CLIS.items():
|
|
40
|
+
if _check_cli(cli_name):
|
|
41
|
+
available.append(
|
|
42
|
+
ContextItem(
|
|
43
|
+
source="tools",
|
|
44
|
+
title=f"{cli_name} available",
|
|
45
|
+
summary=f"{info['desc']} — Use /{info['skill']}"
|
|
46
|
+
)
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
return available
|