skilldrop-cli 0.16.3__py3-none-any.whl
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.
- skilldrop_cli/__init__.py +16 -0
- skilldrop_cli/__main__.py +3 -0
- skilldrop_cli/data/LICENSE +9 -0
- skilldrop_cli/data/LICENSE-APACHE +202 -0
- skilldrop_cli/data/LICENSE-MIT +21 -0
- skilldrop_cli/data/agents/README.md +127 -0
- skilldrop_cli/data/agents/code-quality.md +40 -0
- skilldrop_cli/data/agents/devils-advocate.md +40 -0
- skilldrop_cli/data/agents/security-reviewer.md +44 -0
- skilldrop_cli/data/bin/skilldrop.js +2110 -0
- skilldrop_cli/data/catalogue.json +187 -0
- skilldrop_cli/data/contracts/agent.schema.json +28 -0
- skilldrop_cli/data/contracts/catalogue.schema.json +33 -0
- skilldrop_cli/data/contracts/guide.schema.json +18 -0
- skilldrop_cli/data/contracts/loop.schema.json +87 -0
- skilldrop_cli/data/contracts/pack.schema.json +75 -0
- skilldrop_cli/data/contracts/skill.schema.json +110 -0
- skilldrop_cli/data/contracts/terminals.json +33 -0
- skilldrop_cli/data/model-routing.json +474 -0
- skilldrop_cli/data/package.json +46 -0
- skilldrop_cli/data/packs/ai-engineering/pack.json +57 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-adoption-stage/SKILL.md +90 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-adoption-stage/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-adoption-stage/evals/evals.json +19 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-adoption-stage/manifest.json +39 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-budget/SKILL.md +63 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-budget/evals/eval_queries.json +11 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-budget/evals/evals.json +28 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-budget/manifest.json +11 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-budget/templates/budget-spec.md +30 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-loop-design/SKILL.md +70 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-loop-design/evals/eval_queries.json +11 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-loop-design/evals/evals.json +28 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-loop-design/manifest.json +11 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-loop-design/templates/loop-spec.md +46 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-threat-model/SKILL.md +89 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-threat-model/evals/eval_queries.json +15 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-threat-model/evals/evals.json +41 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-threat-model/examples/support-triage-agent.md +117 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-threat-model/manifest.json +11 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-threat-model/reference.md +101 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-threat-model/templates/agent-threat-model.md +71 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-adoption-rollout/SKILL.md +61 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-adoption-rollout/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-adoption-rollout/evals/evals.json +19 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-adoption-rollout/manifest.json +33 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-readiness-assessment/SKILL.md +68 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-readiness-assessment/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-readiness-assessment/evals/evals.json +17 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-readiness-assessment/manifest.json +35 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-usage-policy/SKILL.md +67 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-usage-policy/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-usage-policy/evals/evals.json +19 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-usage-policy/manifest.json +33 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-usage-report/SKILL.md +111 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-usage-report/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-usage-report/evals/evals.json +19 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-usage-report/evals/files/1/northwind-ai-events.csv +4213 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-usage-report/examples/weekly-engineering-team.md +133 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-usage-report/manifest.json +12 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-usage-report/scripts/build_report.py +436 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-usage-report/templates/report-per-user.md +42 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-usage-report/templates/report-team-rollup.md +49 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-usage-report/templates/usage-event-schema.md +76 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-use-case-triage/SKILL.md +59 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-use-case-triage/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-use-case-triage/evals/evals.json +18 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-use-case-triage/manifest.json +34 -0
- skilldrop_cli/data/packs/ai-engineering/skills/llm-eval-harness/SKILL.md +73 -0
- skilldrop_cli/data/packs/ai-engineering/skills/llm-eval-harness/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/ai-engineering/skills/llm-eval-harness/evals/evals.json +19 -0
- skilldrop_cli/data/packs/ai-engineering/skills/llm-eval-harness/manifest.json +11 -0
- skilldrop_cli/data/packs/ai-engineering/skills/llm-eval-harness/reference.md +58 -0
- skilldrop_cli/data/packs/ai-engineering/skills/llm-eval-harness/templates/eval-plan.md +63 -0
- skilldrop_cli/data/packs/ai-engineering/skills/llm-eval-harness/templates/golden-case.jsonl +5 -0
- skilldrop_cli/data/packs/ai-engineering/skills/subagent-design/SKILL.md +69 -0
- skilldrop_cli/data/packs/ai-engineering/skills/subagent-design/evals/eval_queries.json +11 -0
- skilldrop_cli/data/packs/ai-engineering/skills/subagent-design/evals/evals.json +29 -0
- skilldrop_cli/data/packs/ai-engineering/skills/subagent-design/manifest.json +11 -0
- skilldrop_cli/data/packs/ai-engineering/skills/subagent-design/templates/orchestration-plan.md +47 -0
- skilldrop_cli/data/packs/api-builder/pack.json +48 -0
- skilldrop_cli/data/packs/api-builder/skills/eval-harness-generator/SKILL.md +84 -0
- skilldrop_cli/data/packs/api-builder/skills/eval-harness-generator/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/api-builder/skills/eval-harness-generator/evals/evals.json +19 -0
- skilldrop_cli/data/packs/api-builder/skills/eval-harness-generator/evals/files/1/SKILL.md +31 -0
- skilldrop_cli/data/packs/api-builder/skills/eval-harness-generator/manifest.json +11 -0
- skilldrop_cli/data/packs/api-builder/skills/prompt-caching-advisor/SKILL.md +90 -0
- skilldrop_cli/data/packs/api-builder/skills/prompt-caching-advisor/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/api-builder/skills/prompt-caching-advisor/evals/evals.json +19 -0
- skilldrop_cli/data/packs/api-builder/skills/prompt-caching-advisor/manifest.json +11 -0
- skilldrop_cli/data/packs/api-builder/skills/token-budget-estimator/SKILL.md +75 -0
- skilldrop_cli/data/packs/api-builder/skills/token-budget-estimator/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/api-builder/skills/token-budget-estimator/evals/evals.json +18 -0
- skilldrop_cli/data/packs/api-builder/skills/token-budget-estimator/manifest.json +11 -0
- skilldrop_cli/data/packs/api-builder/skills/tool-use-schema-writer/SKILL.md +111 -0
- skilldrop_cli/data/packs/api-builder/skills/tool-use-schema-writer/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/api-builder/skills/tool-use-schema-writer/evals/evals.json +18 -0
- skilldrop_cli/data/packs/api-builder/skills/tool-use-schema-writer/manifest.json +11 -0
- skilldrop_cli/data/packs/converters/pack.json +66 -0
- skilldrop_cli/data/packs/converters/skills/file-to-markdown/SKILL.md +103 -0
- skilldrop_cli/data/packs/converters/skills/file-to-markdown/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/converters/skills/file-to-markdown/evals/evals.json +27 -0
- skilldrop_cli/data/packs/converters/skills/file-to-markdown/evals/files/1/northwind-q3.pptx +0 -0
- skilldrop_cli/data/packs/converters/skills/file-to-markdown/evals/files/2/acme-contract-summary.pdf +93 -0
- skilldrop_cli/data/packs/converters/skills/file-to-markdown/examples/inputs/accounts.json +1 -0
- skilldrop_cli/data/packs/converters/skills/file-to-markdown/examples/inputs/fabrikam-status.html +14 -0
- skilldrop_cli/data/packs/converters/skills/file-to-markdown/examples/mixed-inputs.md +306 -0
- skilldrop_cli/data/packs/converters/skills/file-to-markdown/manifest.json +49 -0
- skilldrop_cli/data/packs/converters/skills/file-to-markdown/scripts/to_markdown.py +1299 -0
- skilldrop_cli/data/packs/converters/skills/md-to-docx/SKILL.md +124 -0
- skilldrop_cli/data/packs/converters/skills/md-to-docx/evals/eval_queries.json +10 -0
- skilldrop_cli/data/packs/converters/skills/md-to-docx/evals/evals.json +29 -0
- skilldrop_cli/data/packs/converters/skills/md-to-docx/evals/files/1/brand/brand.json +80 -0
- skilldrop_cli/data/packs/converters/skills/md-to-docx/evals/files/1/brand/logo-white.png +0 -0
- skilldrop_cli/data/packs/converters/skills/md-to-docx/evals/files/1/brand/logo.png +0 -0
- skilldrop_cli/data/packs/converters/skills/md-to-docx/evals/files/1/brand/mark.png +0 -0
- skilldrop_cli/data/packs/converters/skills/md-to-docx/evals/files/1/docs/vendor-onboarding.md +42 -0
- skilldrop_cli/data/packs/converters/skills/md-to-docx/examples/q3-support-review-input.md +54 -0
- skilldrop_cli/data/packs/converters/skills/md-to-docx/examples/q3-support-review.md +80 -0
- skilldrop_cli/data/packs/converters/skills/md-to-docx/examples/tickets-by-region.png +0 -0
- skilldrop_cli/data/packs/converters/skills/md-to-docx/manifest.json +52 -0
- skilldrop_cli/data/packs/converters/skills/md-to-docx/reference.md +89 -0
- skilldrop_cli/data/packs/converters/skills/md-to-docx/scripts/md_to_docx.py +1114 -0
- skilldrop_cli/data/packs/converters/skills/md-to-html/SKILL.md +100 -0
- skilldrop_cli/data/packs/converters/skills/md-to-html/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/converters/skills/md-to-html/evals/evals.json +18 -0
- skilldrop_cli/data/packs/converters/skills/md-to-html/evals/files/1/brand/brand.json +80 -0
- skilldrop_cli/data/packs/converters/skills/md-to-html/evals/files/1/brand/logo-white.png +0 -0
- skilldrop_cli/data/packs/converters/skills/md-to-html/evals/files/1/brand/logo.png +0 -0
- skilldrop_cli/data/packs/converters/skills/md-to-html/evals/files/1/brand/mark.png +0 -0
- skilldrop_cli/data/packs/converters/skills/md-to-html/evals/files/1/docs/q3-review.md +35 -0
- skilldrop_cli/data/packs/converters/skills/md-to-html/evals/files/1/img/dashboard.png +0 -0
- skilldrop_cli/data/packs/converters/skills/md-to-html/examples/inputs/chart.svg +8 -0
- skilldrop_cli/data/packs/converters/skills/md-to-html/examples/inputs/ops-review.md +48 -0
- skilldrop_cli/data/packs/converters/skills/md-to-html/examples/ops-review.md +83 -0
- skilldrop_cli/data/packs/converters/skills/md-to-html/manifest.json +43 -0
- skilldrop_cli/data/packs/converters/skills/md-to-html/reference.md +70 -0
- skilldrop_cli/data/packs/converters/skills/md-to-html/scripts/md_to_html.py +652 -0
- skilldrop_cli/data/packs/converters/skills/md-to-xlsx/SKILL.md +120 -0
- skilldrop_cli/data/packs/converters/skills/md-to-xlsx/evals/eval_queries.json +9 -0
- skilldrop_cli/data/packs/converters/skills/md-to-xlsx/evals/evals.json +28 -0
- skilldrop_cli/data/packs/converters/skills/md-to-xlsx/evals/files/1/exports/northwind-invoices.csv +25 -0
- skilldrop_cli/data/packs/converters/skills/md-to-xlsx/evals/files/2/reports/q3-ops-review.md +32 -0
- skilldrop_cli/data/packs/converters/skills/md-to-xlsx/examples/vendor-review-input.md +28 -0
- skilldrop_cli/data/packs/converters/skills/md-to-xlsx/examples/vendor-review.md +94 -0
- skilldrop_cli/data/packs/converters/skills/md-to-xlsx/manifest.json +33 -0
- skilldrop_cli/data/packs/converters/skills/md-to-xlsx/reference.md +94 -0
- skilldrop_cli/data/packs/converters/skills/md-to-xlsx/scripts/md_to_xlsx.py +667 -0
- skilldrop_cli/data/packs/converters/skills/mermaid-render/SKILL.md +109 -0
- skilldrop_cli/data/packs/converters/skills/mermaid-render/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/converters/skills/mermaid-render/evals/evals.json +17 -0
- skilldrop_cli/data/packs/converters/skills/mermaid-render/evals/files/1/docs/contoso-orders.md +23 -0
- skilldrop_cli/data/packs/converters/skills/mermaid-render/examples/broken-diagrams.md +147 -0
- skilldrop_cli/data/packs/converters/skills/mermaid-render/examples/inputs/broken-flowchart.mmd +8 -0
- skilldrop_cli/data/packs/converters/skills/mermaid-render/examples/inputs/broken-sequence.mmd +11 -0
- skilldrop_cli/data/packs/converters/skills/mermaid-render/examples/inputs/checkout-flow.mmd +9 -0
- skilldrop_cli/data/packs/converters/skills/mermaid-render/examples/inputs/design-notes.md +35 -0
- skilldrop_cli/data/packs/converters/skills/mermaid-render/examples/inputs/fixed-flowchart.mmd +9 -0
- skilldrop_cli/data/packs/converters/skills/mermaid-render/examples/inputs/typo.mmd +2 -0
- skilldrop_cli/data/packs/converters/skills/mermaid-render/manifest.json +40 -0
- skilldrop_cli/data/packs/converters/skills/mermaid-render/reference.md +70 -0
- skilldrop_cli/data/packs/converters/skills/mermaid-render/scripts/render_mermaid.py +486 -0
- skilldrop_cli/data/packs/core/loops/ship-a-draft/LOOP.md +77 -0
- skilldrop_cli/data/packs/core/loops/ship-a-draft/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/core/loops/ship-a-draft/evals/evals.json +25 -0
- skilldrop_cli/data/packs/core/loops/ship-a-draft/loop.json +41 -0
- skilldrop_cli/data/packs/core/pack.json +50 -0
- skilldrop_cli/data/packs/core/skills/brief-intake/SKILL.md +79 -0
- skilldrop_cli/data/packs/core/skills/brief-intake/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/core/skills/brief-intake/evals/evals.json +16 -0
- skilldrop_cli/data/packs/core/skills/brief-intake/manifest.json +11 -0
- skilldrop_cli/data/packs/core/skills/brief-intake/templates/brief-adr.md +41 -0
- skilldrop_cli/data/packs/core/skills/brief-intake/templates/brief-decision-log.md +35 -0
- skilldrop_cli/data/packs/core/skills/brief-intake/templates/brief-deck.md +43 -0
- skilldrop_cli/data/packs/core/skills/brief-intake/templates/brief-design-doc.md +48 -0
- skilldrop_cli/data/packs/core/skills/brief-intake/templates/brief-exec-summary.md +47 -0
- skilldrop_cli/data/packs/core/skills/brief-intake/templates/brief-generic.md +45 -0
- skilldrop_cli/data/packs/core/skills/brief-intake/templates/brief-runbook.md +44 -0
- skilldrop_cli/data/packs/core/skills/brief-intake/templates/brief-tech-comparison.md +38 -0
- skilldrop_cli/data/packs/core/skills/council-review/SKILL.md +106 -0
- skilldrop_cli/data/packs/core/skills/council-review/evals/eval_queries.json +38 -0
- skilldrop_cli/data/packs/core/skills/council-review/evals/evals.json +18 -0
- skilldrop_cli/data/packs/core/skills/council-review/examples/redis-cache-decision.md +75 -0
- skilldrop_cli/data/packs/core/skills/council-review/manifest.json +11 -0
- skilldrop_cli/data/packs/core/skills/council-review/reference.md +76 -0
- skilldrop_cli/data/packs/core/skills/council-review/seats/architect.md +29 -0
- skilldrop_cli/data/packs/core/skills/council-review/seats/bench.md +39 -0
- skilldrop_cli/data/packs/core/skills/council-review/seats/operator.md +27 -0
- skilldrop_cli/data/packs/core/skills/council-review/seats/pragmatist.md +29 -0
- skilldrop_cli/data/packs/core/skills/council-review/seats/security-engineer.md +29 -0
- skilldrop_cli/data/packs/core/skills/council-review/seats/user-advocate.md +27 -0
- skilldrop_cli/data/packs/core/skills/council-review/templates/council-review.md +59 -0
- skilldrop_cli/data/packs/core/skills/doc-critique/SKILL.md +119 -0
- skilldrop_cli/data/packs/core/skills/doc-critique/evals/eval_queries.json +38 -0
- skilldrop_cli/data/packs/core/skills/doc-critique/evals/evals.json +17 -0
- skilldrop_cli/data/packs/core/skills/doc-critique/examples/design-doc-critique.md +34 -0
- skilldrop_cli/data/packs/core/skills/doc-critique/manifest.json +11 -0
- skilldrop_cli/data/packs/core/skills/doc-critique/rubrics/adr.md +36 -0
- skilldrop_cli/data/packs/core/skills/doc-critique/rubrics/decision-log.md +39 -0
- skilldrop_cli/data/packs/core/skills/doc-critique/rubrics/deck.md +45 -0
- skilldrop_cli/data/packs/core/skills/doc-critique/rubrics/design-doc.md +42 -0
- skilldrop_cli/data/packs/core/skills/doc-critique/rubrics/exec-summary.md +41 -0
- skilldrop_cli/data/packs/core/skills/doc-critique/rubrics/generic.md +40 -0
- skilldrop_cli/data/packs/core/skills/doc-critique/rubrics/runbook.md +42 -0
- skilldrop_cli/data/packs/core/skills/doc-critique/rubrics/tech-comparison.md +40 -0
- skilldrop_cli/data/packs/core/skills/doc-critique/templates/critique.md +49 -0
- skilldrop_cli/data/packs/core/skills/output-hygiene/SKILL.md +97 -0
- skilldrop_cli/data/packs/core/skills/output-hygiene/evals/eval_queries.json +11 -0
- skilldrop_cli/data/packs/core/skills/output-hygiene/evals/evals.json +30 -0
- skilldrop_cli/data/packs/core/skills/output-hygiene/manifest.json +34 -0
- skilldrop_cli/data/packs/core/skills/output-hygiene/reference.md +106 -0
- skilldrop_cli/data/packs/core/skills/output-hygiene/scripts/scrub.py +315 -0
- skilldrop_cli/data/packs/data-analytics/pack.json +57 -0
- skilldrop_cli/data/packs/data-analytics/skills/dashboard-spec/SKILL.md +83 -0
- skilldrop_cli/data/packs/data-analytics/skills/dashboard-spec/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/data-analytics/skills/dashboard-spec/evals/evals.json +19 -0
- skilldrop_cli/data/packs/data-analytics/skills/dashboard-spec/examples/support-staffing.md +84 -0
- skilldrop_cli/data/packs/data-analytics/skills/dashboard-spec/manifest.json +40 -0
- skilldrop_cli/data/packs/data-analytics/skills/dashboard-spec/reference.md +45 -0
- skilldrop_cli/data/packs/data-analytics/skills/dashboard-spec/templates/dashboard-spec.md +55 -0
- skilldrop_cli/data/packs/data-analytics/skills/metric-definition/SKILL.md +84 -0
- skilldrop_cli/data/packs/data-analytics/skills/metric-definition/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/data-analytics/skills/metric-definition/evals/evals.json +19 -0
- skilldrop_cli/data/packs/data-analytics/skills/metric-definition/examples/refund-rate.md +104 -0
- skilldrop_cli/data/packs/data-analytics/skills/metric-definition/manifest.json +41 -0
- skilldrop_cli/data/packs/data-analytics/skills/metric-definition/reference.md +67 -0
- skilldrop_cli/data/packs/data-analytics/skills/metric-definition/templates/metric-spec.md +70 -0
- skilldrop_cli/data/packs/data-analytics/skills/sql-review/SKILL.md +83 -0
- skilldrop_cli/data/packs/data-analytics/skills/sql-review/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/data-analytics/skills/sql-review/evals/evals.json +19 -0
- skilldrop_cli/data/packs/data-analytics/skills/sql-review/examples/revenue-by-region.md +174 -0
- skilldrop_cli/data/packs/data-analytics/skills/sql-review/manifest.json +42 -0
- skilldrop_cli/data/packs/data-analytics/skills/sql-review/reference.md +84 -0
- skilldrop_cli/data/packs/data-analytics/skills/sql-review/scripts/sql_lint.py +461 -0
- skilldrop_cli/data/packs/design/pack.json +60 -0
- skilldrop_cli/data/packs/design/skills/brand-kit/SKILL.md +105 -0
- skilldrop_cli/data/packs/design/skills/brand-kit/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/design/skills/brand-kit/evals/evals.json +18 -0
- skilldrop_cli/data/packs/design/skills/brand-kit/evals/files/1/brand/northwind-logo-white.png +0 -0
- skilldrop_cli/data/packs/design/skills/brand-kit/evals/files/1/brand/northwind-logo.png +0 -0
- skilldrop_cli/data/packs/design/skills/brand-kit/examples/northwind-brand.md +48 -0
- skilldrop_cli/data/packs/design/skills/brand-kit/manifest.json +45 -0
- skilldrop_cli/data/packs/design/skills/brand-kit/scripts/check_brand.py +114 -0
- skilldrop_cli/data/packs/design/skills/brand-kit/templates/brand.json +54 -0
- skilldrop_cli/data/packs/design/skills/deck-builder/SKILL.md +201 -0
- skilldrop_cli/data/packs/design/skills/deck-builder/evals/eval_queries.json +14 -0
- skilldrop_cli/data/packs/design/skills/deck-builder/evals/evals.json +40 -0
- skilldrop_cli/data/packs/design/skills/deck-builder/examples/exec-board-update.md +108 -0
- skilldrop_cli/data/packs/design/skills/deck-builder/examples/templated-brand-deck.md +148 -0
- skilldrop_cli/data/packs/design/skills/deck-builder/manifest.json +18 -0
- skilldrop_cli/data/packs/design/skills/deck-builder/reference.md +180 -0
- skilldrop_cli/data/packs/design/skills/deck-builder/requirements.txt +3 -0
- skilldrop_cli/data/packs/design/skills/deck-builder/scripts/build_deck.py +1134 -0
- skilldrop_cli/data/packs/design/skills/deck-builder/templates/deck-spec.json +168 -0
- skilldrop_cli/data/packs/design/skills/deck-builder/templates/palettes.json +59 -0
- skilldrop_cli/data/packs/design/skills/marketing-flyer/SKILL.md +113 -0
- skilldrop_cli/data/packs/design/skills/marketing-flyer/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/design/skills/marketing-flyer/evals/evals.json +18 -0
- skilldrop_cli/data/packs/design/skills/marketing-flyer/evals/files/1/brand/brand.json +80 -0
- skilldrop_cli/data/packs/design/skills/marketing-flyer/evals/files/1/brand/logo-white.png +0 -0
- skilldrop_cli/data/packs/design/skills/marketing-flyer/evals/files/1/brand/logo.png +0 -0
- skilldrop_cli/data/packs/design/skills/marketing-flyer/evals/files/1/brand/mark.png +0 -0
- skilldrop_cli/data/packs/design/skills/marketing-flyer/examples/community-health-fair.md +68 -0
- skilldrop_cli/data/packs/design/skills/marketing-flyer/manifest.json +40 -0
- skilldrop_cli/data/packs/design/skills/marketing-flyer/reference.md +54 -0
- skilldrop_cli/data/packs/design/skills/marketing-flyer/scripts/build_flyer.py +323 -0
- skilldrop_cli/data/packs/design/skills/marketing-flyer/templates/flyer-spec.json +26 -0
- skilldrop_cli/data/packs/design/skills/slide-outliner/SKILL.md +58 -0
- skilldrop_cli/data/packs/design/skills/slide-outliner/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/design/skills/slide-outliner/evals/evals.json +16 -0
- skilldrop_cli/data/packs/design/skills/slide-outliner/manifest.json +11 -0
- skilldrop_cli/data/packs/design/skills/slide-outliner/templates/deck-outline.md +131 -0
- skilldrop_cli/data/packs/dev-team/loops/build/LOOP.md +80 -0
- skilldrop_cli/data/packs/dev-team/loops/build/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/dev-team/loops/build/evals/evals.json +27 -0
- skilldrop_cli/data/packs/dev-team/loops/build/loop.json +48 -0
- skilldrop_cli/data/packs/dev-team/loops/release/LOOP.md +91 -0
- skilldrop_cli/data/packs/dev-team/loops/release/loop.json +47 -0
- skilldrop_cli/data/packs/dev-team/pack.json +56 -0
- skilldrop_cli/data/packs/dev-team/skills/accessibility-audit/SKILL.md +74 -0
- skilldrop_cli/data/packs/dev-team/skills/accessibility-audit/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/dev-team/skills/accessibility-audit/evals/evals.json +19 -0
- skilldrop_cli/data/packs/dev-team/skills/accessibility-audit/examples/login-form.md +76 -0
- skilldrop_cli/data/packs/dev-team/skills/accessibility-audit/manifest.json +11 -0
- skilldrop_cli/data/packs/dev-team/skills/accessibility-audit/reference.md +69 -0
- skilldrop_cli/data/packs/dev-team/skills/agents-md-generator/SKILL.md +82 -0
- skilldrop_cli/data/packs/dev-team/skills/agents-md-generator/evals/eval_queries.json +15 -0
- skilldrop_cli/data/packs/dev-team/skills/agents-md-generator/evals/evals.json +50 -0
- skilldrop_cli/data/packs/dev-team/skills/agents-md-generator/evals/files/1/Makefile +5 -0
- skilldrop_cli/data/packs/dev-team/skills/agents-md-generator/evals/files/1/alembic/versions/0001_create_bookings.py +10 -0
- skilldrop_cli/data/packs/dev-team/skills/agents-md-generator/evals/files/1/booking/__init__.py +0 -0
- skilldrop_cli/data/packs/dev-team/skills/agents-md-generator/evals/files/1/booking/app.py +8 -0
- skilldrop_cli/data/packs/dev-team/skills/agents-md-generator/evals/files/1/pyproject.toml +11 -0
- skilldrop_cli/data/packs/dev-team/skills/agents-md-generator/evals/files/1/tests/test_health.py +5 -0
- skilldrop_cli/data/packs/dev-team/skills/agents-md-generator/evals/files/2/AGENTS.md +3 -0
- skilldrop_cli/data/packs/dev-team/skills/agents-md-generator/evals/files/2/package.json +12 -0
- skilldrop_cli/data/packs/dev-team/skills/agents-md-generator/evals/files/2/src/index.ts +1 -0
- skilldrop_cli/data/packs/dev-team/skills/agents-md-generator/manifest.json +11 -0
- skilldrop_cli/data/packs/dev-team/skills/agents-md-generator/reference.md +89 -0
- skilldrop_cli/data/packs/dev-team/skills/agents-md-generator/templates/agents-md.md +48 -0
- skilldrop_cli/data/packs/dev-team/skills/bug-triage/SKILL.md +67 -0
- skilldrop_cli/data/packs/dev-team/skills/bug-triage/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/dev-team/skills/bug-triage/evals/evals.json +17 -0
- skilldrop_cli/data/packs/dev-team/skills/bug-triage/manifest.json +14 -0
- skilldrop_cli/data/packs/dev-team/skills/bug-triage/templates/bug-ticket.md +86 -0
- skilldrop_cli/data/packs/dev-team/skills/contribution-wizard/SKILL.md +134 -0
- skilldrop_cli/data/packs/dev-team/skills/contribution-wizard/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/dev-team/skills/contribution-wizard/evals/evals.json +19 -0
- skilldrop_cli/data/packs/dev-team/skills/contribution-wizard/manifest.json +11 -0
- skilldrop_cli/data/packs/dev-team/skills/devils-advocate/SKILL.md +143 -0
- skilldrop_cli/data/packs/dev-team/skills/devils-advocate/evals/eval_queries.json +38 -0
- skilldrop_cli/data/packs/dev-team/skills/devils-advocate/evals/evals.json +19 -0
- skilldrop_cli/data/packs/dev-team/skills/devils-advocate/examples/rate-limiter-review.md +46 -0
- skilldrop_cli/data/packs/dev-team/skills/devils-advocate/lenses/adversarial-review.md +88 -0
- skilldrop_cli/data/packs/dev-team/skills/devils-advocate/lenses/edge-cases.md +95 -0
- skilldrop_cli/data/packs/dev-team/skills/devils-advocate/lenses/future-proofing.md +75 -0
- skilldrop_cli/data/packs/dev-team/skills/devils-advocate/lenses/test-coverage.md +90 -0
- skilldrop_cli/data/packs/dev-team/skills/devils-advocate/manifest.json +14 -0
- skilldrop_cli/data/packs/dev-team/skills/devils-advocate/templates/challenge.md +118 -0
- skilldrop_cli/data/packs/dev-team/skills/feature-implement-loop/SKILL.md +88 -0
- skilldrop_cli/data/packs/dev-team/skills/feature-implement-loop/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/dev-team/skills/feature-implement-loop/evals/evals.json +19 -0
- skilldrop_cli/data/packs/dev-team/skills/feature-implement-loop/manifest.json +14 -0
- skilldrop_cli/data/packs/dev-team/skills/launch-readiness/SKILL.md +95 -0
- skilldrop_cli/data/packs/dev-team/skills/launch-readiness/evals/eval_queries.json +10 -0
- skilldrop_cli/data/packs/dev-team/skills/launch-readiness/evals/evals.json +19 -0
- skilldrop_cli/data/packs/dev-team/skills/launch-readiness/examples/schema-change-revise.md +54 -0
- skilldrop_cli/data/packs/dev-team/skills/launch-readiness/manifest.json +24 -0
- skilldrop_cli/data/packs/dev-team/skills/launch-readiness/templates/readiness-report.md +41 -0
- skilldrop_cli/data/packs/dev-team/skills/migration-plan/SKILL.md +68 -0
- skilldrop_cli/data/packs/dev-team/skills/migration-plan/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/dev-team/skills/migration-plan/evals/evals.json +16 -0
- skilldrop_cli/data/packs/dev-team/skills/migration-plan/manifest.json +11 -0
- skilldrop_cli/data/packs/dev-team/skills/migration-plan/templates/migration-plan.md +68 -0
- skilldrop_cli/data/packs/dev-team/skills/pre-merge-review/SKILL.md +85 -0
- skilldrop_cli/data/packs/dev-team/skills/pre-merge-review/evals/eval_queries.json +11 -0
- skilldrop_cli/data/packs/dev-team/skills/pre-merge-review/evals/evals.json +26 -0
- skilldrop_cli/data/packs/dev-team/skills/pre-merge-review/examples/pre-merge-verdict.md +43 -0
- skilldrop_cli/data/packs/dev-team/skills/pre-merge-review/manifest.json +15 -0
- skilldrop_cli/data/packs/dev-team/skills/pre-merge-review/scripts/gate.py +189 -0
- skilldrop_cli/data/packs/dev-team/skills/release-notes/SKILL.md +61 -0
- skilldrop_cli/data/packs/dev-team/skills/release-notes/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/dev-team/skills/release-notes/evals/evals.json +19 -0
- skilldrop_cli/data/packs/dev-team/skills/release-notes/manifest.json +11 -0
- skilldrop_cli/data/packs/dev-team/skills/release-notes/templates/release-notes.md +83 -0
- skilldrop_cli/data/packs/dev-team/skills/sonar-onboard/SKILL.md +170 -0
- skilldrop_cli/data/packs/dev-team/skills/sonar-onboard/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/dev-team/skills/sonar-onboard/evals/evals.json +16 -0
- skilldrop_cli/data/packs/dev-team/skills/sonar-onboard/manifest.json +11 -0
- skilldrop_cli/data/packs/dev-team/skills/sonar-onboard/reference.md +151 -0
- skilldrop_cli/data/packs/dev-team/skills/sonar-onboard/templates/github-actions-sonar-server.yml.tmpl +50 -0
- skilldrop_cli/data/packs/dev-team/skills/sonar-onboard/templates/github-actions-sonarcloud.yml.tmpl +53 -0
- skilldrop_cli/data/packs/dev-team/skills/sonar-onboard/templates/readme-snippet.md +38 -0
- skilldrop_cli/data/packs/dev-team/skills/sonar-onboard/templates/sonar-project.properties.tmpl +31 -0
- skilldrop_cli/data/packs/dev-team/skills/sonar-review/SKILL.md +220 -0
- skilldrop_cli/data/packs/dev-team/skills/sonar-review/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/dev-team/skills/sonar-review/evals/evals.json +16 -0
- skilldrop_cli/data/packs/dev-team/skills/sonar-review/lenses/bugs.md +48 -0
- skilldrop_cli/data/packs/dev-team/skills/sonar-review/lenses/code-smells.md +64 -0
- skilldrop_cli/data/packs/dev-team/skills/sonar-review/lenses/coverage-and-duplication.md +74 -0
- skilldrop_cli/data/packs/dev-team/skills/sonar-review/lenses/security-hotspots.md +56 -0
- skilldrop_cli/data/packs/dev-team/skills/sonar-review/lenses/vulnerabilities.md +52 -0
- skilldrop_cli/data/packs/dev-team/skills/sonar-review/manifest.json +37 -0
- skilldrop_cli/data/packs/dev-team/skills/sonar-review/reference.md +167 -0
- skilldrop_cli/data/packs/dev-team/skills/sonar-review/templates/report.md +84 -0
- skilldrop_cli/data/packs/dev-team/skills/test-plan-generator/SKILL.md +59 -0
- skilldrop_cli/data/packs/dev-team/skills/test-plan-generator/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/dev-team/skills/test-plan-generator/evals/evals.json +16 -0
- skilldrop_cli/data/packs/dev-team/skills/test-plan-generator/manifest.json +11 -0
- skilldrop_cli/data/packs/dev-team/skills/test-plan-generator/templates/test-plan.md +83 -0
- skilldrop_cli/data/packs/dev-team/skills/user-story-splitter/SKILL.md +88 -0
- skilldrop_cli/data/packs/dev-team/skills/user-story-splitter/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/dev-team/skills/user-story-splitter/evals/evals.json +16 -0
- skilldrop_cli/data/packs/dev-team/skills/user-story-splitter/examples/notifications-epic.md +123 -0
- skilldrop_cli/data/packs/dev-team/skills/user-story-splitter/manifest.json +14 -0
- skilldrop_cli/data/packs/dev-team/skills/user-story-splitter/templates/story.md +40 -0
- skilldrop_cli/data/packs/experience-design/pack.json +68 -0
- skilldrop_cli/data/packs/experience-design/skills/content-design/SKILL.md +77 -0
- skilldrop_cli/data/packs/experience-design/skills/content-design/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/experience-design/skills/content-design/evals/evals.json +18 -0
- skilldrop_cli/data/packs/experience-design/skills/content-design/examples/parking-permit-page.md +102 -0
- skilldrop_cli/data/packs/experience-design/skills/content-design/manifest.json +41 -0
- skilldrop_cli/data/packs/experience-design/skills/content-design/scripts/readability.py +115 -0
- skilldrop_cli/data/packs/experience-design/skills/content-design/templates/content-spec.md +45 -0
- skilldrop_cli/data/packs/experience-design/skills/design-system-spec/SKILL.md +79 -0
- skilldrop_cli/data/packs/experience-design/skills/design-system-spec/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/experience-design/skills/design-system-spec/evals/evals.json +19 -0
- skilldrop_cli/data/packs/experience-design/skills/design-system-spec/examples/text-field-spec.md +121 -0
- skilldrop_cli/data/packs/experience-design/skills/design-system-spec/manifest.json +46 -0
- skilldrop_cli/data/packs/experience-design/skills/design-system-spec/reference.md +66 -0
- skilldrop_cli/data/packs/experience-design/skills/design-system-spec/templates/component-spec.md +74 -0
- skilldrop_cli/data/packs/experience-design/skills/information-architecture/SKILL.md +76 -0
- skilldrop_cli/data/packs/experience-design/skills/information-architecture/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/experience-design/skills/information-architecture/evals/evals.json +19 -0
- skilldrop_cli/data/packs/experience-design/skills/information-architecture/examples/payroll-app-nav.md +127 -0
- skilldrop_cli/data/packs/experience-design/skills/information-architecture/manifest.json +46 -0
- skilldrop_cli/data/packs/experience-design/skills/information-architecture/reference.md +54 -0
- skilldrop_cli/data/packs/experience-design/skills/information-architecture/templates/ia-spec.md +77 -0
- skilldrop_cli/data/packs/experience-design/skills/service-blueprint/SKILL.md +76 -0
- skilldrop_cli/data/packs/experience-design/skills/service-blueprint/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/experience-design/skills/service-blueprint/evals/evals.json +19 -0
- skilldrop_cli/data/packs/experience-design/skills/service-blueprint/examples/insurance-claim-blueprint.md +107 -0
- skilldrop_cli/data/packs/experience-design/skills/service-blueprint/manifest.json +45 -0
- skilldrop_cli/data/packs/experience-design/skills/service-blueprint/templates/blueprint.md +72 -0
- skilldrop_cli/data/packs/experience-design/skills/ux-writing/SKILL.md +77 -0
- skilldrop_cli/data/packs/experience-design/skills/ux-writing/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/experience-design/skills/ux-writing/evals/evals.json +19 -0
- skilldrop_cli/data/packs/experience-design/skills/ux-writing/examples/team-invite-flow.md +66 -0
- skilldrop_cli/data/packs/experience-design/skills/ux-writing/manifest.json +41 -0
- skilldrop_cli/data/packs/experience-design/skills/ux-writing/templates/string-table.md +22 -0
- skilldrop_cli/data/packs/grc/pack.json +57 -0
- skilldrop_cli/data/packs/grc/skills/dpia/SKILL.md +123 -0
- skilldrop_cli/data/packs/grc/skills/dpia/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/grc/skills/dpia/evals/evals.json +19 -0
- skilldrop_cli/data/packs/grc/skills/dpia/examples/acme-warehouse-performance.md +159 -0
- skilldrop_cli/data/packs/grc/skills/dpia/manifest.json +47 -0
- skilldrop_cli/data/packs/grc/skills/dpia/reference.md +118 -0
- skilldrop_cli/data/packs/grc/skills/dpia/templates/dpia.md +103 -0
- skilldrop_cli/data/packs/grc/skills/risk-register/SKILL.md +139 -0
- skilldrop_cli/data/packs/grc/skills/risk-register/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/grc/skills/risk-register/evals/evals.json +19 -0
- skilldrop_cli/data/packs/grc/skills/risk-register/examples/northwind-register.csv +9 -0
- skilldrop_cli/data/packs/grc/skills/risk-register/examples/northwind-register.md +127 -0
- skilldrop_cli/data/packs/grc/skills/risk-register/manifest.json +43 -0
- skilldrop_cli/data/packs/grc/skills/risk-register/reference.md +99 -0
- skilldrop_cli/data/packs/grc/skills/risk-register/scripts/check_register.py +338 -0
- skilldrop_cli/data/packs/grc/skills/risk-register/templates/risk-register.csv +2 -0
- skilldrop_cli/data/packs/grc/skills/soc2-evidence-map/SKILL.md +117 -0
- skilldrop_cli/data/packs/grc/skills/soc2-evidence-map/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/grc/skills/soc2-evidence-map/evals/evals.json +19 -0
- skilldrop_cli/data/packs/grc/skills/soc2-evidence-map/examples/northwind-evidence-map.csv +17 -0
- skilldrop_cli/data/packs/grc/skills/soc2-evidence-map/examples/northwind-type2-security.md +127 -0
- skilldrop_cli/data/packs/grc/skills/soc2-evidence-map/manifest.json +41 -0
- skilldrop_cli/data/packs/grc/skills/soc2-evidence-map/reference.md +156 -0
- skilldrop_cli/data/packs/grc/skills/soc2-evidence-map/templates/evidence-map.csv +2 -0
- skilldrop_cli/data/packs/infra-as-code/pack.json +51 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-module/SKILL.md +85 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-module/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-module/evals/evals.json +31 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-module/examples/s3-log-bucket/README.md +71 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-module/examples/s3-log-bucket/examples/basic/main.tf +30 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-module/examples/s3-log-bucket/main.tf +153 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-module/examples/s3-log-bucket/outputs.tf +14 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-module/examples/s3-log-bucket/variables.tf +71 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-module/examples/s3-log-bucket/versions.tf +10 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-module/examples/s3-log-bucket.md +50 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-module/manifest.json +41 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-module/reference.md +105 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-module/templates/module-readme.md +55 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-plan-review/SKILL.md +87 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-plan-review/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-plan-review/evals/evals.json +30 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-plan-review/evals/files/2/plan.json +133 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-plan-review/examples/northwind-orders-plan.json +174 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-plan-review/examples/northwind-orders.md +87 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-plan-review/manifest.json +48 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-plan-review/reference.md +77 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-plan-review/scripts/plan_summary.py +361 -0
- skilldrop_cli/data/packs/product-manager/loops/discover/LOOP.md +81 -0
- skilldrop_cli/data/packs/product-manager/loops/discover/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/product-manager/loops/discover/evals/evals.json +26 -0
- skilldrop_cli/data/packs/product-manager/loops/discover/loop.json +41 -0
- skilldrop_cli/data/packs/product-manager/pack.json +61 -0
- skilldrop_cli/data/packs/product-manager/skills/business-case/SKILL.md +64 -0
- skilldrop_cli/data/packs/product-manager/skills/business-case/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/product-manager/skills/business-case/evals/evals.json +19 -0
- skilldrop_cli/data/packs/product-manager/skills/business-case/examples/build-vs-buy-flags.md +42 -0
- skilldrop_cli/data/packs/product-manager/skills/business-case/manifest.json +11 -0
- skilldrop_cli/data/packs/product-manager/skills/business-case/templates/business-case.md +60 -0
- skilldrop_cli/data/packs/product-manager/skills/okr-cascade/SKILL.md +59 -0
- skilldrop_cli/data/packs/product-manager/skills/okr-cascade/evals/eval_queries.json +12 -0
- skilldrop_cli/data/packs/product-manager/skills/okr-cascade/evals/evals.json +28 -0
- skilldrop_cli/data/packs/product-manager/skills/okr-cascade/manifest.json +11 -0
- skilldrop_cli/data/packs/product-manager/skills/okr-cascade/templates/okr-cascade.md +46 -0
- skilldrop_cli/data/packs/product-manager/skills/prd-draft/SKILL.md +62 -0
- skilldrop_cli/data/packs/product-manager/skills/prd-draft/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/product-manager/skills/prd-draft/evals/evals.json +17 -0
- skilldrop_cli/data/packs/product-manager/skills/prd-draft/manifest.json +16 -0
- skilldrop_cli/data/packs/product-manager/skills/prd-draft/templates/prd.md +66 -0
- skilldrop_cli/data/packs/product-manager/skills/prfaq/SKILL.md +76 -0
- skilldrop_cli/data/packs/product-manager/skills/prfaq/evals/eval_queries.json +13 -0
- skilldrop_cli/data/packs/product-manager/skills/prfaq/evals/evals.json +32 -0
- skilldrop_cli/data/packs/product-manager/skills/prfaq/manifest.json +11 -0
- skilldrop_cli/data/packs/product-manager/skills/prfaq/templates/prfaq.md +60 -0
- skilldrop_cli/data/packs/product-manager/skills/requirements-interview/SKILL.md +61 -0
- skilldrop_cli/data/packs/product-manager/skills/requirements-interview/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/product-manager/skills/requirements-interview/evals/evals.json +16 -0
- skilldrop_cli/data/packs/product-manager/skills/requirements-interview/manifest.json +14 -0
- skilldrop_cli/data/packs/product-manager/skills/requirements-interview/templates/interview-kit.md +63 -0
- skilldrop_cli/data/packs/product-manager/skills/strategy-analysis/SKILL.md +63 -0
- skilldrop_cli/data/packs/product-manager/skills/strategy-analysis/evals/eval_queries.json +13 -0
- skilldrop_cli/data/packs/product-manager/skills/strategy-analysis/evals/evals.json +36 -0
- skilldrop_cli/data/packs/product-manager/skills/strategy-analysis/examples/market-entry-tows.md +42 -0
- skilldrop_cli/data/packs/product-manager/skills/strategy-analysis/manifest.json +15 -0
- skilldrop_cli/data/packs/product-manager/skills/success-metrics/SKILL.md +65 -0
- skilldrop_cli/data/packs/product-manager/skills/success-metrics/evals/eval_queries.json +11 -0
- skilldrop_cli/data/packs/product-manager/skills/success-metrics/evals/evals.json +27 -0
- skilldrop_cli/data/packs/product-manager/skills/success-metrics/manifest.json +11 -0
- skilldrop_cli/data/packs/product-manager/skills/success-metrics/templates/metrics-plan.md +55 -0
- skilldrop_cli/data/packs/product-manager/skills/user-journey-map/SKILL.md +65 -0
- skilldrop_cli/data/packs/product-manager/skills/user-journey-map/evals/eval_queries.json +12 -0
- skilldrop_cli/data/packs/product-manager/skills/user-journey-map/evals/evals.json +30 -0
- skilldrop_cli/data/packs/product-manager/skills/user-journey-map/examples/b2b-saas-onboarding.md +69 -0
- skilldrop_cli/data/packs/product-manager/skills/user-journey-map/manifest.json +15 -0
- skilldrop_cli/data/packs/product-manager/skills/user-journey-map/templates/journey-map.md +47 -0
- skilldrop_cli/data/packs/research/pack.json +52 -0
- skilldrop_cli/data/packs/research/skills/hypothesis-comparison/SKILL.md +131 -0
- skilldrop_cli/data/packs/research/skills/hypothesis-comparison/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/research/skills/hypothesis-comparison/evals/evals.json +19 -0
- skilldrop_cli/data/packs/research/skills/hypothesis-comparison/examples/conversion-drop.md +132 -0
- skilldrop_cli/data/packs/research/skills/hypothesis-comparison/manifest.json +43 -0
- skilldrop_cli/data/packs/research/skills/hypothesis-comparison/reference.md +107 -0
- skilldrop_cli/data/packs/research/skills/hypothesis-comparison/scripts/ach_matrix.py +204 -0
- skilldrop_cli/data/packs/research/skills/hypothesis-comparison/templates/hypothesis-comparison.md +61 -0
- skilldrop_cli/data/packs/research/skills/hypothesis-comparison/templates/matrix.csv +4 -0
- skilldrop_cli/data/packs/research/skills/research-plan/SKILL.md +122 -0
- skilldrop_cli/data/packs/research/skills/research-plan/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/research/skills/research-plan/evals/evals.json +28 -0
- skilldrop_cli/data/packs/research/skills/research-plan/examples/four-day-week-plan.md +97 -0
- skilldrop_cli/data/packs/research/skills/research-plan/manifest.json +47 -0
- skilldrop_cli/data/packs/research/skills/research-plan/reference.md +88 -0
- skilldrop_cli/data/packs/research/skills/research-plan/templates/research-plan.md +54 -0
- skilldrop_cli/data/packs/research/skills/source-synthesis/SKILL.md +123 -0
- skilldrop_cli/data/packs/research/skills/source-synthesis/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/research/skills/source-synthesis/evals/evals.json +19 -0
- skilldrop_cli/data/packs/research/skills/source-synthesis/examples/four-day-week.md +146 -0
- skilldrop_cli/data/packs/research/skills/source-synthesis/manifest.json +42 -0
- skilldrop_cli/data/packs/research/skills/source-synthesis/reference.md +92 -0
- skilldrop_cli/data/packs/research/skills/source-synthesis/scripts/citations.py +314 -0
- skilldrop_cli/data/packs/research/skills/source-synthesis/templates/synthesis.md +46 -0
- skilldrop_cli/data/packs/skill-engineering/pack.json +46 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-author/SKILL.md +139 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-author/evals/eval_queries.json +10 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-author/evals/evals.json +19 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-author/examples/release-notes-skill.md +185 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-author/manifest.json +42 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-author/reference.md +144 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-author/templates/eval_queries.json +9 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-author/templates/evals.json +16 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-author/templates/skill-template.md +52 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-review/SKILL.md +131 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-review/evals/eval_queries.json +11 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-review/evals/evals.json +19 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-review/evals/files/1/skills/changelog-writer/SKILL.md +10 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-review/evals/files/1/skills/pr-summary/SKILL.md +12 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-review/evals/files/1/skills/pr-summary/references/tone.md +3 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-review/evals/files/1/skills/pr-summary/scripts/collect.py +6 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-review/examples/meeting-notes-review.md +147 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-review/manifest.json +50 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-review/reference.md +135 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-review/scripts/lint_skill.py +481 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-review/templates/review.md +43 -0
- skilldrop_cli/data/packs/solution-architect/loops/design/LOOP.md +83 -0
- skilldrop_cli/data/packs/solution-architect/loops/design/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/solution-architect/loops/design/evals/evals.json +26 -0
- skilldrop_cli/data/packs/solution-architect/loops/design/loop.json +47 -0
- skilldrop_cli/data/packs/solution-architect/pack.json +65 -0
- skilldrop_cli/data/packs/solution-architect/skills/adr-generator/SKILL.md +50 -0
- skilldrop_cli/data/packs/solution-architect/skills/adr-generator/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/solution-architect/skills/adr-generator/evals/evals.json +17 -0
- skilldrop_cli/data/packs/solution-architect/skills/adr-generator/manifest.json +11 -0
- skilldrop_cli/data/packs/solution-architect/skills/adr-generator/templates/madr.md +56 -0
- skilldrop_cli/data/packs/solution-architect/skills/adr-generator/templates/nygard.md +19 -0
- skilldrop_cli/data/packs/solution-architect/skills/api-contract-draft/SKILL.md +69 -0
- skilldrop_cli/data/packs/solution-architect/skills/api-contract-draft/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/solution-architect/skills/api-contract-draft/evals/evals.json +18 -0
- skilldrop_cli/data/packs/solution-architect/skills/api-contract-draft/manifest.json +11 -0
- skilldrop_cli/data/packs/solution-architect/skills/api-contract-draft/reference.md +73 -0
- skilldrop_cli/data/packs/solution-architect/skills/api-contract-draft/templates/openapi-skeleton.yaml +148 -0
- skilldrop_cli/data/packs/solution-architect/skills/architecture-diagrams/SKILL.md +66 -0
- skilldrop_cli/data/packs/solution-architect/skills/architecture-diagrams/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/solution-architect/skills/architecture-diagrams/evals/evals.json +16 -0
- skilldrop_cli/data/packs/solution-architect/skills/architecture-diagrams/examples/aws-three-tier.md +44 -0
- skilldrop_cli/data/packs/solution-architect/skills/architecture-diagrams/examples/c4-container-saas.md +51 -0
- skilldrop_cli/data/packs/solution-architect/skills/architecture-diagrams/examples/microservices-sequence.md +49 -0
- skilldrop_cli/data/packs/solution-architect/skills/architecture-diagrams/manifest.json +31 -0
- skilldrop_cli/data/packs/solution-architect/skills/architecture-diagrams/templates/c4-container.puml +31 -0
- skilldrop_cli/data/packs/solution-architect/skills/architecture-diagrams/templates/mermaid-aws.md +52 -0
- skilldrop_cli/data/packs/solution-architect/skills/architecture-diagrams/templates/mermaid-flowchart.md +37 -0
- skilldrop_cli/data/packs/solution-architect/skills/architecture-diagrams/templates/mermaid-sequence.md +39 -0
- skilldrop_cli/data/packs/solution-architect/skills/data-contract/SKILL.md +67 -0
- skilldrop_cli/data/packs/solution-architect/skills/data-contract/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/solution-architect/skills/data-contract/evals/evals.json +16 -0
- skilldrop_cli/data/packs/solution-architect/skills/data-contract/manifest.json +11 -0
- skilldrop_cli/data/packs/solution-architect/skills/data-contract/reference.md +46 -0
- skilldrop_cli/data/packs/solution-architect/skills/data-contract/templates/data-contract.md +69 -0
- skilldrop_cli/data/packs/solution-architect/skills/db-schema-design/SKILL.md +68 -0
- skilldrop_cli/data/packs/solution-architect/skills/db-schema-design/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/solution-architect/skills/db-schema-design/evals/evals.json +16 -0
- skilldrop_cli/data/packs/solution-architect/skills/db-schema-design/manifest.json +11 -0
- skilldrop_cli/data/packs/solution-architect/skills/db-schema-design/reference.md +56 -0
- skilldrop_cli/data/packs/solution-architect/skills/db-schema-design/templates/schema-design.md +75 -0
- skilldrop_cli/data/packs/solution-architect/skills/design-doc/SKILL.md +49 -0
- skilldrop_cli/data/packs/solution-architect/skills/design-doc/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/solution-architect/skills/design-doc/evals/evals.json +17 -0
- skilldrop_cli/data/packs/solution-architect/skills/design-doc/manifest.json +14 -0
- skilldrop_cli/data/packs/solution-architect/skills/design-doc/templates/design-doc.md +98 -0
- skilldrop_cli/data/packs/solution-architect/skills/figma-diagrams/SKILL.md +87 -0
- skilldrop_cli/data/packs/solution-architect/skills/figma-diagrams/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/solution-architect/skills/figma-diagrams/evals/evals.json +15 -0
- skilldrop_cli/data/packs/solution-architect/skills/figma-diagrams/manifest.json +36 -0
- skilldrop_cli/data/packs/solution-architect/skills/figma-diagrams/reference.md +91 -0
- skilldrop_cli/data/packs/solution-architect/skills/figma-diagrams/requirements.txt +3 -0
- skilldrop_cli/data/packs/solution-architect/skills/figma-diagrams/scripts/_figma_client.py +71 -0
- skilldrop_cli/data/packs/solution-architect/skills/figma-diagrams/scripts/frame_to_mermaid.py +102 -0
- skilldrop_cli/data/packs/solution-architect/skills/figma-diagrams/scripts/inspect_file.py +46 -0
- skilldrop_cli/data/packs/solution-architect/skills/figma-diagrams/scripts/list_comments.py +35 -0
- skilldrop_cli/data/packs/solution-architect/skills/figma-diagrams/scripts/post_comment.py +52 -0
- skilldrop_cli/data/packs/solution-architect/skills/figma-diagrams/templates/figjam-import.json +20 -0
- skilldrop_cli/data/packs/solution-architect/skills/nfr-spec/SKILL.md +63 -0
- skilldrop_cli/data/packs/solution-architect/skills/nfr-spec/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/solution-architect/skills/nfr-spec/evals/evals.json +16 -0
- skilldrop_cli/data/packs/solution-architect/skills/nfr-spec/manifest.json +16 -0
- skilldrop_cli/data/packs/solution-architect/skills/nfr-spec/reference.md +74 -0
- skilldrop_cli/data/packs/solution-architect/skills/nfr-spec/templates/nfr-spec.md +56 -0
- skilldrop_cli/data/packs/solution-architect/skills/reverse-architecture/SKILL.md +103 -0
- skilldrop_cli/data/packs/solution-architect/skills/reverse-architecture/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/solution-architect/skills/reverse-architecture/evals/evals.json +16 -0
- skilldrop_cli/data/packs/solution-architect/skills/reverse-architecture/manifest.json +11 -0
- skilldrop_cli/data/packs/solution-architect/skills/reverse-architecture/reference.md +150 -0
- skilldrop_cli/data/packs/solution-architect/skills/reverse-architecture/templates/description.md +52 -0
- skilldrop_cli/data/packs/solution-architect/skills/reverse-architecture/templates/extraction.md +55 -0
- skilldrop_cli/data/packs/solution-architect/skills/tech-comparison-matrix/SKILL.md +56 -0
- skilldrop_cli/data/packs/solution-architect/skills/tech-comparison-matrix/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/solution-architect/skills/tech-comparison-matrix/evals/evals.json +18 -0
- skilldrop_cli/data/packs/solution-architect/skills/tech-comparison-matrix/examples/queue-selection.md +41 -0
- skilldrop_cli/data/packs/solution-architect/skills/tech-comparison-matrix/manifest.json +11 -0
- skilldrop_cli/data/packs/solution-architect/skills/tech-comparison-matrix/templates/matrix.md +45 -0
- skilldrop_cli/data/packs/solution-architect/skills/threat-model/SKILL.md +65 -0
- skilldrop_cli/data/packs/solution-architect/skills/threat-model/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/solution-architect/skills/threat-model/evals/evals.json +18 -0
- skilldrop_cli/data/packs/solution-architect/skills/threat-model/examples/document-upload.md +56 -0
- skilldrop_cli/data/packs/solution-architect/skills/threat-model/manifest.json +11 -0
- skilldrop_cli/data/packs/solution-architect/skills/threat-model/reference.md +69 -0
- skilldrop_cli/data/packs/sre-oncall/loops/operate/LOOP.md +84 -0
- skilldrop_cli/data/packs/sre-oncall/loops/operate/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/sre-oncall/loops/operate/evals/evals.json +25 -0
- skilldrop_cli/data/packs/sre-oncall/loops/operate/loop.json +41 -0
- skilldrop_cli/data/packs/sre-oncall/pack.json +59 -0
- skilldrop_cli/data/packs/sre-oncall/skills/capacity-cost-model/SKILL.md +65 -0
- skilldrop_cli/data/packs/sre-oncall/skills/capacity-cost-model/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/sre-oncall/skills/capacity-cost-model/evals/evals.json +19 -0
- skilldrop_cli/data/packs/sre-oncall/skills/capacity-cost-model/manifest.json +11 -0
- skilldrop_cli/data/packs/sre-oncall/skills/capacity-cost-model/reference.md +54 -0
- skilldrop_cli/data/packs/sre-oncall/skills/capacity-cost-model/templates/cost-model.md +68 -0
- skilldrop_cli/data/packs/sre-oncall/skills/cloud-cost-review/SKILL.md +121 -0
- skilldrop_cli/data/packs/sre-oncall/skills/cloud-cost-review/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/sre-oncall/skills/cloud-cost-review/evals/evals.json +29 -0
- skilldrop_cli/data/packs/sre-oncall/skills/cloud-cost-review/examples/acme-aws-september.md +247 -0
- skilldrop_cli/data/packs/sre-oncall/skills/cloud-cost-review/examples/acme-cur-2026-08-09.csv +1085 -0
- skilldrop_cli/data/packs/sre-oncall/skills/cloud-cost-review/manifest.json +49 -0
- skilldrop_cli/data/packs/sre-oncall/skills/cloud-cost-review/reference.md +100 -0
- skilldrop_cli/data/packs/sre-oncall/skills/cloud-cost-review/scripts/cost_summary.py +630 -0
- skilldrop_cli/data/packs/sre-oncall/skills/cloud-cost-review/templates/cost-review.md +36 -0
- skilldrop_cli/data/packs/sre-oncall/skills/delivery-metrics-report/SKILL.md +114 -0
- skilldrop_cli/data/packs/sre-oncall/skills/delivery-metrics-report/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/sre-oncall/skills/delivery-metrics-report/evals/evals.json +28 -0
- skilldrop_cli/data/packs/sre-oncall/skills/delivery-metrics-report/evals/files/1/deploys.csv +49 -0
- skilldrop_cli/data/packs/sre-oncall/skills/delivery-metrics-report/evals/files/1/incidents.csv +7 -0
- skilldrop_cli/data/packs/sre-oncall/skills/delivery-metrics-report/evals/files/1/prs.csv +84 -0
- skilldrop_cli/data/packs/sre-oncall/skills/delivery-metrics-report/examples/checkout-api-8-weeks.md +123 -0
- skilldrop_cli/data/packs/sre-oncall/skills/delivery-metrics-report/examples/deployments.csv +49 -0
- skilldrop_cli/data/packs/sre-oncall/skills/delivery-metrics-report/examples/incidents.csv +7 -0
- skilldrop_cli/data/packs/sre-oncall/skills/delivery-metrics-report/examples/prs.csv +84 -0
- skilldrop_cli/data/packs/sre-oncall/skills/delivery-metrics-report/manifest.json +48 -0
- skilldrop_cli/data/packs/sre-oncall/skills/delivery-metrics-report/reference.md +83 -0
- skilldrop_cli/data/packs/sre-oncall/skills/delivery-metrics-report/scripts/delivery_metrics.py +566 -0
- skilldrop_cli/data/packs/sre-oncall/skills/delivery-metrics-report/templates/delivery-report.md +31 -0
- skilldrop_cli/data/packs/sre-oncall/skills/incident-comms/SKILL.md +68 -0
- skilldrop_cli/data/packs/sre-oncall/skills/incident-comms/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/sre-oncall/skills/incident-comms/evals/evals.json +16 -0
- skilldrop_cli/data/packs/sre-oncall/skills/incident-comms/manifest.json +14 -0
- skilldrop_cli/data/packs/sre-oncall/skills/incident-comms/reference.md +43 -0
- skilldrop_cli/data/packs/sre-oncall/skills/incident-comms/templates/messages.md +82 -0
- skilldrop_cli/data/packs/sre-oncall/skills/observability-plan/SKILL.md +70 -0
- skilldrop_cli/data/packs/sre-oncall/skills/observability-plan/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/sre-oncall/skills/observability-plan/evals/evals.json +16 -0
- skilldrop_cli/data/packs/sre-oncall/skills/observability-plan/manifest.json +15 -0
- skilldrop_cli/data/packs/sre-oncall/skills/observability-plan/reference.md +67 -0
- skilldrop_cli/data/packs/sre-oncall/skills/observability-plan/templates/observability-plan.md +62 -0
- skilldrop_cli/data/packs/sre-oncall/skills/postmortem-generator/SKILL.md +66 -0
- skilldrop_cli/data/packs/sre-oncall/skills/postmortem-generator/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/sre-oncall/skills/postmortem-generator/evals/evals.json +17 -0
- skilldrop_cli/data/packs/sre-oncall/skills/postmortem-generator/manifest.json +14 -0
- skilldrop_cli/data/packs/sre-oncall/skills/postmortem-generator/templates/postmortem.md +67 -0
- skilldrop_cli/data/packs/sre-oncall/skills/runbook-generator/SKILL.md +42 -0
- skilldrop_cli/data/packs/sre-oncall/skills/runbook-generator/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/sre-oncall/skills/runbook-generator/evals/evals.json +17 -0
- skilldrop_cli/data/packs/sre-oncall/skills/runbook-generator/manifest.json +11 -0
- skilldrop_cli/data/packs/sre-oncall/skills/runbook-generator/templates/runbook.md +109 -0
- skilldrop_cli/data/packs/stakeholder-comms/pack.json +60 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/audience-profile/SKILL.md +74 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/audience-profile/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/audience-profile/evals/evals.json +15 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/audience-profile/manifest.json +11 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/audience-profile/reference.md +175 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/decision-log/SKILL.md +68 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/decision-log/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/decision-log/evals/evals.json +17 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/decision-log/manifest.json +11 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/exec-summary/SKILL.md +45 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/exec-summary/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/exec-summary/evals/evals.json +17 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/exec-summary/manifest.json +11 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/exec-summary/templates/exec-summary.md +48 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/guide-builder/SKILL.md +77 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/guide-builder/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/guide-builder/evals/evals.json +18 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/guide-builder/examples/local-setup-guide.md +127 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/guide-builder/manifest.json +11 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/guide-builder/templates/api-reference.md +120 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/guide-builder/templates/design-walkthrough.md +72 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/guide-builder/templates/setup-guide.md +109 -0
- skilldrop_cli/data/packs/trackers/pack.json +61 -0
- skilldrop_cli/data/packs/trackers/skills/backlog-triage/SKILL.md +116 -0
- skilldrop_cli/data/packs/trackers/skills/backlog-triage/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/trackers/skills/backlog-triage/evals/evals.json +30 -0
- skilldrop_cli/data/packs/trackers/skills/backlog-triage/evals/files/1/examples/northwind-backlog.csv +28 -0
- skilldrop_cli/data/packs/trackers/skills/backlog-triage/evals/files/2/issues.json +6052 -0
- skilldrop_cli/data/packs/trackers/skills/backlog-triage/examples/northwind-backlog.csv +28 -0
- skilldrop_cli/data/packs/trackers/skills/backlog-triage/examples/northwind-checkout-triage.md +202 -0
- skilldrop_cli/data/packs/trackers/skills/backlog-triage/manifest.json +42 -0
- skilldrop_cli/data/packs/trackers/skills/backlog-triage/reference.md +106 -0
- skilldrop_cli/data/packs/trackers/skills/backlog-triage/scripts/triage_backlog.py +461 -0
- skilldrop_cli/data/packs/trackers/skills/backlog-triage/templates/triage-report.md +42 -0
- skilldrop_cli/data/packs/trackers/skills/team-status-report/SKILL.md +111 -0
- skilldrop_cli/data/packs/trackers/skills/team-status-report/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/trackers/skills/team-status-report/evals/evals.json +30 -0
- skilldrop_cli/data/packs/trackers/skills/team-status-report/evals/files/1/examples/northwind-week-40.csv +16 -0
- skilldrop_cli/data/packs/trackers/skills/team-status-report/evals/files/2/issues.json +1212 -0
- skilldrop_cli/data/packs/trackers/skills/team-status-report/examples/northwind-week-40.csv +16 -0
- skilldrop_cli/data/packs/trackers/skills/team-status-report/examples/northwind-weekly-status.md +160 -0
- skilldrop_cli/data/packs/trackers/skills/team-status-report/manifest.json +33 -0
- skilldrop_cli/data/packs/trackers/skills/team-status-report/reference.md +92 -0
- skilldrop_cli/data/packs/trackers/skills/team-status-report/scripts/status_counts.py +486 -0
- skilldrop_cli/data/packs/trackers/skills/team-status-report/templates/status-report.md +42 -0
- skilldrop_cli/data/packs/trackers/skills/tracker-brief-sync/SKILL.md +116 -0
- skilldrop_cli/data/packs/trackers/skills/tracker-brief-sync/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/trackers/skills/tracker-brief-sync/evals/evals.json +31 -0
- skilldrop_cli/data/packs/trackers/skills/tracker-brief-sync/evals/files/1/examples/prd-guest-checkout.md +53 -0
- skilldrop_cli/data/packs/trackers/skills/tracker-brief-sync/evals/files/2/examples/prd-guest-checkout.md +53 -0
- skilldrop_cli/data/packs/trackers/skills/tracker-brief-sync/evals/files/2/examples/tracker-after-two-weeks.csv +30 -0
- skilldrop_cli/data/packs/trackers/skills/tracker-brief-sync/examples/guest-checkout-spec.json +98 -0
- skilldrop_cli/data/packs/trackers/skills/tracker-brief-sync/examples/guest-checkout-sync.md +151 -0
- skilldrop_cli/data/packs/trackers/skills/tracker-brief-sync/examples/prd-guest-checkout.md +53 -0
- skilldrop_cli/data/packs/trackers/skills/tracker-brief-sync/examples/tracker-after-two-weeks.csv +30 -0
- skilldrop_cli/data/packs/trackers/skills/tracker-brief-sync/manifest.json +41 -0
- skilldrop_cli/data/packs/trackers/skills/tracker-brief-sync/reference.md +101 -0
- skilldrop_cli/data/packs/trackers/skills/tracker-brief-sync/scripts/brief_sync.py +501 -0
- skilldrop_cli/data/packs/trackers/skills/tracker-brief-sync/templates/issues-spec.json +26 -0
- skilldrop_cli/data/profiles.json +24 -0
- skilldrop_cli-0.16.3.dist-info/METADATA +91 -0
- skilldrop_cli-0.16.3.dist-info/RECORD +757 -0
- skilldrop_cli-0.16.3.dist-info/WHEEL +5 -0
- skilldrop_cli-0.16.3.dist-info/entry_points.txt +2 -0
- skilldrop_cli-0.16.3.dist-info/licenses/LICENSE +9 -0
- skilldrop_cli-0.16.3.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,481 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""lint_skill.py - check the mechanical parts of an Agent Skill folder.
|
|
3
|
+
|
|
4
|
+
Usage:
|
|
5
|
+
python3 lint_skill.py <skill-dir> [--siblings <dir>] [--json] [-o <report-path>]
|
|
6
|
+
|
|
7
|
+
Checks a folder that holds a SKILL.md (Claude Code, Codex, Copilot, Cursor, Kiro,
|
|
8
|
+
Antigravity all read the same shape):
|
|
9
|
+
|
|
10
|
+
frontmatter SKILL.md opens with a --- block holding `name` and `description`
|
|
11
|
+
name kebab-case, at most 64 characters, equal to the folder name
|
|
12
|
+
description 1-1024 characters, long enough for a router to act on, ends with
|
|
13
|
+
trigger phrases ("Use when ...")
|
|
14
|
+
paths every relative link and in-skill path (scripts/, references/,
|
|
15
|
+
templates/, examples/, assets/, lenses/, rubrics/) named in SKILL.md exists
|
|
16
|
+
portability every ${CLAUDE_SKILL_DIR}/x also appears as a plain relative x;
|
|
17
|
+
no absolute home-directory paths
|
|
18
|
+
structure SKILL.md line count, a quality bar, anti-patterns, a when-not-to-use
|
|
19
|
+
section, reference files nobody links, scripts nobody calls
|
|
20
|
+
evals evals/evals.json and evals/eval_queries.json present and well formed
|
|
21
|
+
safety the same pattern families `skilldrop scan` uses: prose instructions to
|
|
22
|
+
override, conceal, rewrite memory, send data out or fetch remote
|
|
23
|
+
instructions; script patterns for remote exec, shell, network,
|
|
24
|
+
credentials, and deletes outside the skill
|
|
25
|
+
siblings (with --siblings) a duplicate name, or a description that overlaps
|
|
26
|
+
heavily with another skill's
|
|
27
|
+
|
|
28
|
+
Every finding is ERROR (breaks loading or a promise the skill makes), WARN (a reviewer
|
|
29
|
+
should look), or INFO. Exit code: 0 no errors, 1 at least one ERROR, 2 bad input.
|
|
30
|
+
Stdlib only, Python 3.9+, no network.
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
import argparse
|
|
34
|
+
import json
|
|
35
|
+
import os
|
|
36
|
+
import re
|
|
37
|
+
import sys
|
|
38
|
+
|
|
39
|
+
MAX_NAME = 64
|
|
40
|
+
MAX_DESC = 1024
|
|
41
|
+
MIN_DESC = 120
|
|
42
|
+
MAX_LINES = 500
|
|
43
|
+
# Word-overlap (Jaccard) of two descriptions' content words. Across the 60-odd skilldrop
|
|
44
|
+
# skills the closest distinct pair scores 0.16, so 0.20 flags a real collision, not a cousin.
|
|
45
|
+
OVERLAP_WARN = 0.20
|
|
46
|
+
|
|
47
|
+
NAME_RE = re.compile(r"^[a-z0-9]+(-[a-z0-9]+)*$")
|
|
48
|
+
FENCE_RE = re.compile(r"^```.*?^```", re.M | re.S)
|
|
49
|
+
MD_LINK_RE = re.compile(r"\[[^\]]*\]\(([^)\s]+)\)")
|
|
50
|
+
INSKILL_RE = re.compile(
|
|
51
|
+
r"(?<![\w/.$}])((?:scripts|references|templates|examples|assets|lenses|rubrics)/[\w./<>{}*-]+)")
|
|
52
|
+
SKILL_DIR_RE = re.compile(r"\$\{?CLAUDE_SKILL_DIR\}?/([\w./<>{}*-]+)")
|
|
53
|
+
TRIGGER_RE = re.compile(
|
|
54
|
+
r"\b(use (it |this skill |this )?(when|whenever|for|if|to)|trigger(s|ed)? (on|when)|"
|
|
55
|
+
r"invoke when|when the user|says \")", re.I)
|
|
56
|
+
WEAK_OPENING_RE = re.compile(r"^(this skill|a skill|skill (that|for|to)|helps?\b|i\b|an? (helpful|useful|simple|powerful))", re.I)
|
|
57
|
+
ABS_PATH_RE = re.compile(r"(?<![\w~])(/Users/[A-Za-z0-9._-]+/|/home/[A-Za-z0-9._-]+/|[A-Z]:\\\\?Users\\\\?)")
|
|
58
|
+
MATERIAL_DIRS = ("references", "lenses", "rubrics")
|
|
59
|
+
SCRIPT_EXT = {".py", ".js", ".mjs", ".cjs", ".sh", ".bash", ".zsh", ".rb", ".pl", ".ps1"}
|
|
60
|
+
|
|
61
|
+
# The pattern families below mirror `skilldrop scan` (bin/skilldrop.js, RFC-0022) so a
|
|
62
|
+
# skill reviewed outside the skilldrop repo gets the same first pass. Literals are split
|
|
63
|
+
# with character classes so this file does not match its own rules.
|
|
64
|
+
PROSE_RULES = [
|
|
65
|
+
("instruction-override", "ERROR", "AST01, LLM01", "tells the agent to discard its earlier instructions",
|
|
66
|
+
re.compile(r"ignor[e]\s+(all\s+)?(previous|prior|earlier|above|preceding)\s+(instructions|prompts|rules)", re.I)),
|
|
67
|
+
("conceal-from-user", "ERROR", "AST01, LLM01", "tells the agent to hide actions from the user",
|
|
68
|
+
re.compile(r"(do\s*n[o']?t|never|without)\s+(tell|telling|inform|informing|notify|notifying|mention|mentioning)\s+(the\s+)?(use[r]|huma[n])", re.I)),
|
|
69
|
+
("memory-overwrite", "ERROR", "AST01, LLM01", "tells the agent to rewrite its own memory or policy file",
|
|
70
|
+
re.compile(r"(update|overwrite|append\s+to|modify)\s+your\s+(own\s+)?(SOUL|MEMORY|CLAUDE|AGENTS)\.m[d]", re.I)),
|
|
71
|
+
("prose-exfil", "WARN", "AST01, LLM02", "tells the agent to send data to an external endpoint",
|
|
72
|
+
re.compile(r"\b(POST|send|upload|transmit)\b[^\n.]{0,60}\bto\s+http[s]?://", re.I)),
|
|
73
|
+
("remote-instructions", "WARN", "AST05, LLM01",
|
|
74
|
+
"tells the agent to fetch instructions from a URL at run time; what it obeys can change after review",
|
|
75
|
+
re.compile(r"\b(fetch|download|load|read|follow|pull)\b[^\n.]{0,40}\b(instructions|rules|prompt|system prompt|skill|directives)\b[^\n.]{0,30}\bfrom\s+(http[s]?://|<?url)", re.I)),
|
|
76
|
+
]
|
|
77
|
+
|
|
78
|
+
SCRIPT_RULES = [
|
|
79
|
+
("exec-remote", "ERROR", "AST01, AST02", "downloads and executes remote content",
|
|
80
|
+
re.compile(r"(cur[l]|wge[t])[^\n|]*\|\s*(sudo\s+)?(ba|z|)s[h]\b|eva[l]\s*\(\s*(requests|urllib|fetch)|base64\s+(-d|--decode)[^\n|]*\|\s*(ba|z|)s[h]\b", re.I)),
|
|
81
|
+
("shell-exec", "WARN", "AST03, LLM06", "executes shell commands",
|
|
82
|
+
re.compile(r"\b(os\.syste[m]|subproces[s]\.(run|call|Popen|check_output)|child_proces[s]|execSyn[c]|spawnSyn[c]|shell_exe[c])")),
|
|
83
|
+
("network", "WARN", "AST03, LLM02", "makes outbound network calls",
|
|
84
|
+
re.compile(r"\b(request[s]\.(get|post|put)|urlli[b]\.request|http[x]\.|axio[s]\.|node-fetc[h]|\bfetc[h]\s*\(\s*[\"'`]https?:|cur[l]\s+https?:|wge[t]\s+https?:)", re.I)),
|
|
85
|
+
("credentials", "WARN", "AST01, LLM02", "reads credentials or secret material",
|
|
86
|
+
re.compile(r"\b(os\.enviro[n]|process\.en[v])\b[^\n]{0,40}(TOKEN|KEY|SECRET|PASSWORD|CREDENTIAL)|~/\.(aws|ssh|npmrc|netrc)\b|\.en[v]\b|id_rs[a]", re.I)),
|
|
87
|
+
("broad-fs", "INFO", "AST03, LLM06", "deletes or writes outside the skill's own folder",
|
|
88
|
+
re.compile(r"\b(shuti[l]\.rmtree|r[m]\s+-rf\s+[~/]|ope[n]\s*\(\s*[\"'`]/(etc|usr|bin)|fs\.(unlink|rmSync)\s*\([^)]*\.\./)")),
|
|
89
|
+
]
|
|
90
|
+
|
|
91
|
+
STOPWORDS = set("""a an and are as at be by for from has have in into is it its of on or that the
|
|
92
|
+
their them this to use used user users when whenever which with without your you skill skills
|
|
93
|
+
says want wants wanted needs need like also each every over under than then only just one
|
|
94
|
+
any all not no can will should would could about across after before more most other such""".split())
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
class Report(object):
|
|
98
|
+
def __init__(self, skill_dir):
|
|
99
|
+
self.skill_dir = skill_dir
|
|
100
|
+
self.findings = []
|
|
101
|
+
self.facts = {}
|
|
102
|
+
|
|
103
|
+
def add(self, level, area, msg, where=""):
|
|
104
|
+
self.findings.append({"level": level, "area": area, "message": msg, "where": where})
|
|
105
|
+
|
|
106
|
+
def count(self, level):
|
|
107
|
+
return sum(1 for f in self.findings if f["level"] == level)
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def die(msg):
|
|
111
|
+
sys.stderr.write("lint_skill: " + msg + "\n")
|
|
112
|
+
sys.exit(2)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def read(path):
|
|
116
|
+
with open(path, encoding="utf-8") as fh:
|
|
117
|
+
return fh.read()
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def split_frontmatter(text):
|
|
121
|
+
"""Return (frontmatter_text or None, body, body_start_line)."""
|
|
122
|
+
lines = text.splitlines()
|
|
123
|
+
if not lines or lines[0].strip() != "---":
|
|
124
|
+
return None, text, 1
|
|
125
|
+
for i in range(1, len(lines)):
|
|
126
|
+
if lines[i].strip() == "---":
|
|
127
|
+
return "\n".join(lines[1:i]), "\n".join(lines[i + 1:]), i + 2
|
|
128
|
+
return None, text, 1
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def parse_frontmatter(fm):
|
|
132
|
+
"""Minimal YAML subset: top-level `key: value`, folded/literal blocks, quoted strings."""
|
|
133
|
+
out = {}
|
|
134
|
+
lines = fm.splitlines()
|
|
135
|
+
i = 0
|
|
136
|
+
while i < len(lines):
|
|
137
|
+
m = re.match(r"^([A-Za-z_][\w-]*):\s*(.*)$", lines[i])
|
|
138
|
+
if not m:
|
|
139
|
+
i += 1
|
|
140
|
+
continue
|
|
141
|
+
key, val = m.group(1), m.group(2).strip()
|
|
142
|
+
i += 1
|
|
143
|
+
cont = []
|
|
144
|
+
while i < len(lines) and (lines[i].startswith((" ", "\t")) or not lines[i].strip()):
|
|
145
|
+
cont.append(lines[i].strip())
|
|
146
|
+
i += 1
|
|
147
|
+
if val in (">", "|", ">-", "|-", ">+", "|+"):
|
|
148
|
+
val = " ".join(c for c in cont if c)
|
|
149
|
+
elif cont and not val.startswith(("[", "{")):
|
|
150
|
+
val = " ".join([val] + [c for c in cont if c])
|
|
151
|
+
if len(val) >= 2 and val[0] == val[-1] and val[0] in "\"'":
|
|
152
|
+
val = val[1:-1]
|
|
153
|
+
out[key] = val
|
|
154
|
+
return out
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def content_words(text):
|
|
158
|
+
return set(w for w in re.findall(r"[a-z][a-z0-9-]{3,}", text.lower()) if w not in STOPWORDS)
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def check_frontmatter(rep, folder, text):
|
|
162
|
+
fm, body, _ = split_frontmatter(text)
|
|
163
|
+
if fm is None:
|
|
164
|
+
rep.add("ERROR", "frontmatter", "SKILL.md does not open with a --- frontmatter block; no tool will load it", "SKILL.md:1")
|
|
165
|
+
return {}, body
|
|
166
|
+
meta = parse_frontmatter(fm)
|
|
167
|
+
name = meta.get("name", "")
|
|
168
|
+
if not name:
|
|
169
|
+
rep.add("ERROR", "frontmatter", "frontmatter has no `name`", "SKILL.md")
|
|
170
|
+
else:
|
|
171
|
+
if name != folder:
|
|
172
|
+
rep.add("ERROR", "frontmatter", "name '%s' does not match folder '%s'; tools key the skill on both" % (name, folder), "SKILL.md")
|
|
173
|
+
if not NAME_RE.match(name):
|
|
174
|
+
rep.add("ERROR", "frontmatter", "name '%s' is not kebab-case (lowercase letters, digits, single hyphens)" % name, "SKILL.md")
|
|
175
|
+
if len(name) > MAX_NAME:
|
|
176
|
+
rep.add("ERROR", "frontmatter", "name is %d characters; the limit is %d" % (len(name), MAX_NAME), "SKILL.md")
|
|
177
|
+
desc = meta.get("description", "")
|
|
178
|
+
rep.facts["description_chars"] = len(desc)
|
|
179
|
+
if not desc:
|
|
180
|
+
rep.add("ERROR", "description", "frontmatter has no `description`; a router has nothing to match on", "SKILL.md")
|
|
181
|
+
else:
|
|
182
|
+
if len(desc) > MAX_DESC:
|
|
183
|
+
rep.add("ERROR", "description", "description is %d characters; the limit is %d" % (len(desc), MAX_DESC), "SKILL.md")
|
|
184
|
+
elif len(desc) < MIN_DESC:
|
|
185
|
+
rep.add("WARN", "description", "description is %d characters; under %d rarely names both the artifact and the triggers" % (len(desc), MIN_DESC), "SKILL.md")
|
|
186
|
+
if not TRIGGER_RE.search(desc):
|
|
187
|
+
rep.add("WARN", "description", "description has no trigger phrases (\"Use when the user ...\", \"says ...\"); routing will rely on luck", "SKILL.md")
|
|
188
|
+
elif TRIGGER_RE.search(desc).start() < len(desc) * 0.25:
|
|
189
|
+
rep.add("INFO", "description", "trigger phrases come before the artifact; lead with what the skill produces", "SKILL.md")
|
|
190
|
+
if WEAK_OPENING_RE.match(desc):
|
|
191
|
+
rep.add("WARN", "description", "description opens with filler (\"%s...\"); open with the artifact it produces" % desc[:24], "SKILL.md")
|
|
192
|
+
for key in meta:
|
|
193
|
+
if key not in ("name", "description", "license", "compatibility", "metadata", "allowed-tools",
|
|
194
|
+
"version", "disable-model-invocation", "user-invocable", "argument-hint", "model"):
|
|
195
|
+
rep.add("INFO", "frontmatter", "frontmatter key '%s' is not one the common tools read; check it is intended" % key, "SKILL.md")
|
|
196
|
+
return meta, body
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
def is_placeholder(target):
|
|
200
|
+
return "..." in target or "…" in target or any(c in target for c in "{}<>*")
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
def check_paths(rep, skill_dir, text):
|
|
204
|
+
prose = FENCE_RE.sub("", text)
|
|
205
|
+
seen = set()
|
|
206
|
+
for m in MD_LINK_RE.finditer(prose):
|
|
207
|
+
target = m.group(1).split("#")[0]
|
|
208
|
+
if not target or re.match(r"^[a-z]+:", target) or target.startswith("/") or is_placeholder(target):
|
|
209
|
+
continue
|
|
210
|
+
seen.add(target)
|
|
211
|
+
if not os.path.exists(os.path.normpath(os.path.join(skill_dir, target))):
|
|
212
|
+
rep.add("ERROR", "paths", "link target '%s' does not exist" % target, "SKILL.md")
|
|
213
|
+
for m in INSKILL_RE.finditer(prose):
|
|
214
|
+
rel = m.group(1).rstrip(".,)`'\"")
|
|
215
|
+
if rel in seen or is_placeholder(rel):
|
|
216
|
+
continue
|
|
217
|
+
seen.add(rel)
|
|
218
|
+
if not os.path.exists(os.path.join(skill_dir, rel)):
|
|
219
|
+
rep.add("ERROR", "paths", "SKILL.md names '%s' but it does not exist in the skill" % rel, "SKILL.md")
|
|
220
|
+
# ${CLAUDE_SKILL_DIR} paths are checked everywhere, fences included: that is where commands live.
|
|
221
|
+
for m in SKILL_DIR_RE.finditer(text):
|
|
222
|
+
rel = m.group(1).rstrip(".,)`'\"")
|
|
223
|
+
if is_placeholder(rel) or rel in seen:
|
|
224
|
+
continue
|
|
225
|
+
seen.add(rel)
|
|
226
|
+
if not os.path.exists(os.path.join(skill_dir, rel)):
|
|
227
|
+
rep.add("ERROR", "paths", "${CLAUDE_SKILL_DIR}/%s does not exist in the skill" % rel, "SKILL.md")
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
def check_portability(rep, skill_dir, text):
|
|
231
|
+
claude_refs = set(m.group(1).rstrip(".,)`'\"") for m in SKILL_DIR_RE.finditer(text))
|
|
232
|
+
stripped = SKILL_DIR_RE.sub("", text)
|
|
233
|
+
for rel in sorted(claude_refs):
|
|
234
|
+
if is_placeholder(rel):
|
|
235
|
+
continue
|
|
236
|
+
if not re.search(r"(?<![\w/}])" + re.escape(rel), stripped):
|
|
237
|
+
rep.add("ERROR", "portability",
|
|
238
|
+
"${CLAUDE_SKILL_DIR}/%s has no plain relative fallback; only Claude Code sets that variable, so Codex, Copilot, Cursor and Kiro cannot find the file" % rel,
|
|
239
|
+
"SKILL.md")
|
|
240
|
+
for path, rel in iter_files(skill_dir, (".md",)):
|
|
241
|
+
if rel.startswith("examples" + os.sep):
|
|
242
|
+
continue # examples illustrate; an absolute path there is not an instruction
|
|
243
|
+
for n, line in enumerate(read_lines(path), 1):
|
|
244
|
+
m = ABS_PATH_RE.search(line)
|
|
245
|
+
if m:
|
|
246
|
+
rep.add("WARN", "portability", "absolute home-directory path '%s' only exists on the author's machine" % m.group(1), "%s:%d" % (rel, n))
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
def iter_files(skill_dir, exts=None):
|
|
250
|
+
for root, dirs, files in os.walk(skill_dir):
|
|
251
|
+
dirs[:] = sorted(d for d in dirs if not d.startswith(".") and d not in ("node_modules", "__pycache__"))
|
|
252
|
+
for f in sorted(files):
|
|
253
|
+
if exts is None or os.path.splitext(f)[1].lower() in exts:
|
|
254
|
+
p = os.path.join(root, f)
|
|
255
|
+
yield p, os.path.relpath(p, skill_dir)
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
def read_lines(path):
|
|
259
|
+
try:
|
|
260
|
+
return read(path).splitlines()
|
|
261
|
+
except (UnicodeDecodeError, OSError):
|
|
262
|
+
return []
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
def check_structure(rep, skill_dir, text):
|
|
266
|
+
n = text.count("\n") + 1
|
|
267
|
+
rep.facts["skill_md_lines"] = n
|
|
268
|
+
if n > MAX_LINES:
|
|
269
|
+
rep.add("WARN", "structure", "SKILL.md is %d lines; past %d, split material into reference files" % (n, MAX_LINES), "SKILL.md")
|
|
270
|
+
headings = [h.lower() for h in re.findall(r"^#{2,3}\s+(.+)$", FENCE_RE.sub("", text), re.M)]
|
|
271
|
+
def has(*words):
|
|
272
|
+
return any(any(w in h for w in words) for h in headings)
|
|
273
|
+
if not has("quality bar", "quality", "definition of done", "acceptance"):
|
|
274
|
+
rep.add("WARN", "structure", "no quality-bar section; nothing tells the agent what a passing output looks like", "SKILL.md")
|
|
275
|
+
if not has("anti-pattern", "antipattern", "avoid", "pitfall"):
|
|
276
|
+
rep.add("WARN", "structure", "no anti-patterns section; the known failure modes are left for the agent to rediscover", "SKILL.md")
|
|
277
|
+
if not has("when not", "not to use", "don't use", "do not use"):
|
|
278
|
+
rep.add("WARN", "structure", "no when-not-to-use section; nothing draws the boundary against sibling skills", "SKILL.md")
|
|
279
|
+
if not re.search(r"non-interactive|headless|BLOCKED", text, re.I):
|
|
280
|
+
rep.add("INFO", "structure", "no non-interactive rule; in a subagent or CI run the skill cannot ask its questions", "SKILL.md")
|
|
281
|
+
material = []
|
|
282
|
+
if os.path.isfile(os.path.join(skill_dir, "reference.md")):
|
|
283
|
+
material.append("reference.md")
|
|
284
|
+
for d in MATERIAL_DIRS:
|
|
285
|
+
dp = os.path.join(skill_dir, d)
|
|
286
|
+
if os.path.isdir(dp):
|
|
287
|
+
material += [os.path.join(d, f) for f in sorted(os.listdir(dp)) if f.endswith(".md")]
|
|
288
|
+
for rel in material:
|
|
289
|
+
if rel not in text and os.path.basename(rel) not in text:
|
|
290
|
+
rep.add("WARN", "structure", "%s is never linked from SKILL.md; no agent will read it" % rel, rel)
|
|
291
|
+
else:
|
|
292
|
+
ln = len(read_lines(os.path.join(skill_dir, rel)))
|
|
293
|
+
if ln > 1000:
|
|
294
|
+
rep.add("INFO", "structure", "%s is %d lines; add a table of contents so the agent can jump" % (rel, ln), rel)
|
|
295
|
+
sdir = os.path.join(skill_dir, "scripts")
|
|
296
|
+
if os.path.isdir(sdir):
|
|
297
|
+
for f in sorted(os.listdir(sdir)):
|
|
298
|
+
if os.path.splitext(f)[1].lower() in SCRIPT_EXT and f not in text:
|
|
299
|
+
rep.add("WARN", "structure", "scripts/%s is never mentioned in SKILL.md; the agent will not know to run it" % f, "scripts/" + f)
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
def check_evals(rep, skill_dir, name):
|
|
303
|
+
ev = os.path.join(skill_dir, "evals", "evals.json")
|
|
304
|
+
qs = os.path.join(skill_dir, "evals", "eval_queries.json")
|
|
305
|
+
if not os.path.isfile(ev):
|
|
306
|
+
rep.add("WARN", "evals", "no evals/evals.json; there is no acceptance prompt to test the skill against", "evals/")
|
|
307
|
+
else:
|
|
308
|
+
try:
|
|
309
|
+
data = json.loads(read(ev))
|
|
310
|
+
except ValueError as e:
|
|
311
|
+
rep.add("ERROR", "evals", "evals.json is not valid JSON: %s" % e, "evals/evals.json")
|
|
312
|
+
data = None
|
|
313
|
+
if data is not None:
|
|
314
|
+
items = data.get("evals") if isinstance(data, dict) else None
|
|
315
|
+
if not isinstance(items, list) or not items:
|
|
316
|
+
rep.add("ERROR", "evals", "evals.json needs {\"skill_name\", \"evals\": [...]} with at least one eval", "evals/evals.json")
|
|
317
|
+
else:
|
|
318
|
+
if data.get("skill_name") != name:
|
|
319
|
+
rep.add("WARN", "evals", "evals.json skill_name is '%s', not '%s'" % (data.get("skill_name"), name), "evals/evals.json")
|
|
320
|
+
n_assert = 0
|
|
321
|
+
for i, e in enumerate(items, 1):
|
|
322
|
+
if not isinstance(e, dict) or not e.get("prompt"):
|
|
323
|
+
rep.add("ERROR", "evals", "eval #%d has no prompt" % i, "evals/evals.json")
|
|
324
|
+
continue
|
|
325
|
+
if not isinstance(e.get("assertions"), list) or not e["assertions"]:
|
|
326
|
+
rep.add("ERROR", "evals", "eval #%d has no assertions; nothing says what a passing output looks like" % i, "evals/evals.json")
|
|
327
|
+
continue
|
|
328
|
+
n_assert += len(e["assertions"])
|
|
329
|
+
if len(e["prompt"]) < 60:
|
|
330
|
+
rep.add("INFO", "evals", "eval #%d prompt is %d characters; a realistic prompt carries concrete details" % (i, len(e["prompt"])), "evals/evals.json")
|
|
331
|
+
rep.facts["evals"] = len(items)
|
|
332
|
+
rep.facts["assertions"] = n_assert
|
|
333
|
+
if n_assert and n_assert < 3:
|
|
334
|
+
rep.add("WARN", "evals", "only %d assertion(s); restate the quality bar as checkable claims" % n_assert, "evals/evals.json")
|
|
335
|
+
if not os.path.isfile(qs):
|
|
336
|
+
rep.add("WARN", "evals", "no evals/eval_queries.json; nothing tests whether the description routes correctly", "evals/")
|
|
337
|
+
return
|
|
338
|
+
try:
|
|
339
|
+
q = json.loads(read(qs))
|
|
340
|
+
except ValueError as e:
|
|
341
|
+
rep.add("ERROR", "evals", "eval_queries.json is not valid JSON: %s" % e, "evals/eval_queries.json")
|
|
342
|
+
return
|
|
343
|
+
if not isinstance(q, list) or any(not isinstance(r, dict) or not r.get("query") or not isinstance(r.get("should_trigger"), bool) for r in q):
|
|
344
|
+
rep.add("ERROR", "evals", "eval_queries.json must be a list of {\"query\": str, \"should_trigger\": true|false}", "evals/eval_queries.json")
|
|
345
|
+
return
|
|
346
|
+
pos = sum(1 for r in q if r["should_trigger"])
|
|
347
|
+
neg = len(q) - pos
|
|
348
|
+
rep.facts["trigger_queries"] = pos
|
|
349
|
+
rep.facts["near_miss_queries"] = neg
|
|
350
|
+
if pos < 4:
|
|
351
|
+
rep.add("WARN", "evals", "%d should-trigger queries; write at least 4 phrasings a real user would type" % pos, "evals/eval_queries.json")
|
|
352
|
+
if neg < 3:
|
|
353
|
+
rep.add("WARN", "evals", "%d should-not-trigger queries; write at least 3 near-misses that belong to a named sibling" % neg, "evals/eval_queries.json")
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
def check_safety(rep, skill_dir):
|
|
357
|
+
for path, rel in iter_files(skill_dir):
|
|
358
|
+
ext = os.path.splitext(path)[1].lower()
|
|
359
|
+
if ext == ".md":
|
|
360
|
+
rules = PROSE_RULES
|
|
361
|
+
elif ext in SCRIPT_EXT:
|
|
362
|
+
rules = SCRIPT_RULES
|
|
363
|
+
else:
|
|
364
|
+
continue
|
|
365
|
+
for n, line in enumerate(read_lines(path), 1):
|
|
366
|
+
if len(line) > 400:
|
|
367
|
+
continue
|
|
368
|
+
for rid, level, owasp, why, rx in rules:
|
|
369
|
+
if rx.search(line):
|
|
370
|
+
rep.add(level, "safety", "%s: %s [%s]" % (rid, why, owasp), "%s:%d" % (rel, n))
|
|
371
|
+
|
|
372
|
+
|
|
373
|
+
def find_skills(root):
|
|
374
|
+
for dirpath, dirs, files in os.walk(root):
|
|
375
|
+
dirs[:] = [d for d in dirs if not d.startswith(".") and d != "node_modules"]
|
|
376
|
+
if "SKILL.md" in files:
|
|
377
|
+
yield dirpath
|
|
378
|
+
dirs[:] = []
|
|
379
|
+
|
|
380
|
+
|
|
381
|
+
def check_siblings(rep, skill_dir, name, desc, root):
|
|
382
|
+
mine = content_words(desc)
|
|
383
|
+
scores = []
|
|
384
|
+
me = os.path.realpath(skill_dir)
|
|
385
|
+
for d in find_skills(root):
|
|
386
|
+
if os.path.realpath(d) == me:
|
|
387
|
+
continue
|
|
388
|
+
try:
|
|
389
|
+
fm, _, _ = split_frontmatter(read(os.path.join(d, "SKILL.md")))
|
|
390
|
+
except (OSError, UnicodeDecodeError):
|
|
391
|
+
continue
|
|
392
|
+
meta = parse_frontmatter(fm or "")
|
|
393
|
+
other = meta.get("name") or os.path.basename(d)
|
|
394
|
+
if other == name:
|
|
395
|
+
rep.add("ERROR", "siblings", "another skill is also named '%s'; only one will load" % name, os.path.relpath(d, root))
|
|
396
|
+
theirs = content_words(meta.get("description", ""))
|
|
397
|
+
if mine and theirs:
|
|
398
|
+
j = len(mine & theirs) / float(len(mine | theirs))
|
|
399
|
+
scores.append((j, other, sorted(mine & theirs)))
|
|
400
|
+
scores.sort(reverse=True)
|
|
401
|
+
rep.facts["siblings_compared"] = len(scores)
|
|
402
|
+
rep.facts["closest_siblings"] = [{"skill": s, "overlap": round(j, 2)} for j, s, _ in scores[:3]]
|
|
403
|
+
for j, other, shared in scores[:3]:
|
|
404
|
+
if j >= OVERLAP_WARN:
|
|
405
|
+
rep.add("WARN", "siblings", "description overlaps %d%% with '%s' (shared: %s); add a when-not line and a near-miss query naming it"
|
|
406
|
+
% (round(j * 100), other, ", ".join(shared[:8])), "SKILL.md")
|
|
407
|
+
|
|
408
|
+
|
|
409
|
+
def render(rep, name):
|
|
410
|
+
out = []
|
|
411
|
+
e, w, i = rep.count("ERROR"), rep.count("WARN"), rep.count("INFO")
|
|
412
|
+
out.append("lint_skill: %s (%s)" % (name, rep.skill_dir))
|
|
413
|
+
facts = rep.facts
|
|
414
|
+
bits = []
|
|
415
|
+
for k in ("skill_md_lines", "description_chars", "evals", "assertions", "trigger_queries", "near_miss_queries", "siblings_compared"):
|
|
416
|
+
if k in facts:
|
|
417
|
+
bits.append("%s=%s" % (k, facts[k]))
|
|
418
|
+
out.append(" " + " ".join(bits))
|
|
419
|
+
if facts.get("closest_siblings"):
|
|
420
|
+
out.append(" closest: " + ", ".join("%s %.2f" % (c["skill"], c["overlap"]) for c in facts["closest_siblings"]))
|
|
421
|
+
order = {"ERROR": 0, "WARN": 1, "INFO": 2}
|
|
422
|
+
for f in sorted(rep.findings, key=lambda x: (order[x["level"]], x["area"])):
|
|
423
|
+
out.append(" %-5s %-12s %s%s" % (f["level"], f["area"], f["message"], (" (" + f["where"] + ")") if f["where"] else ""))
|
|
424
|
+
if not rep.findings:
|
|
425
|
+
out.append(" no findings")
|
|
426
|
+
out.append("result: %d error(s), %d warning(s), %d info -> %s" % (
|
|
427
|
+
e, w, i, "mechanical checks FAIL" if e else ("mechanical checks pass with warnings" if w else "mechanical checks pass")))
|
|
428
|
+
return "\n".join(out) + "\n"
|
|
429
|
+
|
|
430
|
+
|
|
431
|
+
def main(argv=None):
|
|
432
|
+
ap = argparse.ArgumentParser(description="Lint the mechanical parts of an Agent Skill folder.")
|
|
433
|
+
ap.add_argument("skill_dir", help="folder that contains SKILL.md")
|
|
434
|
+
ap.add_argument("--siblings", metavar="DIR", help="folder to search for other skills (name clash and description overlap)")
|
|
435
|
+
ap.add_argument("--json", action="store_true", help="print JSON instead of text")
|
|
436
|
+
ap.add_argument("-o", "--output", metavar="PATH", help="also write the report to PATH")
|
|
437
|
+
args = ap.parse_args(argv)
|
|
438
|
+
|
|
439
|
+
skill_dir = os.path.abspath(args.skill_dir)
|
|
440
|
+
if not os.path.isdir(skill_dir):
|
|
441
|
+
die("'%s' is not a directory" % args.skill_dir)
|
|
442
|
+
skill_md = os.path.join(skill_dir, "SKILL.md")
|
|
443
|
+
if not os.path.isfile(skill_md):
|
|
444
|
+
die("'%s' has no SKILL.md; point at the skill folder itself, not its parent" % args.skill_dir)
|
|
445
|
+
if args.siblings and not os.path.isdir(args.siblings):
|
|
446
|
+
die("--siblings '%s' is not a directory" % args.siblings)
|
|
447
|
+
try:
|
|
448
|
+
text = read(skill_md)
|
|
449
|
+
except UnicodeDecodeError:
|
|
450
|
+
die("SKILL.md is not UTF-8 text")
|
|
451
|
+
|
|
452
|
+
folder = os.path.basename(skill_dir.rstrip(os.sep))
|
|
453
|
+
rep = Report(args.skill_dir)
|
|
454
|
+
meta, _ = check_frontmatter(rep, folder, text)
|
|
455
|
+
name = meta.get("name") or folder
|
|
456
|
+
check_paths(rep, skill_dir, text)
|
|
457
|
+
check_portability(rep, skill_dir, text)
|
|
458
|
+
check_structure(rep, skill_dir, text)
|
|
459
|
+
check_evals(rep, skill_dir, folder)
|
|
460
|
+
check_safety(rep, skill_dir)
|
|
461
|
+
if args.siblings:
|
|
462
|
+
check_siblings(rep, skill_dir, name, meta.get("description", ""), os.path.abspath(args.siblings))
|
|
463
|
+
|
|
464
|
+
if args.json:
|
|
465
|
+
result = json.dumps({"skill": name, "dir": skill_dir, "facts": rep.facts,
|
|
466
|
+
"errors": rep.count("ERROR"), "warnings": rep.count("WARN"),
|
|
467
|
+
"findings": rep.findings}, indent=2) + "\n"
|
|
468
|
+
else:
|
|
469
|
+
result = render(rep, name)
|
|
470
|
+
sys.stdout.write(result)
|
|
471
|
+
if args.output:
|
|
472
|
+
try:
|
|
473
|
+
with open(args.output, "w", encoding="utf-8") as fh:
|
|
474
|
+
fh.write(result)
|
|
475
|
+
except OSError as e:
|
|
476
|
+
die("cannot write %s: %s" % (args.output, e))
|
|
477
|
+
return 1 if rep.count("ERROR") else 0
|
|
478
|
+
|
|
479
|
+
|
|
480
|
+
if __name__ == "__main__":
|
|
481
|
+
sys.exit(main())
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Skill review: {skill-name}
|
|
2
|
+
_Folder: {path} · Reviewed: {YYYY-MM-DD} · Siblings checked: {list, or "none given [assumption]"}_
|
|
3
|
+
|
|
4
|
+
## Verdict
|
|
5
|
+
**{READY | FIX FIRST | REWRITE}** — {N} blocker, {N} major, {N} minor, {N} nit
|
|
6
|
+
|
|
7
|
+
{Three sentences: what the skill is for, the finding that decides the verdict, and what to do first.}
|
|
8
|
+
|
|
9
|
+
## Lint output
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
{paste lint_skill.py output verbatim}
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Findings
|
|
16
|
+
|
|
17
|
+
### Description and routing
|
|
18
|
+
1. 🟧 **Where:** {SKILL.md frontmatter, or "quote"}
|
|
19
|
+
**What:** {one sentence}
|
|
20
|
+
**Fix:** {replacement text}
|
|
21
|
+
|
|
22
|
+
### Portability
|
|
23
|
+
…
|
|
24
|
+
|
|
25
|
+
### Safety
|
|
26
|
+
1. 🟥 **Where:** {file:line} [{AST0N}]
|
|
27
|
+
**What:** {what the line makes the agent or script do}
|
|
28
|
+
**Fix:** {the edit}
|
|
29
|
+
|
|
30
|
+
### Structure
|
|
31
|
+
…
|
|
32
|
+
|
|
33
|
+
### Eval coverage
|
|
34
|
+
…
|
|
35
|
+
|
|
36
|
+
## Suggested description
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
{the full rewritten description, only when routing findings call for one}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## What's working
|
|
43
|
+
- {2-4 specific strengths worth keeping in a rewrite}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: design
|
|
3
|
+
description: Take a ratified requirement to a recorded architectural decision — constraints, structure, diagrams, threats, then a panel that must agree before the decision is written down. Use when the user is designing a system, choosing an architecture, or asking how something should be built.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# design
|
|
7
|
+
|
|
8
|
+
The loop with the worst reversibility profile in the repo. A discovery mistake costs a
|
|
9
|
+
re-brief; a design mistake surfaces months later, in code nobody wants to unwind. That is why
|
|
10
|
+
its gate is a **panel** — independent positions, surfaced cruxes, recorded dissent — and not
|
|
11
|
+
a script, and why the decision is recorded only *after* the panel agrees.
|
|
12
|
+
|
|
13
|
+
## Stages
|
|
14
|
+
|
|
15
|
+
| # | Stage | Type | Skills | Gate |
|
|
16
|
+
|---|---|---|---|---|
|
|
17
|
+
| 1 | `constrain` | generate | [`nfr-spec`](../../skills/nfr-spec/SKILL.md) | — |
|
|
18
|
+
| 2 | `shape` | generate | [`design-doc`](../../skills/design-doc/SKILL.md), [`architecture-diagrams`](../../skills/architecture-diagrams/SKILL.md) | — |
|
|
19
|
+
| 3 | `threat` | verify | [`threat-model`](../../skills/threat-model/SKILL.md) | — |
|
|
20
|
+
| 4 | `ratify` | gate | [`council-review`](../../../core/skills/council-review/SKILL.md) | **G1** review |
|
|
21
|
+
| 5 | `record` | generate | [`adr-generator`](../../skills/adr-generator/SKILL.md) | — |
|
|
22
|
+
|
|
23
|
+
## How to run this loop
|
|
24
|
+
|
|
25
|
+
1. **Constrain before shaping.** `nfr-spec` first, always. A design produced before its
|
|
26
|
+
quality targets exist gets judged on taste, and taste does not survive a review panel.
|
|
27
|
+
2. **Shape prose and picture together.** `design-doc` and `architecture-diagrams` are one
|
|
28
|
+
artifact in two renderings. A diagram that disagrees with the doc is a defect in both.
|
|
29
|
+
3. **Attack it before ratifying.** `threat-model` consumes the design directly. Running it
|
|
30
|
+
after G1 means the panel ratified something nobody had attacked.
|
|
31
|
+
4. **Ratify at G1.** `council-review` seats the standing panel, takes positions *before*
|
|
32
|
+
cross-talk, names the cruxes, and records dissent with "what would change our mind".
|
|
33
|
+
`REVISE` returns to `shape`. `SPLIT` and `RECONSIDER` leave the loop.
|
|
34
|
+
5. **Record last.** `adr-generator` writes the decision *after* it is a decision, with the
|
|
35
|
+
rejected options and the reasoning that killed them. An ADR written before G1 is a proposal
|
|
36
|
+
wearing an ADR's clothes.
|
|
37
|
+
|
|
38
|
+
## Verdicts
|
|
39
|
+
|
|
40
|
+
Defined in [`contracts/terminals.json`](../../../../contracts/terminals.json). `PROCEED WITH
|
|
41
|
+
CONDITIONS` is the common outcome and the most abused: the conditions are part of the
|
|
42
|
+
decision, and `record` must carry them into the ADR.
|
|
43
|
+
|
|
44
|
+
## Non-interactive runs
|
|
45
|
+
|
|
46
|
+
`council-review` can be run by an agent seating the panel itself, so G1 is satisfiable without
|
|
47
|
+
a human. `SPLIT` is not — a genuine unresolved split needs a person. Emit
|
|
48
|
+
`BLOCKED: need a decision-maker for <the crux>` and name the positions.
|
|
49
|
+
|
|
50
|
+
## When a stage's skill is not installed
|
|
51
|
+
|
|
52
|
+
Name the missing skill and skilldrop as its source, do the minimal inline version, and record
|
|
53
|
+
the stage as degraded. If `council-review` is missing, do not skip G1 — run the panel inline
|
|
54
|
+
from the design's own quality attributes and say the seating was improvised.
|
|
55
|
+
|
|
56
|
+
## Run log (opt-in)
|
|
57
|
+
|
|
58
|
+
Only when the environment variable `SKILLDROP_LOOP_LOG` is set to a file path: after each
|
|
59
|
+
gate's verdict, append one JSON line to that file. Nothing else is recorded, and nothing is
|
|
60
|
+
sent anywhere. When the variable isn't set, or you can't read it, skip this section.
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
printf '%s\n' '{"ts":"2026-10-01T14:03:00Z","loop":"design","stage":"ratify","gate":"G1","verdict":"PROCEED","round":1}' >> "$SKILLDROP_LOOP_LOG"
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Fields: `ts` (UTC), `loop`, `stage`, `gate` (`null` for a stage without one), `verdict` (the
|
|
67
|
+
gate's exact word), and `round` (1 for the first attempt, counting returns under the cap).
|
|
68
|
+
`skilldrop loop-stats` summarises the file: which gates pass first time, which loop back, and
|
|
69
|
+
which end in `BLOCKED`.
|
|
70
|
+
|
|
71
|
+
## Quality bar
|
|
72
|
+
|
|
73
|
+
- **Quality targets exist before structure does.** `nfr-spec` is stage 1 because a design without numbers can only be argued about.
|
|
74
|
+
- **The ADR names what was rejected and why.** A decision record with one option is a description of what happened, not a decision.
|
|
75
|
+
- **Dissent is recorded, not resolved away.** A panel that always reaches consensus is not seating real positions.
|
|
76
|
+
- **The diagram and the doc say the same thing.** They are checked against each other before G1, not after someone builds from the wrong one.
|
|
77
|
+
|
|
78
|
+
## Anti-patterns to avoid
|
|
79
|
+
|
|
80
|
+
- ❌ **Writing the ADR before G1.** It pre-commits the panel to a decision it has not made, and every reviewer can feel it.
|
|
81
|
+
- ❌ **Running `threat-model` after ratification.** The panel then ratified an unattacked design, which is the failure this ordering exists to prevent.
|
|
82
|
+
- ❌ **Treating `PROCEED WITH CONDITIONS` as `PROCEED`.** The conditions must reach the ADR; dropping them is how a conditional approval silently becomes unconditional.
|
|
83
|
+
- ❌ **Skipping `constrain` because the NFRs are "obvious".** Obvious targets are the ones nobody writes down and everybody remembers differently.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"query": "design the system for this requirement",
|
|
4
|
+
"should_trigger": true
|
|
5
|
+
},
|
|
6
|
+
{
|
|
7
|
+
"query": "run the design loop on this PRD",
|
|
8
|
+
"should_trigger": true
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"query": "how should we architect this?",
|
|
12
|
+
"should_trigger": true
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"query": "get this to a recorded architecture decision",
|
|
16
|
+
"should_trigger": true
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"query": "implement this story",
|
|
20
|
+
"should_trigger": false
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"query": "write the runbook for this alert",
|
|
24
|
+
"should_trigger": false
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"query": "summarise this for the board",
|
|
28
|
+
"should_trigger": false
|
|
29
|
+
}
|
|
30
|
+
]
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"loop_name": "design",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": "constrains-then-attacks-before-ratifying",
|
|
6
|
+
"prompt": "Run the design loop for per-plan API rate limiting, from this ratified PRD.",
|
|
7
|
+
"assertions": [
|
|
8
|
+
"Runs nfr-spec first and expresses targets as numbers, not adjectives",
|
|
9
|
+
"Produces the design doc and the diagram as one artifact, and checks they agree",
|
|
10
|
+
"Runs threat-model BEFORE the G1 panel, not after",
|
|
11
|
+
"Seats council-review at G1 and records dissent plus what would change each seat's mind",
|
|
12
|
+
"Writes the ADR only after G1 returns, and carries any PROCEED WITH CONDITIONS conditions into it",
|
|
13
|
+
"Names the rejected options and why each lost"
|
|
14
|
+
]
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"id": "conditions-must-reach-the-adr",
|
|
18
|
+
"prompt": "The design-loop panel returned PROCEED WITH CONDITIONS — the operator seat wants the failure mode documented. Finish the loop.",
|
|
19
|
+
"assertions": [
|
|
20
|
+
"Does not treat PROCEED WITH CONDITIONS as PROCEED",
|
|
21
|
+
"Carries the named condition into the ADR as part of the decision",
|
|
22
|
+
"Proceeds to `record` rather than looping back to `shape`"
|
|
23
|
+
]
|
|
24
|
+
}
|
|
25
|
+
]
|
|
26
|
+
}
|