@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,442 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
// CLI wrapper for the C4 producer (#7332, plan Phase 1). Pure logic lives in
|
|
3
|
+
// ../lib/c4-from-components.ts; this file owns the filesystem and the likec4
|
|
4
|
+
// invocation, mirroring the heartbeat-live-reconcile.ts -> reconcile-live-
|
|
5
|
+
// heartbeats.ts split.
|
|
6
|
+
//
|
|
7
|
+
// Reads component docs, writes a distinct composing `.c4` file (never the
|
|
8
|
+
// canonical three — /soleur:architecture owns those and the sandbox pins
|
|
9
|
+
// cwd = workspacePath, so they have two writers), renders via the pinned likec4
|
|
10
|
+
// CLI, and prints a structured `SOLEUR_KB_SYNC_C4` marker to stdout.
|
|
11
|
+
//
|
|
12
|
+
// Exit contract:
|
|
13
|
+
// 0 OK — rendered, elements > 0, relationships > 0
|
|
14
|
+
// 0 DEGRADED — rendered but 0 relationships; or writes skipped because a
|
|
15
|
+
// target was hand-edited; or likec4 unreachable. NOT a failure:
|
|
16
|
+
// the docs (or the sandbox) are the defect, not the run, and a
|
|
17
|
+
// hard error here would fail a tester's whole sync over a corpus
|
|
18
|
+
// Soleur itself taught them to write.
|
|
19
|
+
// 1 ERROR — likec4 reported a source fault, or produced an empty or
|
|
20
|
+
// zero-view model (elements-but-no-views is a layout failure).
|
|
21
|
+
//
|
|
22
|
+
// Observability: layer 7 (`cli-stdout-artifact`). There is no Soleur-side sink for
|
|
23
|
+
// this surface and there must not be one — see ADR-171 §Observability boundary.
|
|
24
|
+
|
|
25
|
+
import { spawnSync } from "node:child_process";
|
|
26
|
+
import { lstatSync, mkdirSync, mkdtempSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs";
|
|
27
|
+
import { tmpdir } from "node:os";
|
|
28
|
+
import { join } from "node:path";
|
|
29
|
+
|
|
30
|
+
import {
|
|
31
|
+
type C4MarkerCounts,
|
|
32
|
+
type RenderVerdict,
|
|
33
|
+
LIKEC4_BEFORE,
|
|
34
|
+
LIKEC4_VERSION,
|
|
35
|
+
assessRender,
|
|
36
|
+
buildEdges,
|
|
37
|
+
canOverwrite,
|
|
38
|
+
countModelJson,
|
|
39
|
+
formatC4Marker,
|
|
40
|
+
generateC4,
|
|
41
|
+
generateSpecC4,
|
|
42
|
+
generateViewPage,
|
|
43
|
+
generateViewsC4,
|
|
44
|
+
likec4ChildEnv,
|
|
45
|
+
loadComponentDir,
|
|
46
|
+
} from "../lib/c4-from-components";
|
|
47
|
+
import { canonicalizeC4Model } from "../lib/c4-canonical.mjs";
|
|
48
|
+
|
|
49
|
+
const COMPONENTS_DIR = "knowledge-base/project/components";
|
|
50
|
+
const DIAGRAMS_DIR = "knowledge-base/engineering/architecture/diagrams";
|
|
51
|
+
const GENERATED_MODEL = "generated-components.c4";
|
|
52
|
+
const MODEL_JSON = "model.likec4.json";
|
|
53
|
+
const VIEW_PAGE = "c4-model.md";
|
|
54
|
+
// A cold `npx -y likec4@…` install was MEASURED at 151s and just-under-120s on the
|
|
55
|
+
// same machine — i.e. the old 120s budget straddled the install it wraps, making a
|
|
56
|
+
// customer's FIRST sync a bandwidth coin flip. The render itself is separately slow
|
|
57
|
+
// on dense corpora (30 components/90 relationships = 13.9s; 35 = timeout at 120s).
|
|
58
|
+
// 600s covers both without hiding a genuine hang: the timeout arm is reported, not
|
|
59
|
+
// swallowed, and reports `render-timeout` rather than blaming the CLI.
|
|
60
|
+
const RENDER_TIMEOUT_MS = 600_000;
|
|
61
|
+
|
|
62
|
+
// `spawnSync`'s default maxBuffer is 1 MiB. Exceeding it sets `error` and kills the
|
|
63
|
+
// child, which routed a >1MiB diagnostic stream into the `likec4-unavailable` arm —
|
|
64
|
+
// downgrading `failed` to `degraded` (exit 0). That is a fail-open in the exact
|
|
65
|
+
// diagnostic gate this producer exists to provide, on the corpus most likely to be
|
|
66
|
+
// broken. Measured: a 3 MiB child stdout yields status:null + ENOBUFS.
|
|
67
|
+
const RENDER_MAX_BUFFER = 32 * 1024 * 1024;
|
|
68
|
+
|
|
69
|
+
/** Collapse to one line — a marker must be greppable as a single record. */
|
|
70
|
+
function oneLine(s: string): string {
|
|
71
|
+
return s.replace(/\s+/g, " ").trim();
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** All-zero counts, so every branch emits the FULL field set. */
|
|
75
|
+
function zeroCounts(): C4MarkerCounts {
|
|
76
|
+
return {
|
|
77
|
+
elements: 0,
|
|
78
|
+
relationships: 0,
|
|
79
|
+
generated_components: 0,
|
|
80
|
+
generated_relationships: 0,
|
|
81
|
+
skipped: 0,
|
|
82
|
+
seeded: 0,
|
|
83
|
+
published: 0,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
type WriteOutcome =
|
|
88
|
+
| "written"
|
|
89
|
+
| "skipped-hand-edited"
|
|
90
|
+
| "skipped-exists"
|
|
91
|
+
| "skipped-symlink"
|
|
92
|
+
| "unchanged";
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Outcomes where the producer REFUSED to write something it otherwise would have.
|
|
96
|
+
*
|
|
97
|
+
* `skipped-exists` is deliberately NOT here. The seed artifacts (spec.c4, views.c4,
|
|
98
|
+
* c4-model.md) exist on every run after the first, so counting that as a refusal made
|
|
99
|
+
* every repeat sync report `degraded` — the steady state misreported as a problem.
|
|
100
|
+
* It is still surfaced separately in the marker as `seeded=`, because "a file is
|
|
101
|
+
* already there" and "I declined to touch your work" are different facts.
|
|
102
|
+
*/
|
|
103
|
+
const REFUSED_OUTCOMES: readonly WriteOutcome[] = ["skipped-hand-edited", "skipped-symlink"];
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Read a file, or `null` when it does not exist.
|
|
107
|
+
*
|
|
108
|
+
* ONE syscall, deliberately — `existsSync(p) ? readFileSync(p) : null` is a
|
|
109
|
+
* check-then-use race (CodeQL `js/file-system-race`, flagged high on this file).
|
|
110
|
+
* That matters more here than the generic case: the caller's whole purpose is to
|
|
111
|
+
* decide whether a file is hand-edited, so a stale answer between the check and
|
|
112
|
+
* the read is precisely the state that would let the producer clobber an operator's
|
|
113
|
+
* correction — the one outcome the guard exists to prevent.
|
|
114
|
+
*/
|
|
115
|
+
function readOrNull(path: string): string | null {
|
|
116
|
+
try {
|
|
117
|
+
return readFileSync(path, "utf8");
|
|
118
|
+
} catch (err) {
|
|
119
|
+
if ((err as NodeJS.ErrnoException).code === "ENOENT") return null;
|
|
120
|
+
throw err;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* True when `path` is a symlink. Uses `lstat`, which does NOT follow the link.
|
|
126
|
+
*
|
|
127
|
+
* ‼️ WHY THIS EXISTS. Without it the producer performs an ARBITRARY FILE WRITE.
|
|
128
|
+
* Reproduced: plant a DANGLING symlink at `generated-components.c4` pointing
|
|
129
|
+
* anywhere (`../../../../.bashrc`); `readOrNull` gets ENOENT and returns null,
|
|
130
|
+
* `canOverwrite(null)` returns true, and `writeFileSync`'s default `w` flag
|
|
131
|
+
* (O_CREAT|O_TRUNC) FOLLOWS the link and creates the victim file with producer
|
|
132
|
+
* content — which embeds an attacker-chosen line from a doc's `component:`
|
|
133
|
+
* frontmatter. A directory symlink on the diagrams dir relocates all four writes.
|
|
134
|
+
*
|
|
135
|
+
* The check must be lstat, not "does it exist": a dangling link is exactly the
|
|
136
|
+
* dangerous case and is invisible to every existence test.
|
|
137
|
+
*/
|
|
138
|
+
function isSymlink(path: string): boolean {
|
|
139
|
+
try {
|
|
140
|
+
return lstatSync(path).isSymbolicLink();
|
|
141
|
+
} catch (err) {
|
|
142
|
+
if ((err as NodeJS.ErrnoException).code === "ENOENT") return false;
|
|
143
|
+
throw err;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Create a file only if it does not already exist, atomically.
|
|
149
|
+
*
|
|
150
|
+
* `wx` is `O_CREAT|O_EXCL`, so the existence test and the create are one
|
|
151
|
+
* indivisible operation — a separate `existsSync` guard would reintroduce the
|
|
152
|
+
* same race. Used for the seed artifacts (`spec.c4`, `views.c4`, the view page),
|
|
153
|
+
* where the rule is strictly "never touch an existing one".
|
|
154
|
+
*/
|
|
155
|
+
function writeIfAbsent(path: string, content: string): WriteOutcome {
|
|
156
|
+
if (isSymlink(path)) return "skipped-symlink";
|
|
157
|
+
try {
|
|
158
|
+
writeFileSync(path, content, { flag: "wx" });
|
|
159
|
+
return "written";
|
|
160
|
+
} catch (err) {
|
|
161
|
+
// EEXIST means a file is already there and we deliberately did not touch it.
|
|
162
|
+
// That is NOT "unchanged" — a hand-authored views.c4 carrying the operator's
|
|
163
|
+
// own view set would otherwise be indistinguishable from a no-op, and the
|
|
164
|
+
// skipped count could never see it.
|
|
165
|
+
if ((err as NodeJS.ErrnoException).code === "EEXIST") return "skipped-exists";
|
|
166
|
+
throw err;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Write only if the existing file carries the GENERATED header (or is absent).
|
|
172
|
+
* Returns `unchanged` when the bytes already match, so an unchanged KB produces
|
|
173
|
+
* no diff — the same determinism requirement kb-coverage.md carries.
|
|
174
|
+
*/
|
|
175
|
+
function guardedWrite(path: string, content: string): WriteOutcome {
|
|
176
|
+
// Refuse symlinks outright — see isSymlink. A dangling link reads as ENOENT,
|
|
177
|
+
// so without this the "is it hand-edited?" question is answered about a file
|
|
178
|
+
// that is not the file we are about to write.
|
|
179
|
+
if (isSymlink(path)) return "skipped-symlink";
|
|
180
|
+
const existing = readOrNull(path);
|
|
181
|
+
if (!canOverwrite(existing)) return "skipped-hand-edited";
|
|
182
|
+
if (existing === content) return "unchanged";
|
|
183
|
+
writeFileSync(path, content);
|
|
184
|
+
return "written";
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
function countModel(jsonPath: string): { elements: number; relationships: number; views: number } {
|
|
188
|
+
const json = readOrNull(jsonPath);
|
|
189
|
+
return json === null ? { elements: 0, relationships: 0, views: 0 } : countModelJson(json);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
export function runProducer(root: string): { code: number; marker: string } {
|
|
193
|
+
const componentsDir = join(root, COMPONENTS_DIR);
|
|
194
|
+
const diagramsDir = join(root, DIAGRAMS_DIR);
|
|
195
|
+
|
|
196
|
+
// Attempt the read and classify ENOENT, rather than probing with existsSync and
|
|
197
|
+
// reading afterwards — same check-then-use class as readOrNull above. "No
|
|
198
|
+
// component docs" is a degraded run, not an error: a repo that has not been
|
|
199
|
+
// synced yet simply has nothing to draw.
|
|
200
|
+
let docs;
|
|
201
|
+
try {
|
|
202
|
+
docs = loadComponentDir(componentsDir);
|
|
203
|
+
} catch (err) {
|
|
204
|
+
if ((err as NodeJS.ErrnoException).code !== "ENOENT") throw err;
|
|
205
|
+
return {
|
|
206
|
+
code: 0,
|
|
207
|
+
marker: formatC4Marker("degraded", zeroCounts(), "no-component-docs"),
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
const edges = buildEdges(docs);
|
|
212
|
+
|
|
213
|
+
mkdirSync(diagramsDir, { recursive: true });
|
|
214
|
+
|
|
215
|
+
const outcomes: Record<string, WriteOutcome> = {};
|
|
216
|
+
outcomes[GENERATED_MODEL] = guardedWrite(join(diagramsDir, GENERATED_MODEL), generateC4(docs, edges));
|
|
217
|
+
|
|
218
|
+
// spec.c4 / views.c4 / the view page are seeded ONLY when absent. A repo that
|
|
219
|
+
// already ran /soleur:architecture has hand-authored ones; a second
|
|
220
|
+
// `specification` block would collide, and overwriting the view set would drop
|
|
221
|
+
// the operator's views. `writeIfAbsent` makes the test-and-create atomic (O_EXCL)
|
|
222
|
+
// rather than an existsSync check-then-write race.
|
|
223
|
+
outcomes["spec.c4"] = writeIfAbsent(join(diagramsDir, "spec.c4"), generateSpecC4());
|
|
224
|
+
outcomes["views.c4"] = writeIfAbsent(join(diagramsDir, "views.c4"), generateViewsC4());
|
|
225
|
+
outcomes[VIEW_PAGE] = writeIfAbsent(join(diagramsDir, VIEW_PAGE), generateViewPage());
|
|
226
|
+
|
|
227
|
+
// `skipped` counts REFUSALS (we would have written, and did not). `seeded` counts
|
|
228
|
+
// targets that already existed — the normal steady state, reported but not a degrade.
|
|
229
|
+
const skipped = Object.values(outcomes).filter((o) => REFUSED_OUTCOMES.includes(o)).length;
|
|
230
|
+
const seeded = Object.values(outcomes).filter((o) => o === "skipped-exists").length;
|
|
231
|
+
|
|
232
|
+
// ‼️ RENDER OFF-TREE, PUBLISH ONLY AFTER THE GATE PASSES.
|
|
233
|
+
//
|
|
234
|
+
// The earlier form rendered IN PLACE (`-o model.likec4.json`, cwd = diagramsDir)
|
|
235
|
+
// and validated the file it had already overwritten. Reproduced: a good 13,109-byte
|
|
236
|
+
// model became 1,001 bytes and THEN the run reported `failed` and exited 1 — the
|
|
237
|
+
// committed artifact was destroyed by the very run that declared the source broken.
|
|
238
|
+
// On this repo the same path replaced a 755,747-byte artifact carrying operator-
|
|
239
|
+
// positioned `manualLayouts` geometry.
|
|
240
|
+
//
|
|
241
|
+
// `render-c4-model.sh` (beside this file) renders to a temp dir for exactly this
|
|
242
|
+
// reason and states it: "On error we never publish, so a broken .c4 can never
|
|
243
|
+
// clobber the good committed artifact." There is a post-mortem in this repo for
|
|
244
|
+
// that clobber having already happened once. The previous version of this file
|
|
245
|
+
// copied that script's DIAG_RE and not its publish discipline.
|
|
246
|
+
//
|
|
247
|
+
// `model.likec4.json` is also the one artifact with no GENERATED header (it is
|
|
248
|
+
// JSON), so it can never route through guardedWrite — publishing it is gated by
|
|
249
|
+
// the render verdict instead.
|
|
250
|
+
const jsonPath = join(diagramsDir, MODEL_JSON);
|
|
251
|
+
const stageDir = mkdtempSync(join(tmpdir(), "soleur-c4-"));
|
|
252
|
+
const stagedJson = join(stageDir, MODEL_JSON);
|
|
253
|
+
|
|
254
|
+
const run = spawnSync(
|
|
255
|
+
"npx",
|
|
256
|
+
// `--ignore-scripts`: the version pin is a VERSION pin, not an integrity pin.
|
|
257
|
+
// `npx -y` resolves likec4's transitive dependencies by semver at run time with
|
|
258
|
+
// no lockfile, so a compromised patch release of any transitive dep would run its
|
|
259
|
+
// postinstall with the operator's privileges and cwd inside the customer's
|
|
260
|
+
// repository. likec4 needs no install scripts to export JSON, so this costs
|
|
261
|
+
// nothing and closes the largest surface the pin does not cover. `--before` resolves
|
|
262
|
+
// the same transitive tree as CI's install (BUMPING LIKEC4 in render-c4-model.sh).
|
|
263
|
+
// `--no-use-dot` pins the wasm layout engine to the server's bytes: inside a
|
|
264
|
+
// container likec4 defaults `use-dot` to the graphviz binary, which is a
|
|
265
|
+
// different layout — or, without graphviz, a zero-view model (#8861).
|
|
266
|
+
["-y", "--ignore-scripts", `--before=${LIKEC4_BEFORE}`, `likec4@${LIKEC4_VERSION}`, "export", "json", "--no-use-dot", "-o", stagedJson, "."],
|
|
267
|
+
{
|
|
268
|
+
cwd: diagramsDir,
|
|
269
|
+
env: likec4ChildEnv(process.env),
|
|
270
|
+
encoding: "utf8",
|
|
271
|
+
timeout: RENDER_TIMEOUT_MS,
|
|
272
|
+
maxBuffer: RENDER_MAX_BUFFER,
|
|
273
|
+
// SIGKILL rather than the default SIGTERM, which `npm exec` can swallow.
|
|
274
|
+
//
|
|
275
|
+
// KNOWN LIMITATION, stated rather than papered over: this signals the DIRECT
|
|
276
|
+
// child only. `spawnSync` has no `detached` option (that is `spawn`-only), so
|
|
277
|
+
// the `likec4` grandchild behind npm's shim layers can outlive the timeout —
|
|
278
|
+
// measured at 405s/263s/143s past a 120s budget, each pinning a core. Raising
|
|
279
|
+
// RENDER_TIMEOUT_MS above the measured cold-install worst case makes the
|
|
280
|
+
// timeout arm rare rather than routine, which is mitigation, not a fix. A real
|
|
281
|
+
// fix means resolving the likec4 binary and spawning it directly instead of
|
|
282
|
+
// through `npm exec`; that changes how the version pin is enforced, which the
|
|
283
|
+
// diagnostic gate depends on, so it is deliberately not bundled into this PR.
|
|
284
|
+
killSignal: "SIGKILL",
|
|
285
|
+
},
|
|
286
|
+
);
|
|
287
|
+
|
|
288
|
+
// A timeout is NOT "the CLI is unavailable". Reporting it as such sends an operator
|
|
289
|
+
// hunting a network fault that does not exist — and the render genuinely does time
|
|
290
|
+
// out on dense corpora (measured: 30 components/90 relationships = 13.9s, 35 =
|
|
291
|
+
// timeout). Distinguish the two, and keep both a clean degrade.
|
|
292
|
+
const timedOut = run.error !== undefined && (run.error as NodeJS.ErrnoException).code === "ETIMEDOUT";
|
|
293
|
+
if (run.error || run.status === null) {
|
|
294
|
+
rmSync(stageDir, { recursive: true, force: true });
|
|
295
|
+
const reason = timedOut ? "render-timeout" : "likec4-unavailable";
|
|
296
|
+
// Report the counts from the artifact ALREADY on disk rather than hardcoding 0 —
|
|
297
|
+
// a stale-but-valid model is not the same as no model, and those zeros were being
|
|
298
|
+
// committed into kb-coverage.md as a permanent record of a run that produced
|
|
299
|
+
// nothing.
|
|
300
|
+
const prior = countModel(jsonPath);
|
|
301
|
+
return {
|
|
302
|
+
code: 0,
|
|
303
|
+
marker: formatC4Marker(
|
|
304
|
+
"degraded",
|
|
305
|
+
{
|
|
306
|
+
...zeroCounts(),
|
|
307
|
+
elements: prior.elements,
|
|
308
|
+
relationships: prior.relationships,
|
|
309
|
+
generated_components: docs.length,
|
|
310
|
+
generated_relationships: edges.length,
|
|
311
|
+
skipped,
|
|
312
|
+
seeded,
|
|
313
|
+
},
|
|
314
|
+
reason,
|
|
315
|
+
String(run.error?.message ?? "no exit status"),
|
|
316
|
+
),
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// A non-zero exit with a clean diagnostic stream would otherwise fall through to
|
|
321
|
+
// countModel and read whatever JSON is on disk — a stale good model reported as a
|
|
322
|
+
// fresh success. The shell precedent checks this; the first version did not.
|
|
323
|
+
if (run.status !== 0) {
|
|
324
|
+
rmSync(stageDir, { recursive: true, force: true });
|
|
325
|
+
const prior = countModel(jsonPath);
|
|
326
|
+
return {
|
|
327
|
+
code: 1,
|
|
328
|
+
marker: formatC4Marker(
|
|
329
|
+
"failed",
|
|
330
|
+
{
|
|
331
|
+
...zeroCounts(),
|
|
332
|
+
elements: prior.elements,
|
|
333
|
+
relationships: prior.relationships,
|
|
334
|
+
generated_components: docs.length,
|
|
335
|
+
generated_relationships: edges.length,
|
|
336
|
+
skipped,
|
|
337
|
+
seeded,
|
|
338
|
+
},
|
|
339
|
+
"likec4-nonzero-exit",
|
|
340
|
+
`exit ${run.status}`,
|
|
341
|
+
),
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
// Gate on the STAGED render, never on the published artifact.
|
|
346
|
+
const diagnostics = `${run.stdout ?? ""}\n${run.stderr ?? ""}`;
|
|
347
|
+
const staged = countModel(stagedJson);
|
|
348
|
+
const verdict = assessRender({
|
|
349
|
+
diagnostics,
|
|
350
|
+
elementCount: staged.elements,
|
|
351
|
+
relationshipCount: staged.relationships,
|
|
352
|
+
// A successful layout always emits at least `index`; zero views on a
|
|
353
|
+
// non-empty model is a layout failure (#8861), never the user's source.
|
|
354
|
+
viewCount: staged.views,
|
|
355
|
+
// The GATE. `edges` is this producer's own contribution, computed in-process —
|
|
356
|
+
// the merged render's count is dominated by any hand-authored model.c4 and
|
|
357
|
+
// cannot answer "did MY corpus produce edges?".
|
|
358
|
+
generatedRelationships: edges.length,
|
|
359
|
+
});
|
|
360
|
+
|
|
361
|
+
// A refusal to overwrite is a DEGRADE, not a clean run. sync.md documents
|
|
362
|
+
// `status=degraded` as covering "a hand-edited file was skipped", and the first
|
|
363
|
+
// version computed `skipped` and never passed it to assessRender — so declining to
|
|
364
|
+
// update an operator's hand-corrected diagram reported `status=ok`, and the E2E
|
|
365
|
+
// asserted only `skipped=1`, never the status, so that arm passed on `ok`.
|
|
366
|
+
let effective: RenderVerdict =
|
|
367
|
+
skipped > 0 && verdict.status === "ok"
|
|
368
|
+
? { status: "degraded" as const, reason: "skipped-write-target", detail: undefined }
|
|
369
|
+
: verdict;
|
|
370
|
+
|
|
371
|
+
// Canonicalize the staged render AFTER the gate (never instead of it). This
|
|
372
|
+
// producer is one of three writers of model.likec4.json — with the repo
|
|
373
|
+
// regenerator and the web app's c4-render.ts — and all three must publish the
|
|
374
|
+
// same bytes (one value per line, view hashes blanked; ADR-235, #8542) or
|
|
375
|
+
// each reformats the others' file in the customer's repo. A failure here is
|
|
376
|
+
// `failed`: raw bytes must never replace the committed artifact.
|
|
377
|
+
if (effective.status !== "failed") {
|
|
378
|
+
try {
|
|
379
|
+
writeFileSync(stagedJson, canonicalizeC4Model(readFileSync(stagedJson, "utf8")));
|
|
380
|
+
} catch (err) {
|
|
381
|
+
effective = {
|
|
382
|
+
status: "failed",
|
|
383
|
+
reason: "canonicalize-failed",
|
|
384
|
+
detail: String((err as Error)?.message ?? err).slice(0, 512),
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
// Publish only on a verdict that is not `failed`. A degraded render (0 relationships)
|
|
390
|
+
// is still a correct model of a link-free corpus and SHOULD be published; a failed
|
|
391
|
+
// one must never replace the committed artifact.
|
|
392
|
+
let published = false;
|
|
393
|
+
if (effective.status !== "failed" && !isSymlink(jsonPath)) {
|
|
394
|
+
// Same filesystem as the destination would be ideal for a true rename; across
|
|
395
|
+
// devices Node falls back to copy+unlink, which is still strictly better than
|
|
396
|
+
// writing the CLI's output directly onto the live path.
|
|
397
|
+
try {
|
|
398
|
+
renameSync(stagedJson, jsonPath);
|
|
399
|
+
published = true;
|
|
400
|
+
} catch {
|
|
401
|
+
writeFileSync(jsonPath, readFileSync(stagedJson));
|
|
402
|
+
published = true;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
rmSync(stageDir, { recursive: true, force: true });
|
|
406
|
+
|
|
407
|
+
return {
|
|
408
|
+
code: effective.status === "failed" ? 1 : 0,
|
|
409
|
+
marker: formatC4Marker(
|
|
410
|
+
effective.status,
|
|
411
|
+
{
|
|
412
|
+
elements: staged.elements,
|
|
413
|
+
relationships: staged.relationships,
|
|
414
|
+
generated_components: docs.length,
|
|
415
|
+
generated_relationships: edges.length,
|
|
416
|
+
skipped,
|
|
417
|
+
seeded,
|
|
418
|
+
published: published ? 1 : 0,
|
|
419
|
+
},
|
|
420
|
+
effective.reason,
|
|
421
|
+
effective.detail,
|
|
422
|
+
),
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
// Only auto-run as a CLI; importing for tests must not execute.
|
|
427
|
+
if (import.meta.main) {
|
|
428
|
+
try {
|
|
429
|
+
const { code, marker } = runProducer(process.argv[2] ?? process.cwd());
|
|
430
|
+
console.log(marker);
|
|
431
|
+
process.exit(code);
|
|
432
|
+
} catch (err) {
|
|
433
|
+
console.log(
|
|
434
|
+
oneLine(
|
|
435
|
+
`SOLEUR_KB_SYNC_ERROR producer=c4 reason=uncaught detail="${String(
|
|
436
|
+
(err as Error)?.message ?? err,
|
|
437
|
+
)}"`,
|
|
438
|
+
),
|
|
439
|
+
);
|
|
440
|
+
process.exit(1);
|
|
441
|
+
}
|
|
442
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Grok fidelity CI gate (Phase F #6325).
|
|
3
|
+
#
|
|
4
|
+
# Validates:
|
|
5
|
+
# 1. AGENTS always-loaded byte budget (lint-agents-rule-budget.py — CI test-scripts shard)
|
|
6
|
+
# 2. Agent compat artifacts (sync-grok-agent-compat --check)
|
|
7
|
+
# 3. Static + live grok inspect contract (bun tests)
|
|
8
|
+
# 4. Golden-path /go routing under Grok harness fixture
|
|
9
|
+
#
|
|
10
|
+
# Before `git push` under Grok Build — do not wait for CI test-scripts to fail.
|
|
11
|
+
#
|
|
12
|
+
# Usage: bash plugins/soleur/scripts/grok-fidelity-gate.sh
|
|
13
|
+
set -euo pipefail
|
|
14
|
+
|
|
15
|
+
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." && pwd)"
|
|
16
|
+
PLUGIN_ROOT="$REPO_ROOT/plugins/soleur"
|
|
17
|
+
|
|
18
|
+
cd "$REPO_ROOT"
|
|
19
|
+
|
|
20
|
+
if [[ "${GROK_FIDELITY_SKIP_BUDGET:-}" != "1" ]]; then
|
|
21
|
+
echo "==> AGENTS rule-budget lint (B_ALWAYS <= 46000)"
|
|
22
|
+
python3 scripts/lint-agents-rule-budget.py AGENTS.md AGENTS.rules.md
|
|
23
|
+
else
|
|
24
|
+
echo "==> AGENTS rule-budget lint (skipped — grok-pre-push-gate already ran test-all)"
|
|
25
|
+
fi
|
|
26
|
+
|
|
27
|
+
# Root package.json provides shared deps (e.g. yaml for agent-registry imports).
|
|
28
|
+
npm ci --ignore-scripts
|
|
29
|
+
|
|
30
|
+
cd "$PLUGIN_ROOT"
|
|
31
|
+
|
|
32
|
+
echo "==> sync-grok-agent-compat --check"
|
|
33
|
+
bun run scripts/sync-grok-agent-compat.ts --check
|
|
34
|
+
|
|
35
|
+
echo "==> trust checkout for grok inspect (.grok/commands is skipped in untrusted folders)"
|
|
36
|
+
bun -e 'import { ensureGrokFolderTrusted, REPO_ROOT } from "./lib/grok-inspect-contract.ts"; ensureGrokFolderTrusted(REPO_ROOT);'
|
|
37
|
+
|
|
38
|
+
echo "==> grok inspect contract + golden-path + lifecycle fidelity eval"
|
|
39
|
+
# Scrub the inherited git-location family before starting a test runner (#7833). This is an
|
|
40
|
+
# entry point outside lefthook.yml and scripts/hooks/, so Guard 2 does not see it; the
|
|
41
|
+
# bunfig preload in this directory is the backstop, this line is the prevention.
|
|
42
|
+
unset GIT_DIR GIT_WORK_TREE GIT_INDEX_FILE GIT_COMMON_DIR GIT_OBJECT_DIRECTORY GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_NAMESPACE GIT_TEMPLATE_DIR GIT_EXEC_PATH
|
|
43
|
+
bun test test/grok-inspect-contract.test.ts test/go-routing-golden-path.test.ts test/workflow-fidelity.test.ts test/pr-merge-poll.test.ts
|
|
44
|
+
|
|
45
|
+
if command -v grok >/dev/null 2>&1; then
|
|
46
|
+
echo "==> live grok inspect contract (CLI on PATH)"
|
|
47
|
+
INSPECT_OUT="$(mktemp)"
|
|
48
|
+
trap 'rm -f "$INSPECT_OUT"' EXIT
|
|
49
|
+
(cd "$REPO_ROOT" && grok inspect >"$INSPECT_OUT")
|
|
50
|
+
bun -e "
|
|
51
|
+
import { readFileSync } from 'fs';
|
|
52
|
+
import { parseGrokInspectOutput, validateGrokInspectParsed } from './lib/grok-inspect-contract.ts';
|
|
53
|
+
const out = readFileSync(process.argv[1], 'utf-8');
|
|
54
|
+
const parsed = parseGrokInspectOutput(out);
|
|
55
|
+
const violations = validateGrokInspectParsed(parsed);
|
|
56
|
+
if (violations.length) {
|
|
57
|
+
console.error('grok inspect contract violations:');
|
|
58
|
+
for (const v of violations) console.error(' -', v);
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
console.log('grok inspect contract OK:', parsed.soleurProjectAgentCount, 'project agents,', parsed.soleurPluginSkillCount, 'plugin skills');
|
|
62
|
+
" "$INSPECT_OUT"
|
|
63
|
+
else
|
|
64
|
+
echo "WARNING: grok CLI not on PATH — static artifact tests ran; live inspect skipped"
|
|
65
|
+
exit 1
|
|
66
|
+
fi
|
|
67
|
+
|
|
68
|
+
echo "grok-fidelity-gate: PASS"
|