opencode-skills-collection 3.1.0 → 3.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundled-skills/.antigravity-install-manifest.json +84 -1
- package/bundled-skills/android-ui-journey-testing/SKILL.md +191 -0
- package/bundled-skills/ask-matt/SKILL.md +92 -0
- package/bundled-skills/bugs-are-annoying/SKILL.md +137 -0
- package/bundled-skills/codebase-design/DEEPENING.md +37 -0
- package/bundled-skills/codebase-design/DESIGN-IT-TWICE.md +44 -0
- package/bundled-skills/codebase-design/SKILL.md +145 -0
- package/bundled-skills/competitor-analysis/LICENSE.txt +21 -0
- package/bundled-skills/competitor-analysis/SKILL.md +434 -0
- package/bundled-skills/competitor-analysis/references/battle-card-subagent.md +127 -0
- package/bundled-skills/competitor-analysis/references/battle-card.md +91 -0
- package/bundled-skills/competitor-analysis/references/example-research.md +130 -0
- package/bundled-skills/competitor-analysis/references/report-template.html +127 -0
- package/bundled-skills/competitor-analysis/references/research-patterns.md +217 -0
- package/bundled-skills/competitor-analysis/references/workflow.md +434 -0
- package/bundled-skills/competitor-analysis/scripts/capture_screenshots.mjs +142 -0
- package/bundled-skills/competitor-analysis/scripts/compile_report.mjs +929 -0
- package/bundled-skills/competitor-analysis/scripts/extract_vs_names.mjs +140 -0
- package/bundled-skills/competitor-analysis/scripts/gate_candidates.mjs +194 -0
- package/bundled-skills/competitor-analysis/scripts/list_urls.mjs +90 -0
- package/bundled-skills/competitor-analysis/scripts/md_utils.mjs +50 -0
- package/bundled-skills/competitor-analysis/scripts/merge_partials.mjs +291 -0
- package/bundled-skills/competitor-analysis/scripts/package.json +6 -0
- package/bundled-skills/design-it/3d-ui/SKILL.md +259 -0
- package/bundled-skills/design-it/SKILL.md +170 -0
- package/bundled-skills/design-it/ai-native-ui/SKILL.md +295 -0
- package/bundled-skills/design-it/aurora-ui/SKILL.md +307 -0
- package/bundled-skills/design-it/bento-ui/SKILL.md +314 -0
- package/bundled-skills/design-it/brutalism/SKILL.md +270 -0
- package/bundled-skills/design-it/brutalist-typography/SKILL.md +287 -0
- package/bundled-skills/design-it/card-based-design/SKILL.md +262 -0
- package/bundled-skills/design-it/claymorphism/SKILL.md +287 -0
- package/bundled-skills/design-it/color-blocking/SKILL.md +278 -0
- package/bundled-skills/design-it/command-center-ui/SKILL.md +345 -0
- package/bundled-skills/design-it/cyber-y2k/SKILL.md +312 -0
- package/bundled-skills/design-it/cyberpunk-ui/SKILL.md +262 -0
- package/bundled-skills/design-it/dark-mode/SKILL.md +289 -0
- package/bundled-skills/design-it/dashboard-design/SKILL.md +331 -0
- package/bundled-skills/design-it/data-dense-design/SKILL.md +322 -0
- package/bundled-skills/design-it/duotone-design/SKILL.md +248 -0
- package/bundled-skills/design-it/editorial-design/SKILL.md +328 -0
- package/bundled-skills/design-it/flat-design/SKILL.md +221 -0
- package/bundled-skills/design-it/flat-design-2/SKILL.md +240 -0
- package/bundled-skills/design-it/floating-ui/SKILL.md +299 -0
- package/bundled-skills/design-it/frutiger-aero/SKILL.md +274 -0
- package/bundled-skills/design-it/glassmorphism/SKILL.md +272 -0
- package/bundled-skills/design-it/gradient-design/SKILL.md +309 -0
- package/bundled-skills/design-it/high-contrast/SKILL.md +288 -0
- package/bundled-skills/design-it/holographic-ui/SKILL.md +310 -0
- package/bundled-skills/design-it/isometric-design/SKILL.md +228 -0
- package/bundled-skills/design-it/layered-design/SKILL.md +247 -0
- package/bundled-skills/design-it/material-design/SKILL.md +275 -0
- package/bundled-skills/design-it/maximalism/SKILL.md +297 -0
- package/bundled-skills/design-it/minimalism/SKILL.md +267 -0
- package/bundled-skills/design-it/monochromatic-ui/SKILL.md +296 -0
- package/bundled-skills/design-it/neo-brutalism/SKILL.md +270 -0
- package/bundled-skills/design-it/neumorphism/SKILL.md +248 -0
- package/bundled-skills/design-it/retro-design/SKILL.md +283 -0
- package/bundled-skills/design-it/retro-futurism/SKILL.md +259 -0
- package/bundled-skills/design-it/sci-fi-interface/SKILL.md +309 -0
- package/bundled-skills/design-it/skeuomorphism/SKILL.md +280 -0
- package/bundled-skills/design-it/soft-pastel/SKILL.md +307 -0
- package/bundled-skills/design-it/spatial-computing-ui/SKILL.md +300 -0
- package/bundled-skills/design-it/spatial-design/SKILL.md +268 -0
- package/bundled-skills/design-it/swiss-design/SKILL.md +293 -0
- package/bundled-skills/design-it/synthwave/SKILL.md +257 -0
- package/bundled-skills/design-it/tile-design/SKILL.md +297 -0
- package/bundled-skills/design-it/typography-first/SKILL.md +247 -0
- package/bundled-skills/design-it/vaporwave/SKILL.md +331 -0
- package/bundled-skills/design-it/vibrant-maximalism/SKILL.md +291 -0
- package/bundled-skills/design-it/widget-based-design/SKILL.md +274 -0
- package/bundled-skills/design-it/y2k-design/SKILL.md +268 -0
- package/bundled-skills/diagnosing-bugs/SKILL.md +165 -0
- package/bundled-skills/diagnosing-bugs/scripts/hitl-loop.template.sh +41 -0
- package/bundled-skills/docs/contributors/skill-scoring.md +235 -0
- package/bundled-skills/docs/integrations/jetski-cortex.md +3 -3
- package/bundled-skills/docs/integrations/jetski-gemini-loader/README.md +1 -1
- package/bundled-skills/docs/maintainers/repo-growth-seo.md +3 -3
- package/bundled-skills/docs/maintainers/skills-update-guide.md +1 -1
- package/bundled-skills/docs/users/bundles.md +1 -1
- package/bundled-skills/docs/users/claude-code-skills.md +1 -1
- package/bundled-skills/docs/users/gemini-cli-skills.md +1 -1
- package/bundled-skills/docs/users/getting-started.md +1 -1
- package/bundled-skills/docs/users/kiro-integration.md +1 -1
- package/bundled-skills/docs/users/usage.md +4 -4
- package/bundled-skills/docs/users/visual-guide.md +4 -4
- package/bundled-skills/domain-modeling/ADR-FORMAT.md +47 -0
- package/bundled-skills/domain-modeling/CONTEXT-FORMAT.md +60 -0
- package/bundled-skills/domain-modeling/SKILL.md +105 -0
- package/bundled-skills/grill-me/SKILL.md +36 -0
- package/bundled-skills/grill-with-docs/SKILL.md +36 -0
- package/bundled-skills/grilling/SKILL.md +39 -0
- package/bundled-skills/handoff/SKILL.md +45 -0
- package/bundled-skills/image-generator/.env.example +7 -0
- package/bundled-skills/image-generator/SKILL.md +509 -0
- package/bundled-skills/improve-codebase-architecture/HTML-REPORT.md +123 -0
- package/bundled-skills/improve-codebase-architecture/SKILL.md +97 -0
- package/bundled-skills/learn/SKILL.md +156 -0
- package/bundled-skills/lesson-generator/SKILL.md +90 -0
- package/bundled-skills/llm-council/.env.example +7 -0
- package/bundled-skills/llm-council/SKILL.md +602 -0
- package/bundled-skills/loop-library/SKILL.md +205 -0
- package/bundled-skills/loop-library/agents/openai.yaml +4 -0
- package/bundled-skills/loop-library/references/catalog.md +270 -0
- package/bundled-skills/mailtrap-managing-contacts/SKILL.md +112 -0
- package/bundled-skills/mailtrap-sending-emails/SKILL.md +167 -0
- package/bundled-skills/mailtrap-setting-up-sending-domain/SKILL.md +77 -0
- package/bundled-skills/mailtrap-testing-with-sandbox/SKILL.md +110 -0
- package/bundled-skills/prototype/LOGIC.md +79 -0
- package/bundled-skills/prototype/SKILL.md +62 -0
- package/bundled-skills/prototype/UI.md +112 -0
- package/bundled-skills/setup-matt-pocock-skills/SKILL.md +158 -0
- package/bundled-skills/setup-matt-pocock-skills/domain.md +51 -0
- package/bundled-skills/setup-matt-pocock-skills/issue-tracker-github.md +34 -0
- package/bundled-skills/setup-matt-pocock-skills/issue-tracker-gitlab.md +35 -0
- package/bundled-skills/setup-matt-pocock-skills/issue-tracker-local.md +19 -0
- package/bundled-skills/setup-matt-pocock-skills/triage-labels.md +15 -0
- package/bundled-skills/survey-generator/LICENSE +21 -0
- package/bundled-skills/survey-generator/SKILL.md +143 -0
- package/bundled-skills/survey-generator/build_artifact.py +208 -0
- package/bundled-skills/survey-generator/examples/agentic-engineering/research_bundle.json +1196 -0
- package/bundled-skills/survey-generator/examples/agentic-engineering/survey.html +706 -0
- package/bundled-skills/survey-generator/style_spec.json +85 -0
- package/bundled-skills/survey-generator/templates/research_bundle_template.json +69 -0
- package/bundled-skills/tdd/SKILL.md +139 -0
- package/bundled-skills/tdd/mocking.md +59 -0
- package/bundled-skills/tdd/refactoring.md +10 -0
- package/bundled-skills/tdd/tests.md +61 -0
- package/bundled-skills/teach/GLOSSARY-FORMAT.md +35 -0
- package/bundled-skills/teach/LEARNING-RECORD-FORMAT.md +46 -0
- package/bundled-skills/teach/MISSION-FORMAT.md +31 -0
- package/bundled-skills/teach/RESOURCES-FORMAT.md +32 -0
- package/bundled-skills/teach/SKILL.md +169 -0
- package/bundled-skills/to-issues/SKILL.md +115 -0
- package/bundled-skills/to-prd/SKILL.md +104 -0
- package/bundled-skills/tools-page-seo-optimizer/SKILL.md +616 -0
- package/bundled-skills/triage/AGENT-BRIEF.md +207 -0
- package/bundled-skills/triage/OUT-OF-SCOPE.md +105 -0
- package/bundled-skills/triage/SKILL.md +143 -0
- package/bundled-skills/vibecode-production-qa-validator/SKILL.md +371 -141
- package/bundled-skills/wiki-builder/SKILL.md +157 -0
- package/bundled-skills/wiki-builder/agents/openai.yaml +5 -0
- package/bundled-skills/wiki-builder/references/wiki-flavors.md +98 -0
- package/bundled-skills/wiki-builder/scripts/init_wiki.sh +105 -0
- package/bundled-skills/wiki-builder/templates/index.md +20 -0
- package/bundled-skills/wiki-builder/templates/maintenance-log.md +7 -0
- package/bundled-skills/wiki-builder/templates/prompts/compile-concept-page.md +12 -0
- package/bundled-skills/wiki-builder/templates/prompts/compile-index.md +11 -0
- package/bundled-skills/wiki-builder/templates/prompts/compile-source-page.md +12 -0
- package/bundled-skills/wiki-builder/templates/prompts/lint-wiki.md +10 -0
- package/bundled-skills/wiki-builder/templates/prompts/query-and-file.md +11 -0
- package/bundled-skills/wiki-builder/templates/sources.md +9 -0
- package/bundled-skills/wiki-builder/templates/wiki.config.md +53 -0
- package/bundled-skills/writing-great-skills/GLOSSARY.md +181 -0
- package/bundled-skills/writing-great-skills/SKILL.md +111 -0
- package/bundled-skills/yao-meta-skill/SKILL.md +86 -0
- package/bundled-skills/yao-meta-skill/agents/interface.yaml +26 -0
- package/bundled-skills/yao-meta-skill/manifest.json +24 -0
- package/bundled-skills/yao-meta-skill/references/artifact-design-doctrine.md +49 -0
- package/bundled-skills/yao-meta-skill/references/authoring-discipline.md +78 -0
- package/bundled-skills/yao-meta-skill/references/autonomous-adaptation.md +65 -0
- package/bundled-skills/yao-meta-skill/references/distribution-registry-method.md +60 -0
- package/bundled-skills/yao-meta-skill/references/eval-playbook.md +69 -0
- package/bundled-skills/yao-meta-skill/references/gate-selection.md +68 -0
- package/bundled-skills/yao-meta-skill/references/governance.md +134 -0
- package/bundled-skills/yao-meta-skill/references/human-review-template.md +54 -0
- package/bundled-skills/yao-meta-skill/references/intent-dialogue.md +138 -0
- package/bundled-skills/yao-meta-skill/references/iteration-philosophy.md +30 -0
- package/bundled-skills/yao-meta-skill/references/non-skill-decision-tree.md +39 -0
- package/bundled-skills/yao-meta-skill/references/operating-modes.md +107 -0
- package/bundled-skills/yao-meta-skill/references/output-eval-method.md +113 -0
- package/bundled-skills/yao-meta-skill/references/output-quality-risk.md +41 -0
- package/bundled-skills/yao-meta-skill/references/output-visual-quality.md +53 -0
- package/bundled-skills/yao-meta-skill/references/packaging-contracts.md +70 -0
- package/bundled-skills/yao-meta-skill/references/pattern-extraction-doctrine.md +76 -0
- package/bundled-skills/yao-meta-skill/references/platform-capability-matrix.md +49 -0
- package/bundled-skills/yao-meta-skill/references/prompt-engineering-doctrine.md +76 -0
- package/bundled-skills/yao-meta-skill/references/qa-ladder.md +57 -0
- package/bundled-skills/yao-meta-skill/references/reference-scan.md +126 -0
- package/bundled-skills/yao-meta-skill/references/regression-cause-taxonomy.md +80 -0
- package/bundled-skills/yao-meta-skill/references/resource-boundaries.md +120 -0
- package/bundled-skills/yao-meta-skill/references/review-studio-method.md +87 -0
- package/bundled-skills/yao-meta-skill/references/review-waiver-method.md +76 -0
- package/bundled-skills/yao-meta-skill/references/runtime-conformance-method.md +21 -0
- package/bundled-skills/yao-meta-skill/references/skill-archetypes.md +86 -0
- package/bundled-skills/yao-meta-skill/references/skill-atlas-method.md +35 -0
- package/bundled-skills/yao-meta-skill/references/skill-engineering-method.md +210 -0
- package/bundled-skills/yao-meta-skill/references/skill-ir-method.md +41 -0
- package/bundled-skills/yao-meta-skill/references/skillops-decision-policy.md +53 -0
- package/bundled-skills/yao-meta-skill/references/systems-thinking-doctrine.md +75 -0
- package/bundled-skills/yao-meta-skill/references/telemetry-drift-method.md +182 -0
- package/bundled-skills/yao-meta-skill/references/trust-security-method.md +79 -0
- package/bundled-skills/yao-meta-skill/references/user-memory-policy.md +35 -0
- package/bundled-skills/youtube-notetaker/SKILL.md +209 -0
- package/bundled-skills/youtube-notetaker/reference/artifact.html +269 -0
- package/bundled-skills/youtube-notetaker/scripts/contact_sheet.py +53 -0
- package/bundled-skills/youtube-notetaker/scripts/detect_slides.sh +19 -0
- package/bundled-skills/youtube-notetaker/scripts/download.sh +24 -0
- package/bundled-skills/youtube-notetaker/scripts/extract_slides.py +43 -0
- package/bundled-skills/youtube-notetaker/scripts/serve.py +173 -0
- package/bundled-skills/youtube-notetaker/scripts/setup.sh +27 -0
- package/bundled-skills/youtube-notetaker/scripts/verify.sh +31 -0
- package/bundled-skills/youtube-notetaker/scripts/vtt_to_transcript.py +59 -0
- package/bundled-skills/youtube-notetaker/scripts/write_library_item.py +69 -0
- package/package.json +1 -1
- package/skills_index.json +1956 -286
- package/bundled-skills/ai-md/SKILL.md +0 -523
- package/bundled-skills/atlas-contract/SKILL.md +0 -650
- package/bundled-skills/busybox-on-windows/SKILL.md +0 -40
- package/bundled-skills/monte-carlo-prevent/SKILL.md +0 -257
- package/bundled-skills/monte-carlo-prevent/references/TROUBLESHOOTING.md +0 -23
- package/bundled-skills/monte-carlo-prevent/references/parameters.md +0 -32
- package/bundled-skills/monte-carlo-prevent/references/workflows.md +0 -478
- package/bundled-skills/monte-carlo-push-ingestion/SKILL.md +0 -372
- package/bundled-skills/monte-carlo-push-ingestion/references/anomaly-detection.md +0 -87
- package/bundled-skills/monte-carlo-push-ingestion/references/custom-lineage.md +0 -203
- package/bundled-skills/monte-carlo-push-ingestion/references/direct-http-api.md +0 -207
- package/bundled-skills/monte-carlo-push-ingestion/references/prerequisites.md +0 -150
- package/bundled-skills/monte-carlo-push-ingestion/references/push-lineage.md +0 -160
- package/bundled-skills/monte-carlo-push-ingestion/references/push-metadata.md +0 -158
- package/bundled-skills/monte-carlo-push-ingestion/references/push-query-logs.md +0 -219
- package/bundled-skills/monte-carlo-push-ingestion/references/validation.md +0 -257
- package/bundled-skills/monte-carlo-push-ingestion/scripts/sample_verify.py +0 -357
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery/collect_and_push_lineage.py +0 -70
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery/collect_and_push_metadata.py +0 -65
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery/collect_and_push_query_logs.py +0 -70
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery/collect_lineage.py +0 -214
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery/collect_metadata.py +0 -160
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery/collect_query_logs.py +0 -164
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery/push_lineage.py +0 -198
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery/push_metadata.py +0 -193
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery/push_query_logs.py +0 -207
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery-iceberg/collect_and_push_metadata.py +0 -71
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery-iceberg/collect_and_push_query_logs.py +0 -64
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery-iceberg/collect_metadata.py +0 -253
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery-iceberg/collect_query_logs.py +0 -149
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery-iceberg/push_metadata.py +0 -190
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery-iceberg/push_query_logs.py +0 -208
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/databricks/collect_and_push_lineage.py +0 -83
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/databricks/collect_and_push_metadata.py +0 -77
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/databricks/collect_and_push_query_logs.py +0 -83
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/databricks/collect_lineage.py +0 -240
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/databricks/collect_metadata.py +0 -212
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/databricks/collect_query_logs.py +0 -204
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/databricks/push_lineage.py +0 -192
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/databricks/push_metadata.py +0 -178
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/databricks/push_query_logs.py +0 -200
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/hive/collect_and_push_lineage.py +0 -119
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/hive/collect_and_push_metadata.py +0 -119
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/hive/collect_and_push_query_logs.py +0 -117
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/hive/collect_lineage.py +0 -265
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/hive/collect_metadata.py +0 -313
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/hive/collect_query_logs.py +0 -284
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/hive/push_lineage.py +0 -309
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/hive/push_metadata.py +0 -245
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/hive/push_query_logs.py +0 -255
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/redshift/collect_and_push_lineage.py +0 -78
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/redshift/collect_and_push_metadata.py +0 -80
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/redshift/collect_and_push_query_logs.py +0 -88
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/redshift/collect_lineage.py +0 -235
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/redshift/collect_metadata.py +0 -219
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/redshift/collect_query_logs.py +0 -239
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/redshift/push_lineage.py +0 -178
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/redshift/push_metadata.py +0 -178
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/redshift/push_query_logs.py +0 -196
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/snowflake/collect_and_push_lineage.py +0 -154
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/snowflake/collect_and_push_metadata.py +0 -137
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/snowflake/collect_and_push_query_logs.py +0 -137
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/snowflake/collect_lineage.py +0 -349
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/snowflake/collect_metadata.py +0 -329
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/snowflake/collect_query_logs.py +0 -254
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/snowflake/push_lineage.py +0 -307
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/snowflake/push_metadata.py +0 -228
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/snowflake/push_query_logs.py +0 -248
- package/bundled-skills/monte-carlo-push-ingestion/scripts/test_template_sdk_usage.py +0 -340
- package/bundled-skills/skill-optimizer/SKILL.md +0 -271
- package/bundled-skills/using-superpowers/SKILL.md +0 -98
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reference_paper": "Gao et al. 2023, Retrieval-Augmented Generation for Large Language Models: A Survey (arXiv:2312.10997)",
|
|
3
|
+
"why_reference": "Clean academic layout, memorable taxonomy tree, paradigm comparison figure, structured progression from foundations to methods to evaluation. Good anchor for an agent harness survey.",
|
|
4
|
+
"layout": {
|
|
5
|
+
"format": "single self-contained HTML file, academic two-column inspired but responsive on modern browsers",
|
|
6
|
+
"page_width": "max-width 1100px, centered",
|
|
7
|
+
"columns": "two-column body text on viewport >= 900px, single column on mobile",
|
|
8
|
+
"margins": "generous, academic paper feel",
|
|
9
|
+
"background": "warm off-white (#fbfaf6 or similar)",
|
|
10
|
+
"body_text_color": "near-black (#1a1a1a)"
|
|
11
|
+
},
|
|
12
|
+
"typography": {
|
|
13
|
+
"body_font": "Georgia, 'Times New Roman', serif",
|
|
14
|
+
"heading_font": "Georgia, serif with slightly heavier weight",
|
|
15
|
+
"monospace": "SFMono-Regular, Menlo, Consolas, monospace",
|
|
16
|
+
"body_size": "15px or 16px, line-height 1.55",
|
|
17
|
+
"section_numbering": "numbered sections and subsections like 1, 1.1, 2, 2.1",
|
|
18
|
+
"title_size": "large, centered on title block",
|
|
19
|
+
"author_and_affiliation": "centered under title, smaller italic"
|
|
20
|
+
},
|
|
21
|
+
"structural_elements": {
|
|
22
|
+
"title_block": "Paper title, author placeholder, affiliation placeholder (Anonymous / DAIR Research Notes), date",
|
|
23
|
+
"abstract": "Italicized paragraph labeled 'Abstract', single column, set off with a subtle border or spacing",
|
|
24
|
+
"keywords": "line of 4 to 6 keywords below the abstract",
|
|
25
|
+
"section_headings": "bold, numbered, flush left",
|
|
26
|
+
"subsection_headings": "bold italic, numbered",
|
|
27
|
+
"paragraphs": "justified text, indented first line optional",
|
|
28
|
+
"inline_citations": "parenthetical like (Yao et al., 2022) matching bibliography keys",
|
|
29
|
+
"references_section": "numbered list, hanging indent, final section"
|
|
30
|
+
},
|
|
31
|
+
"required_figures": [
|
|
32
|
+
{
|
|
33
|
+
"id": "Figure 1",
|
|
34
|
+
"caption": "Taxonomy of the surveyed field. Derive node labels from research_bundle.taxonomy.",
|
|
35
|
+
"description": "Horizontal taxonomy tree rendered as inline SVG. Three vertical columns: root on the left, branches in the middle, leaves on the right. The viewport MUST be tall enough to stack every leaf without overlap: compute viewport_height as sum_over_branches(max(1, children_count) * 28) + 40 and set it explicitly, and set viewport_width to 820. Use preserveAspectRatio default.\n\nROOT NODE: one rounded rect at x=20, y=(viewport_height/2 - 18), width=200, height=36, rx=6, fill #8a2a2b. Text: bold Georgia 14px, fill #fbfaf6, text-anchor middle, x=120, y=(root_y + 23). The width of 200 guarantees 'Agentic Engineering' and similar labels fit; do not shrink below 200 even if the label is short.\n\nBRANCH COLUMN: one rounded rect per entry in research_bundle.taxonomy.branches, all at x=260, width=200, height=32, rx=4, fill #f0efe9, stroke #1a1a1a at 1.2. The vertical position of branch i must be the vertical center of its own leaf block (see below), minus 16. Label: Georgia 12px, text-anchor middle, x=360, y=(branch_y + 20).\n\nLEAF COLUMN: every leaf rect has x=500, width=300, height=22, rx=3, fill #fbfaf6, stroke #c0bdb0 at 0.8. The vertical pitch between consecutive leaves is EXACTLY 28 (rect height 22 plus 6px gap). The leaf block for branch i starts at cumulative_y, which is 20 for branch 0 and cumulative_y_of_previous_branch + 28 * children_count_of_previous_branch for branch i > 0. Within a branch's leaf block, leaf j is at y = branch_block_start_y + 28 * j. Leaf label: Georgia 10px, text-anchor middle, x=650, y=(leaf_y + 15). A leaf rect MUST never visually overlap another leaf rect, and leaf text MUST never cross a rect boundary.\n\nCONNECTORS: from the right edge of the root (x=220, y=root_y+18) to the left edge of each branch (x=260, y=branch_y+16), draw one smooth cubic bezier per branch. From the right edge of each branch (x=460, y=branch_y+16) to the left edge of each of its leaves (x=500, y=leaf_y+11), draw one short horizontal line per leaf.\n\nHARD INVARIANTS (check before emitting): no two rects in the same column have overlapping y ranges; every label stays inside its rect; viewport height equals sum_over_branches(children_count) * 28 + 40 (with a minimum of 360); bezier connectors use C commands, not L commands.",
|
|
36
|
+
"element_budget": "roughly 60 to 80 SVG elements"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"id": "Figure 2",
|
|
40
|
+
"caption": "Three paradigms of the surveyed field. Derive panels from research_bundle.paradigms.",
|
|
41
|
+
"description": "Three side-by-side panels as inline SVG, viewport exactly 780 wide by 280 tall. Each panel corresponds to an entry in research_bundle.paradigms (exactly three paradigms). CRITICAL LAYOUT CONTRACT: the three panel background rectangles are fixed at x=10 width=240, x=270 width=240, and x=530 width=240, all with y=10 height=260, rx=6, fill #faf9f4, stroke #d6d3c4. Every node and connector that belongs to paradigm index i MUST be rendered inside the interior of panel i. The interior x ranges are: panel 1 x in [30, 230], panel 2 x in [290, 490], panel 3 x in [550, 750]. The interior y range for nodes is [55, 250] in every panel (title sits at y=32). REQUIRED IMPLEMENTATION: wrap each panel's nodes and connectors in a single <g transform='translate(OFFSET,0)'> group where OFFSET is 10 for panel 1, 270 for panel 2, and 530 for panel 3 (these offsets match the panel background x positions, so panel-local x=120 maps to each panel's horizontal center). Use panel-local x coordinates in the range [10, 230] inside every group, and arrange the visible content so that its collective horizontal center sits on panel-local x=120. Concretely: if the content has a single row of nodes, center the row on panel-local x=120; if the content has multiple rows stacked vertically (for example, a parent node above a row of children), center each row independently on panel-local x=120 so parents and children share a vertical axis through x=120. Do NOT reuse the same absolute x coordinates for all three paradigms. Panel titles sit at y=32, bold Georgia 13px, text-anchor middle, x at the panel's horizontal center (130, 390, 650). Define a single <marker id='arrow'> with a small filled triangle and reuse it via marker-end on directional connectors. Render paradigm.nodes as rounded rectangles (rx=4, fill #f0efe9, stroke #1a1a1a at 1.2, Georgia 11px labels, text-anchor middle). Draw connectors described by paradigm.flow; flow strings use arrow syntax inside the data file (for example 'Observe -> Reason -> Act -> Observe' means a three-node cycle). Convert every such directed relation into an arrowed connector. If paradigm.flow contains 'bi:' prefix, render a bidirectional pair of arrows. Keep node sizing consistent across all three panels. This arrow notation appears only inside data files; the body prose must still avoid arrow symbols.\n\nMULTI-NODE ROW GEOMETRY (critical): whenever N sibling nodes sit on the same horizontal row inside a panel (for example Worker A, Worker B, Worker C in an orchestrator-workers panel, or three siblings in a fan-out layout), their rect widths and centers MUST follow this deterministic formula so rects never overlap AND the row is centered on panel-local x=120. Panel interior width is 220 (panel-local x in [10, 230], horizontal center at 120). Compute rect_width = floor((200 - 10 * (N + 1)) / N) and clamp to a minimum of 44 and a maximum of 72. Compute total_row_width = N * rect_width + (N - 1) * 10. Compute start_x (panel-local, left edge of leftmost rect) = 120 - total_row_width / 2. Compute center_x_i (panel-local) = start_x + (rect_width / 2) + (rect_width + 10) * i for i in 0..N-1. Use rect_height = 26. Adjacent rects MUST leave at least 10 panel-local pixels of horizontal gap between their facing edges. If a label does not fit inside the computed rect_width at 11px, drop the label to Georgia 10px; if it still does not fit, shorten the label (for example 'Worker A' rather than 'Worker Agent A'). Never widen a rect past its computed rect_width to accommodate a label.\n\nHARD INVARIANTS (check before emitting): no two rects in the same panel and same y-row have overlapping x ranges; every label stays fully inside its rect; no node rectangle from panel i overlaps the background of panel j for i != j; every connector's endpoints sit on the edge of a node rect, not inside it; the collective horizontal center of each panel's visible content aligns with panel-local x=120 (if a panel has multiple vertical rows, each row is independently centered on x=120).",
|
|
42
|
+
"element_budget": "roughly 60 to 80 SVG elements"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"id": "Figure 3",
|
|
46
|
+
"caption": "Representative stack for the surveyed field. Derive layers from research_bundle.stack.",
|
|
47
|
+
"description": "Vertical layered stack diagram rendered as inline SVG, viewport exactly 720 wide by 360 tall. Set both the SVG width attribute and the viewBox to '0 0 720 360'. One horizontal layer bar per entry in research_bundle.stack (ordered bottom-to-top as given in the array), each exactly 360 wide starting at x=40 (so the bar's right edge is at x=400) and 44 tall with rounded corners rx=4 and at least 8px of vertical gap between layers. Use a subtle fill gradient across the stack by varying fills from bottom to top through #e8e6dc, #ece9df, #f0ede2, #f4f1e6, #f8f5e9, #fbfaf6 (cycle or interpolate if there are more or fewer than six layers). Add a left accent bar (fill #8a2a2b, width 4) running the full height of the bottom-most layer only, to emphasize its foundational role. Layer label (research_bundle.stack[i].name) centered inside each bar in Georgia bold 13px. To the right of each bar, render research_bundle.stack[i].role as a short italic descriptive phrase (about 6 to 10 words) in Georgia 11px color #6b6b6b, vertically centered. Role text tspans start at x=420 and MUST wrap across at most two lines (dy=0 and dy=14) so the widest line fits within the viewport right edge at x=720. If a line would exceed x=700, break it at an earlier word boundary or shorten the role phrase; never allow text to run past x=710.",
|
|
48
|
+
"element_budget": "roughly 40 SVG elements"
|
|
49
|
+
}
|
|
50
|
+
],
|
|
51
|
+
"figure_quality_note": "Figures should read as polished academic figures, not quick wireframes. Maintain a consistent visual vocabulary across all three: identical stroke weights, identical corner radii, identical typography (Georgia serif), and shared marker definitions for arrowheads. Avoid gradients and filters, but do use subtle fill differentiation, rounded corners, and bezier curves where appropriate. Every label must have enough padding to never touch a border or another label.",
|
|
52
|
+
"required_tables": [
|
|
53
|
+
{
|
|
54
|
+
"id": "Table 1",
|
|
55
|
+
"caption": "Representative systems across the surveyed dimensions. Derive columns from research_bundle.table.columns and rows from research_bundle.table.rows.",
|
|
56
|
+
"columns_source": "research_bundle.table.columns (array of 4 to 6 short column headers).",
|
|
57
|
+
"rows_source": "research_bundle.table.rows (array of 8 to 12 objects, one per representative system, with a value for every column)."
|
|
58
|
+
}
|
|
59
|
+
],
|
|
60
|
+
"color_palette": {
|
|
61
|
+
"background": "#fbfaf6",
|
|
62
|
+
"text": "#1a1a1a",
|
|
63
|
+
"accent": "#8a2a2b",
|
|
64
|
+
"muted": "#6b6b6b",
|
|
65
|
+
"rule_lines": "#d6d3c4"
|
|
66
|
+
},
|
|
67
|
+
"tone_and_voice": {
|
|
68
|
+
"register": "academic survey, measured, precise",
|
|
69
|
+
"person": "third person, no first-person voice",
|
|
70
|
+
"claims": "descriptive rather than promotional, hedged where appropriate",
|
|
71
|
+
"avoid": ["marketing language", "exclamation points", "informal contractions", "em dashes", "arrow symbols in prose"]
|
|
72
|
+
},
|
|
73
|
+
"hard_rules_for_generation": [
|
|
74
|
+
"Output exactly one self-contained HTML document. No external CSS, no external JS, no external images, no web fonts. Inline everything.",
|
|
75
|
+
"All figures must be rendered as inline SVG elements within the HTML.",
|
|
76
|
+
"Emit figures in the exact order of required_figures and use the exact numeric IDs from required_figures[].id in each figcaption (Figure 1, Figure 2, Figure 3 in that sequence). Figure N must appear in document order before Figure N+1. Do not renumber, skip, or reorder figures even if it seems the surrounding prose would read better the other way. Place each figure inside the section whose topic best matches it, but if two figures would appear in the same section, keep them in numerical order.",
|
|
77
|
+
"Cite only bibliography entries that appear in the provided research_bundle. Do not invent citations.",
|
|
78
|
+
"Use the section structure from the research_bundle. Do not add or remove sections.",
|
|
79
|
+
"Total body length target: roughly 5000 to 6500 words across all sections combined. Each section should carry substantive discussion (at least 3 paragraphs) and integrate multiple cited works. Finish all sections and the References section before reaching the token budget.",
|
|
80
|
+
"Generate sections in order. Place figures inside their sections. If the token budget is tight, shorten prose rather than dropping sections or references.",
|
|
81
|
+
"Do not include any content before <!DOCTYPE html> or after </html>.",
|
|
82
|
+
"Do not use em dashes or arrow symbols in body prose.",
|
|
83
|
+
"Produce a References section at the end that lists every bibliography entry in numeric order, formatted consistently."
|
|
84
|
+
]
|
|
85
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "Survey Title: A Descriptive Subtitle",
|
|
3
|
+
"authors_placeholder": "Anonymous",
|
|
4
|
+
"anchor_source": "https://example.com/public-resource-used-as-anchor",
|
|
5
|
+
"abstract_hints": [
|
|
6
|
+
"One sentence framing the problem space.",
|
|
7
|
+
"One sentence describing why the field is coalescing now.",
|
|
8
|
+
"One sentence previewing the taxonomy and contributions of this survey."
|
|
9
|
+
],
|
|
10
|
+
"taxonomy": {
|
|
11
|
+
"root": "Survey Topic",
|
|
12
|
+
"branches": [
|
|
13
|
+
{ "name": "Branch A", "children": ["Leaf A1", "Leaf A2", "Leaf A3"] },
|
|
14
|
+
{ "name": "Branch B", "children": ["Leaf B1", "Leaf B2"] },
|
|
15
|
+
{ "name": "Branch C", "children": ["Leaf C1", "Leaf C2", "Leaf C3"] },
|
|
16
|
+
{ "name": "Branch D", "children": ["Leaf D1", "Leaf D2"] },
|
|
17
|
+
{ "name": "Branch E", "children": ["Leaf E1", "Leaf E2", "Leaf E3"] }
|
|
18
|
+
]
|
|
19
|
+
},
|
|
20
|
+
"paradigms": [
|
|
21
|
+
{
|
|
22
|
+
"name": "Paradigm 1",
|
|
23
|
+
"nodes": ["Step A", "Step B", "Step C"],
|
|
24
|
+
"flow": "Step A -> Step B -> Step C -> Step A"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"name": "Paradigm 2",
|
|
28
|
+
"nodes": ["Plan", "Subtask 1", "Subtask 2", "Subtask 3"],
|
|
29
|
+
"flow": "Plan -> Subtask 1; Plan -> Subtask 2; Plan -> Subtask 3"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"name": "Paradigm 3",
|
|
33
|
+
"nodes": ["Act", "Reflect", "Memory"],
|
|
34
|
+
"flow": "Act -> Reflect -> Act; bi: Reflect -> Memory"
|
|
35
|
+
}
|
|
36
|
+
],
|
|
37
|
+
"stack": [
|
|
38
|
+
{ "name": "Layer 1 (foundational)", "role": "Short italic role description for layer 1." },
|
|
39
|
+
{ "name": "Layer 2", "role": "Short italic role description for layer 2." },
|
|
40
|
+
{ "name": "Layer 3", "role": "Short italic role description for layer 3." },
|
|
41
|
+
{ "name": "Layer 4", "role": "Short italic role description for layer 4." },
|
|
42
|
+
{ "name": "Layer 5", "role": "Short italic role description for layer 5." },
|
|
43
|
+
{ "name": "Layer 6 (topmost)", "role": "Short italic role description for layer 6." }
|
|
44
|
+
],
|
|
45
|
+
"sections": [
|
|
46
|
+
{ "id": "1", "title": "Introduction", "guidance": "Frame the problem and preview the taxonomy." },
|
|
47
|
+
{ "id": "2", "title": "Foundations", "guidance": "Cover the core primitives.", "papers": ["Key1", "Key2"] },
|
|
48
|
+
{ "id": "3", "title": "Methods", "guidance": "Survey the main methodological families.", "papers": ["Key3", "Key4"] },
|
|
49
|
+
{ "id": "4", "title": "Systems", "guidance": "Compare representative systems.", "papers": ["Key5", "Key6"] },
|
|
50
|
+
{ "id": "5", "title": "Evaluation", "guidance": "Review benchmarks and metrics.", "papers": ["Key7"] },
|
|
51
|
+
{ "id": "6", "title": "Open Problems and Future Directions", "guidance": "Discuss reliability, cost, portability, and open research questions." }
|
|
52
|
+
],
|
|
53
|
+
"table": {
|
|
54
|
+
"columns": ["System", "Primary Mechanism", "Key Contribution", "Primary Evaluation"],
|
|
55
|
+
"rows": [
|
|
56
|
+
{ "System": "Example System", "Primary Mechanism": "Short description", "Key Contribution": "Short description", "Primary Evaluation": "Short description" }
|
|
57
|
+
]
|
|
58
|
+
},
|
|
59
|
+
"bibliography": [
|
|
60
|
+
{
|
|
61
|
+
"key": "Key1",
|
|
62
|
+
"authors": "Author, A. et al.",
|
|
63
|
+
"year": "2024",
|
|
64
|
+
"title": "Paper Title",
|
|
65
|
+
"venue": "Venue Year",
|
|
66
|
+
"summary": "One to two sentence summary of the paper's contribution."
|
|
67
|
+
}
|
|
68
|
+
]
|
|
69
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: tdd
|
|
3
|
+
description: Test-driven development. Use when the user wants to build features or fix bugs test-first, mentions "red-green-refactor", or wants integration tests.
|
|
4
|
+
category: "development"
|
|
5
|
+
risk: "safe"
|
|
6
|
+
source: "community"
|
|
7
|
+
source_repo: "mattpocock/skills"
|
|
8
|
+
source_type: "community"
|
|
9
|
+
date_added: "2026-06-19"
|
|
10
|
+
author: "Matt Pocock"
|
|
11
|
+
license: "MIT"
|
|
12
|
+
license_source: "https://github.com/mattpocock/skills/blob/main/LICENSE"
|
|
13
|
+
tags:
|
|
14
|
+
- engineering
|
|
15
|
+
- workflow
|
|
16
|
+
- coding-agents
|
|
17
|
+
tools:
|
|
18
|
+
- claude-code
|
|
19
|
+
- codex-cli
|
|
20
|
+
- cursor
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
# Test-Driven Development
|
|
24
|
+
|
|
25
|
+
## When to Use
|
|
26
|
+
|
|
27
|
+
Use when this workflow matches the user request: Use this skill for its documented workflow.
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
_Source: [mattpocock/skills](https://github.com/mattpocock/skills) (MIT)._
|
|
31
|
+
|
|
32
|
+
## Philosophy
|
|
33
|
+
|
|
34
|
+
**Core principle**: Tests should verify behavior through public interfaces, not implementation details. Code can change entirely; tests shouldn't.
|
|
35
|
+
|
|
36
|
+
**Good tests** are integration-style: they exercise real code paths through public APIs. They describe _what_ the system does, not _how_ it does it. A good test reads like a specification - "user can checkout with valid cart" tells you exactly what capability exists. These tests survive refactors because they don't care about internal structure.
|
|
37
|
+
|
|
38
|
+
**Bad tests** are coupled to implementation. They mock internal collaborators, test private methods, or verify through external means (like querying a database directly instead of using the interface). The warning sign: your test breaks when you refactor, but behavior hasn't changed. If you rename an internal function and tests fail, those tests were testing implementation, not behavior.
|
|
39
|
+
|
|
40
|
+
See [tests.md](tests.md) for examples and [mocking.md](mocking.md) for mocking guidelines.
|
|
41
|
+
|
|
42
|
+
## Anti-Pattern: Horizontal Slices
|
|
43
|
+
|
|
44
|
+
**DO NOT write all tests first, then all implementation.** This is "horizontal slicing" - treating RED as "write all tests" and GREEN as "write all code."
|
|
45
|
+
|
|
46
|
+
This produces **crap tests**:
|
|
47
|
+
|
|
48
|
+
- Tests written in bulk test _imagined_ behavior, not _actual_ behavior
|
|
49
|
+
- You end up testing the _shape_ of things (data structures, function signatures) rather than user-facing behavior
|
|
50
|
+
- Tests become insensitive to real changes - they pass when behavior breaks, fail when behavior is fine
|
|
51
|
+
- You outrun your headlights, committing to test structure before understanding the implementation
|
|
52
|
+
|
|
53
|
+
**Correct approach**: Vertical slices via tracer bullets. One test → one implementation → repeat. Each test responds to what you learned from the previous cycle. Because you just wrote the code, you know exactly what behavior matters and how to verify it.
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
WRONG (horizontal):
|
|
57
|
+
RED: test1, test2, test3, test4, test5
|
|
58
|
+
GREEN: impl1, impl2, impl3, impl4, impl5
|
|
59
|
+
|
|
60
|
+
RIGHT (vertical):
|
|
61
|
+
RED→GREEN: test1→impl1
|
|
62
|
+
RED→GREEN: test2→impl2
|
|
63
|
+
RED→GREEN: test3→impl3
|
|
64
|
+
...
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Workflow
|
|
68
|
+
|
|
69
|
+
### 1. Planning
|
|
70
|
+
|
|
71
|
+
When exploring the codebase, read `CONTEXT.md` (if it exists) so that test names and interface vocabulary match the project's domain language, and respect ADRs in the area you're touching.
|
|
72
|
+
|
|
73
|
+
Before writing any code:
|
|
74
|
+
|
|
75
|
+
- [ ] Confirm with user what interface changes are needed
|
|
76
|
+
- [ ] Confirm with user which behaviors to test (prioritize)
|
|
77
|
+
- [ ] Identify opportunities for deep modules (small interface, deep implementation) — run the `/codebase-design` skill for the vocabulary and the testability checks
|
|
78
|
+
- [ ] List the behaviors to test (not implementation steps)
|
|
79
|
+
- [ ] Get user approval on the plan
|
|
80
|
+
|
|
81
|
+
Ask: "What should the public interface look like? Which behaviors are most important to test?"
|
|
82
|
+
|
|
83
|
+
**You can't test everything.** Confirm with the user exactly which behaviors matter most. Focus testing effort on critical paths and complex logic, not every possible edge case.
|
|
84
|
+
|
|
85
|
+
### 2. Tracer Bullet
|
|
86
|
+
|
|
87
|
+
Write ONE test that confirms ONE thing about the system:
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
RED: Write test for first behavior → test fails
|
|
91
|
+
GREEN: Write minimal code to pass → test passes
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
This is your tracer bullet - proves the path works end-to-end.
|
|
95
|
+
|
|
96
|
+
### 3. Incremental Loop
|
|
97
|
+
|
|
98
|
+
For each remaining behavior:
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
RED: Write next test → fails
|
|
102
|
+
GREEN: Minimal code to pass → passes
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Rules:
|
|
106
|
+
|
|
107
|
+
- One test at a time
|
|
108
|
+
- Only enough code to pass current test
|
|
109
|
+
- Don't anticipate future tests
|
|
110
|
+
- Keep tests focused on observable behavior
|
|
111
|
+
|
|
112
|
+
### 4. Refactor
|
|
113
|
+
|
|
114
|
+
After all tests pass, look for [refactor candidates](refactoring.md):
|
|
115
|
+
|
|
116
|
+
- [ ] Extract duplication
|
|
117
|
+
- [ ] Deepen modules (move complexity behind simple interfaces)
|
|
118
|
+
- [ ] Apply SOLID principles where natural
|
|
119
|
+
- [ ] Consider what new code reveals about existing code
|
|
120
|
+
- [ ] Run tests after each refactor step
|
|
121
|
+
|
|
122
|
+
**Never refactor while RED.** Get to GREEN first.
|
|
123
|
+
|
|
124
|
+
## Checklist Per Cycle
|
|
125
|
+
|
|
126
|
+
```
|
|
127
|
+
[ ] Test describes behavior, not implementation
|
|
128
|
+
[ ] Test uses public interface only
|
|
129
|
+
[ ] Test would survive internal refactor
|
|
130
|
+
[ ] Code is minimal for this test
|
|
131
|
+
[ ] No speculative features added
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
## Limitations
|
|
136
|
+
|
|
137
|
+
- Requires the upstream tool, account, API key, or local setup when the workflow names one.
|
|
138
|
+
- Does not authorize destructive, production, paid, or external-message actions without explicit user approval.
|
|
139
|
+
- Validate generated artifacts or recommendations against the user's real sources before treating them as final.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# When to Mock
|
|
2
|
+
|
|
3
|
+
Mock at **system boundaries** only:
|
|
4
|
+
|
|
5
|
+
- External APIs (payment, email, etc.)
|
|
6
|
+
- Databases (sometimes - prefer test DB)
|
|
7
|
+
- Time/randomness
|
|
8
|
+
- File system (sometimes)
|
|
9
|
+
|
|
10
|
+
Don't mock:
|
|
11
|
+
|
|
12
|
+
- Your own classes/modules
|
|
13
|
+
- Internal collaborators
|
|
14
|
+
- Anything you control
|
|
15
|
+
|
|
16
|
+
## Designing for Mockability
|
|
17
|
+
|
|
18
|
+
At system boundaries, design interfaces that are easy to mock:
|
|
19
|
+
|
|
20
|
+
**1. Use dependency injection**
|
|
21
|
+
|
|
22
|
+
Pass external dependencies in rather than creating them internally:
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
// Easy to mock
|
|
26
|
+
function processPayment(order, paymentClient) {
|
|
27
|
+
return paymentClient.charge(order.total);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Hard to mock
|
|
31
|
+
function processPayment(order) {
|
|
32
|
+
const client = new StripeClient(process.env.STRIPE_KEY);
|
|
33
|
+
return client.charge(order.total);
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
**2. Prefer SDK-style interfaces over generic fetchers**
|
|
38
|
+
|
|
39
|
+
Create specific functions for each external operation instead of one generic function with conditional logic:
|
|
40
|
+
|
|
41
|
+
```typescript
|
|
42
|
+
// GOOD: Each function is independently mockable
|
|
43
|
+
const api = {
|
|
44
|
+
getUser: (id) => fetch(`/users/${id}`),
|
|
45
|
+
getOrders: (userId) => fetch(`/users/${userId}/orders`),
|
|
46
|
+
createOrder: (data) => fetch('/orders', { method: 'POST', body: data }),
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
// BAD: Mocking requires conditional logic inside the mock
|
|
50
|
+
const api = {
|
|
51
|
+
fetch: (endpoint, options) => fetch(endpoint, options),
|
|
52
|
+
};
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
The SDK approach means:
|
|
56
|
+
- Each mock returns one specific shape
|
|
57
|
+
- No conditional logic in test setup
|
|
58
|
+
- Easier to see which endpoints a test exercises
|
|
59
|
+
- Type safety per endpoint
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# Refactor Candidates
|
|
2
|
+
|
|
3
|
+
After TDD cycle, look for:
|
|
4
|
+
|
|
5
|
+
- **Duplication** → Extract function/class
|
|
6
|
+
- **Long methods** → Break into private helpers (keep tests on public interface)
|
|
7
|
+
- **Shallow modules** → Combine or deepen
|
|
8
|
+
- **Feature envy** → Move logic to where data lives
|
|
9
|
+
- **Primitive obsession** → Introduce value objects
|
|
10
|
+
- **Existing code** the new code reveals as problematic
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Good and Bad Tests
|
|
2
|
+
|
|
3
|
+
## Good Tests
|
|
4
|
+
|
|
5
|
+
**Integration-style**: Test through real interfaces, not mocks of internal parts.
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
// GOOD: Tests observable behavior
|
|
9
|
+
test("user can checkout with valid cart", async () => {
|
|
10
|
+
const cart = createCart();
|
|
11
|
+
cart.add(product);
|
|
12
|
+
const result = await checkout(cart, paymentMethod);
|
|
13
|
+
expect(result.status).toBe("confirmed");
|
|
14
|
+
});
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Characteristics:
|
|
18
|
+
|
|
19
|
+
- Tests behavior users/callers care about
|
|
20
|
+
- Uses public API only
|
|
21
|
+
- Survives internal refactors
|
|
22
|
+
- Describes WHAT, not HOW
|
|
23
|
+
- One logical assertion per test
|
|
24
|
+
|
|
25
|
+
## Bad Tests
|
|
26
|
+
|
|
27
|
+
**Implementation-detail tests**: Coupled to internal structure.
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
// BAD: Tests implementation details
|
|
31
|
+
test("checkout calls paymentService.process", async () => {
|
|
32
|
+
const mockPayment = jest.mock(paymentService);
|
|
33
|
+
await checkout(cart, payment);
|
|
34
|
+
expect(mockPayment.process).toHaveBeenCalledWith(cart.total);
|
|
35
|
+
});
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Red flags:
|
|
39
|
+
|
|
40
|
+
- Mocking internal collaborators
|
|
41
|
+
- Testing private methods
|
|
42
|
+
- Asserting on call counts/order
|
|
43
|
+
- Test breaks when refactoring without behavior change
|
|
44
|
+
- Test name describes HOW not WHAT
|
|
45
|
+
- Verifying through external means instead of interface
|
|
46
|
+
|
|
47
|
+
```typescript
|
|
48
|
+
// BAD: Bypasses interface to verify
|
|
49
|
+
test("createUser saves to database", async () => {
|
|
50
|
+
await createUser({ name: "Alice" });
|
|
51
|
+
const row = await db.query("SELECT * FROM users WHERE name = ?", ["Alice"]);
|
|
52
|
+
expect(row).toBeDefined();
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
// GOOD: Verifies through interface
|
|
56
|
+
test("createUser makes user retrievable", async () => {
|
|
57
|
+
const user = await createUser({ name: "Alice" });
|
|
58
|
+
const retrieved = await getUser(user.id);
|
|
59
|
+
expect(retrieved.name).toBe("Alice");
|
|
60
|
+
});
|
|
61
|
+
```
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# GLOSSARY.md Format
|
|
2
|
+
|
|
3
|
+
`GLOSSARY.md` is the canonical language for this teaching workspace. All explainers, exercises, and learning records should adhere to its terminology. Building it is itself part of learning: compressing a concept into a tight definition is evidence the user understands it.
|
|
4
|
+
|
|
5
|
+
## Structure
|
|
6
|
+
|
|
7
|
+
```md
|
|
8
|
+
# {Topic} Glossary
|
|
9
|
+
|
|
10
|
+
{One or two sentence description of the topic this glossary covers.}
|
|
11
|
+
|
|
12
|
+
## Terms
|
|
13
|
+
|
|
14
|
+
**Hypertrophy**:
|
|
15
|
+
Muscle growth driven by mechanical tension and metabolic stress over repeated training sessions.
|
|
16
|
+
_Avoid_: Bulking, getting big
|
|
17
|
+
|
|
18
|
+
**Progressive overload**:
|
|
19
|
+
Systematically increasing the demand on a muscle over time — via load, volume, or intensity.
|
|
20
|
+
_Avoid_: Pushing harder, levelling up
|
|
21
|
+
|
|
22
|
+
**RPE (Rate of Perceived Exertion)**:
|
|
23
|
+
A 1–10 self-rating of how hard a set felt, where 10 is failure and 8 means two reps left in the tank.
|
|
24
|
+
_Avoid_: Effort score, intensity rating
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Rules
|
|
28
|
+
|
|
29
|
+
- **Add a term only when the user understands it.** The glossary is a record of compressed knowledge, not a dictionary the user reads to learn. If the user has just been introduced to a concept, wait until they can use it correctly before promoting it here.
|
|
30
|
+
- **Be opinionated.** When several words exist for the same concept, pick the best one and list the rest as aliases to avoid. This is how language compresses.
|
|
31
|
+
- **Keep definitions tight.** One or two sentences. Define what the term IS, not what it does or how to do it.
|
|
32
|
+
- **Use the glossary's own terms inside definitions.** Once a term is in the glossary, prefer it everywhere — including inside other definitions. This is what makes complex terms easier to grasp later.
|
|
33
|
+
- **Group under subheadings** when natural clusters emerge (e.g. `## Anatomy`, `## Programming`). A flat list is fine when terms cohere.
|
|
34
|
+
- **Flag ambiguities explicitly.** If a term is used loosely in the wider field, note the resolution: "In this workspace, 'set' always means a working set — warm-ups are tracked separately."
|
|
35
|
+
- **Revise as understanding deepens.** A definition the user wrote in week one may be wrong by week six. Update in place; do not leave stale entries.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Learning Record Format
|
|
2
|
+
|
|
3
|
+
Learning records live in `./learning-records/` and use sequential numbering: `0001-slug.md`, `0002-slug.md`, etc. Create the directory lazily — only when the first record is written.
|
|
4
|
+
|
|
5
|
+
They are the teaching equivalent of ADRs: they capture non-obvious lessons, key insights, and stated prior knowledge that will steer future sessions. They are used to calculate the zone of proximal development.
|
|
6
|
+
|
|
7
|
+
## Template
|
|
8
|
+
|
|
9
|
+
```md
|
|
10
|
+
# {Short title of what was learned or established}
|
|
11
|
+
|
|
12
|
+
{1-3 sentences: what was learned (or what prior knowledge was established), and why it matters for future sessions.}
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
That is the whole format. A learning record can be a single paragraph. The value is recording _that_ this is now known and _why_ it changes what to teach next — not in filling out sections.
|
|
16
|
+
|
|
17
|
+
## Optional sections
|
|
18
|
+
|
|
19
|
+
Only include these when they add genuine value. Most records won't need them.
|
|
20
|
+
|
|
21
|
+
- **Status** frontmatter (`active | superseded by LR-NNNN`) — useful when an earlier understanding turns out to be wrong and is replaced.
|
|
22
|
+
- **Evidence** — how the user demonstrated the understanding (a question answered, an exercise completed, prior experience cited). Useful when the claim might be revisited.
|
|
23
|
+
- **Implications** — what this unlocks or rules out for future sessions. Worth recording when non-obvious.
|
|
24
|
+
|
|
25
|
+
## Numbering
|
|
26
|
+
|
|
27
|
+
Scan `./learning-records/` for the highest existing number and increment by one.
|
|
28
|
+
|
|
29
|
+
## When to write a learning record
|
|
30
|
+
|
|
31
|
+
Write one when any of these is true:
|
|
32
|
+
|
|
33
|
+
1. **The user demonstrated genuine understanding of something non-trivial** — not just exposure, but evidence they can use the concept correctly. This sets a new floor for what to teach next.
|
|
34
|
+
2. **The user disclosed prior knowledge** — "I already know X." Record it so future sessions don't re-teach it. Also record the _depth_ claimed.
|
|
35
|
+
3. **A misconception was corrected** — the user previously believed something wrong and now sees why. These are high-value: they predict future stumbling blocks for related topics.
|
|
36
|
+
4. **The mission shifted in response to learning** — the user discovered they cared about something different than they thought. Cross-link to [[MISSION.md]] and update it.
|
|
37
|
+
|
|
38
|
+
### What does _not_ qualify
|
|
39
|
+
|
|
40
|
+
- Material that was merely covered. Coverage is not learning. Wait for evidence.
|
|
41
|
+
- Anything already captured tersely in [[GLOSSARY.md]] as a term definition. Don't duplicate.
|
|
42
|
+
- Session-by-session activity logs. Learning records are not a journal — they are decision-grade insights.
|
|
43
|
+
|
|
44
|
+
## Supersession
|
|
45
|
+
|
|
46
|
+
When a later record contradicts an earlier one (the user's understanding deepened or corrected), mark the old record `Status: superseded by LR-NNNN` rather than deleting it. The history of how understanding evolved is itself useful signal.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# MISSION.md Format
|
|
2
|
+
|
|
3
|
+
`MISSION.md` lives at the workspace root. It captures the _reason_ the user is learning this topic. Every teaching decision — what to teach next, which resources to surface, which exercises to design — should trace back to this document.
|
|
4
|
+
|
|
5
|
+
## Template
|
|
6
|
+
|
|
7
|
+
```md
|
|
8
|
+
# Mission: {Topic}
|
|
9
|
+
|
|
10
|
+
## Why
|
|
11
|
+
{1-3 sentences. The concrete real-world goal the user is chasing. What changes in their life or work when they have this skill? Avoid abstract framings like "to understand X" — push for the underlying outcome.}
|
|
12
|
+
|
|
13
|
+
## Success looks like
|
|
14
|
+
- {A specific, observable thing the user will be able to do}
|
|
15
|
+
- {Another specific thing}
|
|
16
|
+
- {…}
|
|
17
|
+
|
|
18
|
+
## Constraints
|
|
19
|
+
- {Time, budget, prior commitments, learning preferences, anything that bounds the approach}
|
|
20
|
+
|
|
21
|
+
## Out of scope
|
|
22
|
+
- {Adjacent topics the user explicitly does not want to chase right now — protects the zone of proximal development}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Rules
|
|
26
|
+
|
|
27
|
+
- **One mission per workspace.** If the user wants to learn two unrelated things, that is two workspaces.
|
|
28
|
+
- **Concrete over abstract.** "Run a half marathon by October" beats "get fitter." "Ship a Rust CLI to my team" beats "learn Rust."
|
|
29
|
+
- **Push back on vagueness.** If the user cannot articulate why, interview them before writing anything. A bad mission is worse than no mission.
|
|
30
|
+
- **Revise when reality shifts.** Missions change. When the user's goal moves, update this file — don't leave a stale mission steering future sessions.
|
|
31
|
+
- **Keep it short.** If `MISSION.md` runs past a screen, it has stopped being a compass and started being a plan.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# RESOURCES.md Format
|
|
2
|
+
|
|
3
|
+
`RESOURCES.md` is the curated set of trusted sources for this topic. Knowledge for explainers should be drawn from here, not from parametric guesses. Wisdom comes from the communities listed here.
|
|
4
|
+
|
|
5
|
+
## Structure
|
|
6
|
+
|
|
7
|
+
```md
|
|
8
|
+
# {Topic} Resources
|
|
9
|
+
|
|
10
|
+
## Knowledge
|
|
11
|
+
|
|
12
|
+
- [Book: _The Science and Practice of Strength Training_ — Zatsiorsky & Kraemer](https://example.com)
|
|
13
|
+
Foundational text on programming and adaptation. Use for: anything to do with periodisation, recovery, intensity zones.
|
|
14
|
+
- [Article: "How Much Should I Train?" — Greg Nuckols (Stronger By Science)](https://example.com)
|
|
15
|
+
Evidence-based review of volume landmarks. Use for: weekly set targets per muscle group.
|
|
16
|
+
|
|
17
|
+
## Wisdom (Communities)
|
|
18
|
+
|
|
19
|
+
- [r/weightroom](https://reddit.com/r/weightroom)
|
|
20
|
+
High-signal subreddit, moderated against bro-science. Use for: programme critique, plateau troubleshooting.
|
|
21
|
+
- Local: Tuesday strength class at {gym name}
|
|
22
|
+
Use for: real-time coaching feedback on lifts.
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Rules
|
|
26
|
+
|
|
27
|
+
- **High-trust only.** Prefer primary sources, recognised experts, peer-reviewed work, and communities with strong moderation. If a resource is marketing dressed as education, leave it out.
|
|
28
|
+
- **Annotate every entry.** A bare link is useless in three months. Add one line: what it covers and when to reach for it.
|
|
29
|
+
- **Group by Knowledge / Wisdom.** Mirrors the philosophy in [SKILL.md](./SKILL.md). It is fine for a resource to appear in only one group.
|
|
30
|
+
- **Surface gaps explicitly.** If no good resource exists for an area the mission needs, write a `## Gaps` section listing what is missing. This drives future search.
|
|
31
|
+
- **Prune ruthlessly.** A resource that turned out to be wrong, shallow, or off-mission should be removed, not buried. Better five sharp sources than thirty mediocre ones.
|
|
32
|
+
- **Record community preferences.** If the user has opted out of joining communities, note it here so future sessions don't keep proposing them.
|