@soleur/opencode 0.0.0-stage → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/agents.manifest.json +476 -0
- package/.claude-plugin/plugin.json +42 -0
- package/README.md +44 -2
- package/agents/community/.gitkeep +0 -0
- package/agents/engineering/cto.md +87 -0
- package/agents/engineering/design/ddd-architect.md +95 -0
- package/agents/engineering/discovery/agent-finder.md +214 -0
- package/agents/engineering/discovery/functional-discovery.md +182 -0
- package/agents/engineering/infra/infra-security.md +151 -0
- package/agents/engineering/infra/platform-strategist.md +109 -0
- package/agents/engineering/infra/terraform-architect.md +171 -0
- package/agents/engineering/prompt-engineer.md +37 -0
- package/agents/engineering/research/best-practices-researcher.md +115 -0
- package/agents/engineering/research/framework-docs-researcher.md +93 -0
- package/agents/engineering/research/git-history-analyzer.md +53 -0
- package/agents/engineering/research/learnings-researcher.md +285 -0
- package/agents/engineering/research/repo-research-analyst.md +118 -0
- package/agents/engineering/review/agent-native-reviewer.md +279 -0
- package/agents/engineering/review/architecture-strategist.md +61 -0
- package/agents/engineering/review/code-quality-analyst.md +92 -0
- package/agents/engineering/review/code-simplicity-reviewer.md +109 -0
- package/agents/engineering/review/data-integrity-guardian.md +82 -0
- package/agents/engineering/review/data-migration-expert.md +98 -0
- package/agents/engineering/review/deployment-verification-agent.md +183 -0
- package/agents/engineering/review/dhh-rails-reviewer.md +46 -0
- package/agents/engineering/review/kieran-rails-reviewer.md +87 -0
- package/agents/engineering/review/legacy-code-expert.md +55 -0
- package/agents/engineering/review/observability-coverage-reviewer.md +147 -0
- package/agents/engineering/review/pattern-recognition-specialist.md +59 -0
- package/agents/engineering/review/performance-oracle.md +130 -0
- package/agents/engineering/review/security-sentinel.md +167 -0
- package/agents/engineering/review/semgrep-sast.md +36 -0
- package/agents/engineering/review/test-design-reviewer.md +150 -0
- package/agents/engineering/review/user-impact-reviewer.md +70 -0
- package/agents/engineering/workflow/pr-comment-resolver.md +69 -0
- package/agents/finance/budget-analyst.md +29 -0
- package/agents/finance/cfo.md +44 -0
- package/agents/finance/financial-reporter.md +30 -0
- package/agents/finance/revenue-analyst.md +30 -0
- package/agents/legal/clo.md +115 -0
- package/agents/legal/legal-compliance-auditor.md +110 -0
- package/agents/legal/legal-document-generator.md +134 -0
- package/agents/marketing/analytics-analyst.md +25 -0
- package/agents/marketing/brand-architect.md +181 -0
- package/agents/marketing/cmo.md +76 -0
- package/agents/marketing/conversion-optimizer.md +19 -0
- package/agents/marketing/copywriter.md +20 -0
- package/agents/marketing/fact-checker.md +70 -0
- package/agents/marketing/growth-strategist.md +145 -0
- package/agents/marketing/paid-media-strategist.md +28 -0
- package/agents/marketing/pricing-strategist.md +17 -0
- package/agents/marketing/programmatic-seo-specialist.md +25 -0
- package/agents/marketing/retention-strategist.md +23 -0
- package/agents/marketing/seo-aeo-analyst.md +164 -0
- package/agents/operations/coo.md +50 -0
- package/agents/operations/ops-advisor.md +78 -0
- package/agents/operations/ops-provisioner.md +101 -0
- package/agents/operations/ops-research.md +52 -0
- package/agents/operations/service-automator.md +278 -0
- package/agents/product/business-validator.md +206 -0
- package/agents/product/competitive-intelligence.md +89 -0
- package/agents/product/cpo.md +63 -0
- package/agents/product/design/ux-design-lead.md +209 -0
- package/agents/product/spec-flow-analyzer.md +122 -0
- package/agents/sales/cro.md +44 -0
- package/agents/sales/deal-architect.md +29 -0
- package/agents/sales/outbound-strategist.md +29 -0
- package/agents/sales/pipeline-analyst.md +29 -0
- package/agents/support/cco.md +48 -0
- package/agents/support/community-manager.md +570 -0
- package/agents/support/ticket-triage.md +70 -0
- package/bin/soleur-opencode.js +29 -0
- package/commands/go.md +659 -0
- package/commands/help.md +273 -0
- package/commands/sync.md +977 -0
- package/commands/version.md +103 -0
- package/hooks/antigravity-hooks.json +84 -0
- package/hooks/antigravity-session-start.sh +15 -0
- package/hooks/bare-root-cwd-guard.sh +131 -0
- package/hooks/browser-snapshot-credential-guard.sh +200 -0
- package/hooks/codex-session-start.sh +9 -0
- package/hooks/compaction-state.sh +525 -0
- package/hooks/destructive-command-guard.sh +1387 -0
- package/hooks/devin-session-start.sh +90 -0
- package/hooks/ext-filter-detect.sh +171 -0
- package/hooks/hooks.json +133 -0
- package/hooks/lib/hook-tool-kind.sh +24 -0
- package/hooks/lib/log-rotation.sh +176 -0
- package/hooks/lib/shell-argv.pl +576 -0
- package/hooks/memory-backstop.sh +1114 -0
- package/hooks/operator-stage-approval.sh +391 -0
- package/hooks/stop-hook.sh +367 -0
- package/hooks/unkept-promise-hook.sh +383 -0
- package/hooks/version-banner.sh +127 -0
- package/hooks/welcome-hook.sh +50 -0
- package/install.js +108 -0
- package/lib/agent-registry.ts +154 -0
- package/lib/c4-canonical-cli.mjs +34 -0
- package/lib/c4-canonical.mjs +46 -0
- package/lib/c4-from-components.ts +554 -0
- package/lib/go-routing.ts +81 -0
- package/lib/grok-inspect-contract.ts +311 -0
- package/lib/harness-model-map.ts +101 -0
- package/lib/harness-parity.ts +726 -0
- package/lib/harness-tool-map.ts +180 -0
- package/lib/harness.ts +716 -0
- package/lib/heartbeat-live-reconcile.ts +1153 -0
- package/lib/heartbeat-manifest.ts +342 -0
- package/lib/kb-coverage.ts +252 -0
- package/lib/pr-merge-poll.ts +103 -0
- package/lib/workflow-fidelity.ts +388 -0
- package/opencode/INSTRUCTIONS.md +152 -0
- package/opencode/agents/engineering/cto.md +10 -0
- package/opencode/agents/engineering/design/ddd-architect.md +10 -0
- package/opencode/agents/engineering/discovery/agent-finder.md +10 -0
- package/opencode/agents/engineering/discovery/functional-discovery.md +10 -0
- package/opencode/agents/engineering/infra/infra-security.md +10 -0
- package/opencode/agents/engineering/infra/platform-strategist.md +10 -0
- package/opencode/agents/engineering/infra/terraform-architect.md +10 -0
- package/opencode/agents/engineering/prompt-engineer.md +10 -0
- package/opencode/agents/engineering/research/best-practices-researcher.md +10 -0
- package/opencode/agents/engineering/research/framework-docs-researcher.md +10 -0
- package/opencode/agents/engineering/research/git-history-analyzer.md +10 -0
- package/opencode/agents/engineering/research/learnings-researcher.md +10 -0
- package/opencode/agents/engineering/research/repo-research-analyst.md +10 -0
- package/opencode/agents/engineering/review/agent-native-reviewer.md +10 -0
- package/opencode/agents/engineering/review/architecture-strategist.md +10 -0
- package/opencode/agents/engineering/review/code-quality-analyst.md +10 -0
- package/opencode/agents/engineering/review/code-simplicity-reviewer.md +10 -0
- package/opencode/agents/engineering/review/data-integrity-guardian.md +10 -0
- package/opencode/agents/engineering/review/data-migration-expert.md +10 -0
- package/opencode/agents/engineering/review/deployment-verification-agent.md +10 -0
- package/opencode/agents/engineering/review/dhh-rails-reviewer.md +10 -0
- package/opencode/agents/engineering/review/kieran-rails-reviewer.md +10 -0
- package/opencode/agents/engineering/review/legacy-code-expert.md +10 -0
- package/opencode/agents/engineering/review/observability-coverage-reviewer.md +10 -0
- package/opencode/agents/engineering/review/pattern-recognition-specialist.md +10 -0
- package/opencode/agents/engineering/review/performance-oracle.md +10 -0
- package/opencode/agents/engineering/review/security-sentinel.md +10 -0
- package/opencode/agents/engineering/review/semgrep-sast.md +10 -0
- package/opencode/agents/engineering/review/test-design-reviewer.md +10 -0
- package/opencode/agents/engineering/review/user-impact-reviewer.md +10 -0
- package/opencode/agents/engineering/workflow/pr-comment-resolver.md +10 -0
- package/opencode/agents/finance/budget-analyst.md +10 -0
- package/opencode/agents/finance/cfo.md +10 -0
- package/opencode/agents/finance/financial-reporter.md +10 -0
- package/opencode/agents/finance/revenue-analyst.md +10 -0
- package/opencode/agents/legal/clo.md +10 -0
- package/opencode/agents/legal/legal-compliance-auditor.md +10 -0
- package/opencode/agents/legal/legal-document-generator.md +10 -0
- package/opencode/agents/marketing/analytics-analyst.md +10 -0
- package/opencode/agents/marketing/brand-architect.md +10 -0
- package/opencode/agents/marketing/cmo.md +10 -0
- package/opencode/agents/marketing/conversion-optimizer.md +10 -0
- package/opencode/agents/marketing/copywriter.md +10 -0
- package/opencode/agents/marketing/fact-checker.md +10 -0
- package/opencode/agents/marketing/growth-strategist.md +10 -0
- package/opencode/agents/marketing/paid-media-strategist.md +10 -0
- package/opencode/agents/marketing/pricing-strategist.md +10 -0
- package/opencode/agents/marketing/programmatic-seo-specialist.md +10 -0
- package/opencode/agents/marketing/retention-strategist.md +10 -0
- package/opencode/agents/marketing/seo-aeo-analyst.md +10 -0
- package/opencode/agents/operations/coo.md +10 -0
- package/opencode/agents/operations/ops-advisor.md +10 -0
- package/opencode/agents/operations/ops-provisioner.md +10 -0
- package/opencode/agents/operations/ops-research.md +10 -0
- package/opencode/agents/operations/service-automator.md +10 -0
- package/opencode/agents/product/business-validator.md +10 -0
- package/opencode/agents/product/competitive-intelligence.md +10 -0
- package/opencode/agents/product/cpo.md +10 -0
- package/opencode/agents/product/design/ux-design-lead.md +10 -0
- package/opencode/agents/product/spec-flow-analyzer.md +10 -0
- package/opencode/agents/sales/cro.md +10 -0
- package/opencode/agents/sales/deal-architect.md +10 -0
- package/opencode/agents/sales/outbound-strategist.md +10 -0
- package/opencode/agents/sales/pipeline-analyst.md +10 -0
- package/opencode/agents/support/cco.md +10 -0
- package/opencode/agents/support/community-manager.md +10 -0
- package/opencode/agents/support/ticket-triage.md +10 -0
- package/opencode/commands/go.md +10 -0
- package/opencode/commands/help.md +10 -0
- package/opencode/commands/sync.md +10 -0
- package/opencode/commands/version.md +11 -0
- package/opencode/opencode.json +8 -0
- package/opencode/plugin.ts +493 -0
- package/package.json +36 -4
- package/scripts/admin-merge-ready.sh +545 -0
- package/scripts/admin-merge-ready.test.sh +753 -0
- package/scripts/affected-tests.sh +908 -0
- package/scripts/affected-tests.test.sh +1797 -0
- package/scripts/alpha-metrics.sh +78 -0
- package/scripts/alpha-metrics.test.sh +115 -0
- package/scripts/ancestor-signal-helpers.baseline.txt +16 -0
- package/scripts/audit-flag-flip.sh +107 -0
- package/scripts/check-red-on-main.sh +316 -0
- package/scripts/ci-head-verdict.sh +363 -0
- package/scripts/cloud-detect.sh +193 -0
- package/scripts/delegation-verify.sh +657 -0
- package/scripts/delegation-verify.test.sh +1424 -0
- package/scripts/deploy-arm.sh +475 -0
- package/scripts/domain-model-drift.sh +419 -0
- package/scripts/emit-decision.sh +144 -0
- package/scripts/emit-decision.test.sh +144 -0
- package/scripts/ext-filter-divergence-corpus.txt +15 -0
- package/scripts/ext-filter-divergence.sh +189 -0
- package/scripts/generate-c4-from-components.ts +442 -0
- package/scripts/grok-fidelity-gate.sh +68 -0
- package/scripts/grok-pre-push-gate.sh +232 -0
- package/scripts/harness-discovery-smoke.ts +906 -0
- package/scripts/harness-parity-census.ts +92 -0
- package/scripts/inngest-luks-alert-armed-probe.ts +29 -0
- package/scripts/install-opencode-adapter.ts +520 -0
- package/scripts/lib/affected-tests/common.sh +365 -0
- package/scripts/lib/affected-tests/go.sh +157 -0
- package/scripts/lib/affected-tests/js.sh +188 -0
- package/scripts/lib/affected-tests/nx-turbo.sh +98 -0
- package/scripts/lib/affected-tests/python.sh +185 -0
- package/scripts/lib/context-sanitize.sh +49 -0
- package/scripts/lib/domain-model-lib.sh +180 -0
- package/scripts/lib/ext-filter-grammar.tsv +34 -0
- package/scripts/lib/operator-script.sh +1236 -0
- package/scripts/lib/proc.sh +580 -0
- package/scripts/lib/session-state.sh +748 -0
- package/scripts/lib/tmp-classify.sh +843 -0
- package/scripts/lib/wrapper-boundary.sh +47 -0
- package/scripts/lint-ratchet.py +1547 -0
- package/scripts/monitor-pr-checks.sh +441 -0
- package/scripts/pipeline-tally.sh +756 -0
- package/scripts/pipeline-tally.test.sh +740 -0
- package/scripts/plugin-version.sh +528 -0
- package/scripts/precommit-guard.sh +113 -0
- package/scripts/precommit-guard.test.sh +254 -0
- package/scripts/reconcile-live-heartbeats.ts +705 -0
- package/scripts/render-c4-model.sh +217 -0
- package/scripts/resolve-git-root.sh +55 -0
- package/scripts/resolve-regenerable-conflicts.sh +363 -0
- package/scripts/resolve-regenerable-conflicts.test.sh +780 -0
- package/scripts/ruff-requirements.txt +22 -0
- package/scripts/run-in-pid-namespace.sh +98 -0
- package/scripts/run-in-pid-namespace.test.sh +290 -0
- package/scripts/scan-ancestor-signal-helpers.py +556 -0
- package/scripts/scan-ancestor-signal-helpers.test.sh +670 -0
- package/scripts/setup-ralph-loop.sh +238 -0
- package/scripts/sync-cursor-name-map.ts +316 -0
- package/scripts/sync-grok-agent-compat.ts +188 -0
- package/scripts/sync-npm-package.ts +178 -0
- package/scripts/sync-opencode-adapter.ts +479 -0
- package/scripts/sync-pr-behind.sh +534 -0
- package/scripts/sync-pr-behind.test.sh +252 -0
- package/scripts/taste-profile-update.sh +180 -0
- package/scripts/taste-profile-update.test.sh +167 -0
- package/scripts/write-budget-marker.sh +23 -0
- package/scripts/write-kb-coverage.ts +113 -0
- package/skills/admin-ip-refresh/SKILL.md +81 -0
- package/skills/admin-ip-refresh/references/admin-ip-refresh-procedure.md +201 -0
- package/skills/agent-browser/SKILL.md +698 -0
- package/skills/agent-browser/scripts/playwright-mcp-profile-slot.sh +304 -0
- package/skills/agent-browser/scripts/playwright-mcp-redact-proxy.py +964 -0
- package/skills/agent-browser/scripts/redact-a11y-snapshot.py +443 -0
- package/skills/agent-browser/test/fixtures/capture-playwright-mcp-fixtures.py +217 -0
- package/skills/agent-browser/test/fixtures/fake-passthrough-proxy.py +24 -0
- package/skills/agent-browser/test/fixtures/fake-playwright-mcp.py +131 -0
- package/skills/agent-browser/test/fixtures/make-proxy-mutant.py +48 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/dialog-link-injection.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/empty-content.json +5 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-and-result.json +4 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-code-bool.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-code-string.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-message-tree.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-no-data.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-string.json +4 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-with-data.json +9 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/evaluate-escaped-object.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/invalid-utf8.json +4 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/link-result.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/list-two-results.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/meta-in-result.json +13 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/no-content.json +5 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/quoted-key.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/resource-block.json +18 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/result-and-method.json +11 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/result-string.json +3 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/run-code-escaped-one-row.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/run-code-escaped.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/structured-content.json +13 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/tools-list-no-tools.json +5 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/tree-no-credential.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/two-text-blocks.json +14 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/unparsable-line.json +3 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/value-contains-brace.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/value-contains-link-substring.json +10 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/close.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/evaluate.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/find.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/framing.json +6 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/initialize.json +14 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/navigate-link.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/navigate.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/roots-list-request.json +5 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/screenshot.json +17 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-filename.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-meta-json.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-meta-raw.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/tools-list.json +827 -0
- package/skills/agent-browser/test/fixtures/proxy-session-driver.py +138 -0
- package/skills/agent-browser/test/fixtures/session-facts.py +102 -0
- package/skills/agent-browser/test/playwright-mcp-lifetime.test.sh +1620 -0
- package/skills/agent-browser/test/playwright-mcp-redact-proxy.test.sh +1599 -0
- package/skills/agent-browser/test/redact-a11y-snapshot.test.sh +527 -0
- package/skills/agent-native-architecture/SKILL.md +479 -0
- package/skills/agent-native-architecture/references/action-parity-discipline.md +430 -0
- package/skills/agent-native-architecture/references/agent-execution-patterns.md +483 -0
- package/skills/agent-native-architecture/references/agent-native-testing.md +605 -0
- package/skills/agent-native-architecture/references/architecture-patterns.md +493 -0
- package/skills/agent-native-architecture/references/dynamic-context-injection.md +358 -0
- package/skills/agent-native-architecture/references/files-universal-interface.md +314 -0
- package/skills/agent-native-architecture/references/from-primitives-to-domain-tools.md +381 -0
- package/skills/agent-native-architecture/references/mcp-tool-design.md +524 -0
- package/skills/agent-native-architecture/references/mobile-patterns.md +897 -0
- package/skills/agent-native-architecture/references/product-implications.md +478 -0
- package/skills/agent-native-architecture/references/refactoring-to-prompt-native.md +342 -0
- package/skills/agent-native-architecture/references/self-modification.md +294 -0
- package/skills/agent-native-architecture/references/shared-workspace-architecture.md +700 -0
- package/skills/agent-native-architecture/references/system-prompt-design.md +263 -0
- package/skills/agent-native-audit/SKILL.md +300 -0
- package/skills/agent-native-audit/workflows/agent-native-audit.workflow.js +423 -0
- package/skills/andrew-kane-gem-writer/SKILL.md +189 -0
- package/skills/andrew-kane-gem-writer/references/database-adapters.md +231 -0
- package/skills/andrew-kane-gem-writer/references/module-organization.md +121 -0
- package/skills/andrew-kane-gem-writer/references/rails-integration.md +183 -0
- package/skills/andrew-kane-gem-writer/references/resources.md +126 -0
- package/skills/andrew-kane-gem-writer/references/testing-patterns.md +261 -0
- package/skills/architecture/SKILL.md +436 -0
- package/skills/architecture/references/adr-template.md +154 -0
- package/skills/architecture/references/likec4-reference.md +136 -0
- package/skills/architecture/references/nfr-reference.md +126 -0
- package/skills/archive-kb/SKILL.md +86 -0
- package/skills/archive-kb/scripts/archive-kb.sh +300 -0
- package/skills/archive-kb/test/archive-kb-partial-run.test.sh +276 -0
- package/skills/atdd-developer/SKILL.md +65 -0
- package/skills/brainstorm/SKILL.md +701 -0
- package/skills/brainstorm/references/brainstorm-brand-workshop.md +153 -0
- package/skills/brainstorm/references/brainstorm-domain-config.md +63 -0
- package/skills/brainstorm/references/brainstorm-validation-workshop.md +65 -0
- package/skills/brainstorm/references/ui-surface-terms.md +42 -0
- package/skills/brainstorm-techniques/SKILL.md +231 -0
- package/skills/brainstorm-techniques/references/decision-principles.md +150 -0
- package/skills/brainstorm-techniques/references/phase-boundaries.md +103 -0
- package/skills/brainstorm-techniques/references/standing-delegation.md +407 -0
- package/skills/brainstorm-techniques/references/technical-ruling-delegation.md +174 -0
- package/skills/campaign-calendar/SKILL.md +145 -0
- package/skills/cf-token-scope/SKILL.md +164 -0
- package/skills/cf-token-scope/references/widen-playbook.md +114 -0
- package/skills/cf-token-scope/scripts/cf-token-scope.sh +253 -0
- package/skills/changelog/SKILL.md +142 -0
- package/skills/code-to-prd/SKILL.md +66 -0
- package/skills/code-to-prd/references/banner-template.md +12 -0
- package/skills/code-to-prd/references/prd-template.md +41 -0
- package/skills/code-to-prd/scripts/code-to-prd.sh +634 -0
- package/skills/code-to-prd/test/code-to-prd.test.sh +447 -0
- package/skills/code-to-prd/test/fixture/.env.example +7 -0
- package/skills/code-to-prd/test/fixture/app/about/page.tsx +11 -0
- package/skills/code-to-prd/test/fixture/app/api/health/route.ts +10 -0
- package/skills/code-to-prd/test/fixture/app/page.tsx +14 -0
- package/skills/code-to-prd/test/fixture/next.config.mjs +3 -0
- package/skills/code-to-prd/test/fixture/package.json +6 -0
- package/skills/cohort-status/SKILL.md +62 -0
- package/skills/community/SKILL.md +210 -0
- package/skills/community/scripts/bsky-community.sh +644 -0
- package/skills/community/scripts/bsky-setup.sh +631 -0
- package/skills/community/scripts/community-router.sh +93 -0
- package/skills/community/scripts/discord-community.sh +487 -0
- package/skills/community/scripts/discord-setup.sh +784 -0
- package/skills/community/scripts/github-community.sh +706 -0
- package/skills/community/scripts/hn-community.sh +233 -0
- package/skills/community/scripts/lib/hmac-sha1-b64.sh +126 -0
- package/skills/community/scripts/linkedin-community.sh +750 -0
- package/skills/community/scripts/linkedin-setup.sh +758 -0
- package/skills/community/scripts/x-community.sh +890 -0
- package/skills/community/scripts/x-setup.sh +713 -0
- package/skills/community/test/community-argv.test.sh +2922 -0
- package/skills/community/test/github-community.test.sh +981 -0
- package/skills/competitive-analysis/SKILL.md +69 -0
- package/skills/competitive-analysis/references/peer-plugin-audit.md +218 -0
- package/skills/compound/SKILL.md +673 -0
- package/skills/compound/scripts/token-efficiency-report.sh +334 -0
- package/skills/compound/test/phase-16.test.sh +379 -0
- package/skills/compound-capture/SKILL.md +791 -0
- package/skills/compound-capture/assets/critical-pattern-template.md +37 -0
- package/skills/compound-capture/assets/resolution-template.md +116 -0
- package/skills/compound-capture/references/yaml-schema.md +67 -0
- package/skills/compound-capture/schema.yaml +181 -0
- package/skills/constraint-scaffold/SKILL.md +175 -0
- package/skills/constraint-scaffold/references/boundary-readme.template +35 -0
- package/skills/constraint-scaffold/references/constraint-gates-workflow.template +69 -0
- package/skills/constraint-scaffold/references/depcruise-config.template +230 -0
- package/skills/constraint-scaffold/references/fix-constraints-stage-a.template +240 -0
- package/skills/constraint-scaffold/references/fix-constraints-stage-b.template +313 -0
- package/skills/constraint-scaffold/references/shared-runner.template +135 -0
- package/skills/constraint-scaffold/scripts/constraint-scaffold.sh +589 -0
- package/skills/constraint-scaffold/test/bite-proof.test.sh +1338 -0
- package/skills/constraint-scaffold/test/boundary.test.sh +734 -0
- package/skills/constraint-scaffold/test/emit-fix-constraints.test.sh +193 -0
- package/skills/constraint-scaffold/test/generator.test.sh +93 -0
- package/skills/constraint-scaffold/test/parity.test.sh +285 -0
- package/skills/content-writer/SKILL.md +242 -0
- package/skills/content-writer/scripts/blog-jargon-scan.sh +42 -0
- package/skills/cron-delete/SKILL.md +56 -0
- package/skills/cron-list/SKILL.md +54 -0
- package/skills/deepen-plan/SKILL.md +937 -0
- package/skills/deepen-plan/workflows/deepen-plan.workflow.js +488 -0
- package/skills/deploy/SKILL.md +115 -0
- package/skills/deploy/references/hetzner-setup.md +65 -0
- package/skills/deploy/scripts/deploy.sh +37 -0
- package/skills/deploy-docs/SKILL.md +95 -0
- package/skills/dhh-rails-style/SKILL.md +203 -0
- package/skills/dhh-rails-style/references/architecture.md +717 -0
- package/skills/dhh-rails-style/references/controllers.md +323 -0
- package/skills/dhh-rails-style/references/frontend.md +556 -0
- package/skills/dhh-rails-style/references/gems.md +316 -0
- package/skills/dhh-rails-style/references/models.md +388 -0
- package/skills/dhh-rails-style/references/testing.md +354 -0
- package/skills/discord-content/SKILL.md +126 -0
- package/skills/docs-site/SKILL.md +214 -0
- package/skills/drain-labeled-backlog/SKILL.md +203 -0
- package/skills/drain-labeled-backlog/scripts/group-by-area.sh +208 -0
- package/skills/drain-labeled-backlog/workflows/drain-labeled-backlog.workflow.js +433 -0
- package/skills/drain-prs/SKILL.md +142 -0
- package/skills/drain-prs/scripts/triage-prs.sh +192 -0
- package/skills/drain-prs/test/argv-ceiling.test.sh +183 -0
- package/skills/dspy-ruby/SKILL.md +634 -0
- package/skills/dspy-ruby/assets/config-template.rb +359 -0
- package/skills/dspy-ruby/assets/module-template.rb +326 -0
- package/skills/dspy-ruby/assets/signature-template.rb +143 -0
- package/skills/dspy-ruby/references/core-concepts.md +268 -0
- package/skills/dspy-ruby/references/optimization.md +623 -0
- package/skills/dspy-ruby/references/providers.md +335 -0
- package/skills/eval-harness/README.md +194 -0
- package/skills/eval-harness/SKILL.md +157 -0
- package/skills/eval-harness/enums/go-routes.json +13 -0
- package/skills/eval-harness/enums/incident-threshold.json +5 -0
- package/skills/eval-harness/enums/lane.json +5 -0
- package/skills/eval-harness/enums/tool-selection.json +20 -0
- package/skills/eval-harness/enums/triage-levels.json +5 -0
- package/skills/eval-harness/gated-skills.json +34 -0
- package/skills/eval-harness/models.generated.json +5 -0
- package/skills/eval-harness/promptfooconfig-go-routing.yaml +35 -0
- package/skills/eval-harness/promptfooconfig-incident-threshold.yaml +32 -0
- package/skills/eval-harness/promptfooconfig-lane-inference.yaml +33 -0
- package/skills/eval-harness/promptfooconfig-ticket-triage.yaml +34 -0
- package/skills/eval-harness/promptfooconfig-tool-selection.yaml +33 -0
- package/skills/eval-harness/prompts/go-baseline.txt +6 -0
- package/skills/eval-harness/prompts/go-skill.txt +21 -0
- package/skills/eval-harness/prompts/incident-threshold-baseline.txt +6 -0
- package/skills/eval-harness/prompts/incident-threshold-skill.txt +12 -0
- package/skills/eval-harness/prompts/lane-inference-baseline.txt +6 -0
- package/skills/eval-harness/prompts/lane-inference-skill.txt +15 -0
- package/skills/eval-harness/prompts/tool-selection-baseline.txt +19 -0
- package/skills/eval-harness/prompts/tool-selection-skill.txt +22 -0
- package/skills/eval-harness/prompts/triage-baseline.txt +7 -0
- package/skills/eval-harness/prompts/triage-skill.txt +10 -0
- package/skills/eval-harness/scripts/eval-gate.cjs +318 -0
- package/skills/eval-harness/scripts/extract-block.cjs +87 -0
- package/skills/eval-harness/scripts/gate-classification.cjs +28 -0
- package/skills/eval-harness/scripts/gen-models.sh +41 -0
- package/skills/eval-harness/scripts/gen-skill-prompt.cjs +177 -0
- package/skills/eval-harness/scripts/measure-classification.cjs +30 -0
- package/skills/eval-harness/scripts/parse-label.cjs +93 -0
- package/skills/eval-harness/scripts/verdict.cjs +132 -0
- package/skills/eval-harness/tasks/go-routing.jsonl +8 -0
- package/skills/eval-harness/tasks/incident-threshold.jsonl +7 -0
- package/skills/eval-harness/tasks/lane-inference.jsonl +7 -0
- package/skills/eval-harness/tasks/ticket-triage.jsonl +6 -0
- package/skills/eval-harness/tasks/tool-selection.jsonl +15 -0
- package/skills/eval-harness/test/eval-gate.test.sh +132 -0
- package/skills/eval-harness/test/extract-block.test.sh +87 -0
- package/skills/eval-harness/test/gate-classification.test.sh +77 -0
- package/skills/eval-harness/test/gen-models.test.sh +75 -0
- package/skills/eval-harness/test/measure-classification.test.sh +74 -0
- package/skills/eval-harness/test/parse-label.test.sh +129 -0
- package/skills/eval-harness/test/registry-completeness.test.sh +109 -0
- package/skills/eval-harness/test/verdict.test.sh +123 -0
- package/skills/every-style-editor/SKILL.md +142 -0
- package/skills/every-style-editor/references/EVERY_WRITE_STYLE.md +529 -0
- package/skills/feature-tweet/SKILL.md +199 -0
- package/skills/feature-video/SKILL.md +412 -0
- package/skills/feature-video/scripts/check_deps.sh +281 -0
- package/skills/file-todos/SKILL.md +267 -0
- package/skills/file-todos/assets/todo-template.md +166 -0
- package/skills/fix-issue/SKILL.md +278 -0
- package/skills/fix-issue/references/agent-authored-exclusion.md +118 -0
- package/skills/fix-issue/references/exclude-label-jq-snippet.md +96 -0
- package/skills/flag-bootstrap/SETUP.md +142 -0
- package/skills/flag-create/SKILL.md +145 -0
- package/skills/flag-create/scripts/create.sh +273 -0
- package/skills/flag-delete/SKILL.md +167 -0
- package/skills/flag-delete/scripts/delete.sh +288 -0
- package/skills/flag-list/SKILL.md +99 -0
- package/skills/flag-list/scripts/list.sh +275 -0
- package/skills/flag-set-role/SKILL.md +229 -0
- package/skills/flag-set-role/scripts/flip.sh +774 -0
- package/skills/frontend-anti-slop/SKILL.md +106 -0
- package/skills/frontend-anti-slop/references/anti-patterns.md +199 -0
- package/skills/frontend-anti-slop/references/slop-rules.md +65 -0
- package/skills/frontend-anti-slop/scripts/tier1-scan.ts +525 -0
- package/skills/frontend-design/SKILL.md +77 -0
- package/skills/gdpr-gate/NOTICE +136 -0
- package/skills/gdpr-gate/SKILL.md +341 -0
- package/skills/gdpr-gate/references/fields.md +160 -0
- package/skills/gdpr-gate/references/layers/api-layer.md +355 -0
- package/skills/gdpr-gate/references/layers/auth-sessions.md +290 -0
- package/skills/gdpr-gate/references/layers/data-in-transit.md +331 -0
- package/skills/gdpr-gate/references/layers/data-lifecycle.md +341 -0
- package/skills/gdpr-gate/references/layers/frontend.md +249 -0
- package/skills/gdpr-gate/references/layers/testing-seeding.md +256 -0
- package/skills/gdpr-gate/references/leakage-vectors.md +248 -0
- package/skills/gdpr-gate/references/legacy/legal-consent-v1-prose.md +48 -0
- package/skills/gdpr-gate/references/legal-consent.md +140 -0
- package/skills/gdpr-gate/references/non-negotiables.md +60 -0
- package/skills/gdpr-gate/scripts/gdpr-gate.sh +271 -0
- package/skills/gdpr-gate/scripts/notice-frontmatter.sh +337 -0
- package/skills/gdpr-gate/scripts/path-denylist.txt +39 -0
- package/skills/gdpr-gate/scripts/repo-scan.sh +158 -0
- package/skills/gdpr-gate/scripts/vendor-drift-classify.sh +120 -0
- package/skills/gdpr-gate/scripts/vendor-pin-integrity.sh +237 -0
- package/skills/gemini-imagegen/SKILL.md +283 -0
- package/skills/gemini-imagegen/requirements.txt +5 -0
- package/skills/gemini-imagegen/scripts/_error_handling.py +146 -0
- package/skills/gemini-imagegen/scripts/compose_images.py +150 -0
- package/skills/gemini-imagegen/scripts/edit_image.py +137 -0
- package/skills/gemini-imagegen/scripts/gemini_images.py +256 -0
- package/skills/gemini-imagegen/scripts/generate_image.py +147 -0
- package/skills/gemini-imagegen/scripts/multi_turn_chat.py +223 -0
- package/skills/gemini-imagegen/scripts/test_error_handling.py +179 -0
- package/skills/git-worktree/SKILL.md +534 -0
- package/skills/git-worktree/scripts/git-repo-readiness-diag.sh +98 -0
- package/skills/git-worktree/scripts/worktree-manager.sh +4773 -0
- package/skills/git-worktree/test/create-from-origin-main.test.sh +116 -0
- package/skills/git-worktree/test/lease-protects-active.test.sh +1056 -0
- package/skills/git-worktree/test/no-repo-fail-loud.test.sh +88 -0
- package/skills/git-worktree/test/orphan-reaper-honest-count.test.sh +379 -0
- package/skills/git-worktree/test/reap-archive-persistence.test.sh +725 -0
- package/skills/git-worktree/test/stale-lock-sweep.test.sh +176 -0
- package/skills/go/SKILL.md +54 -0
- package/skills/growth/SKILL.md +164 -0
- package/skills/harvest-debt/SKILL.md +78 -0
- package/skills/harvest-debt/scripts/harvest-debt.sh +114 -0
- package/skills/heal-skill/SKILL.md +173 -0
- package/skills/help/SKILL.md +46 -0
- package/skills/incident/NOTICE +39 -0
- package/skills/incident/SKILL.md +395 -0
- package/skills/incident/scripts/dry-run.sh +448 -0
- package/skills/incident/scripts/redact-engine.py +412 -0
- package/skills/incident/scripts/redact-sentinel.sh +44 -0
- package/skills/incident/templates/pir.md +139 -0
- package/skills/incident/test/fixtures/dry-run-incident.json +26 -0
- package/skills/incident/test/fixtures/dry-run-secret-leak.json +26 -0
- package/skills/incident/test/fixtures/legacy-bash-scanner.sh +82 -0
- package/skills/incident/test/fixtures/positive-corpus.md +87 -0
- package/skills/incident/test/redact-sentinel.test.sh +1420 -0
- package/skills/invoice/SKILL.md +206 -0
- package/skills/kb-glossary/SKILL.md +71 -0
- package/skills/kb-glossary/references/glossary-format.md +111 -0
- package/skills/kb-glossary/references/rejected-request-register.md +115 -0
- package/skills/kb-search/SKILL.md +276 -0
- package/skills/kb-search/scripts/kb-search-cache.sh +123 -0
- package/skills/legal-audit/SKILL.md +161 -0
- package/skills/legal-generate/NOTICE +242 -0
- package/skills/legal-generate/SKILL.md +244 -0
- package/skills/legal-generate/references/templates/advisor-agreement/template.md +12 -0
- package/skills/legal-generate/references/templates/business-associate-agreement/template.md +112 -0
- package/skills/legal-generate/references/templates/cookie-notice/template.md +82 -0
- package/skills/legal-generate/references/templates/dpa-global/template.md +439 -0
- package/skills/legal-generate/references/templates/dpa-us/template.md +222 -0
- package/skills/legal-generate/references/templates/employee-offer-letter/template.md +75 -0
- package/skills/legal-generate/references/templates/master-services-agreement/template.md +252 -0
- package/skills/legal-generate/references/templates/mutual-nda/template.md +66 -0
- package/skills/legal-generate/references/templates/one-way-nda/template.md +38 -0
- package/skills/legal-generate/references/templates/privacy-policy-gdpr/template.md +427 -0
- package/skills/legal-generate/references/templates/privacy-policy-us/template.md +313 -0
- package/skills/legal-generate/references/templates/terms-of-use/template.md +75 -0
- package/skills/legal-generate/scripts/strip-vendor-credit.sh +96 -0
- package/skills/linear-fetch/SKILL.md +247 -0
- package/skills/linear-fetch/scripts/assert-no-linear-telemetry.sh +66 -0
- package/skills/linear-fetch/scripts/redact-linear-urls.sh +51 -0
- package/skills/linear-fetch/scripts/render-caller-template.sh +36 -0
- package/skills/linear-fetch/test/assert-no-linear-telemetry.test.sh +113 -0
- package/skills/linear-fetch/test/parity.test.sh +112 -0
- package/skills/linear-fetch/test/persist-safe-integration.test.sh +191 -0
- package/skills/linear-fetch/test/redact-linear-urls.test.sh +226 -0
- package/skills/merge-pr/SKILL.md +668 -0
- package/skills/model-launch-review/SKILL.md +255 -0
- package/skills/model-launch-review/scripts/audit-models.sh +501 -0
- package/skills/one-shot/SKILL.md +316 -0
- package/skills/one-shot/references/token-discipline.md +74 -0
- package/skills/operator-bootstrap/SKILL.md +412 -0
- package/skills/operator-bootstrap/template.sh +439 -0
- package/skills/operator-digest/SKILL.md +287 -0
- package/skills/operator-digest/assets/operator-digest.workflow.yml +175 -0
- package/skills/operator-digest/scripts/digest-scrub.sh +119 -0
- package/skills/operator-digest/scripts/provision-operator-digest-repo.sh +147 -0
- package/skills/operator-rephrase/SKILL.md +98 -0
- package/skills/pencil-setup/SKILL.md +201 -0
- package/skills/pencil-setup/scripts/check_deps.sh +556 -0
- package/skills/pencil-setup/scripts/copy_adapter.sh +80 -0
- package/skills/pencil-setup/scripts/package-lock.json +1172 -0
- package/skills/pencil-setup/scripts/package.json +14 -0
- package/skills/pencil-setup/scripts/pencil-error-enrichment.mjs +21 -0
- package/skills/pencil-setup/scripts/pencil-mcp-adapter.mjs +733 -0
- package/skills/pencil-setup/scripts/pencil-response-classify.mjs +38 -0
- package/skills/pencil-setup/scripts/pencil-save-gate.mjs +26 -0
- package/skills/pencil-setup/scripts/sanitize-filename.mjs +25 -0
- package/skills/plan/SKILL.md +1140 -0
- package/skills/plan/references/differential-migration-testing.md +185 -0
- package/skills/plan/references/plan-community-discovery.md +42 -0
- package/skills/plan/references/plan-founder-check.md +137 -0
- package/skills/plan/references/plan-functional-overlap.md +25 -0
- package/skills/plan/references/plan-host-fanout.md +51 -0
- package/skills/plan/references/plan-issue-templates.md +779 -0
- package/skills/plan/references/plan-network-outage-checklist.md +131 -0
- package/skills/plan/references/plan-scope-check.md +126 -0
- package/skills/plan/references/plan-sharp-edges.md +325 -0
- package/skills/plan/references/plan-signoff-lifecycle.md +12 -0
- package/skills/plan/references/webapp-cwv-observability.md +143 -0
- package/skills/plan-review/SKILL.md +91 -0
- package/skills/plan-review/lib/named-panel.mjs +58 -0
- package/skills/plan-review/workflows/plan-review.workflow.js +477 -0
- package/skills/postmerge/SKILL.md +642 -0
- package/skills/postmerge/references/deploy-status-debugging.md +138 -0
- package/skills/postmerge/references/graceful-degradation.md +20 -0
- package/skills/postmerge/references/sentry-error-count-delta.md +137 -0
- package/skills/preflight/SKILL.md +1553 -0
- package/skills/preflight/references/check-13-founder-check.md +286 -0
- package/skills/preflight/scripts/founder-check.py +1640 -0
- package/skills/preflight/scripts/parse-form-a.awk +107 -0
- package/skills/preflight/scripts/probe-verb-gate.sh +108 -0
- package/skills/product-roadmap/SKILL.md +357 -0
- package/skills/product-roadmap/scripts/roadmap-reconcile.sh +327 -0
- package/skills/provision-cloudflare/SKILL.md +67 -0
- package/skills/provision-cloudflare/scripts/provision-cloudflare.sh +271 -0
- package/skills/provision-doppler/SKILL.md +58 -0
- package/skills/provision-doppler/scripts/provision-doppler.sh +358 -0
- package/skills/provision-github/SKILL.md +59 -0
- package/skills/provision-github/scripts/provision-github.sh +300 -0
- package/skills/provision-hetzner/SKILL.md +76 -0
- package/skills/provision-hetzner/scripts/provision-hetzner.sh +262 -0
- package/skills/provision-hetzner/test/fixture/knowledge-base/legal/tenant-dpa-register.md +26 -0
- package/skills/provision-hetzner/test/fixture/provision-hetzner-dry-run.golden +34 -0
- package/skills/provision-hetzner/test/provision-hetzner-characterization.test.sh +227 -0
- package/skills/qa/SKILL.md +263 -0
- package/skills/qa/references/browser-preflight.md +22 -0
- package/skills/questionnaire-generate/SKILL.md +328 -0
- package/skills/questionnaire-generate/references/questionnaire.template +60 -0
- package/skills/rclone/SKILL.md +162 -0
- package/skills/rclone/scripts/check_setup.sh +63 -0
- package/skills/release-announce/SKILL.md +65 -0
- package/skills/release-docs/SKILL.md +92 -0
- package/skills/reproduce-bug/SKILL.md +358 -0
- package/skills/resolve-debt/SKILL.md +85 -0
- package/skills/resolve-debt/scripts/resolve-debt.py +584 -0
- package/skills/resolve-parallel/SKILL.md +45 -0
- package/skills/resolve-parallel/workflows/resolve-parallel.workflow.js +415 -0
- package/skills/resolve-pr-parallel/SKILL.md +68 -0
- package/skills/resolve-pr-parallel/workflows/resolve-pr-parallel.workflow.js +419 -0
- package/skills/resolve-todo-parallel/SKILL.md +57 -0
- package/skills/resolve-todo-parallel/workflows/resolve-todo-parallel.workflow.js +398 -0
- package/skills/review/SKILL.md +1621 -0
- package/skills/review/references/anti-slop-scanner-hook.md +40 -0
- package/skills/review/references/defect-classes-migrations.md +9 -0
- package/skills/review/references/generated-input-oracle-surfaces.md +15 -0
- package/skills/review/references/review-e2e-testing.md +116 -0
- package/skills/review/references/review-todo-structure.md +165 -0
- package/skills/review/references/risk-tier-and-fix-rounds.md +95 -0
- package/skills/review/references/semgrep-custom-rules.yaml +174 -0
- package/skills/review/references/ultrathink-phases.md +98 -0
- package/skills/review/references/wfs.md +6 -0
- package/skills/review/scripts/emit-review-trailer.sh +499 -0
- package/skills/review/scripts/ensure-semgrep.sh +99 -0
- package/skills/review/scripts/fix-round-seats.sh +197 -0
- package/skills/review/test/emit-review-trailer.test.sh +387 -0
- package/skills/review/test/ensure-semgrep.test.sh +111 -0
- package/skills/review/test/fix-round-seats.test.sh +237 -0
- package/skills/review/workflows/README.md +147 -0
- package/skills/review/workflows/review.workflow.js +667 -0
- package/skills/schedule/SKILL.md +796 -0
- package/skills/seo-aeo/SKILL.md +139 -0
- package/skills/seo-aeo/scripts/validate-csp.sh +233 -0
- package/skills/seo-aeo/scripts/validate-seo.sh +262 -0
- package/skills/ship/SKILL.md +3022 -0
- package/skills/ship/references/adr-ordinal-collision.md +47 -0
- package/skills/ship/references/affected-gate-contract.md +115 -0
- package/skills/ship/references/ci-run-diagnosis.md +29 -0
- package/skills/ship/references/ci-workflow-authoring.md +68 -0
- package/skills/ship/references/counsel-review-clo-attestation.md +38 -0
- package/skills/ship/references/cto-ruling-armed-push.md +5 -0
- package/skills/ship/references/decision-challenges-render.md +71 -0
- package/skills/ship/references/detached-battery-verdict.md +13 -0
- package/skills/ship/references/feature-tweet-draft.md +42 -0
- package/skills/ship/references/followthrough-issue-body-template.md +47 -0
- package/skills/ship/references/followthrough-stub-template.sh +92 -0
- package/skills/ship/references/merge-queue-dequeue.md +39 -0
- package/skills/ship/references/operator-holds.md +149 -0
- package/skills/ship/references/pipeline-tally-render.md +43 -0
- package/skills/ship/references/pr-overlap.md +153 -0
- package/skills/ship/references/queue-mode.md +7 -0
- package/skills/ship/references/ready-run-wait.md +36 -0
- package/skills/ship/references/red-on-main-quarantine.md +110 -0
- package/skills/ship/references/register-update-pr-pattern.md +88 -0
- package/skills/ship/references/settle-then-admin-merge.md +130 -0
- package/skills/ship/references/supabase-column-probe.md +13 -0
- package/skills/ship/scripts/auto-close-scan.sh +76 -0
- package/skills/ship/scripts/battery-owed.sh +403 -0
- package/skills/ship/scripts/hold-gate-eval.sh +410 -0
- package/skills/ship/scripts/net-issue-flow.sh +665 -0
- package/skills/ship/scripts/pr-overlap-preflight.sh +483 -0
- package/skills/ship/scripts/ship-pir-action-items-gate.sh +246 -0
- package/skills/ship/scripts/technical-ruling-gate.sh +444 -0
- package/skills/skill-creator/SKILL.md +299 -0
- package/skills/skill-creator/references/api-security.md +248 -0
- package/skills/skill-creator/references/authoring-levers.md +110 -0
- package/skills/skill-creator/references/be-clear-and-direct.md +587 -0
- package/skills/skill-creator/references/best-practices.md +431 -0
- package/skills/skill-creator/references/common-patterns.md +639 -0
- package/skills/skill-creator/references/core-principles.md +193 -0
- package/skills/skill-creator/references/executable-code.md +188 -0
- package/skills/skill-creator/references/iteration-and-testing.md +509 -0
- package/skills/skill-creator/references/official-spec.md +193 -0
- package/skills/skill-creator/references/recommended-structure.md +180 -0
- package/skills/skill-creator/references/skill-structure.md +396 -0
- package/skills/skill-creator/references/using-scripts.md +122 -0
- package/skills/skill-creator/references/using-templates.md +120 -0
- package/skills/skill-creator/references/workflows-and-validation.md +541 -0
- package/skills/skill-creator/scripts/init_skill.py +322 -0
- package/skills/skill-creator/scripts/package_skill.py +110 -0
- package/skills/skill-creator/scripts/quick_validate.py +64 -0
- package/skills/skill-creator/templates/router-skill.md +73 -0
- package/skills/skill-creator/templates/simple-skill.md +34 -0
- package/skills/skill-creator/workflows/add-reference.md +96 -0
- package/skills/skill-creator/workflows/add-script.md +104 -0
- package/skills/skill-creator/workflows/add-template.md +83 -0
- package/skills/skill-creator/workflows/add-workflow.md +128 -0
- package/skills/skill-creator/workflows/audit-skill.md +159 -0
- package/skills/skill-creator/workflows/create-domain-expertise-skill.md +623 -0
- package/skills/skill-creator/workflows/create-new-skill.md +207 -0
- package/skills/skill-creator/workflows/get-guidance.md +134 -0
- package/skills/skill-creator/workflows/upgrade-to-router.md +170 -0
- package/skills/skill-creator/workflows/verify-skill.md +226 -0
- package/skills/skill-security-scan/SKILL.md +145 -0
- package/skills/skill-security-scan/references/disclaimer.md +21 -0
- package/skills/skill-security-scan/references/first-party-allowlist.yaml +38 -0
- package/skills/skill-security-scan/references/override-artifact-schema.json +68 -0
- package/skills/skill-security-scan/references/override-mechanism.md +171 -0
- package/skills/skill-security-scan/references/redirect-domains.yaml +27 -0
- package/skills/skill-security-scan/references/regex-patterns.md +136 -0
- package/skills/skill-security-scan/references/rules/code-exec.yaml +70 -0
- package/skills/skill-security-scan/references/rules/filesystem-boundary.yaml +29 -0
- package/skills/skill-security-scan/references/rules/manifest.yaml +44 -0
- package/skills/skill-security-scan/references/rules/supply-chain.yaml +36 -0
- package/skills/skill-security-scan/references/scan-meta-schema.json +63 -0
- package/skills/skill-security-scan/references/test-fixtures/clean-soleur-style.skill.md +23 -0
- package/skills/skill-security-scan/references/test-fixtures/clean-third-party.skill.md +26 -0
- package/skills/skill-security-scan/references/test-fixtures/malicious-codeexec.skill.md +23 -0
- package/skills/skill-security-scan/references/test-fixtures/malicious-curl-pipe-bash.skill.md +69 -0
- package/skills/skill-security-scan/references/test-fixtures/malicious-prompt-injection.skill.md +17 -0
- package/skills/skill-security-scan/references/test-fixtures/malicious-telemetry-beacon.skill.md +23 -0
- package/skills/skill-security-scan/references/typosquat-targets.yaml +65 -0
- package/skills/skill-security-scan/scripts/check-codeexec.sh +41 -0
- package/skills/skill-security-scan/scripts/check-filesystem-boundary.sh +19 -0
- package/skills/skill-security-scan/scripts/check-prompt-injection.sh +95 -0
- package/skills/skill-security-scan/scripts/check-supply-chain.sh +219 -0
- package/skills/skill-security-scan/scripts/check-telemetry-surface.sh +126 -0
- package/skills/skill-security-scan/scripts/lib.sh +197 -0
- package/skills/skill-security-scan/scripts/parse-override.sh +231 -0
- package/skills/skill-security-scan/scripts/run-scan.sh +342 -0
- package/skills/skill-security-scan/scripts/run-self-test.sh +95 -0
- package/skills/skill-security-scan/test/argv-ceiling.test.sh +180 -0
- package/skills/skill-security-scan/test/meta-dir-reap.test.sh +411 -0
- package/skills/skill-security-scan/test/parse-override.test.sh +607 -0
- package/skills/skill-security-scan/test/redact-pii-ghs-shape.test.sh +251 -0
- package/skills/social-distribute/SKILL.md +485 -0
- package/skills/spec-templates/SKILL.md +274 -0
- package/skills/sync/SKILL.md +49 -0
- package/skills/test-browser/SKILL.md +464 -0
- package/skills/test-browser/references/feature-map.md +161 -0
- package/skills/test-fix-loop/SKILL.md +159 -0
- package/skills/test-fix-loop/references/determinism-checklist.md +154 -0
- package/skills/triage/SKILL.md +402 -0
- package/skills/trigger-cron/SKILL.md +136 -0
- package/skills/trigger-cron/scripts/trigger.sh +198 -0
- package/skills/user-set-role/SKILL.md +147 -0
- package/skills/user-set-role/scripts/set-role.sh +218 -0
- package/skills/user-story-writer/SKILL.md +77 -0
- package/skills/ux-audit/SKILL.md +251 -0
- package/skills/ux-audit/references/finding.schema.json +62 -0
- package/skills/ux-audit/references/route-list.yaml +95 -0
- package/skills/ux-audit/scripts/bot-fixture.ts +270 -0
- package/skills/ux-audit/scripts/bot-signin.ts +135 -0
- package/skills/ux-audit/scripts/dedup-hash.ts +46 -0
- package/skills/work/SKILL.md +1479 -0
- package/skills/work/references/end-of-work-resume.md +7 -0
- package/skills/work/references/hook-test-main-cwd.md +24 -0
- package/skills/work/references/key-principles.md +83 -0
- package/skills/work/references/property-testing.md +122 -0
- package/skills/work/references/sql-security-definer-rpc-scaffold.sql +78 -0
- package/skills/work/references/work-agent-teams.md +97 -0
- package/skills/work/references/work-lifecycle-parallel.md +147 -0
- package/skills/work/references/work-lockfile-bumps.md +97 -0
- package/skills/work/references/work-scratch-sandboxes.md +212 -0
- package/skills/work/references/work-subagent-fanout.md +61 -0
- package/skills/work/references/work-test-harness-sharp-edges.md +73 -0
- package/skills/xcode-test/SKILL.md +360 -0
|
@@ -0,0 +1,554 @@
|
|
|
1
|
+
// Generate a LikeC4 model from the component docs `/soleur:sync` already writes.
|
|
2
|
+
//
|
|
3
|
+
// WHY A RELATIONSHIP-COUNT GATE EXISTS. The dependency convention this parses is
|
|
4
|
+
// EMERGENT, not specified. Until #7332 the only place it was written down was a
|
|
5
|
+
// prose placeholder in the component template; nothing ever told the producing
|
|
6
|
+
// side to emit a parseable form. Skouer's docs happen to use markdown links,
|
|
7
|
+
// Soleur's own use prose ("None (agents are standalone)") 4 times out of 4. So
|
|
8
|
+
// the failure mode this module is built around is not a crash — it is a corpus
|
|
9
|
+
// that yields elements, exits 0, validates clean, and renders a diagram of
|
|
10
|
+
// DISCONNECTED BOXES reported as a successful result. `assessRender` reports that
|
|
11
|
+
// state as `degraded`: the docs are the defect, not the run.
|
|
12
|
+
//
|
|
13
|
+
// VALIDATION MIRRORS plugins/soleur/scripts/render-c4-model.sh (its DIAG_RE and
|
|
14
|
+
// element-count gates), NOT c4-render.ts — except the #8861 views gate, which
|
|
15
|
+
// all three writers share identically (plain-object `views` count > 0).
|
|
16
|
+
// The two in-repo precedents deliberately disagree on the DIAGNOSTIC gate:
|
|
17
|
+
// `c4-render.ts` refuses to key on likec4 stderr, reasoning that its wording
|
|
18
|
+
// drifts across patch versions — correct for a RUNTIME save path that cannot
|
|
19
|
+
// pin the CLI (its element/view COUNT gates are identical to this module's).
|
|
20
|
+
// This
|
|
21
|
+
// producer pins `likec4@1.50.0` (asserted by a drift guard against both
|
|
22
|
+
// precedents), so the wording is fixed and both gates are safe. That pin is load
|
|
23
|
+
// bearing: if it moves, the diagnostic gate is the thing that breaks.
|
|
24
|
+
//
|
|
25
|
+
// This module is PURE — parsing, edge building, and string generation only. All
|
|
26
|
+
// filesystem writes and the likec4 invocation live in the executable wrapper,
|
|
27
|
+
// plugins/soleur/scripts/generate-c4-from-components.ts, mirroring the
|
|
28
|
+
// heartbeat-live-reconcile.ts -> reconcile-live-heartbeats.ts split.
|
|
29
|
+
|
|
30
|
+
import { readFileSync, readdirSync } from "node:fs";
|
|
31
|
+
import { join } from "node:path";
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Pinned likec4 CLI version. MUST stay equal to `LIKEC4_VERSION` in
|
|
35
|
+
* plugins/soleur/scripts/render-c4-model.sh and the `likec4@…` pin in
|
|
36
|
+
* apps/web-platform/server/c4-render.ts — a drift guard asserts all three.
|
|
37
|
+
*/
|
|
38
|
+
export const LIKEC4_VERSION = "1.50.0";
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* `--before` cutoff for the `npx` resolve. MUST stay equal to `LIKEC4_BEFORE` in
|
|
42
|
+
* plugins/soleur/scripts/render-c4-model.sh (BUMPING LIKEC4 there) — a drift guard asserts it.
|
|
43
|
+
*/
|
|
44
|
+
export const LIKEC4_BEFORE = "2026-09-28";
|
|
45
|
+
|
|
46
|
+
/** Provenance stamp. A file without this as its FIRST line is never overwritten. */
|
|
47
|
+
export const GENERATED_HEADER =
|
|
48
|
+
"// GENERATED by /soleur:sync c4 — hand edits will be overwritten";
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Source-fault detector, behaviourally equivalent to `DIAG_RE` in
|
|
52
|
+
* plugins/soleur/scripts/render-c4-model.sh. likec4@1.50.0 exits 0 on a syntax error —
|
|
53
|
+
* it drops the bad fragment, prints `Invalid <file>` / `Line N:`, and still emits
|
|
54
|
+
* a non-empty but INCOMPLETE model, which element-count alone cannot see.
|
|
55
|
+
*
|
|
56
|
+
* The anchors are deliberate: likec4 echoes `workspace: /abs/path`, so an
|
|
57
|
+
* unanchored `Invalid` would false-fail for a checkout directory whose name
|
|
58
|
+
* happens to contain the marker word.
|
|
59
|
+
*/
|
|
60
|
+
export const DIAG_RE =
|
|
61
|
+
/^([0-9]{2}:[0-9]{2}:[0-9]{2}(\.[0-9]+)? +[A-Z]+ +[^ ]+ +)?Invalid |Could not resolve|^\s+Line [0-9]+:/m;
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* The environment likec4 runs under. Under CI it switches to a timestamped, ANSI-coloured
|
|
65
|
+
* reporter; CI and FORCE_COLOR are dropped and NO_COLOR set so the diagnostics reach
|
|
66
|
+
* `DIAG_RE` plain. `assessRender` also strips ANSI, so either defence alone holds.
|
|
67
|
+
*/
|
|
68
|
+
export function likec4ChildEnv(base: NodeJS.ProcessEnv): NodeJS.ProcessEnv {
|
|
69
|
+
const env: NodeJS.ProcessEnv = { ...base, NO_COLOR: "1" };
|
|
70
|
+
delete env.CI;
|
|
71
|
+
delete env.FORCE_COLOR;
|
|
72
|
+
return env;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const ANSI_RE = /\x1b\[[0-9;]*m/g;
|
|
76
|
+
|
|
77
|
+
/** Marker sentinel for the C4 producer. */
|
|
78
|
+
export const C4_MARKER = "SOLEUR_KB_SYNC_C4";
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Every numeric field the C4 marker emits, in emission order.
|
|
82
|
+
*
|
|
83
|
+
* ‼️ ALL of them appear on EVERY branch, even when the value is zero. The first
|
|
84
|
+
* version emitted a different field set per branch — `generated_*` and `published`
|
|
85
|
+
* only on the render path, `detail` only on the unavailable path, `docs` sometimes —
|
|
86
|
+
* so an agent parsing a fixed key set got missing keys with no way to tell
|
|
87
|
+
* absent-because-zero from absent-because-branch. `MARKER_FIELDS` in kb-coverage.ts
|
|
88
|
+
* already did this correctly; this is that pattern applied to the sibling producer,
|
|
89
|
+
* with a drift guard asserting both.
|
|
90
|
+
*/
|
|
91
|
+
export const C4_MARKER_FIELDS = [
|
|
92
|
+
"elements",
|
|
93
|
+
"relationships",
|
|
94
|
+
"generated_components",
|
|
95
|
+
"generated_relationships",
|
|
96
|
+
"skipped",
|
|
97
|
+
"seeded",
|
|
98
|
+
"published",
|
|
99
|
+
] as const;
|
|
100
|
+
|
|
101
|
+
export type C4MarkerCounts = Record<(typeof C4_MARKER_FIELDS)[number], number>;
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Build the C4 marker. One formatter, so no branch can omit a field.
|
|
105
|
+
*
|
|
106
|
+
* `reason` is a BARE TOKEN and `detail` carries prose — a consumer classifies on
|
|
107
|
+
* `reason=` without string-matching a sentence.
|
|
108
|
+
*/
|
|
109
|
+
export function formatC4Marker(
|
|
110
|
+
status: RenderVerdict["status"],
|
|
111
|
+
counts: C4MarkerCounts,
|
|
112
|
+
reason?: string,
|
|
113
|
+
detail?: string,
|
|
114
|
+
): string {
|
|
115
|
+
const head =
|
|
116
|
+
`${C4_MARKER} status=${status}` +
|
|
117
|
+
(reason ? ` reason=${reason}` : "") +
|
|
118
|
+
(detail ? ` detail="${detail.replace(/"/g, "'").replace(/\s+/g, " ").trim()}"` : "");
|
|
119
|
+
const fields = C4_MARKER_FIELDS.map((f) => `${f}=${counts[f]}`).join(" ");
|
|
120
|
+
return `${head} ${fields}`;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export type DepSource = "frontmatter" | "links" | "none";
|
|
124
|
+
|
|
125
|
+
export type ParsedComponent = {
|
|
126
|
+
/** Sanitized LikeC4 identifier (alphanumeric, camelCase). */
|
|
127
|
+
id: string;
|
|
128
|
+
/** Original kebab-case `component:` value — the key dependencies refer to. */
|
|
129
|
+
name: string;
|
|
130
|
+
/** Human-readable title for the diagram node. */
|
|
131
|
+
title: string;
|
|
132
|
+
/** Resolved dependency names, sorted. */
|
|
133
|
+
deps: string[];
|
|
134
|
+
/**
|
|
135
|
+
* Where `deps` came from. `"frontmatter"` with an empty list means the author
|
|
136
|
+
* DECLARED no dependencies; `"none"` means they declared nothing at all. The
|
|
137
|
+
* coverage summary needs that distinction — a corpus of silent docs must not
|
|
138
|
+
* read as a corpus of genuine leaves.
|
|
139
|
+
*/
|
|
140
|
+
depSource: DepSource;
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
export type Edge = { from: string; to: string };
|
|
144
|
+
|
|
145
|
+
export type RenderVerdict = {
|
|
146
|
+
status: "ok" | "degraded" | "failed";
|
|
147
|
+
/**
|
|
148
|
+
* A BARE TOKEN, never free prose. A consumer classifies on this, and the previous
|
|
149
|
+
* form emitted a quoted sentence — so a `reason=(\S+)` regex yielded `"0`.
|
|
150
|
+
* Human-readable context belongs in `detail`.
|
|
151
|
+
*/
|
|
152
|
+
reason?: string;
|
|
153
|
+
detail?: string;
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
// ---------------------------------------------------------------------------
|
|
157
|
+
// frontmatter
|
|
158
|
+
// ---------------------------------------------------------------------------
|
|
159
|
+
|
|
160
|
+
type Frontmatter = {
|
|
161
|
+
component?: string;
|
|
162
|
+
status?: string;
|
|
163
|
+
/** `undefined` = absent; `[]` = explicitly declared empty. */
|
|
164
|
+
dependencies?: string[];
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
function splitFrontmatter(source: string): string | null {
|
|
168
|
+
if (!source.startsWith("---")) return null;
|
|
169
|
+
const end = source.indexOf("\n---", 3);
|
|
170
|
+
if (end === -1) return null;
|
|
171
|
+
return source.slice(source.indexOf("\n") + 1, end);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
function parseFrontmatter(source: string): Frontmatter {
|
|
175
|
+
const block = splitFrontmatter(source);
|
|
176
|
+
if (block === null) return {};
|
|
177
|
+
|
|
178
|
+
const fm: Frontmatter = {};
|
|
179
|
+
const lines = block.split("\n");
|
|
180
|
+
|
|
181
|
+
for (let i = 0; i < lines.length; i++) {
|
|
182
|
+
const line = lines[i];
|
|
183
|
+
const kv = line.match(/^([A-Za-z_][A-Za-z0-9_]*):[ \t]*(.*)$/);
|
|
184
|
+
if (!kv) continue;
|
|
185
|
+
const key = kv[1];
|
|
186
|
+
const inline = kv[2].trim();
|
|
187
|
+
|
|
188
|
+
if (key === "component" || key === "status") {
|
|
189
|
+
fm[key] = inline.replace(/^["']|["']$/g, "");
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
if (key !== "dependencies") continue;
|
|
194
|
+
|
|
195
|
+
// Inline form: `dependencies: []` or `dependencies: [a, b]`.
|
|
196
|
+
if (inline.startsWith("[")) {
|
|
197
|
+
const inner = inline.slice(1, inline.lastIndexOf("]")).trim();
|
|
198
|
+
fm.dependencies = inner === "" ? [] : inner.split(",").map((s) => s.trim()).filter(Boolean);
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// Block form: collect the following ` - item` lines. An empty value with no
|
|
203
|
+
// following items is still a DECLARATION, so seed with [].
|
|
204
|
+
const items: string[] = [];
|
|
205
|
+
for (let j = i + 1; j < lines.length; j++) {
|
|
206
|
+
const item = lines[j].match(/^[ \t]+-[ \t]+(.*)$/);
|
|
207
|
+
if (!item) break;
|
|
208
|
+
const v = item[1].trim().replace(/^["']|["']$/g, "");
|
|
209
|
+
if (v) items.push(v);
|
|
210
|
+
}
|
|
211
|
+
fm.dependencies = items;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
return fm;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// ---------------------------------------------------------------------------
|
|
218
|
+
// parsing
|
|
219
|
+
// ---------------------------------------------------------------------------
|
|
220
|
+
|
|
221
|
+
/** Sanitize a kebab-case component name into a LikeC4 identifier. */
|
|
222
|
+
export function toId(name: string): string {
|
|
223
|
+
const parts = name.split(/[^A-Za-z0-9]+/).filter(Boolean);
|
|
224
|
+
if (parts.length === 0) return "component";
|
|
225
|
+
const head = parts[0].toLowerCase();
|
|
226
|
+
const tail = parts.slice(1).map((p) => p[0].toUpperCase() + p.slice(1).toLowerCase());
|
|
227
|
+
const id = head + tail.join("");
|
|
228
|
+
return /^[0-9]/.test(id) ? `c${id}` : id;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
function titleFor(name: string): string {
|
|
232
|
+
return name
|
|
233
|
+
.split(/[^A-Za-z0-9]+/)
|
|
234
|
+
.filter(Boolean)
|
|
235
|
+
.map((p) => p[0].toUpperCase() + p.slice(1))
|
|
236
|
+
.join(" ");
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Parse one component doc. Returns `null` for a `status: deprecated` doc —
|
|
241
|
+
* sync.md's contract is "Removed components: add `status: deprecated` (do not
|
|
242
|
+
* delete)", so without this filter the element set accretes deleted components
|
|
243
|
+
* forever and their declared dependencies create dangling edges.
|
|
244
|
+
*/
|
|
245
|
+
export function parseComponentDoc(source: string, fallbackName: string): ParsedComponent | null {
|
|
246
|
+
const fm = parseFrontmatter(source);
|
|
247
|
+
if (fm.status === "deprecated") return null;
|
|
248
|
+
|
|
249
|
+
const name = fm.component ?? fallbackName;
|
|
250
|
+
|
|
251
|
+
let deps: string[];
|
|
252
|
+
let depSource: DepSource;
|
|
253
|
+
|
|
254
|
+
if (fm.dependencies !== undefined) {
|
|
255
|
+
deps = fm.dependencies;
|
|
256
|
+
depSource = "frontmatter";
|
|
257
|
+
} else {
|
|
258
|
+
// Fallback for docs written before the frontmatter contract: extract markdown
|
|
259
|
+
// links from the prose `**Internal**` line. Prose without links yields
|
|
260
|
+
// nothing — deliberately. Inferring edges from prose would invent
|
|
261
|
+
// architecture, which is worse than reporting degraded.
|
|
262
|
+
const internal = source.match(/^[ \t]*[-*][ \t]*\*\*Internal\*\*[ \t]*:(.*)$/m);
|
|
263
|
+
const links = internal ? [...internal[1].matchAll(/\[([^\]]+)\]\([^)]*\)/g)] : [];
|
|
264
|
+
if (links.length > 0) {
|
|
265
|
+
deps = links.map((m) => m[1].trim());
|
|
266
|
+
depSource = "links";
|
|
267
|
+
} else {
|
|
268
|
+
deps = [];
|
|
269
|
+
depSource = "none";
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
const unique = [...new Set(deps.filter((d) => d && d !== name))].sort();
|
|
274
|
+
|
|
275
|
+
return { id: toId(name), name, title: titleFor(name), deps: unique, depSource };
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/** Load and parse every `*.md` in a directory, dropping deprecated docs. Sorted by name. */
|
|
279
|
+
export function loadComponentDir(dir: string): ParsedComponent[] {
|
|
280
|
+
const files = readdirSync(dir)
|
|
281
|
+
.filter((f) => f.endsWith(".md") && f !== "README.md")
|
|
282
|
+
.sort();
|
|
283
|
+
|
|
284
|
+
const docs: ParsedComponent[] = [];
|
|
285
|
+
for (const f of files) {
|
|
286
|
+
const parsed = parseComponentDoc(readFileSync(join(dir, f), "utf8"), f.replace(/\.md$/, ""));
|
|
287
|
+
if (parsed) docs.push(parsed);
|
|
288
|
+
}
|
|
289
|
+
return docs.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// ---------------------------------------------------------------------------
|
|
293
|
+
// edges
|
|
294
|
+
// ---------------------------------------------------------------------------
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Build the edge set, dropping any dependency whose target is not a live element.
|
|
298
|
+
* An edge to a missing or deprecated component makes likec4 emit
|
|
299
|
+
* `Could not resolve …`, which the diagnostic gate treats as a hard failure — so
|
|
300
|
+
* the producer must not emit it in the first place.
|
|
301
|
+
*/
|
|
302
|
+
export function buildEdges(components: ParsedComponent[]): Edge[] {
|
|
303
|
+
const live = new Set(components.map((c) => c.name));
|
|
304
|
+
const edges: Edge[] = [];
|
|
305
|
+
|
|
306
|
+
for (const c of components) {
|
|
307
|
+
for (const dep of c.deps) {
|
|
308
|
+
if (live.has(dep)) edges.push({ from: c.name, to: dep });
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
return edges.sort((a, b) =>
|
|
313
|
+
a.from < b.from ? -1 : a.from > b.from ? 1 : a.to < b.to ? -1 : a.to > b.to ? 1 : 0,
|
|
314
|
+
);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// ---------------------------------------------------------------------------
|
|
318
|
+
// non-destructive write contract
|
|
319
|
+
// ---------------------------------------------------------------------------
|
|
320
|
+
|
|
321
|
+
/**
|
|
322
|
+
* True when the producer may write this path. `/soleur:architecture` writes
|
|
323
|
+
* spec.c4 / model.c4 / views.c4 cwd-relative, and the agent sandbox pins
|
|
324
|
+
* `cwd = workspacePath` — two writers, one directory. A tester who hand-corrects
|
|
325
|
+
* a wrong edge must not have it silently reverted by the next sync.
|
|
326
|
+
*
|
|
327
|
+
* The header must be the FIRST line, not merely present somewhere in the body
|
|
328
|
+
* (cq-assert-anchor-not-bare-token): a hand-authored file that happens to quote
|
|
329
|
+
* the header in a comment is still a hand-authored file.
|
|
330
|
+
*/
|
|
331
|
+
export function canOverwrite(existing: string | null): boolean {
|
|
332
|
+
if (existing === null) return true;
|
|
333
|
+
return existing.split("\n", 1)[0].trim() === GENERATED_HEADER;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
// ---------------------------------------------------------------------------
|
|
337
|
+
// generation
|
|
338
|
+
// ---------------------------------------------------------------------------
|
|
339
|
+
|
|
340
|
+
function escapeC4(s: string): string {
|
|
341
|
+
return s.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
/**
|
|
345
|
+
* Emit the composing model file. Deterministic by construction: no timestamp, no
|
|
346
|
+
* run id, sorted inputs — an unchanged component-doc set must produce a
|
|
347
|
+
* byte-identical file, or every sync emits a diff forever.
|
|
348
|
+
*/
|
|
349
|
+
export function generateC4(components: ParsedComponent[], edges: Edge[]): string {
|
|
350
|
+
const byName = new Map(components.map((c) => [c.name, c]));
|
|
351
|
+
const out: string[] = [GENERATED_HEADER, "", "model {", ""];
|
|
352
|
+
|
|
353
|
+
for (const c of components) {
|
|
354
|
+
out.push(` ${c.id} = component "${escapeC4(c.title)}" {`);
|
|
355
|
+
out.push(` description "${escapeC4(`Component: ${c.name}`)}"`);
|
|
356
|
+
out.push(" }");
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
if (edges.length > 0) {
|
|
360
|
+
out.push("");
|
|
361
|
+
for (const e of edges) {
|
|
362
|
+
const from = byName.get(e.from);
|
|
363
|
+
const to = byName.get(e.to);
|
|
364
|
+
if (!from || !to) continue;
|
|
365
|
+
out.push(` ${from.id} -> ${to.id} "depends on"`);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
out.push("}", "");
|
|
370
|
+
return out.join("\n");
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
/**
|
|
374
|
+
* Minimal `specification` block for the `component` element kind the generated model
|
|
375
|
+
* uses. Without it every generated element is an unresolved reference and the render
|
|
376
|
+
* fails.
|
|
377
|
+
*
|
|
378
|
+
* ‼️ The wrapper seeds this only when no file NAMED `spec.c4` exists — it does not
|
|
379
|
+
* scan the directory for an existing `specification` block. That distinction was
|
|
380
|
+
* previously stated the other way round, and the gap is reachable: a repo using the
|
|
381
|
+
* valid single-file LikeC4 layout (its `specification` inside `model.c4`) gets a
|
|
382
|
+
* SECOND `element component` declaration and the whole sync exits 1. Soleur's own
|
|
383
|
+
* diagrams dir has a discrete `spec.c4`, so dogfooding cannot surface it.
|
|
384
|
+
*
|
|
385
|
+
* Left as a filename check deliberately: scanning for a `specification` block means
|
|
386
|
+
* parsing every `.c4` in the directory, and the failure is loud (exit 1 with the
|
|
387
|
+
* likec4 diagnostic naming the duplicate) rather than silent. Recorded here so the
|
|
388
|
+
* next reader sees a known, bounded limitation instead of a false claim.
|
|
389
|
+
*/
|
|
390
|
+
export function generateSpecC4(): string {
|
|
391
|
+
return [
|
|
392
|
+
GENERATED_HEADER,
|
|
393
|
+
"",
|
|
394
|
+
"specification {",
|
|
395
|
+
" element component {",
|
|
396
|
+
' notation "Component"',
|
|
397
|
+
" style {",
|
|
398
|
+
" shape rectangle",
|
|
399
|
+
" }",
|
|
400
|
+
" }",
|
|
401
|
+
"}",
|
|
402
|
+
"",
|
|
403
|
+
].join("\n");
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
/** Minimal view so the model renders in the KB viewer. */
|
|
407
|
+
export function generateViewsC4(): string {
|
|
408
|
+
return [
|
|
409
|
+
GENERATED_HEADER,
|
|
410
|
+
"",
|
|
411
|
+
"views {",
|
|
412
|
+
" view generatedComponents {",
|
|
413
|
+
' title "Components (generated from knowledge base)"',
|
|
414
|
+
" include *",
|
|
415
|
+
" }",
|
|
416
|
+
"}",
|
|
417
|
+
"",
|
|
418
|
+
].join("\n");
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
/**
|
|
422
|
+
* The markdown page carrying the view embed. The KB viewer renders a diagram only
|
|
423
|
+
* for a markdown page with a `likec4-view` fence — three .c4 files alone are not
|
|
424
|
+
* enough (api/kb/c4/project/route.ts also returns MODEL_NOT_BUILT without a
|
|
425
|
+
* committed model.likec4.json).
|
|
426
|
+
*/
|
|
427
|
+
export function generateViewPage(viewId = "generatedComponents"): string {
|
|
428
|
+
return [
|
|
429
|
+
"# Components",
|
|
430
|
+
"",
|
|
431
|
+
"Generated by `/soleur:sync c4` from the component docs in",
|
|
432
|
+
"`knowledge-base/project/components/`. Edges come from each doc's",
|
|
433
|
+
"`dependencies:` frontmatter.",
|
|
434
|
+
"",
|
|
435
|
+
"```likec4-view",
|
|
436
|
+
viewId,
|
|
437
|
+
"```",
|
|
438
|
+
"",
|
|
439
|
+
].join("\n");
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
// ---------------------------------------------------------------------------
|
|
443
|
+
// validation
|
|
444
|
+
// ---------------------------------------------------------------------------
|
|
445
|
+
|
|
446
|
+
/**
|
|
447
|
+
* Count elements, relationships, and views in a rendered `model.likec4.json`.
|
|
448
|
+
* `views` feeds `assessRender`'s zero-views gate (#8861).
|
|
449
|
+
*
|
|
450
|
+
* ‼️ The relationship key is `relations`, NOT `relationships`. Reading the wrong
|
|
451
|
+
* key returns `undefined` -> 0, which makes `assessRender` report EVERY corpus as
|
|
452
|
+
* degraded — a gate that always fires is exactly as useless as one that never
|
|
453
|
+
* does, and no unit test over `assessRender` (which takes plain numbers) can see
|
|
454
|
+
* it. `countModelJson` exists so the key mapping itself is pinned by a test
|
|
455
|
+
* against a real likec4 artifact.
|
|
456
|
+
*
|
|
457
|
+
* Non-object shapes yield 0 rather than throwing: likec4 can emit a null/array
|
|
458
|
+
* field, and a bare `Object.keys` on those would silently produce a wrong count.
|
|
459
|
+
*/
|
|
460
|
+
export function countModelJson(json: string): {
|
|
461
|
+
elements: number;
|
|
462
|
+
relationships: number;
|
|
463
|
+
views: number;
|
|
464
|
+
} {
|
|
465
|
+
try {
|
|
466
|
+
const model = JSON.parse(json) as Record<string, unknown>;
|
|
467
|
+
const size = (v: unknown) =>
|
|
468
|
+
v && typeof v === "object" && !Array.isArray(v) ? Object.keys(v).length : 0;
|
|
469
|
+
return {
|
|
470
|
+
elements: size(model.elements),
|
|
471
|
+
relationships: size(model.relations),
|
|
472
|
+
views: size(model.views),
|
|
473
|
+
};
|
|
474
|
+
} catch {
|
|
475
|
+
return { elements: 0, relationships: 0, views: 0 };
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
/**
|
|
480
|
+
* The gates. Order matters: a source fault is a hard failure regardless of
|
|
481
|
+
* counts, an empty model is a failure, a zero-view model is a LAYOUT failure
|
|
482
|
+
* (#8861 — a successful layout always emits at least `index`, so this is the
|
|
483
|
+
* graphviz-fallback/container shape, never the user's source), and only then is
|
|
484
|
+
* a zero-relationship model classified — as `degraded`, never `failed`. The
|
|
485
|
+
* docs are the defect there, not the run, and failing the sync over it would
|
|
486
|
+
* punish the tester for a corpus Soleur itself taught them to write.
|
|
487
|
+
*/
|
|
488
|
+
export function assessRender(input: {
|
|
489
|
+
diagnostics: string;
|
|
490
|
+
/** Elements in the RENDERED model (the whole diagrams dir). Validates non-degeneracy. */
|
|
491
|
+
elementCount: number;
|
|
492
|
+
/**
|
|
493
|
+
* Views in the RENDERED model — the #8861 gate, mirroring c4-render.ts's
|
|
494
|
+
* `counts.views === 0`. Elements-but-no-views means the layout engine failed,
|
|
495
|
+
* so a zero here is `failed`, and it is checked before the
|
|
496
|
+
* generatedRelationships degrade so a broken layout is never published as a
|
|
497
|
+
* "link-free corpus".
|
|
498
|
+
*/
|
|
499
|
+
viewCount: number;
|
|
500
|
+
/** Relationships in the RENDERED model. Reported, but NOT the gate — see below. */
|
|
501
|
+
relationshipCount: number;
|
|
502
|
+
/**
|
|
503
|
+
* Relationships THIS PRODUCER contributed, i.e. `buildEdges(docs).length`.
|
|
504
|
+
*
|
|
505
|
+
* ‼️ THIS is the gate, and using `relationshipCount` was the defect. `likec4
|
|
506
|
+
* export json .` renders the WHOLE diagrams directory, so on any repo that already
|
|
507
|
+
* has a hand-authored `model.c4` the count is dominated by edges the producer did
|
|
508
|
+
* not create. Measured on this repo: 4 component docs with ZERO `dependencies:`
|
|
509
|
+
* frontmatter — the producer contributed 0 relationships — and the merged render
|
|
510
|
+
* reported 135. The zero-relationship gate, which is this module's entire reason
|
|
511
|
+
* for existing, was therefore unreachable in exactly the two-writer scenario the
|
|
512
|
+
* design is built around: it could only ever fire on a fresh diagrams dir, where
|
|
513
|
+
* it is least needed.
|
|
514
|
+
*
|
|
515
|
+
* The producer already knows this number without asking likec4 — it built the edge
|
|
516
|
+
* set. The render's job is validation and artifact production, not counting.
|
|
517
|
+
*/
|
|
518
|
+
generatedRelationships: number;
|
|
519
|
+
}): RenderVerdict {
|
|
520
|
+
const diagnostics = input.diagnostics.replace(ANSI_RE, "");
|
|
521
|
+
if (DIAG_RE.test(diagnostics)) {
|
|
522
|
+
const line = diagnostics.split("\n").find((l) => DIAG_RE.test(l)) ?? "";
|
|
523
|
+
return { status: "failed", reason: "source-fault", detail: line.trim() };
|
|
524
|
+
}
|
|
525
|
+
if (input.elementCount === 0) {
|
|
526
|
+
return { status: "failed", reason: "empty-model", detail: "likec4 produced an empty/degenerate model" };
|
|
527
|
+
}
|
|
528
|
+
if (input.viewCount === 0) {
|
|
529
|
+
// A layout failure with no diagnostic the source-fault arm could claim —
|
|
530
|
+
// the likec4 output tail is the only evidence the agent gets, so carry a
|
|
531
|
+
// trimmed copy on the wire (the marker collapses whitespace anyway).
|
|
532
|
+
const tail = diagnostics
|
|
533
|
+
.split("\n")
|
|
534
|
+
.filter(Boolean)
|
|
535
|
+
.slice(-5)
|
|
536
|
+
.join(" | ")
|
|
537
|
+
.slice(0, 300);
|
|
538
|
+
return {
|
|
539
|
+
status: "failed",
|
|
540
|
+
reason: "zero-views",
|
|
541
|
+
detail: `likec4 produced a model with elements but no views — a layout failure, not a source fault${tail ? ` — last output: ${tail}` : ""}`,
|
|
542
|
+
};
|
|
543
|
+
}
|
|
544
|
+
if (input.generatedRelationships === 0) {
|
|
545
|
+
return {
|
|
546
|
+
status: "degraded",
|
|
547
|
+
reason: "no-generated-relationships",
|
|
548
|
+
detail:
|
|
549
|
+
"component docs declare no parseable dependencies, so this producer " +
|
|
550
|
+
"contributed a set of disconnected boxes",
|
|
551
|
+
};
|
|
552
|
+
}
|
|
553
|
+
return { status: "ok" };
|
|
554
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* /go routing dispatch — maps classified intent labels to registered skills/agents.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the eval-gate routing table in plugins/soleur/commands/go.md.
|
|
5
|
+
* Golden-path eval (Phase F #6325) asserts Grok slash_command dispatch fidelity.
|
|
6
|
+
* Anti-bypass contract (#6338): routes resolve via workflow-fidelity.ts.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { invokeSkill, spawnAgent, type SkillInvocation, type AgentSpawn } from "./harness";
|
|
10
|
+
import { GO_SKILL_ROUTES, resolveGoSkillRoute } from "./workflow-fidelity";
|
|
11
|
+
|
|
12
|
+
export { GO_SKILL_ROUTES, resolveGoSkillRoute };
|
|
13
|
+
|
|
14
|
+
/** Agent routes (spawn_subagent / Task — never improvised workflows). */
|
|
15
|
+
export const GO_AGENT_ROUTES: Record<string, string> = {
|
|
16
|
+
"clo-attestation": "clo",
|
|
17
|
+
"legal-threshold": "clo",
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export type GoRouteTarget =
|
|
21
|
+
| { kind: "skill"; skill: string }
|
|
22
|
+
| { kind: "agent"; agent: string };
|
|
23
|
+
|
|
24
|
+
/** Resolve a classified routing label to its registered target. */
|
|
25
|
+
export function resolveGoRoute(label: string): GoRouteTarget {
|
|
26
|
+
if (label in GO_AGENT_ROUTES) {
|
|
27
|
+
return { kind: "agent", agent: GO_AGENT_ROUTES[label] };
|
|
28
|
+
}
|
|
29
|
+
return { kind: "skill", skill: resolveGoSkillRoute(label) };
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export type GoDispatch =
|
|
33
|
+
| { kind: "skill"; invocation: SkillInvocation }
|
|
34
|
+
| { kind: "agent"; spawn: AgentSpawn };
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Dispatch a classified /go route under the active harness.
|
|
38
|
+
* Pass `env` in tests to pin Grok vs Claude without mutating process.env.
|
|
39
|
+
*/
|
|
40
|
+
export function dispatchGoRoute(
|
|
41
|
+
label: string,
|
|
42
|
+
userInput: string,
|
|
43
|
+
env?: NodeJS.ProcessEnv,
|
|
44
|
+
): GoDispatch {
|
|
45
|
+
const target = resolveGoRoute(label);
|
|
46
|
+
const prev = { ...process.env };
|
|
47
|
+
|
|
48
|
+
if (env) {
|
|
49
|
+
for (const key of Object.keys(process.env)) {
|
|
50
|
+
if (!(key in env)) delete process.env[key];
|
|
51
|
+
}
|
|
52
|
+
Object.assign(process.env, env);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
try {
|
|
56
|
+
if (target.kind === "agent") {
|
|
57
|
+
return { kind: "agent", spawn: spawnAgent(target.agent, userInput) };
|
|
58
|
+
}
|
|
59
|
+
return { kind: "skill", invocation: invokeSkill(target.skill, userInput) };
|
|
60
|
+
} finally {
|
|
61
|
+
for (const key of Object.keys(process.env)) {
|
|
62
|
+
if (!(key in prev)) delete process.env[key];
|
|
63
|
+
}
|
|
64
|
+
Object.assign(process.env, prev);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** Pin harness for deterministic golden-path tests. */
|
|
69
|
+
export function grokTestEnv(): NodeJS.ProcessEnv {
|
|
70
|
+
return { GROK_HOME: "/home/user/.grok" };
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export function claudeTestEnv(): NodeJS.ProcessEnv {
|
|
74
|
+
return { CLAUDECODE: "1" };
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** Expected Grok slash command for a skill route (golden-path assertion). */
|
|
78
|
+
export function expectedGrokSlashCommand(skill: string, args?: string): string {
|
|
79
|
+
const trimmed = args?.trim();
|
|
80
|
+
return trimmed ? `/${skill} ${trimmed}` : `/${skill}`;
|
|
81
|
+
}
|