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,125 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""codegraph_db.py — adapt codegraph's SQLite into the symbol-graph DB wicked-patch
|
|
3
|
+
expects (the `--db`).
|
|
4
|
+
|
|
5
|
+
This is the payoff of ADR 0001: codegraph builds a column-precise, multi-language
|
|
6
|
+
symbol+edge graph; wicked-patch needs a `--db` with a `symbols` table + reference
|
|
7
|
+
tables for cross-file refactor (rename/add-field/remove). Nothing produced that
|
|
8
|
+
`--db` before, so the patch family was dead-on-arrival. This translates
|
|
9
|
+
codegraph's `nodes`/`edges` into the schema `PropagationEngine` + `_resolve_symbol_id`
|
|
10
|
+
read, reviving the family without changing patch's engine.
|
|
11
|
+
|
|
12
|
+
Mapping (codegraph → patch):
|
|
13
|
+
nodes(id,name,kind,file_path,start_line,end_line,metadata)
|
|
14
|
+
-> symbols(id,name,type,file_path,line_start,line_end,metadata,layer)
|
|
15
|
+
edges(source,target,kind):
|
|
16
|
+
kind='references' -> symbol_refs(source_id,target_id,ref_type) + refs
|
|
17
|
+
kind='calls' -> symbol_calls(symbol_id,target_id) + refs
|
|
18
|
+
kind='imports' -> symbol_imports(symbol_id,target_id) + refs
|
|
19
|
+
(all) -> refs(source_id,target_id,ref_type,confidence)
|
|
20
|
+
+ metadata(key,value) with indexed_at (safety.py freshness check)
|
|
21
|
+
|
|
22
|
+
Stdlib-only. Deterministic. Rebuilds the patch DB from scratch each run.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
from __future__ import annotations
|
|
26
|
+
|
|
27
|
+
import json
|
|
28
|
+
import sqlite3
|
|
29
|
+
import sys
|
|
30
|
+
from datetime import datetime, timezone
|
|
31
|
+
from pathlib import Path
|
|
32
|
+
from typing import Dict
|
|
33
|
+
|
|
34
|
+
# codegraph edge kind -> (patch reference table, columns)
|
|
35
|
+
_EDGE_TABLE = {
|
|
36
|
+
"references": ("symbol_refs", ("source_id", "target_id", "ref_type")),
|
|
37
|
+
"calls": ("symbol_calls", ("symbol_id", "target_id")),
|
|
38
|
+
"imports": ("symbol_imports", ("symbol_id", "target_id")),
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def build_patch_db(codegraph_db: Path, out_db: Path) -> Dict[str, int]:
|
|
43
|
+
"""Translate a codegraph SQLite into a patch-compatible symbol-graph DB.
|
|
44
|
+
Returns counts. Rebuilds out_db from scratch (idempotent)."""
|
|
45
|
+
if not Path(codegraph_db).exists():
|
|
46
|
+
raise FileNotFoundError(f"codegraph db not found: {codegraph_db}; run `codegraph index` first")
|
|
47
|
+
src = sqlite3.connect(f"file:{codegraph_db}?mode=ro", uri=True)
|
|
48
|
+
src.row_factory = sqlite3.Row
|
|
49
|
+
if Path(out_db).exists():
|
|
50
|
+
Path(out_db).unlink()
|
|
51
|
+
dst = sqlite3.connect(str(out_db))
|
|
52
|
+
try:
|
|
53
|
+
dst.executescript(
|
|
54
|
+
"""
|
|
55
|
+
CREATE TABLE symbols (
|
|
56
|
+
id TEXT PRIMARY KEY, name TEXT, type TEXT, file_path TEXT,
|
|
57
|
+
line_start INTEGER, line_end INTEGER, metadata TEXT, layer TEXT
|
|
58
|
+
);
|
|
59
|
+
CREATE TABLE refs (source_id TEXT, target_id TEXT, ref_type TEXT, confidence REAL);
|
|
60
|
+
CREATE TABLE symbol_refs (source_id TEXT, target_id TEXT, ref_type TEXT);
|
|
61
|
+
CREATE TABLE symbol_calls (symbol_id TEXT, target_id TEXT);
|
|
62
|
+
CREATE TABLE symbol_imports (symbol_id TEXT, target_id TEXT);
|
|
63
|
+
CREATE TABLE metadata (key TEXT PRIMARY KEY, value TEXT);
|
|
64
|
+
CREATE INDEX idx_symbols_name ON symbols(name);
|
|
65
|
+
CREATE INDEX idx_symbols_file ON symbols(file_path);
|
|
66
|
+
CREATE INDEX idx_refs_target ON refs(target_id);
|
|
67
|
+
"""
|
|
68
|
+
)
|
|
69
|
+
counts = {"symbols": 0, "refs": 0, "symbol_refs": 0, "symbol_calls": 0, "symbol_imports": 0}
|
|
70
|
+
# codegraph nodes carry no `metadata` column. PropagationEngine does
|
|
71
|
+
# json.loads(metadata) so it MUST be a JSON object (or NULL -> "{}").
|
|
72
|
+
# Pack the useful codegraph fields (signature) as JSON. layer has no
|
|
73
|
+
# codegraph equivalent -> NULL.
|
|
74
|
+
for r in src.execute(
|
|
75
|
+
"SELECT id, name, kind, file_path, start_line, end_line, signature FROM nodes"
|
|
76
|
+
):
|
|
77
|
+
meta = json.dumps({"signature": r["signature"]}) if r["signature"] else None
|
|
78
|
+
dst.execute(
|
|
79
|
+
"INSERT OR IGNORE INTO symbols (id,name,type,file_path,line_start,line_end,metadata,layer)"
|
|
80
|
+
" VALUES (?,?,?,?,?,?,?,?)",
|
|
81
|
+
(r["id"], r["name"], r["kind"], r["file_path"],
|
|
82
|
+
r["start_line"], r["end_line"], meta, None),
|
|
83
|
+
)
|
|
84
|
+
counts["symbols"] += 1
|
|
85
|
+
for e in src.execute("SELECT source, target, kind FROM edges"):
|
|
86
|
+
s, t, k = e["source"], e["target"], e["kind"]
|
|
87
|
+
dst.execute("INSERT INTO refs (source_id,target_id,ref_type,confidence) VALUES (?,?,?,?)",
|
|
88
|
+
(s, t, k, 1.0))
|
|
89
|
+
counts["refs"] += 1
|
|
90
|
+
spec = _EDGE_TABLE.get(k)
|
|
91
|
+
if spec:
|
|
92
|
+
table, cols = spec
|
|
93
|
+
dst.execute(f"INSERT INTO {table} ({','.join(cols)}) VALUES ({','.join('?' * len(cols))})",
|
|
94
|
+
(s, t, k) if len(cols) == 3 else (s, t))
|
|
95
|
+
counts[table] += 1
|
|
96
|
+
dst.execute("INSERT INTO metadata (key,value) VALUES ('indexed_at', ?)",
|
|
97
|
+
(datetime.now(timezone.utc).isoformat(),))
|
|
98
|
+
dst.execute("INSERT INTO metadata (key,value) VALUES ('source', 'codegraph')")
|
|
99
|
+
dst.commit()
|
|
100
|
+
return counts
|
|
101
|
+
finally:
|
|
102
|
+
src.close()
|
|
103
|
+
dst.close()
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def main() -> int:
|
|
107
|
+
import argparse
|
|
108
|
+
p = argparse.ArgumentParser(description="Build a wicked-patch --db from codegraph's SQLite.")
|
|
109
|
+
p.add_argument("--codegraph-db", default=".codegraph/codegraph.db")
|
|
110
|
+
p.add_argument("--out", default=".wicked/patch-symbols.db")
|
|
111
|
+
a = p.parse_args()
|
|
112
|
+
out = Path(a.out)
|
|
113
|
+
out.parent.mkdir(parents=True, exist_ok=True)
|
|
114
|
+
try:
|
|
115
|
+
counts = build_patch_db(Path(a.codegraph_db), out)
|
|
116
|
+
except FileNotFoundError as e:
|
|
117
|
+
print(str(e), file=sys.stderr)
|
|
118
|
+
return 1
|
|
119
|
+
import json
|
|
120
|
+
print(json.dumps({"out": str(out), **counts}, indent=2))
|
|
121
|
+
return 0
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
if __name__ == "__main__":
|
|
125
|
+
sys.exit(main())
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Code generators for wicked-patch.
|
|
3
|
+
|
|
4
|
+
Generators are the code-production side of the patch pipeline:
|
|
5
|
+
- Input: change spec + affected symbols
|
|
6
|
+
- Output: concrete patches per file
|
|
7
|
+
|
|
8
|
+
Uses the symbol graph (from --db or wicked-brain once available) to
|
|
9
|
+
propagate changes across all affected files automatically.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from .base import (
|
|
13
|
+
BaseGenerator,
|
|
14
|
+
GeneratorRegistry,
|
|
15
|
+
register_generator,
|
|
16
|
+
ChangeSpec,
|
|
17
|
+
ChangeType,
|
|
18
|
+
FieldSpec,
|
|
19
|
+
Patch,
|
|
20
|
+
PatchSet,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
# Import generators to register them
|
|
24
|
+
from . import java_generator
|
|
25
|
+
from . import jsp_generator
|
|
26
|
+
from . import python_generator
|
|
27
|
+
from . import typescript_generator
|
|
28
|
+
from . import sql_generator
|
|
29
|
+
from . import go_generator
|
|
30
|
+
from . import csharp_generator
|
|
31
|
+
from . import ruby_generator
|
|
32
|
+
from . import kotlin_generator
|
|
33
|
+
from . import rust_generator
|
|
34
|
+
from . import php_generator
|
|
35
|
+
from . import perl_generator
|
|
36
|
+
|
|
37
|
+
# Import propagation engine
|
|
38
|
+
from .propagation_engine import PropagationEngine, PropagationPlan, AffectedSymbol
|
|
39
|
+
|
|
40
|
+
__all__ = [
|
|
41
|
+
# Base classes
|
|
42
|
+
"BaseGenerator",
|
|
43
|
+
"GeneratorRegistry",
|
|
44
|
+
"register_generator",
|
|
45
|
+
# Change specifications
|
|
46
|
+
"ChangeSpec",
|
|
47
|
+
"ChangeType",
|
|
48
|
+
"FieldSpec",
|
|
49
|
+
# Patch handling
|
|
50
|
+
"Patch",
|
|
51
|
+
"PatchSet",
|
|
52
|
+
# Propagation
|
|
53
|
+
"PropagationEngine",
|
|
54
|
+
"PropagationPlan",
|
|
55
|
+
"AffectedSymbol",
|
|
56
|
+
]
|
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Base generator interface and registry for language-agnostic code generation.
|
|
3
|
+
|
|
4
|
+
Generators are the symmetric counterpart to adapters. While adapters extract
|
|
5
|
+
symbols from code, generators create patches to modify code based on change
|
|
6
|
+
specifications and the symbol graph.
|
|
7
|
+
|
|
8
|
+
Architecture:
|
|
9
|
+
ChangeSpec -> Generator.generate() -> Patch/PatchSet
|
|
10
|
+
|
|
11
|
+
The propagation engine uses lineage paths to coordinate generators:
|
|
12
|
+
1. User specifies a change to a symbol (e.g., add field to entity)
|
|
13
|
+
2. Lineage tracer finds all dependent symbols
|
|
14
|
+
3. For each affected file, the appropriate generator creates patches
|
|
15
|
+
4. All patches are returned as a PatchSet for review/application
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from abc import ABC, abstractmethod
|
|
19
|
+
from dataclasses import dataclass, field
|
|
20
|
+
from enum import Enum
|
|
21
|
+
from pathlib import Path
|
|
22
|
+
from typing import Any, Dict, List, Optional, Set, Type, Union
|
|
23
|
+
import logging
|
|
24
|
+
import threading
|
|
25
|
+
|
|
26
|
+
logger = logging.getLogger(__name__)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class ChangeType(str, Enum):
|
|
30
|
+
"""Types of changes that can be propagated."""
|
|
31
|
+
ADD_FIELD = "add_field" # Add a field to an entity/class
|
|
32
|
+
REMOVE_FIELD = "remove_field" # Remove a field
|
|
33
|
+
RENAME_FIELD = "rename_field" # Rename a field
|
|
34
|
+
MODIFY_FIELD = "modify_field" # Change field type or attributes
|
|
35
|
+
ADD_VALIDATION = "add_validation" # Add validation logic
|
|
36
|
+
ADD_COLUMN = "add_column" # Add database column
|
|
37
|
+
RENAME_COLUMN = "rename_column" # Rename database column
|
|
38
|
+
ADD_UI_BINDING = "add_ui_binding" # Add UI binding for field
|
|
39
|
+
UPDATE_UI_BINDING = "update_ui_binding" # Update existing UI binding
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
@dataclass
|
|
43
|
+
class FieldSpec:
|
|
44
|
+
"""Specification for a field/property."""
|
|
45
|
+
name: str
|
|
46
|
+
type: str # Language-agnostic type hint
|
|
47
|
+
nullable: bool = True
|
|
48
|
+
default: Optional[str] = None
|
|
49
|
+
validation: Optional[Dict[str, Any]] = None # e.g., {"min": 0, "max": 100}
|
|
50
|
+
annotations: List[str] = field(default_factory=list)
|
|
51
|
+
column_name: Optional[str] = None # Database column name if different
|
|
52
|
+
label: Optional[str] = None # UI label
|
|
53
|
+
description: Optional[str] = None
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
@dataclass
|
|
57
|
+
class ChangeSpec:
|
|
58
|
+
"""
|
|
59
|
+
Specification for a change to propagate.
|
|
60
|
+
|
|
61
|
+
This is language-agnostic - the generator translates it to
|
|
62
|
+
language-specific code modifications.
|
|
63
|
+
"""
|
|
64
|
+
change_type: ChangeType
|
|
65
|
+
target_symbol_id: str # Symbol being modified
|
|
66
|
+
field_spec: Optional[FieldSpec] = None # For add/modify field
|
|
67
|
+
old_name: Optional[str] = None # For rename operations
|
|
68
|
+
new_name: Optional[str] = None # For rename operations
|
|
69
|
+
metadata: Dict[str, Any] = field(default_factory=dict)
|
|
70
|
+
|
|
71
|
+
def __post_init__(self):
|
|
72
|
+
if isinstance(self.change_type, str):
|
|
73
|
+
self.change_type = ChangeType(self.change_type)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
@dataclass
|
|
77
|
+
class Patch:
|
|
78
|
+
"""
|
|
79
|
+
A single code modification.
|
|
80
|
+
|
|
81
|
+
Patches are expressed as line-based edits to maintain
|
|
82
|
+
readability and allow for conflict detection.
|
|
83
|
+
"""
|
|
84
|
+
file_path: str
|
|
85
|
+
line_start: int # 1-based line number
|
|
86
|
+
line_end: int # Inclusive end line
|
|
87
|
+
old_content: str # Original lines (for verification)
|
|
88
|
+
new_content: str # Replacement content
|
|
89
|
+
description: str # Human-readable description
|
|
90
|
+
symbol_id: Optional[str] = None # Related symbol
|
|
91
|
+
confidence: str = "high" # high/medium/low
|
|
92
|
+
|
|
93
|
+
@property
|
|
94
|
+
def is_insert(self) -> bool:
|
|
95
|
+
"""True if this is an insertion (no lines replaced)."""
|
|
96
|
+
return self.line_start > self.line_end
|
|
97
|
+
|
|
98
|
+
@property
|
|
99
|
+
def is_delete(self) -> bool:
|
|
100
|
+
"""True if this is a deletion (empty new content)."""
|
|
101
|
+
return not self.new_content.strip()
|
|
102
|
+
|
|
103
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
104
|
+
return {
|
|
105
|
+
"file": self.file_path,
|
|
106
|
+
"line_start": self.line_start,
|
|
107
|
+
"line_end": self.line_end,
|
|
108
|
+
"old": self.old_content,
|
|
109
|
+
"new": self.new_content,
|
|
110
|
+
"description": self.description,
|
|
111
|
+
"symbol_id": self.symbol_id,
|
|
112
|
+
"confidence": self.confidence,
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
def to_unified_diff(self) -> str:
|
|
116
|
+
"""Generate unified diff format."""
|
|
117
|
+
from difflib import unified_diff
|
|
118
|
+
old_lines = self.old_content.splitlines(keepends=True)
|
|
119
|
+
new_lines = self.new_content.splitlines(keepends=True)
|
|
120
|
+
diff = unified_diff(
|
|
121
|
+
old_lines, new_lines,
|
|
122
|
+
fromfile=f"a/{self.file_path}",
|
|
123
|
+
tofile=f"b/{self.file_path}",
|
|
124
|
+
lineterm=""
|
|
125
|
+
)
|
|
126
|
+
return "".join(diff)
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
@dataclass
|
|
130
|
+
class PatchSet:
|
|
131
|
+
"""
|
|
132
|
+
Collection of patches for a change propagation.
|
|
133
|
+
|
|
134
|
+
Groups patches by file and provides aggregate statistics.
|
|
135
|
+
"""
|
|
136
|
+
change_spec: ChangeSpec
|
|
137
|
+
patches: List[Patch] = field(default_factory=list)
|
|
138
|
+
errors: List[str] = field(default_factory=list)
|
|
139
|
+
warnings: List[str] = field(default_factory=list)
|
|
140
|
+
|
|
141
|
+
@property
|
|
142
|
+
def files_affected(self) -> Set[str]:
|
|
143
|
+
"""Set of files that will be modified."""
|
|
144
|
+
return {p.file_path for p in self.patches}
|
|
145
|
+
|
|
146
|
+
@property
|
|
147
|
+
def patch_count(self) -> int:
|
|
148
|
+
return len(self.patches)
|
|
149
|
+
|
|
150
|
+
@property
|
|
151
|
+
def has_errors(self) -> bool:
|
|
152
|
+
return len(self.errors) > 0
|
|
153
|
+
|
|
154
|
+
def patches_by_file(self) -> Dict[str, List[Patch]]:
|
|
155
|
+
"""Group patches by file path."""
|
|
156
|
+
by_file: Dict[str, List[Patch]] = {}
|
|
157
|
+
for patch in self.patches:
|
|
158
|
+
if patch.file_path not in by_file:
|
|
159
|
+
by_file[patch.file_path] = []
|
|
160
|
+
by_file[patch.file_path].append(patch)
|
|
161
|
+
# Sort patches within each file by line number (descending for safe application).
|
|
162
|
+
# enumerate() provides a stable secondary key so same-position patches
|
|
163
|
+
# preserve their original generation order after reversal.
|
|
164
|
+
for patches in by_file.values():
|
|
165
|
+
indexed = list(enumerate(patches))
|
|
166
|
+
indexed.sort(key=lambda t: (t[1].line_start, t[0]), reverse=True)
|
|
167
|
+
patches[:] = [p for _, p in indexed]
|
|
168
|
+
return by_file
|
|
169
|
+
|
|
170
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
171
|
+
return {
|
|
172
|
+
"change_type": self.change_spec.change_type.value,
|
|
173
|
+
"target": self.change_spec.target_symbol_id,
|
|
174
|
+
"files_affected": list(self.files_affected),
|
|
175
|
+
"patch_count": self.patch_count,
|
|
176
|
+
"patches": [p.to_dict() for p in self.patches],
|
|
177
|
+
"errors": self.errors,
|
|
178
|
+
"warnings": self.warnings,
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
def summary(self) -> str:
|
|
182
|
+
"""Human-readable summary."""
|
|
183
|
+
lines = [
|
|
184
|
+
f"Change: {self.change_spec.change_type.value}",
|
|
185
|
+
f"Target: {self.change_spec.target_symbol_id}",
|
|
186
|
+
f"Files affected: {len(self.files_affected)}",
|
|
187
|
+
f"Patches: {self.patch_count}",
|
|
188
|
+
]
|
|
189
|
+
if self.errors:
|
|
190
|
+
lines.append(f"Errors: {len(self.errors)}")
|
|
191
|
+
if self.warnings:
|
|
192
|
+
lines.append(f"Warnings: {len(self.warnings)}")
|
|
193
|
+
return "\n".join(lines)
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
class BaseGenerator(ABC):
|
|
197
|
+
"""
|
|
198
|
+
Base class for language-specific code generators.
|
|
199
|
+
|
|
200
|
+
Each generator knows how to create patches for its language
|
|
201
|
+
based on change specifications.
|
|
202
|
+
"""
|
|
203
|
+
|
|
204
|
+
# Override in subclasses
|
|
205
|
+
name: str = "base"
|
|
206
|
+
extensions: Set[str] = set() # e.g., {'.java'}
|
|
207
|
+
symbol_types: Set[str] = set() # Symbol types this generator handles
|
|
208
|
+
|
|
209
|
+
def __init__(self, db_path: Optional[Path] = None):
|
|
210
|
+
"""
|
|
211
|
+
Initialize generator.
|
|
212
|
+
|
|
213
|
+
Args:
|
|
214
|
+
db_path: Path to symbol database for context lookup
|
|
215
|
+
"""
|
|
216
|
+
self.db_path = db_path
|
|
217
|
+
self._conn = None
|
|
218
|
+
|
|
219
|
+
@abstractmethod
|
|
220
|
+
def generate(
|
|
221
|
+
self,
|
|
222
|
+
change_spec: ChangeSpec,
|
|
223
|
+
symbol: Dict[str, Any],
|
|
224
|
+
file_content: str,
|
|
225
|
+
) -> List[Patch]:
|
|
226
|
+
"""
|
|
227
|
+
Generate patches for a change.
|
|
228
|
+
|
|
229
|
+
Args:
|
|
230
|
+
change_spec: The change to apply
|
|
231
|
+
symbol: The symbol being modified (from database)
|
|
232
|
+
file_content: Current content of the file
|
|
233
|
+
|
|
234
|
+
Returns:
|
|
235
|
+
List of patches to apply
|
|
236
|
+
"""
|
|
237
|
+
raise NotImplementedError("Subclasses must implement generate() to produce language-specific patches")
|
|
238
|
+
|
|
239
|
+
def supports_file(self, file_path: str) -> bool:
|
|
240
|
+
"""Check if this generator handles the given file type."""
|
|
241
|
+
ext = Path(file_path).suffix.lower()
|
|
242
|
+
return ext in self.extensions
|
|
243
|
+
|
|
244
|
+
def supports_symbol(self, symbol_type: str) -> bool:
|
|
245
|
+
"""Check if this generator handles the given symbol type."""
|
|
246
|
+
return symbol_type.lower() in {t.lower() for t in self.symbol_types}
|
|
247
|
+
|
|
248
|
+
def _get_indentation(self, line: str) -> str:
|
|
249
|
+
"""Extract indentation from a line."""
|
|
250
|
+
return line[:len(line) - len(line.lstrip())]
|
|
251
|
+
|
|
252
|
+
def _map_type(self, generic_type: str, language: str = None) -> str:
|
|
253
|
+
"""
|
|
254
|
+
Map a generic type to a language-specific type.
|
|
255
|
+
|
|
256
|
+
Override in subclasses for language-specific mappings.
|
|
257
|
+
"""
|
|
258
|
+
# Default mappings
|
|
259
|
+
type_map = {
|
|
260
|
+
"string": "String",
|
|
261
|
+
"int": "int",
|
|
262
|
+
"integer": "Integer",
|
|
263
|
+
"long": "Long",
|
|
264
|
+
"float": "float",
|
|
265
|
+
"double": "double",
|
|
266
|
+
"boolean": "boolean",
|
|
267
|
+
"date": "Date",
|
|
268
|
+
"datetime": "LocalDateTime",
|
|
269
|
+
"decimal": "BigDecimal",
|
|
270
|
+
}
|
|
271
|
+
return type_map.get(generic_type.lower(), generic_type)
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
# Registry for generators
|
|
275
|
+
_GENERATOR_REGISTRY: Dict[str, Type[BaseGenerator]] = {}
|
|
276
|
+
_instances: Dict[str, BaseGenerator] = {}
|
|
277
|
+
_lock = threading.Lock()
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
def register_generator(cls: Type[BaseGenerator]) -> Type[BaseGenerator]:
|
|
281
|
+
"""
|
|
282
|
+
Decorator to register a generator class.
|
|
283
|
+
|
|
284
|
+
Usage:
|
|
285
|
+
@register_generator
|
|
286
|
+
class JavaGenerator(BaseGenerator):
|
|
287
|
+
name = "java"
|
|
288
|
+
extensions = {'.java'}
|
|
289
|
+
...
|
|
290
|
+
"""
|
|
291
|
+
for ext in cls.extensions:
|
|
292
|
+
_GENERATOR_REGISTRY[ext] = cls
|
|
293
|
+
logger.debug(f"Registered generator {cls.name} for {ext}")
|
|
294
|
+
return cls
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
class GeneratorRegistry:
|
|
298
|
+
"""
|
|
299
|
+
Registry for code generators.
|
|
300
|
+
|
|
301
|
+
Maps file extensions and symbol types to generators.
|
|
302
|
+
Thread-safe with instance caching.
|
|
303
|
+
"""
|
|
304
|
+
|
|
305
|
+
@classmethod
|
|
306
|
+
def get_generator(
|
|
307
|
+
cls,
|
|
308
|
+
file_path: str,
|
|
309
|
+
db_path: Optional[Path] = None
|
|
310
|
+
) -> Optional[BaseGenerator]:
|
|
311
|
+
"""
|
|
312
|
+
Get generator instance for a file.
|
|
313
|
+
|
|
314
|
+
Args:
|
|
315
|
+
file_path: Path to file
|
|
316
|
+
db_path: Optional database path
|
|
317
|
+
|
|
318
|
+
Returns:
|
|
319
|
+
Generator instance or None
|
|
320
|
+
"""
|
|
321
|
+
ext = Path(file_path).suffix.lower()
|
|
322
|
+
generator_class = _GENERATOR_REGISTRY.get(ext)
|
|
323
|
+
|
|
324
|
+
if not generator_class:
|
|
325
|
+
return None
|
|
326
|
+
|
|
327
|
+
# Thread-safe cache lookup
|
|
328
|
+
cache_key = f"{generator_class.name}:{db_path}"
|
|
329
|
+
with _lock:
|
|
330
|
+
if cache_key not in _instances:
|
|
331
|
+
_instances[cache_key] = generator_class(db_path)
|
|
332
|
+
return _instances[cache_key]
|
|
333
|
+
|
|
334
|
+
@classmethod
|
|
335
|
+
def supported_extensions(cls) -> Set[str]:
|
|
336
|
+
"""Get all registered file extensions."""
|
|
337
|
+
return set(_GENERATOR_REGISTRY.keys())
|
|
338
|
+
|
|
339
|
+
@classmethod
|
|
340
|
+
def list_generators(cls) -> Dict[str, Type[BaseGenerator]]:
|
|
341
|
+
"""List all registered generators."""
|
|
342
|
+
return dict(_GENERATOR_REGISTRY)
|
|
343
|
+
|
|
344
|
+
@classmethod
|
|
345
|
+
def generate(
|
|
346
|
+
cls,
|
|
347
|
+
change_spec: ChangeSpec,
|
|
348
|
+
symbol: Dict[str, Any],
|
|
349
|
+
file_content: str,
|
|
350
|
+
file_path: str,
|
|
351
|
+
db_path: Optional[Path] = None,
|
|
352
|
+
) -> List[Patch]:
|
|
353
|
+
"""
|
|
354
|
+
Generate patches using the appropriate generator.
|
|
355
|
+
|
|
356
|
+
Args:
|
|
357
|
+
change_spec: Change specification
|
|
358
|
+
symbol: Symbol being modified
|
|
359
|
+
file_content: Current file content
|
|
360
|
+
file_path: Path to file
|
|
361
|
+
db_path: Optional database path
|
|
362
|
+
|
|
363
|
+
Returns:
|
|
364
|
+
List of patches, empty if no generator available
|
|
365
|
+
"""
|
|
366
|
+
generator = cls.get_generator(file_path, db_path)
|
|
367
|
+
if generator:
|
|
368
|
+
try:
|
|
369
|
+
return generator.generate(change_spec, symbol, file_content)
|
|
370
|
+
except Exception as e:
|
|
371
|
+
logger.warning(f"Generator {generator.name} failed: {e}")
|
|
372
|
+
return []
|
|
373
|
+
return []
|