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,101 @@
|
|
|
1
|
+
# tracker-brief-sync reference
|
|
2
|
+
|
|
3
|
+
## Sections: what an issue links back to
|
|
4
|
+
|
|
5
|
+
The script needs to know what counts as a section of the doc.
|
|
6
|
+
|
|
7
|
+
| Doc shape | Sections are | Flag |
|
|
8
|
+
|---|---|---|
|
|
9
|
+
| A PRD from `prd-draft`, or any doc with requirement IDs | IDs in the first column of a table, or at the start of a heading or list item (R1, G1, NFR-3) | default; `--id-pattern` sets which IDs need an issue (default `R\d+`) |
|
|
10
|
+
| A brief with no IDs | Every `##` and `###` heading, by its slug (`## Saved searches` → `saved-searches`) | `--headings` |
|
|
11
|
+
|
|
12
|
+
With IDs, only those matching `--id-pattern` must have an issue; other IDs (goals, NFRs) are
|
|
13
|
+
valid link targets but aren't required. A requirement whose MoSCoW cell is `W` (Won't have)
|
|
14
|
+
must **not** have an issue.
|
|
15
|
+
|
|
16
|
+
If the doc has neither IDs nor headings, ask the user to add IDs to the requirements, or to
|
|
17
|
+
number them, before syncing. Matching by title is too fragile to report drift on.
|
|
18
|
+
|
|
19
|
+
## The Source line
|
|
20
|
+
|
|
21
|
+
Every issue the script creates ends its description with:
|
|
22
|
+
|
|
23
|
+
```text
|
|
24
|
+
Source: <doc_url or doc>#<anchor> (<section>)
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
The anchor is the heading the section sits under (for IDs) or the heading's own slug (for
|
|
28
|
+
`--headings`). The drift check reads the part in brackets. If someone deletes the line, drift
|
|
29
|
+
falls back to finding the ID anywhere in the title, description or labels, and lists those
|
|
30
|
+
issues as "linked by mention" so the user can restore the line.
|
|
31
|
+
|
|
32
|
+
## From doc to items
|
|
33
|
+
|
|
34
|
+
| Doc part | Becomes | Rule |
|
|
35
|
+
|---|---|---|
|
|
36
|
+
| Goal | Epic | One epic per goal that has requirements mapped to it. A goal with none gets no epic; say so |
|
|
37
|
+
| Requirement (M, S, C) | Story or task | One per requirement. Two only if the requirement has two independent behaviours. If it's too big for one, say so and hand it to `user-story-splitter` |
|
|
38
|
+
| Requirement (W) | Nothing | List under "Not created" |
|
|
39
|
+
| Non-goal | Nothing | List under "Not created" |
|
|
40
|
+
| Open question | Nothing | Report it as unresolved; it may add work later |
|
|
41
|
+
| Quality target / NFR | Task, only if it's a piece of work (e.g. a load test); otherwise a criterion on the stories it constrains | Say which |
|
|
42
|
+
|
|
43
|
+
**Acceptance criteria** restate the requirement's observable behaviour as Given/When/Then.
|
|
44
|
+
They don't add behaviour the doc doesn't have. If a requirement is too vague to test ("fast",
|
|
45
|
+
"easy"), write the criterion you can, and list the requirement under "Needs sharpening in the doc".
|
|
46
|
+
|
|
47
|
+
**Labels** have no spaces (Jira rejects them). Use one label for the feature on every item, plus
|
|
48
|
+
an area label where the doc makes the area clear.
|
|
49
|
+
|
|
50
|
+
## Spec format
|
|
51
|
+
|
|
52
|
+
See [`templates/issues-spec.json`](templates/issues-spec.json).
|
|
53
|
+
|
|
54
|
+
| Field | Required | Notes |
|
|
55
|
+
|---|---|---|
|
|
56
|
+
| `doc` | yes | File name of the doc |
|
|
57
|
+
| `doc_url` | no | Where the team reads the doc; used in the Source line if present |
|
|
58
|
+
| `items[].id` | yes | Your own ID (E1, S1). Unique. Not the tracker key |
|
|
59
|
+
| `items[].type` | yes | epic, story, task or bug |
|
|
60
|
+
| `items[].parent` | no | The `id` of an epic in the same spec. Epics can't have parents |
|
|
61
|
+
| `items[].title` | yes | Verb-first for stories ("Pay as a guest…"), outcome for epics |
|
|
62
|
+
| `items[].description` | yes | From the doc; no invented reasons or numbers |
|
|
63
|
+
| `items[].acceptance_criteria` | stories and tasks | A list of strings |
|
|
64
|
+
| `items[].labels` | no | A list; no spaces |
|
|
65
|
+
| `items[].source` | yes | The section ID or heading slug; must exist in the doc and not be Won't have |
|
|
66
|
+
|
|
67
|
+
## Import targets
|
|
68
|
+
|
|
69
|
+
| Target | What you get | How to import |
|
|
70
|
+
|---|---|---|
|
|
71
|
+
| `--target jira` | CSV: `Issue Id, Parent Id, Issue Type, Summary, Description, Labels, Labels…` | Jira's CSV importer (external system import). On the field-mapping screen, map Issue Id and Parent Id so children link to their parent, and map every Labels column to Labels. Whether an epic link imports this way depends on your Jira; if stories land without a parent, import the epics first and set the parent in bulk after |
|
|
72
|
+
| `--target csv` | CSV: `ID, Type, Title, Description, Acceptance criteria, Labels, Parent ID, Parent title, Source` | Any importer with a column-mapping step. Check your tracker's current import docs for which columns it accepts. For Linear, the more dependable route is creating issues from the spec through the Linear MCP, one call per item, epics first |
|
|
73
|
+
| `--target github` | A bash script of `gh label create` and `gh issue create` commands | GitHub has no CSV import for issues. Read the script, then run it inside the repo. Epics become issues labelled `epic`; add children as sub-issues afterwards |
|
|
74
|
+
|
|
75
|
+
When the user has a tracker MCP tool and asks you to create the issues directly, still write
|
|
76
|
+
and check the spec first, then create from it, so the drift check has the same Source lines.
|
|
77
|
+
|
|
78
|
+
## Drift: what's reported
|
|
79
|
+
|
|
80
|
+
| Drift | Rule | Usual fix |
|
|
81
|
+
|---|---|---|
|
|
82
|
+
| Doc section with no issue | A required section with no live issue (cancelled and duplicate issues don't count) | Create the issue, or change the doc (move it to Won't have) |
|
|
83
|
+
| Issue with no doc section | No Source line and no ID mention | Add a requirement to the doc, or take the issue out of the feature |
|
|
84
|
+
| Issue pointing at a missing section | Its Source names a section the doc doesn't have (renumbered or deleted) | Relink, or restore the section |
|
|
85
|
+
| Issue for a Won't-have requirement | Its Source names a `W` requirement | Close the issue, or change the doc first |
|
|
86
|
+
|
|
87
|
+
Drift is a disagreement between two sources. The report says which way each could be resolved
|
|
88
|
+
and who decides; it doesn't assume the tracker is wrong.
|
|
89
|
+
|
|
90
|
+
## Field mapping for drift exports
|
|
91
|
+
|
|
92
|
+
| Field | Jira CSV | Linear | GitHub |
|
|
93
|
+
|---|---|---|---|
|
|
94
|
+
| key | Issue key | ID / identifier | number |
|
|
95
|
+
| title | Summary | Title | title |
|
|
96
|
+
| description | Description | Description | body |
|
|
97
|
+
| status | Status | Status / state | state |
|
|
98
|
+
| type | Issue Type | (labels) | (labels) |
|
|
99
|
+
| labels | Labels | Labels | labels |
|
|
100
|
+
|
|
101
|
+
GitHub: `gh issue list --label guest-checkout --state all --limit 500 --json number,title,body,state,labels > issues.json`.
|
|
@@ -0,0 +1,501 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Keep a tracker in step with a brief or PRD.
|
|
3
|
+
|
|
4
|
+
Two subcommands:
|
|
5
|
+
|
|
6
|
+
export Turn an issues spec (JSON, written from the doc) into a file your tracker imports:
|
|
7
|
+
--target jira CSV for Jira's CSV importer (Issue Id / Parent Id hierarchy)
|
|
8
|
+
--target csv a plain CSV with one column per field, for importers with a
|
|
9
|
+
column-mapping step
|
|
10
|
+
--target github a shell script of `gh issue create` commands (GitHub has no
|
|
11
|
+
CSV issue import)
|
|
12
|
+
The spec is checked first: every item needs a title, a description and a source
|
|
13
|
+
section; stories and tasks need acceptance criteria; parents must exist; with
|
|
14
|
+
--doc, every source must exist in the doc.
|
|
15
|
+
|
|
16
|
+
drift Compare a doc with a tracker export and report: doc sections with no issue,
|
|
17
|
+
issues with no section, issues pointing at sections the doc no longer has, and
|
|
18
|
+
issues for requirements the doc marks Won't have.
|
|
19
|
+
|
|
20
|
+
Sections are requirement IDs found in the doc (default pattern R1, R2 ... in the first
|
|
21
|
+
column of a table or at the start of a heading or list item), or, with --headings, the
|
|
22
|
+
doc's ## and ### headings. Issues link back with a "Source: <doc>#<anchor> (<ID>)" line.
|
|
23
|
+
|
|
24
|
+
Stdlib only; runs on Python 3.9+.
|
|
25
|
+
|
|
26
|
+
Usage:
|
|
27
|
+
python3 brief_sync.py export issues-spec.json --target jira --doc prd.md -o import.csv
|
|
28
|
+
python3 brief_sync.py export issues-spec.json --target github -o create-issues.sh
|
|
29
|
+
python3 brief_sync.py drift --doc prd.md --export tracker-export.csv -o drift.md
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
from __future__ import annotations
|
|
33
|
+
|
|
34
|
+
import argparse
|
|
35
|
+
import csv
|
|
36
|
+
import io
|
|
37
|
+
import json
|
|
38
|
+
import re
|
|
39
|
+
import shlex
|
|
40
|
+
import sys
|
|
41
|
+
from pathlib import Path
|
|
42
|
+
|
|
43
|
+
ALIASES = {
|
|
44
|
+
"key": ["issue key", "key", "identifier", "id", "number", "issue id"],
|
|
45
|
+
"title": ["summary", "title", "name"],
|
|
46
|
+
"description": ["description", "body"],
|
|
47
|
+
"status": ["status", "state", "workflow state"],
|
|
48
|
+
"type": ["issue type", "type", "issuetype"],
|
|
49
|
+
"labels": ["labels", "label"],
|
|
50
|
+
}
|
|
51
|
+
DROPPED_STATUSES = {"canceled", "cancelled", "duplicate", "won't do", "wont do", "won't fix",
|
|
52
|
+
"obsolete"}
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def die(msg: str) -> None:
|
|
56
|
+
sys.stderr.write("error: " + msg + "\n")
|
|
57
|
+
sys.exit(2)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def flat_value(v) -> str:
|
|
61
|
+
"""Turn nested JSON values (users, statuses, label lists) into a plain string."""
|
|
62
|
+
if v is None:
|
|
63
|
+
return ""
|
|
64
|
+
if isinstance(v, dict):
|
|
65
|
+
for k in ("displayName", "name", "login", "title", "value", "key"):
|
|
66
|
+
if v.get(k) not in (None, ""):
|
|
67
|
+
return str(v[k])
|
|
68
|
+
if "nodes" in v:
|
|
69
|
+
return flat_value(v["nodes"])
|
|
70
|
+
return ""
|
|
71
|
+
if isinstance(v, list):
|
|
72
|
+
return ", ".join(s for s in (flat_value(x) for x in v) if s)
|
|
73
|
+
return str(v)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def load_rows(path: Path) -> list:
|
|
77
|
+
suffix = path.suffix.lower()
|
|
78
|
+
try:
|
|
79
|
+
text = path.read_text(encoding="utf-8-sig")
|
|
80
|
+
except OSError as e:
|
|
81
|
+
die("cannot read {}: {}".format(path, e))
|
|
82
|
+
if suffix in (".csv", ".tsv"):
|
|
83
|
+
delim = "\t" if suffix == ".tsv" else ","
|
|
84
|
+
reader = csv.reader(io.StringIO(text, newline=""), delimiter=delim)
|
|
85
|
+
try:
|
|
86
|
+
header = next(reader)
|
|
87
|
+
except StopIteration:
|
|
88
|
+
die("{} is empty".format(path))
|
|
89
|
+
rows = []
|
|
90
|
+
for raw in reader:
|
|
91
|
+
if not any(c.strip() for c in raw):
|
|
92
|
+
continue
|
|
93
|
+
row = {}
|
|
94
|
+
# Jira repeats columns (Labels, Labels, ...); join repeats instead of overwriting.
|
|
95
|
+
for h, v in zip(header, raw):
|
|
96
|
+
h = h.strip()
|
|
97
|
+
if h in row and v.strip():
|
|
98
|
+
row[h] = (row[h] + ", " + v.strip()) if row[h] else v.strip()
|
|
99
|
+
elif h not in row:
|
|
100
|
+
row[h] = v.strip()
|
|
101
|
+
rows.append(row)
|
|
102
|
+
return rows
|
|
103
|
+
if suffix in (".json", ".jsonl", ".ndjson"):
|
|
104
|
+
try:
|
|
105
|
+
if suffix == ".json":
|
|
106
|
+
data = json.loads(text)
|
|
107
|
+
else:
|
|
108
|
+
data = [json.loads(line) for line in text.splitlines() if line.strip()]
|
|
109
|
+
except json.JSONDecodeError as e:
|
|
110
|
+
die("{} is not valid JSON: {}".format(path, e))
|
|
111
|
+
if isinstance(data, dict):
|
|
112
|
+
for k in ("issues", "items", "nodes", "data", "results"):
|
|
113
|
+
if isinstance(data.get(k), list):
|
|
114
|
+
data = data[k]
|
|
115
|
+
break
|
|
116
|
+
if not isinstance(data, list):
|
|
117
|
+
die("JSON must be a list of issues, or an object with an 'issues'/'items' list")
|
|
118
|
+
rows = []
|
|
119
|
+
for obj in data:
|
|
120
|
+
if not isinstance(obj, dict):
|
|
121
|
+
continue
|
|
122
|
+
merged = dict(obj)
|
|
123
|
+
for nest in ("fields", "content"): # Jira REST `fields`, gh project `content`
|
|
124
|
+
if isinstance(obj.get(nest), dict):
|
|
125
|
+
for k, v in obj[nest].items():
|
|
126
|
+
merged.setdefault(k, v)
|
|
127
|
+
rows.append({k: flat_value(v) for k, v in merged.items()})
|
|
128
|
+
return rows
|
|
129
|
+
die("unsupported file type {!r}: use .csv, .tsv, .json or .jsonl".format(suffix))
|
|
130
|
+
return []
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def build_mapping(headers: list, overrides: dict) -> dict:
|
|
134
|
+
lower = {h.lower().strip(): h for h in headers}
|
|
135
|
+
mapping = {}
|
|
136
|
+
for field, names in ALIASES.items():
|
|
137
|
+
if field in overrides:
|
|
138
|
+
if overrides[field] not in headers:
|
|
139
|
+
die("--map {}={!r}: no such column. Columns are: {}".format(
|
|
140
|
+
field, overrides[field], ", ".join(headers)))
|
|
141
|
+
mapping[field] = overrides[field]
|
|
142
|
+
continue
|
|
143
|
+
for n in names:
|
|
144
|
+
if n in lower:
|
|
145
|
+
mapping[field] = lower[n]
|
|
146
|
+
break
|
|
147
|
+
return mapping
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
BROAD_ID = r"[A-Z]{1,4}-?\d+(?:\.\d+)?"
|
|
153
|
+
MOSCOW = {"m": "M", "must": "M", "s": "S", "should": "S", "c": "C", "could": "C",
|
|
154
|
+
"w": "W", "won't": "W", "wont": "W", "won't have": "W"}
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def slugify(text: str) -> str:
|
|
158
|
+
t = re.sub(r"[^\w\- ]+", "", text.strip().lower())
|
|
159
|
+
return re.sub(r"\s+", "-", t)
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
def parse_doc(path: Path, id_pattern: str, headings: bool) -> dict:
|
|
163
|
+
"""Return {"sections": {id: {...}}, "required": [ids], "mode": "ids"|"headings"}."""
|
|
164
|
+
try:
|
|
165
|
+
text = path.read_text(encoding="utf-8")
|
|
166
|
+
except OSError as e:
|
|
167
|
+
die("cannot read {}: {}".format(path, e))
|
|
168
|
+
try:
|
|
169
|
+
req_re = re.compile(r"^(?:{})$".format(id_pattern))
|
|
170
|
+
except re.error as e:
|
|
171
|
+
die("--id-pattern is not a valid regex: {}".format(e))
|
|
172
|
+
broad = re.compile(r"^(?:{})$".format(BROAD_ID))
|
|
173
|
+
sections = {}
|
|
174
|
+
current_heading = ""
|
|
175
|
+
in_fence = False
|
|
176
|
+
for line in text.splitlines():
|
|
177
|
+
s = line.strip()
|
|
178
|
+
if s.startswith("```"):
|
|
179
|
+
in_fence = not in_fence
|
|
180
|
+
continue
|
|
181
|
+
if in_fence:
|
|
182
|
+
continue
|
|
183
|
+
hm = re.match(r"^(#{1,6})\s+(.*)$", s)
|
|
184
|
+
if hm:
|
|
185
|
+
current_heading = hm.group(2).strip()
|
|
186
|
+
if headings and len(hm.group(1)) in (2, 3):
|
|
187
|
+
slug = slugify(current_heading)
|
|
188
|
+
sections[slug] = {"id": slug, "text": current_heading, "moscow": "",
|
|
189
|
+
"heading": current_heading}
|
|
190
|
+
first = re.match(r"^\**({})\**\b[\s:.\-—]*(.*)$".format(BROAD_ID), current_heading)
|
|
191
|
+
if first and not headings:
|
|
192
|
+
sections.setdefault(first.group(1), {"id": first.group(1), "text": first.group(2),
|
|
193
|
+
"moscow": "", "heading": current_heading})
|
|
194
|
+
continue
|
|
195
|
+
if s.startswith("|"):
|
|
196
|
+
cells = [c.strip().strip("*").strip() for c in s.strip("|").split("|")]
|
|
197
|
+
if cells and broad.match(cells[0]):
|
|
198
|
+
moscow = ""
|
|
199
|
+
for c in cells[2:]:
|
|
200
|
+
if c.lower() in MOSCOW:
|
|
201
|
+
moscow = MOSCOW[c.lower()]
|
|
202
|
+
break
|
|
203
|
+
sections.setdefault(cells[0], {"id": cells[0], "text": cells[1] if len(cells) > 1 else "",
|
|
204
|
+
"moscow": moscow, "heading": current_heading})
|
|
205
|
+
continue
|
|
206
|
+
lm = re.match(r"^[-*]\s+\**({})\**[\s:.\-—]+(.*)$".format(BROAD_ID), s)
|
|
207
|
+
if lm and not headings:
|
|
208
|
+
sections.setdefault(lm.group(1), {"id": lm.group(1), "text": lm.group(2),
|
|
209
|
+
"moscow": "", "heading": current_heading})
|
|
210
|
+
if headings:
|
|
211
|
+
required = [k for k in sections]
|
|
212
|
+
else:
|
|
213
|
+
required = [k for k, v in sections.items() if req_re.match(k) and v["moscow"] != "W"]
|
|
214
|
+
return {"sections": sections, "required": required, "mode": "headings" if headings else "ids",
|
|
215
|
+
"wont": [k for k, v in sections.items() if v["moscow"] == "W"]}
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
def source_line(spec: dict, item: dict, doc_info) -> str:
|
|
219
|
+
ref = spec.get("doc_url") or spec.get("doc") or "the brief"
|
|
220
|
+
src = item["source"]
|
|
221
|
+
anchor = slugify(src)
|
|
222
|
+
if doc_info and src in doc_info["sections"] and doc_info["mode"] == "ids":
|
|
223
|
+
anchor = slugify(doc_info["sections"][src]["heading"]) or anchor
|
|
224
|
+
return "Source: {}#{} ({})".format(ref, anchor, src)
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
def full_description(spec: dict, item: dict, doc_info) -> str:
|
|
228
|
+
parts = [item["description"].strip()]
|
|
229
|
+
ac = item.get("acceptance_criteria") or []
|
|
230
|
+
if ac:
|
|
231
|
+
parts.append("Acceptance criteria:\n" + "\n".join("- " + a for a in ac))
|
|
232
|
+
parts.append(source_line(spec, item, doc_info))
|
|
233
|
+
return "\n\n".join(parts)
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
def check_spec(spec: dict, doc_info) -> list:
|
|
237
|
+
errors = []
|
|
238
|
+
items = spec.get("items")
|
|
239
|
+
if not isinstance(items, list) or not items:
|
|
240
|
+
return ["spec needs a non-empty 'items' list"]
|
|
241
|
+
ids = [it.get("id") for it in items if isinstance(it, dict)]
|
|
242
|
+
dupes = sorted({i for i in ids if i and ids.count(i) > 1})
|
|
243
|
+
if dupes:
|
|
244
|
+
errors.append("duplicate item ids: " + ", ".join(dupes))
|
|
245
|
+
for n, it in enumerate(items, 1):
|
|
246
|
+
if not isinstance(it, dict):
|
|
247
|
+
errors.append("item {} is not an object".format(n))
|
|
248
|
+
continue
|
|
249
|
+
name = it.get("id") or "item {}".format(n)
|
|
250
|
+
for f in ("id", "type", "title", "description", "source"):
|
|
251
|
+
if not str(it.get(f) or "").strip():
|
|
252
|
+
errors.append("{}: missing '{}'".format(name, f))
|
|
253
|
+
t = str(it.get("type") or "").lower()
|
|
254
|
+
if t not in ("epic", "story", "task", "bug"):
|
|
255
|
+
errors.append("{}: type must be epic, story, task or bug, not {!r}".format(name, it.get("type")))
|
|
256
|
+
if t in ("story", "task") and not it.get("acceptance_criteria"):
|
|
257
|
+
errors.append("{}: a {} needs acceptance_criteria".format(name, t))
|
|
258
|
+
if it.get("acceptance_criteria") is not None and not isinstance(it.get("acceptance_criteria"), list):
|
|
259
|
+
errors.append("{}: acceptance_criteria must be a list of strings".format(name))
|
|
260
|
+
if it.get("labels") is not None and not isinstance(it.get("labels"), list):
|
|
261
|
+
errors.append("{}: labels must be a list".format(name))
|
|
262
|
+
for lab in it.get("labels") or []:
|
|
263
|
+
if " " in str(lab):
|
|
264
|
+
errors.append("{}: label {!r} has a space; Jira labels can't".format(name, lab))
|
|
265
|
+
parent = it.get("parent")
|
|
266
|
+
if parent:
|
|
267
|
+
if parent not in ids:
|
|
268
|
+
errors.append("{}: parent {!r} is not an item in the spec".format(name, parent))
|
|
269
|
+
elif t == "epic":
|
|
270
|
+
errors.append("{}: an epic can't have a parent".format(name))
|
|
271
|
+
if doc_info and it.get("source") and it["source"] not in doc_info["sections"]:
|
|
272
|
+
errors.append("{}: source {!r} is not a section in the doc".format(name, it["source"]))
|
|
273
|
+
if doc_info and it.get("source") in doc_info.get("wont", []):
|
|
274
|
+
errors.append("{}: source {!r} is marked Won't have in the doc".format(name, it["source"]))
|
|
275
|
+
return errors
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
def cmd_export(args) -> int:
|
|
279
|
+
try:
|
|
280
|
+
spec = json.loads(args.spec.read_text(encoding="utf-8"))
|
|
281
|
+
except OSError as e:
|
|
282
|
+
die("cannot read {}: {}".format(args.spec, e))
|
|
283
|
+
except json.JSONDecodeError as e:
|
|
284
|
+
die("{} is not valid JSON: {}".format(args.spec, e))
|
|
285
|
+
if not isinstance(spec, dict):
|
|
286
|
+
die("spec must be a JSON object with an 'items' list")
|
|
287
|
+
doc_info = parse_doc(args.doc, args.id_pattern, args.headings)
|
|
288
|
+
errors = check_spec(spec, doc_info)
|
|
289
|
+
if errors:
|
|
290
|
+
sys.stderr.write("spec has {} problem(s):\n".format(len(errors)))
|
|
291
|
+
for e in errors:
|
|
292
|
+
sys.stderr.write(" - " + e + "\n")
|
|
293
|
+
return 1
|
|
294
|
+
items = spec["items"]
|
|
295
|
+
# Epics first so importers that resolve parents in order can find them.
|
|
296
|
+
items = sorted(items, key=lambda it: 0 if it["type"].lower() == "epic" else 1)
|
|
297
|
+
by_id = {it["id"]: it for it in items}
|
|
298
|
+
out = io.StringIO()
|
|
299
|
+
if args.target == "github":
|
|
300
|
+
out.write("#!/usr/bin/env bash\n# Generated by brief_sync.py from {}. Review before running.\n".format(args.spec.name))
|
|
301
|
+
out.write("# Creates any missing labels, then the issues. Run from inside the target repo.\nset -euo pipefail\n")
|
|
302
|
+
has_epics = any(it["type"].lower() == "epic" for it in items)
|
|
303
|
+
labels = sorted({lab for it in items for lab in (it.get("labels") or [])} | ({"epic"} if has_epics else set()))
|
|
304
|
+
for lab in labels:
|
|
305
|
+
out.write("gh label create {} --force >/dev/null\n".format(shlex.quote(lab)))
|
|
306
|
+
for it in items:
|
|
307
|
+
body = full_description(spec, it, doc_info)
|
|
308
|
+
if it.get("parent"):
|
|
309
|
+
body = "Part of: {} ({})\n\n".format(by_id[it["parent"]]["title"], it["parent"]) + body
|
|
310
|
+
cmd = ["gh", "issue", "create", "--title", it["title"], "--body", body]
|
|
311
|
+
for lab in (it.get("labels") or []) + (["epic"] if it["type"].lower() == "epic" else []):
|
|
312
|
+
cmd += ["--label", lab]
|
|
313
|
+
out.write(" ".join(shlex.quote(c) for c in cmd) + "\n")
|
|
314
|
+
if has_epics:
|
|
315
|
+
out.write("# Epics are created as issues labelled 'epic'. Add their children as sub-issues in GitHub afterwards.\n")
|
|
316
|
+
text = out.getvalue()
|
|
317
|
+
else:
|
|
318
|
+
w = csv.writer(out)
|
|
319
|
+
max_labels = max([len(it.get("labels") or []) for it in items] + [1])
|
|
320
|
+
if args.target == "jira":
|
|
321
|
+
w.writerow(["Issue Id", "Parent Id", "Issue Type", "Summary", "Description"] + ["Labels"] * max_labels)
|
|
322
|
+
num = {x["id"]: i for i, x in enumerate(items, 1)}
|
|
323
|
+
for it in items:
|
|
324
|
+
labs = list(it.get("labels") or []) + [""] * (max_labels - len(it.get("labels") or []))
|
|
325
|
+
w.writerow([num[it["id"]], num.get(it.get("parent"), "") if it.get("parent") else "",
|
|
326
|
+
it["type"].capitalize(), it["title"], full_description(spec, it, doc_info)] + labs)
|
|
327
|
+
else:
|
|
328
|
+
w.writerow(["ID", "Type", "Title", "Description", "Acceptance criteria", "Labels", "Parent ID",
|
|
329
|
+
"Parent title", "Source"])
|
|
330
|
+
for it in items:
|
|
331
|
+
w.writerow([it["id"], it["type"].capitalize(), it["title"],
|
|
332
|
+
it["description"].strip() + "\n\n" + source_line(spec, it, doc_info),
|
|
333
|
+
"\n".join(it.get("acceptance_criteria") or []), ", ".join(it.get("labels") or []),
|
|
334
|
+
it.get("parent") or "", by_id[it["parent"]]["title"] if it.get("parent") else "",
|
|
335
|
+
source_line(spec, it, doc_info)])
|
|
336
|
+
text = out.getvalue()
|
|
337
|
+
if args.output:
|
|
338
|
+
args.output.write_text(text, encoding="utf-8")
|
|
339
|
+
n_epics = sum(1 for it in items if it["type"].lower() == "epic")
|
|
340
|
+
sys.stderr.write("wrote {}: {} items ({} epics, {} others)\n".format(
|
|
341
|
+
args.output, len(items), n_epics, len(items) - n_epics))
|
|
342
|
+
else:
|
|
343
|
+
sys.stdout.write(text)
|
|
344
|
+
return 0
|
|
345
|
+
|
|
346
|
+
|
|
347
|
+
def cmd_drift(args) -> int:
|
|
348
|
+
doc_info = parse_doc(args.doc, args.id_pattern, args.headings)
|
|
349
|
+
if not doc_info["sections"]:
|
|
350
|
+
die("found no sections in {}. Use --headings, or --id-pattern to match your requirement IDs".format(args.doc))
|
|
351
|
+
if not args.export.exists():
|
|
352
|
+
die("{} does not exist".format(args.export))
|
|
353
|
+
rows = load_rows(args.export)
|
|
354
|
+
if not rows:
|
|
355
|
+
die("{} has no issues in it".format(args.export))
|
|
356
|
+
headers = []
|
|
357
|
+
for r in rows:
|
|
358
|
+
for h in r:
|
|
359
|
+
if h not in headers:
|
|
360
|
+
headers.append(h)
|
|
361
|
+
mp = build_mapping(headers, {})
|
|
362
|
+
if "title" not in mp:
|
|
363
|
+
die("no title column found. Columns are: " + ", ".join(headers))
|
|
364
|
+
|
|
365
|
+
def g(row, field):
|
|
366
|
+
col = mp.get(field)
|
|
367
|
+
return (row.get(col) or "").strip() if col else ""
|
|
368
|
+
|
|
369
|
+
sections = doc_info["sections"]
|
|
370
|
+
mention_re = re.compile(r"(?<![\w-])({})(?![\w-])".format(args.id_pattern)) if doc_info["mode"] == "ids" else None
|
|
371
|
+
src_re = re.compile(r"Source:[^\n]*\(([^)\n]+)\)\s*$", re.M)
|
|
372
|
+
issues = []
|
|
373
|
+
for i, r in enumerate(rows, 1):
|
|
374
|
+
text = "\n".join([g(r, "title"), g(r, "description"), g(r, "labels")])
|
|
375
|
+
refs = src_re.findall(g(r, "description"))
|
|
376
|
+
how = "source line" if refs else ""
|
|
377
|
+
if not refs and mention_re:
|
|
378
|
+
refs = sorted(set(m.group(1) for m in mention_re.finditer(text)))
|
|
379
|
+
how = "mention" if refs else ""
|
|
380
|
+
issues.append({"key": g(r, "key") or "row-{}".format(i), "title": g(r, "title"),
|
|
381
|
+
"status": g(r, "status"), "type": g(r, "type"),
|
|
382
|
+
"dropped": g(r, "status").lower() in DROPPED_STATUSES,
|
|
383
|
+
"refs": [x.strip() for x in refs], "how": how})
|
|
384
|
+
|
|
385
|
+
live = [it for it in issues if not it["dropped"]]
|
|
386
|
+
covered = {}
|
|
387
|
+
for it in live:
|
|
388
|
+
for ref in it["refs"]:
|
|
389
|
+
covered.setdefault(ref, []).append(it)
|
|
390
|
+
uncovered = [s for s in doc_info["required"] if s not in covered]
|
|
391
|
+
orphans = [it for it in live if not it["refs"]]
|
|
392
|
+
dangling = [(it, ref) for it in live for ref in it["refs"] if ref not in sections]
|
|
393
|
+
wont = [(it, ref) for it in live for ref in it["refs"] if ref in doc_info["wont"]]
|
|
394
|
+
by_mention = [it for it in live if it["how"] == "mention"]
|
|
395
|
+
|
|
396
|
+
L = []
|
|
397
|
+
L.append("# Drift: {} vs {}".format(args.doc.name, args.export.name))
|
|
398
|
+
L.append("")
|
|
399
|
+
L.append("{} sections in the doc ({} need an issue{}) · {} issues in the export ({} canceled or duplicate, ignored)".format(
|
|
400
|
+
len(sections), len(doc_info["required"]),
|
|
401
|
+
", {} marked Won't have".format(len(doc_info["wont"])) if doc_info["wont"] else "",
|
|
402
|
+
len(issues), len(issues) - len(live)))
|
|
403
|
+
L.append("Sections are {}.".format("## and ### headings" if doc_info["mode"] == "headings"
|
|
404
|
+
else "IDs matching `{}`".format(args.id_pattern)))
|
|
405
|
+
L.append("")
|
|
406
|
+
L.append("| Drift | Count |")
|
|
407
|
+
L.append("|---|---:|")
|
|
408
|
+
L.append("| Doc sections with no issue | {} |".format(len(uncovered)))
|
|
409
|
+
L.append("| Issues with no doc section | {} |".format(len(orphans)))
|
|
410
|
+
L.append("| Issues pointing at a section the doc doesn't have | {} |".format(len(dangling)))
|
|
411
|
+
L.append("| Issues for a Won't-have requirement | {} |".format(len(wont)))
|
|
412
|
+
L.append("")
|
|
413
|
+
L.append("## Doc sections with no issue")
|
|
414
|
+
L.append("")
|
|
415
|
+
if uncovered:
|
|
416
|
+
for s in uncovered:
|
|
417
|
+
v = sections[s]
|
|
418
|
+
L.append("- {}{}: {}".format(s, " ({})".format(v["moscow"]) if v["moscow"] else "", v["text"]))
|
|
419
|
+
else:
|
|
420
|
+
L.append("None.")
|
|
421
|
+
L.append("")
|
|
422
|
+
L.append("## Issues with no doc section")
|
|
423
|
+
L.append("")
|
|
424
|
+
if orphans:
|
|
425
|
+
for it in orphans:
|
|
426
|
+
L.append("- {} {} ({}{})".format(it["key"], it["title"], it["status"] or "no status",
|
|
427
|
+
", " + it["type"] if it["type"] else ""))
|
|
428
|
+
else:
|
|
429
|
+
L.append("None.")
|
|
430
|
+
L.append("")
|
|
431
|
+
L.append("## Issues pointing at a section the doc doesn't have")
|
|
432
|
+
L.append("")
|
|
433
|
+
if dangling:
|
|
434
|
+
for it, ref in dangling:
|
|
435
|
+
L.append("- {} {}: points at {}".format(it["key"], it["title"], ref))
|
|
436
|
+
else:
|
|
437
|
+
L.append("None.")
|
|
438
|
+
L.append("")
|
|
439
|
+
if wont:
|
|
440
|
+
L.append("## Issues for a Won't-have requirement")
|
|
441
|
+
L.append("")
|
|
442
|
+
for it, ref in wont:
|
|
443
|
+
L.append("- {} {}: {} is Won't have in the doc".format(it["key"], it["title"], ref))
|
|
444
|
+
L.append("")
|
|
445
|
+
L.append("## Coverage")
|
|
446
|
+
L.append("")
|
|
447
|
+
L.append("| Section | MoSCoW | Issues |")
|
|
448
|
+
L.append("|---|---|---|")
|
|
449
|
+
for s, v in sections.items():
|
|
450
|
+
if s in doc_info["required"] or s in covered or s in doc_info["wont"]:
|
|
451
|
+
cell = ", ".join("{} ({})".format(it["key"], it["status"] or "?") for it in covered.get(s, [])) or "-"
|
|
452
|
+
L.append("| {} | {} | {} |".format(s, v["moscow"] or "-", cell))
|
|
453
|
+
L.append("")
|
|
454
|
+
if by_mention:
|
|
455
|
+
L.append("Linked by mentioning the ID rather than a Source line (check these): " +
|
|
456
|
+
", ".join(it["key"] for it in by_mention))
|
|
457
|
+
L.append("")
|
|
458
|
+
text = "\n".join(L) + "\n"
|
|
459
|
+
if args.output:
|
|
460
|
+
args.output.write_text(text, encoding="utf-8")
|
|
461
|
+
sys.stderr.write("wrote {}\n".format(args.output))
|
|
462
|
+
else:
|
|
463
|
+
sys.stdout.write(text)
|
|
464
|
+
return 0
|
|
465
|
+
|
|
466
|
+
|
|
467
|
+
def main(argv=None) -> int:
|
|
468
|
+
ap = argparse.ArgumentParser(description="Keep a tracker in step with a brief or PRD.")
|
|
469
|
+
sub = ap.add_subparsers(dest="cmd")
|
|
470
|
+
e = sub.add_parser("export", help="issues spec JSON -> tracker import file")
|
|
471
|
+
e.add_argument("spec", type=Path)
|
|
472
|
+
e.add_argument("--target", choices=("jira", "csv", "github"), required=True)
|
|
473
|
+
e.add_argument("--doc", type=Path, required=True,
|
|
474
|
+
help="the brief or PRD; every source must exist in it")
|
|
475
|
+
e.add_argument("-o", "--output", type=Path)
|
|
476
|
+
d = sub.add_parser("drift", help="doc vs tracker export -> drift report")
|
|
477
|
+
d.add_argument("--doc", type=Path, required=True)
|
|
478
|
+
d.add_argument("--export", type=Path, required=True)
|
|
479
|
+
d.add_argument("-o", "--output", type=Path)
|
|
480
|
+
for p in (e, d):
|
|
481
|
+
p.add_argument("--id-pattern", default=r"R\d+",
|
|
482
|
+
help="regex for requirement IDs that need an issue (default R\\d+)")
|
|
483
|
+
p.add_argument("--headings", action="store_true",
|
|
484
|
+
help="use ## and ### headings as sections instead of requirement IDs")
|
|
485
|
+
args = ap.parse_args(argv)
|
|
486
|
+
if args.cmd == "export":
|
|
487
|
+
if not args.doc.exists():
|
|
488
|
+
die("{} does not exist".format(args.doc))
|
|
489
|
+
if not args.spec.exists():
|
|
490
|
+
die("{} does not exist".format(args.spec))
|
|
491
|
+
return cmd_export(args)
|
|
492
|
+
if args.cmd == "drift":
|
|
493
|
+
if not args.doc.exists():
|
|
494
|
+
die("{} does not exist".format(args.doc))
|
|
495
|
+
return cmd_drift(args)
|
|
496
|
+
ap.print_help()
|
|
497
|
+
return 2
|
|
498
|
+
|
|
499
|
+
|
|
500
|
+
if __name__ == "__main__":
|
|
501
|
+
sys.exit(main())
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"doc": "prd-<feature>.md",
|
|
3
|
+
"doc_url": "https://<wiki or repo URL of the doc; optional, used in the Source line instead of doc>",
|
|
4
|
+
"items": [
|
|
5
|
+
{
|
|
6
|
+
"id": "E1",
|
|
7
|
+
"type": "epic",
|
|
8
|
+
"title": "<outcome in plain words, from the goal>",
|
|
9
|
+
"description": "<what the epic delivers and the goal's success line, copied from the doc>",
|
|
10
|
+
"labels": ["<feature-label>"],
|
|
11
|
+
"source": "G1"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"id": "S1",
|
|
15
|
+
"type": "story",
|
|
16
|
+
"parent": "E1",
|
|
17
|
+
"title": "<verb-first, user-visible change>",
|
|
18
|
+
"description": "As a <user from the doc>, I can <capability>, so <reason from the doc>.",
|
|
19
|
+
"acceptance_criteria": [
|
|
20
|
+
"Given <state>, when <action>, then <observable result>"
|
|
21
|
+
],
|
|
22
|
+
"labels": ["<feature-label>", "<area>"],
|
|
23
|
+
"source": "R1"
|
|
24
|
+
}
|
|
25
|
+
]
|
|
26
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$comment": "Named install presets — one command installs a bundle of packs, agents, and loops. A profile is an install recipe, not a skill: nothing moves into profiles/, and a skill can belong to any number of profiles. validate.py enforces that every pack, agent, and loop named here exists. Rationale: docs/rfcs/ (RFC to be written). A role pack already brings `core` through `requires` (RFC-0033), so profiles never need to list it beside one.",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"profiles": {
|
|
5
|
+
"starter": {
|
|
6
|
+
"description": "Everything a new team member needs on day one: the dev-team pack plus the review panel that gates it.",
|
|
7
|
+
"packs": ["dev-team"],
|
|
8
|
+
"agents": ["devils-advocate", "security-reviewer", "code-quality"],
|
|
9
|
+
"loops": ["build"]
|
|
10
|
+
},
|
|
11
|
+
"architect": {
|
|
12
|
+
"description": "Design-phase setup: the solution-architect pack and the loops that run it end to end.",
|
|
13
|
+
"packs": ["solution-architect"],
|
|
14
|
+
"agents": [],
|
|
15
|
+
"loops": ["design", "ship-a-draft"]
|
|
16
|
+
},
|
|
17
|
+
"full": {
|
|
18
|
+
"description": "The complete catalogue: every pack, every reviewer agent, every loop.",
|
|
19
|
+
"packs": ["core", "solution-architect", "product-manager", "dev-team", "sre-oncall", "stakeholder-comms", "design", "ai-engineering", "api-builder", "converters", "experience-design", "research", "trackers", "data-analytics", "grc", "infra-as-code", "skill-engineering"],
|
|
20
|
+
"agents": ["devils-advocate", "security-reviewer", "code-quality"],
|
|
21
|
+
"loops": ["discover", "design", "build", "release", "operate", "ship-a-draft"]
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|