ruff-sync 0.1.5.dev2__tar.gz → 0.1.5.dev4__tar.gz

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.
Files changed (181) hide show
  1. ruff_sync-0.1.5.dev4/.agents/decisions/0001-type-refactoring-strategy.md +36 -0
  2. ruff_sync-0.1.5.dev4/.agents/decisions/0002-tui-node-ast.md +36 -0
  3. ruff_sync-0.1.5.dev4/.agents/decisions/README.md +11 -0
  4. ruff_sync-0.1.5.dev4/.agents/ruff.toml +37 -0
  5. ruff_sync-0.1.5.dev4/.agents/skills/adr/SKILL.md +66 -0
  6. ruff_sync-0.1.5.dev4/.agents/skills/mike/SKILL.md +150 -0
  7. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/.agents/skills/mkdocs-generation/templates/api-reference.md +1 -1
  8. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/.agents/skills/mkdocs-generation/templates/mkdocs.yml +1 -1
  9. ruff_sync-0.1.5.dev4/.agents/skills/skill-creator/SKILL.md +82 -0
  10. ruff_sync-0.1.5.dev4/.agents/skills/skill-creator/references/best-practices.md +56 -0
  11. ruff_sync-0.1.5.dev4/.agents/skills/skill-creator/references/evaluating-skills.md +49 -0
  12. ruff_sync-0.1.5.dev4/.agents/skills/skill-creator/references/optimizing-descriptions.md +29 -0
  13. ruff_sync-0.1.5.dev4/.agents/skills/skill-creator/references/quickstart.md +64 -0
  14. ruff_sync-0.1.5.dev4/.agents/skills/skill-creator/references/sources.md +18 -0
  15. ruff_sync-0.1.5.dev4/.agents/skills/skill-creator/references/using-scripts.md +59 -0
  16. ruff_sync-0.1.5.dev4/.agents/skills/skill-creator/scripts/scaffold_skill.py +185 -0
  17. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/.agents/skills/textual/SKILL.md +1 -0
  18. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/.agents/skills/textual/examples/basic_app.py +5 -2
  19. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/.agents/skills/textual/examples/reactive_example.py +4 -1
  20. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/.agents/skills/textual/references/widgets.md +44 -0
  21. ruff_sync-0.1.5.dev4/.agents/skills/type-checking/SKILL.md +77 -0
  22. ruff_sync-0.1.5.dev4/.agents/skills/type-checking/evals.json +52 -0
  23. ruff_sync-0.1.5.dev4/.agents/skills/type-checking/references/advanced-narrowing.md +53 -0
  24. ruff_sync-0.1.5.dev4/.agents/skills/type-checking/references/error-code-lookup.md +69 -0
  25. ruff_sync-0.1.5.dev4/.agents/skills/type-checking/references/generics.md +60 -0
  26. ruff_sync-0.1.5.dev4/.agents/skills/type-checking/references/naming.md +56 -0
  27. ruff_sync-0.1.5.dev4/.agents/skills/type-checking/references/protocol-patterns.md +56 -0
  28. ruff_sync-0.1.5.dev4/.agents/skills/type-checking/references/quickstart.md +12 -0
  29. ruff_sync-0.1.5.dev4/.agents/skills/type-checking/references/refactoring-patterns.md +72 -0
  30. ruff_sync-0.1.5.dev4/.agents/skills/type-checking/scripts/audit_types.py +104 -0
  31. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/.agents/tui_design.md +19 -10
  32. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/.agents/tui_requirements.md +8 -4
  33. ruff_sync-0.1.5.dev4/.agents/tui_rule_browsing.md +44 -0
  34. ruff_sync-0.1.5.dev4/.agents/tui_rule_browsing_design.md +66 -0
  35. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/.github/workflows/ci.yaml +24 -1
  36. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/AGENTS.md +13 -28
  37. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/PKG-INFO +1 -1
  38. ruff_sync-0.1.5.dev4/docs/overrides/partials/version_warning.html +27 -0
  39. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/mkdocs.yml +2 -3
  40. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/pyproject.toml +4 -2
  41. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/src/ruff_sync/__init__.py +2 -0
  42. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/src/ruff_sync/cli.py +25 -9
  43. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/src/ruff_sync/core.py +45 -36
  44. ruff_sync-0.1.5.dev4/src/ruff_sync/dependencies.py +64 -0
  45. ruff_sync-0.1.5.dev4/src/ruff_sync/system.py +178 -0
  46. ruff_sync-0.1.5.dev4/src/ruff_sync/tui/__init__.py +26 -0
  47. ruff_sync-0.1.5.dev4/src/ruff_sync/tui/app.py +263 -0
  48. ruff_sync-0.1.5.dev4/src/ruff_sync/tui/constants.py +9 -0
  49. ruff_sync-0.1.5.dev4/src/ruff_sync/tui/screens.py +187 -0
  50. ruff_sync-0.1.5.dev4/src/ruff_sync/tui/themes.py +22 -0
  51. ruff_sync-0.1.5.dev4/src/ruff_sync/tui/types_.py +263 -0
  52. ruff_sync-0.1.5.dev4/src/ruff_sync/tui/widgets.py +270 -0
  53. ruff_sync-0.1.5.dev4/src/ruff_sync/types_.py +31 -0
  54. ruff_sync-0.1.5.dev4/tests/conftest.py +123 -0
  55. ruff_sync-0.1.5.dev4/tests/test_dependencies.py +59 -0
  56. ruff_sync-0.1.5.dev4/tests/test_minimal_imports.sh +54 -0
  57. ruff_sync-0.1.5.dev4/tests/test_rule_logic.py +102 -0
  58. ruff_sync-0.1.5.dev4/tests/tui/__init__.py +3 -0
  59. ruff_sync-0.1.5.dev4/tests/tui/conftest.py +22 -0
  60. ruff_sync-0.1.5.dev4/tests/tui/test_themes.py +36 -0
  61. ruff_sync-0.1.5.dev4/tests/tui/test_tui.py +380 -0
  62. ruff_sync-0.1.5.dev4/tests/tui/test_tui_types.py +87 -0
  63. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/uv.lock +3 -1
  64. ruff_sync-0.1.5.dev2/.agents/skills/mike/SKILL.md +0 -106
  65. ruff_sync-0.1.5.dev2/docs/overrides/partials/version_warning.html +0 -18
  66. ruff_sync-0.1.5.dev2/src/ruff_sync/dependencies.py +0 -38
  67. ruff_sync-0.1.5.dev2/src/ruff_sync/system.py +0 -45
  68. ruff_sync-0.1.5.dev2/tests/conftest.py +0 -64
  69. ruff_sync-0.1.5.dev2/tests/test_dependencies.py +0 -35
  70. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/.agents/DEPENDENCIES.md +0 -0
  71. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/.agents/TESTING.md +0 -0
  72. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/.agents/formatters-architecture.md +0 -0
  73. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/.agents/gitlab-reports.md +0 -0
  74. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/.agents/issue-102-context.md +0 -0
  75. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/.agents/skills/dirty-equals/SKILL.md +0 -0
  76. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/.agents/skills/dirty-equals/references/common-matchers.md +0 -0
  77. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/.agents/skills/dirty-equals/references/toml-matching.md +0 -0
  78. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/.agents/skills/dirty-equals/trigger_eval.json +0 -0
  79. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/.agents/skills/gh-issues/SKILL.md +0 -0
  80. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/.agents/skills/mike/references/commands.md +0 -0
  81. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/.agents/skills/mkdocs-generation/SKILL.md +0 -0
  82. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/.agents/skills/mkdocs-generation/examples.md +0 -0
  83. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/.agents/skills/mkdocs-generation/templates/getting-started.md +0 -0
  84. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/.agents/skills/mkdocs-generation/templates/index.md +0 -0
  85. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/.agents/skills/release-notes-generation/SKILL.md +0 -0
  86. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/.agents/skills/ruff-sync-usage/SKILL.md +0 -0
  87. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/.agents/skills/ruff-sync-usage/references/ci-integration.md +0 -0
  88. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/.agents/skills/ruff-sync-usage/references/configuration.md +0 -0
  89. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/.agents/skills/ruff-sync-usage/references/troubleshooting.md +0 -0
  90. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/.agents/skills/textual/references/events.md +0 -0
  91. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/.agents/skills/textual/references/styling.md +0 -0
  92. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/.agents/skills/textual/references/testing.md +0 -0
  93. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/.agents/workflows/add-test-case.md +0 -0
  94. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/.git-blame-ignore-revs +0 -0
  95. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/.github/dependabot.yml +0 -0
  96. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/.github/workflows/complexity.yaml +0 -0
  97. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/.github/workflows/docs.yaml +0 -0
  98. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/.gitignore +0 -0
  99. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/.pre-commit-config.yaml +0 -0
  100. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/.pre-commit-hooks.yaml +0 -0
  101. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/CONTRIBUTING.md +0 -0
  102. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/LICENSE.md +0 -0
  103. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/README.md +0 -0
  104. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/codecov.yml +0 -0
  105. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/configs/data-science-engineering/ruff.toml +0 -0
  106. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/configs/fastapi/ruff.toml +0 -0
  107. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/configs/kitchen-sink/ruff.toml +0 -0
  108. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/docs/agent-skill.md +0 -0
  109. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/docs/assets/favicon.png +0 -0
  110. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/docs/assets/github-pr-annotation.png +0 -0
  111. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/docs/assets/logo.png +0 -0
  112. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/docs/assets/ruff_sync_banner.png +0 -0
  113. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/docs/best-practices.md +0 -0
  114. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/docs/ci-integration.md +0 -0
  115. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/docs/configuration.md +0 -0
  116. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/docs/contributing.md +0 -0
  117. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/docs/examples/advanced-config.toml +0 -0
  118. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/docs/examples/basic-config.toml +0 -0
  119. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/docs/gen_ref_pages.py +0 -0
  120. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/docs/index.md +0 -0
  121. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/docs/installation.md +0 -0
  122. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/docs/overrides/main.html +0 -0
  123. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/docs/pre-commit.md +0 -0
  124. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/docs/pre-defined-configs.md +0 -0
  125. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/docs/troubleshooting.md +0 -0
  126. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/docs/url-resolution.md +0 -0
  127. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/docs/usage.md +0 -0
  128. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/scripts/check_dogfood.sh +0 -0
  129. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/scripts/gitclone_dogfood.sh +0 -0
  130. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/scripts/pull_dogfood.sh +0 -0
  131. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/skills-lock.json +0 -0
  132. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/src/ruff_sync/__main__.py +0 -0
  133. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/src/ruff_sync/config_io.py +0 -0
  134. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/src/ruff_sync/constants.py +0 -0
  135. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/src/ruff_sync/formatters.py +0 -0
  136. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/src/ruff_sync/pre_commit.py +0 -0
  137. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tasks.py +0 -0
  138. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/__init__.py +0 -0
  139. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/lifecycle_tomls/multi_upstream_final.toml +0 -0
  140. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/lifecycle_tomls/multi_upstream_initial.toml +0 -0
  141. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/lifecycle_tomls/multi_upstream_up1.toml +0 -0
  142. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/lifecycle_tomls/multi_upstream_up2.toml +0 -0
  143. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/lifecycle_tomls/no_changes_final.toml +0 -0
  144. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/lifecycle_tomls/no_changes_initial.toml +0 -0
  145. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/lifecycle_tomls/no_changes_upstream.toml +0 -0
  146. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/lifecycle_tomls/no_dotted_keys_final.toml +0 -0
  147. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/lifecycle_tomls/no_dotted_keys_initial.toml +0 -0
  148. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/lifecycle_tomls/no_dotted_keys_upstream.toml +0 -0
  149. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/lifecycle_tomls/no_ruff_cfg_final.toml +0 -0
  150. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/lifecycle_tomls/no_ruff_cfg_initial.toml +0 -0
  151. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/lifecycle_tomls/no_ruff_cfg_upstream.toml +0 -0
  152. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/lifecycle_tomls/readme_excludes_final.toml +0 -0
  153. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/lifecycle_tomls/readme_excludes_initial.toml +0 -0
  154. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/lifecycle_tomls/readme_excludes_upstream.toml +0 -0
  155. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/lifecycle_tomls/standard_final.toml +0 -0
  156. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/lifecycle_tomls/standard_initial.toml +0 -0
  157. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/lifecycle_tomls/standard_upstream.toml +0 -0
  158. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/ruff.toml +0 -0
  159. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/test_basic.py +0 -0
  160. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/test_check.py +0 -0
  161. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/test_ci_integration.py +0 -0
  162. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/test_ci_validation.py +0 -0
  163. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/test_config_io.py +0 -0
  164. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/test_config_validation.py +0 -0
  165. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/test_constants.py +0 -0
  166. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/test_corner_cases.py +0 -0
  167. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/test_deprecation.py +0 -0
  168. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/test_e2e.py +0 -0
  169. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/test_formatters.py +0 -0
  170. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/test_git_fetch.py +0 -0
  171. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/test_pre_commit.py +0 -0
  172. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/test_project.py +0 -0
  173. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/test_scaffold.py +0 -0
  174. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/test_serialization.py +0 -0
  175. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/test_system.py +0 -0
  176. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/test_toml_operations.py +0 -0
  177. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/test_url_handling.py +0 -0
  178. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/test_whitespace.py +0 -0
  179. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/w_ruff_sync_cfg/pyproject.toml +0 -0
  180. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/wo_ruff_cfg/pyproject.toml +0 -0
  181. {ruff_sync-0.1.5.dev2 → ruff_sync-0.1.5.dev4}/tests/wo_ruff_sync_cfg/pyproject.toml +0 -0
@@ -0,0 +1,36 @@
1
+ # ADR 0001: Type Refactoring Strategy
2
+
3
+ ---
4
+ status: accepted
5
+ date: 2026-04-05
6
+ decider: Agent
7
+ ---
8
+
9
+ ## Context
10
+
11
+ The `ruff-sync` codebase, particularly the TUI and TOML merging logic, has historically relied on `dict[str, Any]` and deep `isinstance` checks. This makes the codebase difficult to maintain, prone to runtime errors, and provides poor IDE support.
12
+
13
+ Based on the establishing `type-checking` skill, we need a strategic approach to "Complexity Shifting" and "Healthy Abstraction".
14
+
15
+ ## Decision
16
+
17
+ We will implement a multi-phase type-refactoring strategy:
18
+
19
+ 1. **Eliminate unstructured `dict[str, Any]`**: Introduce `TypedDict` for core payloads (Ruff rules, linters) in the TUI and System modules.
20
+ 2. **Polymorphic TUI Widgets**: Replace recursive `isinstance(data, dict/list)` chains in widgets with structural polymorphism (e.g., `@singledispatchmethod` or a dedicated Node AST).
21
+ 3. **Strategic Complexity (High-ROI typing)**: Apply strict typing (`tomlkit` bounds) to core infrastructure like `core.py` (TOML merging) while keeping feature code simple.
22
+ 4. **Result Type Patterns**: Shift away from `Union[Success, Error]` with `isinstance` checks towards robust `Result` or tuple patterns.
23
+
24
+ ## Consequences
25
+
26
+ - **Pros**:
27
+ - Improved static analysis via `mypy`.
28
+ - Better developer experience (autocompletion, go-to-definition).
29
+ - Reduced runtime "surprises" in complex TOML merges.
30
+ - **Cons**:
31
+ - Initial "complexity tax" in core infrastructure types.
32
+ - Requires wrapping raw TOML data into structured nodes before rendering.
33
+
34
+ ## References
35
+
36
+ - [type-checking skill](../skills/type-checking/SKILL.md)
@@ -0,0 +1,36 @@
1
+ # ADR 0002: TUI Node AST Architecture
2
+
3
+ ---
4
+ status: accepted
5
+ date: 2026-04-05
6
+ decider: Agent
7
+ ---
8
+
9
+ ## Context
10
+
11
+ The TUI's configuration rendering (`widgets.py`) and selection logic (`app.py`) rely heavily on nested `isinstance` checks to navigate raw `dict`/`list` structures. This breaks down as the TOML structure becomes more complex (dotted keys, custom tables, list-of-tables).
12
+
13
+ We need a way to shift "rendering complexity" into "data structure complexity" using the polymorphism principle from ADR 0001.
14
+
15
+ ## Decision
16
+
17
+ We will implement a polymorphic **ConfigNode AST** for the TUI:
18
+
19
+ 1. **`ConfigNode` Protocol**: A baseline interface (`path()`, `key()`, `children()`, `doc_target()`).
20
+ 2. **Concrete Nodes**: `DictNode`, `ListNode`, `ScalarNode`, `LinterNode`, and `RulesCollectionNode`.
21
+ 3. **Recursive Wrapping**: A `wrap_data()` factory that converts raw TOML data into a `ConfigNode` tree during initial load.
22
+ 4. **UI-Layer Polymorphism**: Use `@singledispatchmethod` in widgets (e.g., `CategoryTable.render_node(node)`) to route rendering logic based on the node type, keeping Rich markup out of the model layer.
23
+
24
+ ## Consequences
25
+
26
+ - **Pros**:
27
+ - Centralized documentation routing (`doc_target()`).
28
+ - Widgets no longer need to know "what" they are rendering, only "how" to render a `ConfigNode`.
29
+ - Eliminates fragile nested type-inference logic.
30
+ - **Cons**:
31
+ - Requires an additional "wrapping" step during data load.
32
+ - Slightly more boilerplate in `src/ruff_sync/tui/types_.py`.
33
+
34
+ ## References
35
+
36
+ - [ADR 0001: Type Refactoring Strategy](./0001-type-refactoring-strategy.md)
@@ -0,0 +1,11 @@
1
+ # ADR Index
2
+
3
+ This is an internal record of architectural decisions for `ruff-sync`. These documents capture the historical "Why" for design choices made by both human and agentic developers.
4
+
5
+ | ID | Date | Status | Title |
6
+ | --- | --- | --- | --- |
7
+ | [0001](./0001-type-refactoring-strategy.md) | 2026-04-05 | Accepted | Type Refactoring Strategy |
8
+ | [0002](./0002-tui-node-ast.md) | 2026-04-05 | Accepted | TUI Node AST Architecture |
9
+
10
+ ---
11
+ *For instructions on how to create or manage ADRs, see the [ADR Skill](../skills/adr/SKILL.md).*
@@ -0,0 +1,37 @@
1
+ # Agents-specific ruff linter overrides.
2
+ # This configuration applies to all files within the .agents/ directory.
3
+ #
4
+ # WHY AGENT SCRIPTS ARE TREATED DIFFERENTLY:
5
+ # ------------------------------------------
6
+ # 1. Faster iteration: Agent-related code (skills, scripts, and examples) is
7
+ # often experimental, short-lived, or used for automation.
8
+ # 2. Lower maintenance: We relax requirements like module-level docstrings
9
+ # to maintain speed and reduce boilerplate.
10
+ # 3. Local use: These scripts are usually run locally by the agent or developer
11
+ # rather than being part of the core production library.
12
+ # 4. Prototyping: Allowing assert statements (S101) makes it easier to write
13
+ # concise validation for specialized agent workflows.
14
+ # 5. Usage context for examples: We disable rules that move imports into
15
+ # if TYPE_CHECKING blocks because skill examples may be integrated into
16
+ # other applications in ways we cannot predict. Runtime access to
17
+ # imported objects is preserved to ensure compatibility with various
18
+ # application patterns (decorators, runtime reflection, etc).
19
+
20
+ # Inherit root linter settings from the project's pyproject.toml.
21
+ extend = "../pyproject.toml"
22
+
23
+ [lint]
24
+ # Specific overrides for agent python code, scripts, and skills.
25
+ extend-ignore = [
26
+ "D100", # missing-docstring-in-module - Agent scripts don't require module-level docstrings.
27
+ "D103", # missing-docstring-in-public-function - Agent functions don't require public docstrings.
28
+ "S101", # assert-statement - Asserts are preferred over other validation for internal agent scripts.
29
+
30
+ # Preserve runtime access for standalone examples and unknown integration:
31
+ # Disable rules that move imports into if TYPE_CHECKING: blocks.
32
+ "TC001", # Move third-party import into a type-checking block
33
+ "TC002", # Move third-party import into a type-checking block
34
+ "TC003", # Move second-party import into a type-checking block
35
+ "TC004", # Move first-party import into a type-checking block
36
+ "TC005", # Move standard library import into a type-checking block
37
+ ]
@@ -0,0 +1,66 @@
1
+ # ADR (Architectural Decision Record) Skill
2
+
3
+ ## Overview
4
+
5
+ Use this skill to capture, manage, and reference significant architectural decisions for `ruff-sync`. ADRs are stored internally in `.agents/decisions/` and provide a historical record of "Why" things are designed the way they are.
6
+
7
+ ## When to Create an ADR
8
+
9
+ Create an ADR when:
10
+ - A significant architectural change is proposed (e.g., new internal AST, changing the merging strategy).
11
+ - A long-running refactoring strategy is initiated (e.g., the Type-Checking Refactoring).
12
+ - A decision is made that will impact future development and needs to be "remembered" by future agent sessions.
13
+ - A "Implementation Plan" has been approved and reaches a level of architectural significance that warrants long-term persistence.
14
+
15
+ ## ADR Structure
16
+
17
+ Each ADR should be named `NNNN-slug.md` (e.g., `0001-type-refactoring-strategy.md`) and located in `.agents/decisions/`.
18
+
19
+ > [!IMPORTANT]
20
+ > **Use relative paths for ALL internal links.** Never use absolute paths (`file:///Users/...`) as they are machine-specific and break in different environments.
21
+
22
+ Use the following template:
23
+
24
+ ```markdown
25
+ # ADR [NNNN]: [Short Title]
26
+
27
+ ---
28
+ status: [proposed | accepted | superseded | deprecated]
29
+ date: YYYY-MM-DD
30
+ decider: [Agent | User]
31
+ ---
32
+
33
+ ## Context
34
+
35
+ What is the problem we are trying to solve? What are the constraints?
36
+
37
+ ## Decision
38
+
39
+ What are we doing? Be specific about the architectural shift.
40
+
41
+ ## Consequences
42
+
43
+ What are the trade-offs? What will be easier? What will be harder?
44
+
45
+ ## References
46
+
47
+ - Links to PRs or Issues (use `gh-issues` skill).
48
+ - Links to other ADRs (e.g., "Supersedes [NNNN]").
49
+ - Links to implementation plans or research.
50
+ ```
51
+
52
+ ## Workflows
53
+
54
+ ### 1. Creating a New ADR
55
+ 1. Identify the need for a persistent architectural record.
56
+ 2. Draft the ADR in `.agents/decisions/` using the next available number.
57
+ 3. Update `.agents/decisions/README.md` with the new entry.
58
+ 4. Reference the ADR in `AGENTS.md` if it represents a foundational shift.
59
+
60
+ ### 2. Superseding an ADR
61
+ 1. Create the new ADR (e.g., `0005`).
62
+ 2. Mark the old ADR (e.g., `0002`) as `status: superseded`.
63
+ 3. Add a link in the old ADR's `References` to the new one, and vice versa.
64
+
65
+ ### 3. Graduation
66
+ Implementation plans in `.agents/` are often temporary. When a plan is completed, if its decisions are architecturally significant, "graduate" it by distilling its core decisions into an ADR.
@@ -0,0 +1,150 @@
1
+ ---
2
+ name: mike
3
+ description: Use this skill to manage multiple versions of documentation for MkDocs-powered sites. Deploy new versions, update aliases (like 'latest' or 'stable'), set the default version for the site root, and manage versioned subdirectories in the deployment branch. Use this whenever the user wants to publish, version, or alias documentation, even if they don't explicitly mention "mike". Also use this when the user wants to troubleshoot or debug versioned documentation.
4
+ ---
5
+
6
+ # mike: MkDocs Versioning
7
+
8
+ `mike` is used in this project to manage a versioned documentation site, allowing side-by-side availability of `dev` (main branch) and stable release docs (e.g., `0.1.4`).
9
+
10
+ ## Prerequisites
11
+
12
+ `mike` is included in the `docs` dependency group.
13
+ ```bash
14
+ # Sync documentation dependencies
15
+ uv sync --group docs
16
+ ```
17
+
18
+ ## Project Strategy
19
+
20
+ This project follows a specific versioning strategy:
21
+ 1. **`dev`**: Represents the current `main` branch.
22
+ 2. **Stable Releases**: Versioned documentation (e.g., `0.1.4`) created upon release.
23
+ 3. **`stable`**: An alias always pointing to the most recent non-dev release.
24
+ 4. **`latest`**: An alias pointing to the most recent release (including dev, if applicable).
25
+
26
+ ## Theme Overrides
27
+
28
+ To support the version switcher and custom banners, the project uses a `custom_dir` override in `mkdocs.yml`:
29
+
30
+ ```yaml
31
+ theme:
32
+ name: material
33
+ custom_dir: docs/overrides
34
+ ```
35
+
36
+ ### Version switcher
37
+
38
+ The version switcher is enabled via `extra.version.provider: mike`:
39
+
40
+ ```yaml
41
+ extra:
42
+ version:
43
+ provider: mike
44
+ ```
45
+
46
+ ## Versioning Banner
47
+
48
+ A custom banner is displayed when users are viewing the `dev` documentation. This is handled via `docs/overrides/main.html` and `docs/overrides/partials/version_warning.html`.
49
+
50
+ ### How it works:
51
+ - `main.html`: Extends the base template and includes the `version_warning.html` partial at the start of the `content` block.
52
+ - `version_warning.html`: Contains an HTML snippet that is hidden by default and shown via JavaScript if the URL path contains `/dev/`.
53
+
54
+ Example in `version_warning.html`:
55
+ ```html
56
+ <div id="version-warning" style="display: none;">
57
+ <div class="admonition warning">
58
+ <p class="admonition-title">Warning</p>
59
+ <p>
60
+ You are viewing the documentation for the <strong>development</strong> version.
61
+ The latest stable release can be found at <a href="https://kilo59.github.io/ruff-sync/">kilo59.github.io/ruff-sync</a>.
62
+ </p>
63
+ </div>
64
+ </div>
65
+ <script>
66
+ (function() {
67
+ const version_warning = document.getElementById("version-warning");
68
+ if (!version_warning) return;
69
+
70
+ // mike provides a 'mike' object with some metadata if available
71
+ // Otherwise fall back to checking the pathname
72
+ const isDev = window.location.pathname.includes("/dev/") ||
73
+ (window.mike && typeof window.mike.version === 'string' && window.mike.version === "dev");
74
+
75
+ if (isDev) {
76
+ version_warning.style.display = "block";
77
+ }
78
+ })();
79
+ </script>
80
+ ```
81
+
82
+ ### 1. Deploying Development Docs
83
+ Run this from the `main` branch to update the `dev` version:
84
+ ```bash
85
+ mike deploy dev --push --update-aliases
86
+ ```
87
+
88
+ ### 2. Deploying a Stable Release
89
+ When a new version is released (e.g., `0.1.4`), deploy it and update the `stable` alias:
90
+ ```bash
91
+ # Deploy the specific version and update 'stable'
92
+ mike deploy 0.1.4 stable --push --update-aliases
93
+
94
+ # Set 'stable' as the default version for the site root
95
+ mike set-default --push stable
96
+ ```
97
+
98
+ ## Reference Commands
99
+
100
+ | Action | Command |
101
+ | :--- | :--- |
102
+ | **Deploy** | `mike deploy <version> [alias]` |
103
+ | **List** | `mike list` |
104
+ | **Set Default** | `mike set-default <version>` |
105
+ | **Alias** | `mike alias <version> <alias>` |
106
+ | **Delete** | `mike delete <identifier>` |
107
+
108
+ ## CI/CD Integration
109
+
110
+ The deployment logic is automated in [.github/workflows/ci.yaml](.github/workflows/ci.yaml). It automatically:
111
+ - Extracts the version from `pyproject.toml`.
112
+ - Deploys to `dev` if the version contains `.dev`.
113
+ - Deploys to `<version>` and updates `stable` for official releases.
114
+
115
+ > [!IMPORTANT]
116
+ > **Do NOT** use `mike install-gh-pages`. It is deprecated and removed in the version used by this project. `mike deploy` handles branch initialization automatically.
117
+
118
+ > [!TIP]
119
+ > Use `mike serve` locally to preview the version switcher before pushing changes.
120
+
121
+ ## Troubleshooting
122
+
123
+ ### Version Selector Not Appearing
124
+ - **Missing `versions.json`**: Ensure `mike deploy` or `mike update-aliases` has been run. The file must exist at the site root.
125
+ - **Incomplete `versions.json`**: If the current page's version (e.g., `stable`) is not listed in `versions.json`, some themes (like Material) may hide the selector.
126
+ - **`site_url` Case Sensitivity**: On GitHub Pages, ensure `site_url` in `mkdocs.yml` matches the actual deployment URL (usually lowercase). Discrepancies can cause the switcher to fail to find `versions.json` due to 404s.
127
+ - **Redundant Config**: Ensure `theme.version` is NOT set in `mkdocs.yml`. Use `extra.version.provider: mike` instead.
128
+ - **`canonical_version` Missing**: If the switcher is hidden on the root page, adding `canonical_version: stable` (or your main alias) to the `mike` plugin configuration can help the theme associate the root with the switcher metadata.
129
+
130
+ ### 404 for `versions.json`
131
+ - If you see a 404 for `/versions.json` but `https://<user>.github.io/<repo>/versions.json` exists, the switcher is looking at the domain root instead of the project root. Verify `site_url` includes the repository name and has a trailing slash.
132
+
133
+ ## Post-Mortem & Known Issues
134
+
135
+ > [!CAUTION]
136
+ > **Current Status**: Documentation versioning is currently **BROKEN** on the live site (`kilo59.github.io/ruff-sync`).
137
+
138
+ ### Failed Repair History
139
+ The following fixes have been attempted and **FAILED** to resolve the issue:
140
+ 1. **Lowercasing `site_url`**: Normalizing the repository name in the URL (e.g., `ruff-sync` instead of `Ruff-Sync`) did not fix the 404s for `versions.json`.
141
+ 2. **Removing `theme.version`**: Removing the redundant Material 9.x config did not restore the switcher.
142
+ 3. **Adding `canonical_version: stable`**: Adding this to the `mike` plugin in `mkdocs.yml` was intended to fix path resolution but has not fixed the root page 404.
143
+ 4. **CI Restoration Logic**: Adding `mike alias --push stable stable` to the CI to manually repair `versions.json` hasn't restored the picker on the root page.
144
+
145
+ ### Root Cause Suspicions
146
+ - **GitHub Pages Subfolder Pathing**: The site is served from a subfolder (`/ruff-sync/`). `mike`'s JavaScript for the version switcher frequently struggles with calculating relative paths to `versions.json` when served from a subfolder if `site_url` or base paths are not perfectly aligned with the deployment environment.
147
+ - **`versions.json` Drift**: The `versions.json` file on the `gh-pages` branch frequently becomes desynchronized or loses the `stable` entry, which triggers `mkdocs-material` to hide the switcher entirely.
148
+
149
+ ### Guidance for Future Agents
150
+ Before attempting another "fix," you **MUST** verify the current state of `versions.json` on the `gh-pages` branch and check the browser console on the live site for 404 paths. Do not assume standard configurations will work without manual verification of the deployed assets.
@@ -26,7 +26,7 @@ For nested API structure, create subdirectories:
26
26
  docs/api/
27
27
  ├── index.md - API overview
28
28
  ├── client.md - ::: package.client.Client
29
- ├── models.md - ::: package.models
29
+ ├── types_.md - ::: package.types_
30
30
  └── entities/
31
31
  ├── user.md - ::: package.entities.User
32
32
  └── item.md - ::: package.entities.Item
@@ -59,4 +59,4 @@ nav:
59
59
  # - Overview: api/index.md
60
60
  # - Core:
61
61
  # - Client: api/client.md
62
- # - Models: api/models.md
62
+ # - Types: api/types_.md
@@ -0,0 +1,82 @@
1
+ ---
2
+ name: skill-creator
3
+ description: >-
4
+ Create or update Agent Skills to extend capabilities for specific tasks,
5
+ frameworks, or domain-specific workflows. Use this when the user asks to
6
+ "add a skill," "create a tool for X," or "teach the agent how to Y."
7
+ ---
8
+
9
+ # Skill Creator Meta-Skill
10
+
11
+ This skill provides a systematic approach to creating and optimizing "Agent Skills" within the `.agents/skills/` directory.
12
+
13
+ ## Available Scripts
14
+
15
+ - **`scripts/scaffold_skill.py`**: Automated scaffolding for new Agent Skill directories and `SKILL.md` templates.
16
+
17
+ ## Workflow
18
+
19
+ 1. **Scaffold the Skill**:
20
+ - Run the scaffolding script to create the directory structure:
21
+ ```bash
22
+ uv run .agents/skills/skill-creator/scripts/scaffold_skill.py <name> \\
23
+ --description "user intent" \\
24
+ --keywords "key, word"
25
+ ```
26
+ - This creates `.agents/skills/<name>/SKILL.md` and standard subdirectories.
27
+
28
+ 2. **Research & Plan**:
29
+ - Check existing skills in `.agents/skills/` to prevent duplication. Identify if an existing skill can just be extended instead of creating a new one.
30
+ - **Research Tool Usage**: Prioritize `search_web` and `read_url_content` for gathering information. Use the browser subagent (`read_browser_page`) only as a last resort for sites requiring JavaScript or authentication.
31
+ - Determine the scope of the skill (e.g., CLI wrapper, documentation guide, testing helper).
32
+ - Identify existing project artifacts (style guides, API specs, CI workflows) to pull information from.
33
+ - Design a test case or a set of "should-trigger" queries.
34
+ - See [references/quickstart.md](references/quickstart.md) for the basic structure.
35
+
36
+ 3. **Define Frontmatter**:
37
+ - `name`: Must match the folder name in `.agents/skills/`.
38
+ - `description`: Write an imperative, user-intent-focused description.
39
+ - See [references/optimizing-descriptions.md](references/optimizing-descriptions.md) for optimization tips.
40
+
41
+ 4. **Develop the Procedure & Scripts**:
42
+ - Favor procedural instructions ("To do X, run Y") over declarative ones.
43
+ - Bundle complex logic in `scripts/` using [references/using-scripts.md](references/using-scripts.md). Ensure any helper scripts are robust (add type hints, lint with `ruff`, and consider unit tests).
44
+ - Include a "Quick Start" section for the most common use case.
45
+ - Use checklists for multi-step workflows.
46
+
47
+ 5. **Progressive Disclosure (PD)**:
48
+ - **Procedural Entry Point**: Keep the main `SKILL.md` strictly procedural (The "How-To") and under 110 lines.
49
+ - **Offload Details**: Move illustrative recipes, deep-dive code examples, technical deep-dives, and troubleshooting logs to a `references/` subdirectory.
50
+ - See [references/best-practices.md](references/best-practices.md) for structuring tips.
51
+
52
+ 6. **Validation & Iteration**:
53
+ - Run the prompt *with* and *without* the skill instructions.
54
+ - Use [references/evaluating-skills.md](references/evaluating-skills.md) to grade outputs with assertions.
55
+ - Add a "Gotchas" section to address common pitfalls.
56
+ - Iterate on instructions based on failed assertions or high variance.
57
+
58
+ 7. **Global Knowledge Sync**:
59
+ - If the new skill introduces fundamental rules or overarching context that all agents *must* inherently know *before* using the skill, add a very brief mention in `AGENTS.md`.
60
+ - **Caution**: Do not bloat `AGENTS.md`. Only link to the skill or summarize the rule in 1-2 sentences. Keep the detailed documentation inside the skill folder.
61
+
62
+ ## Skill Quality Checklist
63
+
64
+ - [ ] **Frontmatter**: Does the name match the directory name?
65
+ - [ ] **Description**: Is it imperative ("Use this skill when...") and under 1024 characters?
66
+ - [ ] **Procedural**: Does it provide clear, actionable steps for the agent to follow?
67
+ - [ ] **Context**: Does it include project-specific context (e.g., using `uv run`, `gh`, `ruff`)?
68
+ - [ ] **Specificity**: Does the level of detail match the fragility of the task?
69
+ - [ ] **Overlap**: Is the domain distinct enough that it doesn't overlap excessively with existing skills?
70
+ - [ ] **Global Sync**: Have overarching project rules been bubbled up to `AGENTS.md` (while avoiding bloat)?
71
+ - [ ] **PD Audit**: Is the main file under 110 lines and free of dense examples/logic trees?
72
+ - [ ] **Quick Start**: Does the main file have a "Quick Start" section for the primary use case?
73
+ - [ ] **Research Efficiency**: Did you prioritize fast tools (`search_web`/`read_url_content`) over the slow browser subagent for research?
74
+
75
+ ## References
76
+
77
+ - [Quickstart](references/quickstart.md) — Basic SKILL.md structure
78
+ - [Best Practices](references/best-practices.md) — How to scope and calibrate skills
79
+ - [Optimizing Descriptions](references/optimizing-descriptions.md) — Reliable triggering strategies
80
+ - [Evaluating Skills](references/evaluating-skills.md) — Eval-driven iteration and assertions
81
+ - [Using Scripts](references/using-scripts.md) — Bundling logic and agentic script design
82
+ - [Research Sources](references/sources.md) — External documentation used to create this skill
@@ -0,0 +1,56 @@
1
+ # Best Practices for Skill Creation
2
+
3
+ How to write skills that are well-scoped and calibrated to the task.
4
+
5
+ ## 1. Spending Context Wisely
6
+
7
+ **Add what the agent lacks, omit what it knows.**
8
+ - **Bad**: "PDF (Portable Document Format) is a common file format..." (The agent knows this).
9
+ - **Good**: "Use `pdfplumber` for text extraction. For scans, fall back to `pytesseract`." (This is project-specific guidance).
10
+
11
+ ## 2. Match Specificity to Fragility
12
+
13
+ **Low fragility (General task)**:
14
+ - Provide high-level goals and examples.
15
+ - Allow the agent to decide the best path (e.g., "Check database queries for SQLi...").
16
+
17
+ **High fragility (Specific/Dangerous task)**:
18
+ - Provide exact command sequences.
19
+ - Add warnings: "Do not modify flags or skip steps."
20
+ - Example: "Run exactly `python migrate.py --verify --backup`."
21
+
22
+ ## 3. Favor Procedures over Declarations
23
+
24
+ - **Bad**: "This skill manages database migrations."
25
+ - **Good**: "To perform a migration: 1. Run script A. 2. Verify output B. 3. Update file C."
26
+ - Use checklists for multi-step workflows to help the agent track progress.
27
+
28
+ ## 4. Progressive Disclosure
29
+
30
+ **Spending context wisely: Main file = Procedural. References = Illustrative.**
31
+ - **Limit**: Keep the main `SKILL.md` under **110 lines**.
32
+ - **The Entry Point**: Focus strictly on the "How-To" (workflows, checklists, high-level procedures).
33
+ - **The References**: Move anything that is "Illustrative" or "Dense" to the `references/` directory. This includes:
34
+ - Complex decision trees or logic tables.
35
+ - Multi-line code examples/recipes.
36
+ - Full API references or error-code lookups.
37
+ - Troubleshooting logs or edge-case post-mortems.
38
+ - This ensures the agent is only "weighed down" by relevant context when needed.
39
+
40
+ ## 5. Gotchas & Common Pitfalls
41
+
42
+ - Include a "Gotchas" section to address recurring issues.
43
+ - Document reasons *why* certain approaches are forbidden (e.g., "Do not use library X because of security vulnerability Y").
44
+ - Link to troubleshooting guides for deeper dives.
45
+
46
+ ## 6. Plan-Validate-Execute Loops
47
+
48
+ - Instruct the agent to create a plan first.
49
+ - Provide validation scripts to check work before "committing" (e.g., linting, type-checking, or running a validator).
50
+
51
+ ## 7. Research Performance
52
+
53
+ **Prioritize fast, text-based tools over the browser.**
54
+ - **Fast**: Use `search_web` and `read_url_content` for documentation and general research.
55
+ - **Slow**: Avoid `read_browser_page` (browser subagent) unless the target site is a single-page app (SPA) that requires JavaScript rendering or authentication.
56
+ - **Guideline**: If you can see the content with a simple `curl`-like tool, do not spin up a browser. This saves significant time and keeps the agent focused.
@@ -0,0 +1,49 @@
1
+ # Evaluating Skill Quality
2
+
3
+ "Eval-driven iteration" is the process of testing your skill against realistic prompts to ensure it produces high-quality, reliable outputs.
4
+
5
+ ## 1. Designing Test Cases
6
+
7
+ A good test case includes:
8
+ - **Prompt**: A realistic user message (e.g., "Analyze the CSV at data/sales.csv").
9
+ - **Expected Output**: A human-readable description of success.
10
+ - **Input Files**: Mock data or real project files needed for the task.
11
+ - **Assertions**: Specific, observable criteria for success.
12
+
13
+ ### Example Eval (evals.json)
14
+ ```json
15
+ {
16
+ "id": 1,
17
+ "prompt": "Summarize the linting errors in src/core.py",
18
+ "expected_output": "A markdown table with Error Code, Message, and Line Number.",
19
+ "assertions": [
20
+ "Output is a markdown table",
21
+ "Includes at least 3 columns",
22
+ "All error codes start with 'E' or 'W'"
23
+ ]
24
+ }
25
+ ```
26
+
27
+ ## 2. Running Evals
28
+
29
+ **The Loop**:
30
+ 1. **Baseline**: Run the prompt *without* the new skill instructions.
31
+ 2. **With Skill**: Run same prompt with the skill active.
32
+ 3. **Compare**: Measure the delta in quality, time, and tokens.
33
+
34
+ **Workspace Structure**:
35
+ Store iteration results in separate folders (e.g., `iteration-1/with_skill/outputs/`) to track progress over time.
36
+
37
+ ## 3. Grading with Assertions
38
+
39
+ - **Programmatic**: "Output is valid JSON."
40
+ - **Observable**: "The chart has labeled axes."
41
+ - **Countable**: "Includes at least 3 recommendations."
42
+
43
+ **Grading Principle**: Require concrete evidence for a PASS. If it's vague, it's a FAIL.
44
+
45
+ ## 4. Analyzing Patterns
46
+
47
+ - **High StdDev**: If results vary wildly across runs, the instructions may be too ambiguous.
48
+ - **Plateau**: If more rules don't improve the pass rate, the skill may be over-constrained. Try simplifying.
49
+ - **Delta**: Focus on where the skill actually changes the agent's behavior compared to the baseline.
@@ -0,0 +1,29 @@
1
+ # Optimizing Skill Descriptions
2
+
3
+ The `description` field in a Skill's frontmatter determines *if* the agent chooses to use the skill.
4
+
5
+ ## 1. Writing Effective Descriptions
6
+
7
+ - **Imperative Phrase**: Use "Use this skill when..." rather than "This skill does...".
8
+ - **Focus on User Intent**: Describe what the user wants to achieve (e.g., "Analyze CSVs") rather than internal mechanics ("Run `scripts/csv_parser.py`").
9
+ - **Err on the Side of Being Pushy**: Explicitly list contexts where the skill applies, including synonyms (e.g., "even if they don't explicitly mention 'CSV' or 'analysis'").
10
+ - **Concise & Goal-Oriented**: A short paragraph (<1024 chars) is usually right.
11
+
12
+ ## 2. Avoiding Overfitting
13
+
14
+ - **Broaden the Scope**: If you miss a "should-trigger" case, broaden the description.
15
+ - **Avoid Keyword Stuffing**: Don't just add words from failed queries. Identify the *general category* those words represent.
16
+ - **Structural Changes**: If tweaks fail, try a different framing or sentence structure.
17
+
18
+ ## 3. Testing with Queries
19
+
20
+ - **Should-Trigger Queries**: Test with formal, casual, and typo-ridden prompts.
21
+ - **Should-Not-Trigger Queries**: Test with "near-misses" (e.g., "I need to edit Excel budget" vs "I need to analyze CSV sales").
22
+ - **Validation Pass Rate**: Use fresh queries (not the ones used to train/optimize) to check for generalization.
23
+
24
+ ## Checklist for Activation
25
+
26
+ - [ ] Is it under 1024 characters? (Hard limit)
27
+ - [ ] Does it start with "Use this skill when..."?
28
+ - [ ] Does it cover at least 3-4 likely phrasing variations?
29
+ - [ ] Is it separate from other skills in the same repository? (Avoid overlap)
@@ -0,0 +1,64 @@
1
+ # Skill Creation Quickstart
2
+
3
+ A "Skill" is a directory containing a `SKILL.md` file that provides instructions to an agent.
4
+
5
+ ## Basic Structure
6
+
7
+ Create your skill at `.agents/skills/<name>/SKILL.md`:
8
+
9
+ ```markdown
10
+ ---
11
+ name: <name>
12
+ description: >-
13
+ Use this skill when <user intent/achievement>.
14
+ Trigger on <keywords/context>.
15
+ ---
16
+
17
+ # <Title>
18
+
19
+ <High-level overview of the skill's purpose.>
20
+
21
+ ## Quick Start
22
+
23
+ ```bash
24
+ # Provide the most common command or procedure
25
+ <command>
26
+ ```
27
+
28
+ ## Common Workflows
29
+
30
+ ### Workflow 1
31
+
32
+ - [ ] Step 1: <action>
33
+ - [ ] Step 2: <action>
34
+ - [ ] Step 3: <action>
35
+
36
+ ## Gotchas
37
+
38
+ - **<pitfall>**: <resolution>
39
+ - **<limitation>**: <alternative>
40
+
41
+ ## References
42
+
43
+ - [Reference 1](references/ref1.md)
44
+ - [Reference 2](references/ref2.md)
45
+ ```
46
+
47
+ ## Directory Layout
48
+
49
+ ```text
50
+ .agents/skills/<name>/
51
+ SKILL.md # Entry point (Frontmatter + Core Instructions)
52
+ references/ # (Optional) Detailed guides
53
+ config.md
54
+ troubleshooting.md
55
+ scripts/ # (Optional) Reusable scripts
56
+ scaffold.py
57
+ assets/ # (Optional) Static assets or images
58
+ ```
59
+
60
+ ## Activation Rules
61
+
62
+ 1. **Frontmatter**: The `name` must match the parent folder exactly.
63
+ 2. **Detection**: The agent reads the `description` at the start of a session. It only loads the full `SKILL.md` when it decides to "activate" based on the user's request.
64
+ 3. **Imperative Phrase**: Always start descriptions with "Use this skill when..." to help the agent decide.
@@ -0,0 +1,18 @@
1
+ # External Research Sources
2
+
3
+ These sources were used to build the initial version of the `skill-creator` meta-skill. Refer to them whenever recommendations change.
4
+
5
+ **Last Updated**: 2026-04-05 (Meta-skill created)
6
+
7
+ ## Official Documentation
8
+
9
+ - **[Quickstart](https://agentskills.io/skill-creation/quickstart)** — Basic structure and directory layout.
10
+ - **[Best Practices](https://agentskills.io/skill-creation/best-practices)** — Scoping, calibration, and procedural instructions.
11
+ - **[Optimizing Descriptions](https://agentskills.io/skill-creation/optimizing-descriptions)** — Imperative phrasing and reliable triggering strategies.
12
+ - **[Evaluating Skills](https://agentskills.io/skill-creation/evaluating-skills)** — Eval-driven iteration and assertion-based grading.
13
+ - **[Using Scripts](https://agentskills.io/skill-creation/using-scripts)** — Bundling executable logic and agentic script design.
14
+
15
+ ## Maintenance Policy
16
+
17
+ - **Check regularly**: Periodically visit these URLs to see if new "Gotchas" or pattern recommendations have been added.
18
+ - **Update Workflow**: If a source is updated, update the corresponding reference file in this skill.