milknado 0.1.0__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 (289) hide show
  1. milknado-0.1.0/.agents/plugins/marketplace.json +18 -0
  2. milknado-0.1.0/.claude-plugin/marketplace.json +12 -0
  3. milknado-0.1.0/.github/ISSUE_TEMPLATE/bug_report.yml +70 -0
  4. milknado-0.1.0/.github/ISSUE_TEMPLATE/config.yml +8 -0
  5. milknado-0.1.0/.github/ISSUE_TEMPLATE/feature_request.yml +39 -0
  6. milknado-0.1.0/.github/PULL_REQUEST_TEMPLATE.md +29 -0
  7. milknado-0.1.0/.github/copilot-instructions.md +72 -0
  8. milknado-0.1.0/.github/dependabot.yml +21 -0
  9. milknado-0.1.0/.github/instructions/code-review.instructions.md +31 -0
  10. milknado-0.1.0/.github/instructions/coding-agent.instructions.md +26 -0
  11. milknado-0.1.0/.github/instructions/python.instructions.md +10 -0
  12. milknado-0.1.0/.github/workflows/ci.yml +54 -0
  13. milknado-0.1.0/.github/workflows/codeql.yml +42 -0
  14. milknado-0.1.0/.github/workflows/dependency-review.yml +18 -0
  15. milknado-0.1.0/.github/workflows/release.yml +39 -0
  16. milknado-0.1.0/.github/workflows/scorecard.yml +40 -0
  17. milknado-0.1.0/.gitignore +224 -0
  18. milknado-0.1.0/.hallouminate/config.toml +21 -0
  19. milknado-0.1.0/.hallouminate/wiki/architecture/adapters.md +103 -0
  20. milknado-0.1.0/.hallouminate/wiki/architecture/batching.md +98 -0
  21. milknado-0.1.0/.hallouminate/wiki/architecture/distribution.md +55 -0
  22. milknado-0.1.0/.hallouminate/wiki/architecture/entry-points.md +83 -0
  23. milknado-0.1.0/.hallouminate/wiki/architecture/execution.md +306 -0
  24. milknado-0.1.0/.hallouminate/wiki/architecture/graph.md +146 -0
  25. milknado-0.1.0/.hallouminate/wiki/architecture/index.md +11 -0
  26. milknado-0.1.0/.hallouminate/wiki/architecture/planning.md +122 -0
  27. milknado-0.1.0/.hallouminate/wiki/conventions/build-and-gates.md +66 -0
  28. milknado-0.1.0/.hallouminate/wiki/conventions/code-style.md +57 -0
  29. milknado-0.1.0/.hallouminate/wiki/conventions/index.md +6 -0
  30. milknado-0.1.0/.hallouminate/wiki/history/index.md +9 -0
  31. milknado-0.1.0/.hallouminate/wiki/history/loop-vendor-in-decision.md +31 -0
  32. milknado-0.1.0/.hallouminate/wiki/history/nih-decisions.md +46 -0
  33. milknado-0.1.0/.hallouminate/wiki/history/pr137-loop-vendor-in.md +33 -0
  34. milknado-0.1.0/.hallouminate/wiki/history/pr94-refactor-split.md +44 -0
  35. milknado-0.1.0/.hallouminate/wiki/history/review-lessons.md +150 -0
  36. milknado-0.1.0/.hallouminate/wiki/index.md +35 -0
  37. milknado-0.1.0/.mcp.json +25 -0
  38. milknado-0.1.0/AGENTS.md +112 -0
  39. milknado-0.1.0/CLAUDE.md +1 -0
  40. milknado-0.1.0/CODE_OF_CONDUCT.md +41 -0
  41. milknado-0.1.0/CONTRIBUTING.md +48 -0
  42. milknado-0.1.0/LICENSE +21 -0
  43. milknado-0.1.0/PKG-INFO +15 -0
  44. milknado-0.1.0/README.md +53 -0
  45. milknado-0.1.0/SECURITY.md +38 -0
  46. milknado-0.1.0/codecov.yml +10 -0
  47. milknado-0.1.0/integrations/README.md +23 -0
  48. milknado-0.1.0/integrations/codex/README.md +34 -0
  49. milknado-0.1.0/integrations/codex/config.toml.example +14 -0
  50. milknado-0.1.0/integrations/cursor-milknado/.cursor-plugin/plugin.json +8 -0
  51. milknado-0.1.0/integrations/cursor-milknado/README.md +22 -0
  52. milknado-0.1.0/integrations/cursor-milknado/commands/milknado-agents-check.md +12 -0
  53. milknado-0.1.0/integrations/cursor-milknado/commands/milknado-plan.md +14 -0
  54. milknado-0.1.0/integrations/cursor-milknado/commands/milknado-run.md +14 -0
  55. milknado-0.1.0/integrations/cursor-milknado/commands/milknado-status.md +10 -0
  56. milknado-0.1.0/integrations/cursor-milknado/mcp.json +15 -0
  57. milknado-0.1.0/integrations/cursor-milknado/skills/milknado/SKILL.md +24 -0
  58. milknado-0.1.0/integrations/gemini-milknado/README.md +41 -0
  59. milknado-0.1.0/integrations/gemini-milknado/commands/milknado_agents_check.toml +7 -0
  60. milknado-0.1.0/integrations/gemini-milknado/commands/milknado_plan.toml +9 -0
  61. milknado-0.1.0/integrations/gemini-milknado/commands/milknado_run.toml +9 -0
  62. milknado-0.1.0/integrations/gemini-milknado/commands/milknado_status.toml +9 -0
  63. milknado-0.1.0/integrations/gemini-milknado/gemini-extension.json +17 -0
  64. milknado-0.1.0/integrations/spec/commands.yaml +54 -0
  65. milknado-0.1.0/integrations/spec/generate_integrations.py +81 -0
  66. milknado-0.1.0/integrations/spec/templates/cursor-command.md.tmpl +11 -0
  67. milknado-0.1.0/integrations/spec/templates/gemini-command.toml.tmpl +7 -0
  68. milknado-0.1.0/justfile +191 -0
  69. milknado-0.1.0/milknado.toml +12 -0
  70. milknado-0.1.0/plugins/milknado/.claude-plugin/plugin.json +5 -0
  71. milknado-0.1.0/plugins/milknado/.codex-plugin/plugin.json +5 -0
  72. milknado-0.1.0/plugins/milknado/.mcp.json +1 -0
  73. milknado-0.1.0/plugins/milknado/skills/harvest/SKILL.md +59 -0
  74. milknado-0.1.0/plugins/milknado/skills/load-roadmap/SKILL.md +53 -0
  75. milknado-0.1.0/plugins/milknado/skills/milknado-config/SKILL.md +189 -0
  76. milknado-0.1.0/plugins/milknado/skills/milknado-config/references/flavor-presets.md +169 -0
  77. milknado-0.1.0/pyproject.toml +52 -0
  78. milknado-0.1.0/scripts/mock_planner.py +46 -0
  79. milknado-0.1.0/src/milknado/__init__.py +3 -0
  80. milknado-0.1.0/src/milknado/_cli_helpers.py +61 -0
  81. milknado-0.1.0/src/milknado/_mcp_core.py +173 -0
  82. milknado-0.1.0/src/milknado/_ralph_node_runner.py +91 -0
  83. milknado-0.1.0/src/milknado/_vendor/README.md +20 -0
  84. milknado-0.1.0/src/milknado/_vendor/tiktoken-cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +100256 -0
  85. milknado-0.1.0/src/milknado/adapters/__init__.py +5 -0
  86. milknado-0.1.0/src/milknado/adapters/crg.py +153 -0
  87. milknado-0.1.0/src/milknado/adapters/git.py +167 -0
  88. milknado-0.1.0/src/milknado/adapters/loop.py +479 -0
  89. milknado-0.1.0/src/milknado/adapters/tilth.py +149 -0
  90. milknado-0.1.0/src/milknado/app/__init__.py +1 -0
  91. milknado-0.1.0/src/milknado/app/run_command.py +39 -0
  92. milknado-0.1.0/src/milknado/cli.py +233 -0
  93. milknado-0.1.0/src/milknado/cli_agents.py +58 -0
  94. milknado-0.1.0/src/milknado/cli_plan.py +417 -0
  95. milknado-0.1.0/src/milknado/cli_roadmap.py +65 -0
  96. milknado-0.1.0/src/milknado/cli_run.py +124 -0
  97. milknado-0.1.0/src/milknado/cli_tools.py +206 -0
  98. milknado-0.1.0/src/milknado/domains/__init__.py +0 -0
  99. milknado-0.1.0/src/milknado/domains/batching/README.md +345 -0
  100. milknado-0.1.0/src/milknado/domains/batching/__init__.py +33 -0
  101. milknado-0.1.0/src/milknado/domains/batching/_model.py +193 -0
  102. milknado-0.1.0/src/milknado/domains/batching/_tarjan.py +103 -0
  103. milknado-0.1.0/src/milknado/domains/batching/change.py +97 -0
  104. milknado-0.1.0/src/milknado/domains/batching/graph_build.py +282 -0
  105. milknado-0.1.0/src/milknado/domains/batching/solver.py +299 -0
  106. milknado-0.1.0/src/milknado/domains/batching/weights.py +178 -0
  107. milknado-0.1.0/src/milknado/domains/common/__init__.py +47 -0
  108. milknado-0.1.0/src/milknado/domains/common/agent_argv.py +204 -0
  109. milknado-0.1.0/src/milknado/domains/common/config.py +558 -0
  110. milknado-0.1.0/src/milknado/domains/common/doctor.py +94 -0
  111. milknado-0.1.0/src/milknado/domains/common/errors.py +115 -0
  112. milknado-0.1.0/src/milknado/domains/common/flavor_profile.py +72 -0
  113. milknado-0.1.0/src/milknado/domains/common/paths.py +29 -0
  114. milknado-0.1.0/src/milknado/domains/common/plugin.py +22 -0
  115. milknado-0.1.0/src/milknado/domains/common/process.py +34 -0
  116. milknado-0.1.0/src/milknado/domains/common/protocols.py +112 -0
  117. milknado-0.1.0/src/milknado/domains/common/toolchain.py +88 -0
  118. milknado-0.1.0/src/milknado/domains/common/types.py +112 -0
  119. milknado-0.1.0/src/milknado/domains/dispatch/__init__.py +51 -0
  120. milknado-0.1.0/src/milknado/domains/dispatch/_runstate.py +78 -0
  121. milknado-0.1.0/src/milknado/domains/dispatch/async_run.py +172 -0
  122. milknado-0.1.0/src/milknado/domains/dispatch/brief.py +73 -0
  123. milknado-0.1.0/src/milknado/domains/dispatch/cancel.py +160 -0
  124. milknado-0.1.0/src/milknado/domains/dispatch/lifecycle.py +123 -0
  125. milknado-0.1.0/src/milknado/domains/dispatch/reconcile.py +156 -0
  126. milknado-0.1.0/src/milknado/domains/dispatch/runner.py +285 -0
  127. milknado-0.1.0/src/milknado/domains/execution/__init__.py +23 -0
  128. milknado-0.1.0/src/milknado/domains/execution/_context.py +49 -0
  129. milknado-0.1.0/src/milknado/domains/execution/executor.py +521 -0
  130. milknado-0.1.0/src/milknado/domains/execution/headless.py +87 -0
  131. milknado-0.1.0/src/milknado/domains/execution/run_loop/__init__.py +330 -0
  132. milknado-0.1.0/src/milknado/domains/execution/run_loop/_completion.py +67 -0
  133. milknado-0.1.0/src/milknado/domains/execution/run_loop/_logging.py +33 -0
  134. milknado-0.1.0/src/milknado/domains/execution/run_loop/_result.py +22 -0
  135. milknado-0.1.0/src/milknado/domains/execution/run_loop/display.py +180 -0
  136. milknado-0.1.0/src/milknado/domains/execution/run_loop/input.py +91 -0
  137. milknado-0.1.0/src/milknado/domains/graph/__init__.py +4 -0
  138. milknado-0.1.0/src/milknado/domains/graph/_analytics_facade.py +50 -0
  139. milknado-0.1.0/src/milknado/domains/graph/_mutations.py +198 -0
  140. milknado-0.1.0/src/milknado/domains/graph/_persistence.py +613 -0
  141. milknado-0.1.0/src/milknado/domains/graph/_transitions.py +161 -0
  142. milknado-0.1.0/src/milknado/domains/graph/display.py +152 -0
  143. milknado-0.1.0/src/milknado/domains/graph/graph.py +612 -0
  144. milknado-0.1.0/src/milknado/domains/graph/runnability.py +101 -0
  145. milknado-0.1.0/src/milknado/domains/graph/status_flow.py +79 -0
  146. milknado-0.1.0/src/milknado/domains/graph/traversals.py +36 -0
  147. milknado-0.1.0/src/milknado/domains/planning/__init__.py +19 -0
  148. milknado-0.1.0/src/milknado/domains/planning/batching_bridge.py +142 -0
  149. milknado-0.1.0/src/milknado/domains/planning/context.py +314 -0
  150. milknado-0.1.0/src/milknado/domains/planning/manifest.py +321 -0
  151. milknado-0.1.0/src/milknado/domains/planning/planner.py +202 -0
  152. milknado-0.1.0/src/milknado/domains/planning/telemetry.py +58 -0
  153. milknado-0.1.0/src/milknado/domains/wiki/__init__.py +17 -0
  154. milknado-0.1.0/src/milknado/domains/wiki/_serialize.py +110 -0
  155. milknado-0.1.0/src/milknado/domains/wiki/exporter.py +225 -0
  156. milknado-0.1.0/src/milknado/domains/wiki/importer.py +154 -0
  157. milknado-0.1.0/src/milknado/loop/__init__.py +20 -0
  158. milknado-0.1.0/src/milknado/loop/_agent.py +1134 -0
  159. milknado-0.1.0/src/milknado/loop/_events.py +336 -0
  160. milknado-0.1.0/src/milknado/loop/_frontmatter.py +165 -0
  161. milknado-0.1.0/src/milknado/loop/_output.py +137 -0
  162. milknado-0.1.0/src/milknado/loop/_promise.py +24 -0
  163. milknado-0.1.0/src/milknado/loop/_resolver.py +91 -0
  164. milknado-0.1.0/src/milknado/loop/_run_types.py +235 -0
  165. milknado-0.1.0/src/milknado/loop/_runner.py +70 -0
  166. milknado-0.1.0/src/milknado/loop/_wind_down_shim.py +130 -0
  167. milknado-0.1.0/src/milknado/loop/adapters/__init__.py +76 -0
  168. milknado-0.1.0/src/milknado/loop/adapters/_generic.py +79 -0
  169. milknado-0.1.0/src/milknado/loop/adapters/_protocol.py +148 -0
  170. milknado-0.1.0/src/milknado/loop/adapters/claude.py +230 -0
  171. milknado-0.1.0/src/milknado/loop/adapters/codex.py +255 -0
  172. milknado-0.1.0/src/milknado/loop/adapters/copilot.py +158 -0
  173. milknado-0.1.0/src/milknado/loop/adapters/crush.py +129 -0
  174. milknado-0.1.0/src/milknado/loop/adapters/opencode.py +186 -0
  175. milknado-0.1.0/src/milknado/loop/engine.py +582 -0
  176. milknado-0.1.0/src/milknado/loop/hooks.py +244 -0
  177. milknado-0.1.0/src/milknado/loop/manager.py +256 -0
  178. milknado-0.1.0/src/milknado/mcp_ralph.py +240 -0
  179. milknado-0.1.0/src/milknado/mcp_run.py +273 -0
  180. milknado-0.1.0/src/milknado/mcp_server.py +248 -0
  181. milknado-0.1.0/src/milknado/mcp_todo.py +163 -0
  182. milknado-0.1.0/src/milknado/mcp_todo_mutate.py +237 -0
  183. milknado-0.1.0/src/milknado/mcp_wiki.py +62 -0
  184. milknado-0.1.0/src/milknado/plugins/__init__.py +4 -0
  185. milknado-0.1.0/src/milknado/plugins/loader.py +55 -0
  186. milknado-0.1.0/src/milknado/plugins/scaffold.py +81 -0
  187. milknado-0.1.0/tests/__init__.py +0 -0
  188. milknado-0.1.0/tests/adversarial/__init__.py +0 -0
  189. milknado-0.1.0/tests/adversarial/test_bridge_chaos.py +168 -0
  190. milknado-0.1.0/tests/adversarial/test_cli_chaos.py +254 -0
  191. milknado-0.1.0/tests/adversarial/test_context_chaos.py +166 -0
  192. milknado-0.1.0/tests/adversarial/test_manifest_chaos.py +306 -0
  193. milknado-0.1.0/tests/adversarial/test_telemetry_chaos.py +194 -0
  194. milknado-0.1.0/tests/adversarial/test_traversals_chaos.py +145 -0
  195. milknado-0.1.0/tests/batching/__init__.py +0 -0
  196. milknado-0.1.0/tests/batching/test_adversarial.py +448 -0
  197. milknado-0.1.0/tests/batching/test_change.py +123 -0
  198. milknado-0.1.0/tests/batching/test_graph_build.py +200 -0
  199. milknado-0.1.0/tests/batching/test_mcp_tool.py +329 -0
  200. milknado-0.1.0/tests/batching/test_press.py +587 -0
  201. milknado-0.1.0/tests/batching/test_solver.py +268 -0
  202. milknado-0.1.0/tests/batching/test_weights.py +224 -0
  203. milknado-0.1.0/tests/conftest.py +45 -0
  204. milknado-0.1.0/tests/fixtures/no_heading.md +3 -0
  205. milknado-0.1.0/tests/fixtures/not_md.txt +1 -0
  206. milknado-0.1.0/tests/fixtures/valid.md +3 -0
  207. milknado-0.1.0/tests/loop/__init__.py +0 -0
  208. milknado-0.1.0/tests/loop/conftest.py +18 -0
  209. milknado-0.1.0/tests/loop/fixtures/__init__.py +0 -0
  210. milknado-0.1.0/tests/loop/fixtures/adapters/claude_basic_run.jsonl +8 -0
  211. milknado-0.1.0/tests/loop/fixtures/adapters/codex_basic_run.jsonl +7 -0
  212. milknado-0.1.0/tests/loop/fixtures/adapters/copilot_basic_run.jsonl +5 -0
  213. milknado-0.1.0/tests/loop/fixtures/adapters/opencode_basic_run.jsonl +7 -0
  214. milknado-0.1.0/tests/loop/helpers.py +242 -0
  215. milknado-0.1.0/tests/loop/test_adapters_claude.py +190 -0
  216. milknado-0.1.0/tests/loop/test_adapters_codex.py +173 -0
  217. milknado-0.1.0/tests/loop/test_adapters_copilot.py +135 -0
  218. milknado-0.1.0/tests/loop/test_adapters_crush.py +116 -0
  219. milknado-0.1.0/tests/loop/test_adapters_golden.py +158 -0
  220. milknado-0.1.0/tests/loop/test_adapters_opencode.py +184 -0
  221. milknado-0.1.0/tests/loop/test_adapters_registry.py +57 -0
  222. milknado-0.1.0/tests/loop/test_agent.py +1826 -0
  223. milknado-0.1.0/tests/loop/test_engine.py +1713 -0
  224. milknado-0.1.0/tests/loop/test_events.py +222 -0
  225. milknado-0.1.0/tests/loop/test_frontmatter.py +271 -0
  226. milknado-0.1.0/tests/loop/test_hooks.py +183 -0
  227. milknado-0.1.0/tests/loop/test_manager.py +438 -0
  228. milknado-0.1.0/tests/loop/test_output.py +163 -0
  229. milknado-0.1.0/tests/loop/test_promise.py +42 -0
  230. milknado-0.1.0/tests/loop/test_resolver.py +216 -0
  231. milknado-0.1.0/tests/loop/test_run_types.py +284 -0
  232. milknado-0.1.0/tests/loop/test_runner.py +116 -0
  233. milknado-0.1.0/tests/loop/test_turn_cap.py +373 -0
  234. milknado-0.1.0/tests/loop/test_wind_down_shim.py +92 -0
  235. milknado-0.1.0/tests/test_adapters_crg.py +387 -0
  236. milknado-0.1.0/tests/test_adapters_git.py +275 -0
  237. milknado-0.1.0/tests/test_adapters_loop.py +633 -0
  238. milknado-0.1.0/tests/test_agent_argv.py +322 -0
  239. milknado-0.1.0/tests/test_cli.py +1845 -0
  240. milknado-0.1.0/tests/test_cli_agents.py +61 -0
  241. milknado-0.1.0/tests/test_cli_pty_smoke.py +169 -0
  242. milknado-0.1.0/tests/test_cli_roadmap.py +87 -0
  243. milknado-0.1.0/tests/test_config.py +247 -0
  244. milknado-0.1.0/tests/test_config_layered.py +471 -0
  245. milknado-0.1.0/tests/test_config_self_parse.py +96 -0
  246. milknado-0.1.0/tests/test_display.py +198 -0
  247. milknado-0.1.0/tests/test_doctor.py +94 -0
  248. milknado-0.1.0/tests/test_e2e_sonnet_worker.py +165 -0
  249. milknado-0.1.0/tests/test_errors.py +184 -0
  250. milknado-0.1.0/tests/test_execution.py +1228 -0
  251. milknado-0.1.0/tests/test_executor_duration.py +355 -0
  252. milknado-0.1.0/tests/test_executor_merge_back.py +412 -0
  253. milknado-0.1.0/tests/test_flavor_config.py +674 -0
  254. milknado-0.1.0/tests/test_graph.py +776 -0
  255. milknado-0.1.0/tests/test_graph_claim.py +298 -0
  256. milknado-0.1.0/tests/test_graph_persistence.py +458 -0
  257. milknado-0.1.0/tests/test_graph_traversals.py +45 -0
  258. milknado-0.1.0/tests/test_graph_wiki_ref.py +117 -0
  259. milknado-0.1.0/tests/test_headless.py +140 -0
  260. milknado-0.1.0/tests/test_justfile.py +12 -0
  261. milknado-0.1.0/tests/test_loop_verifier.py +366 -0
  262. milknado-0.1.0/tests/test_mcp_ralph.py +749 -0
  263. milknado-0.1.0/tests/test_mcp_run_enhancements.py +1221 -0
  264. milknado-0.1.0/tests/test_mcp_server.py +2123 -0
  265. milknado-0.1.0/tests/test_mcp_wiki.py +79 -0
  266. milknado-0.1.0/tests/test_mega_batch_detection.py +73 -0
  267. milknado-0.1.0/tests/test_node_kind_hierarchy.py +898 -0
  268. milknado-0.1.0/tests/test_paths.py +75 -0
  269. milknado-0.1.0/tests/test_planning.py +1138 -0
  270. milknado-0.1.0/tests/test_planning_batching_bridge.py +382 -0
  271. milknado-0.1.0/tests/test_planning_telemetry.py +223 -0
  272. milknado-0.1.0/tests/test_plugin_manifests.py +272 -0
  273. milknado-0.1.0/tests/test_plugin_scaffold.py +304 -0
  274. milknado-0.1.0/tests/test_process.py +34 -0
  275. milknado-0.1.0/tests/test_prompt_prepends.py +58 -0
  276. milknado-0.1.0/tests/test_run_loop.py +1554 -0
  277. milknado-0.1.0/tests/test_run_loop_completion.py +190 -0
  278. milknado-0.1.0/tests/test_run_loop_input.py +244 -0
  279. milknado-0.1.0/tests/test_run_loop_logging.py +105 -0
  280. milknado-0.1.0/tests/test_tilth_adapter.py +280 -0
  281. milknado-0.1.0/tests/test_toolchain.py +124 -0
  282. milknado-0.1.0/tests/test_vendor_loop_seams.py +231 -0
  283. milknado-0.1.0/tests/test_weights_per_symbol.py +164 -0
  284. milknado-0.1.0/tests/test_wiki_exporter.py +326 -0
  285. milknado-0.1.0/tests/test_wiki_importer.py +241 -0
  286. milknado-0.1.0/tests/test_wiki_serialize.py +182 -0
  287. milknado-0.1.0/tests/test_worker_env.py +131 -0
  288. milknado-0.1.0/tests/test_worktree_shared_graph.py +757 -0
  289. milknado-0.1.0/uv.lock +2575 -0
@@ -0,0 +1,18 @@
1
+ {
2
+ "interface": {
3
+ "displayName": "milknado"
4
+ },
5
+ "plugins": [
6
+ {
7
+ "source": {
8
+ "source": "local",
9
+ "path": "./plugins/milknado"
10
+ },
11
+ "policy": {
12
+ "installation": "AVAILABLE",
13
+ "authentication": "ON_INSTALL"
14
+ },
15
+ "category": "developer-tools"
16
+ }
17
+ ]
18
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "name": "milknado",
3
+ "owner": {
4
+ "name": "paulnsorensen"
5
+ },
6
+ "plugins": [
7
+ {
8
+ "name": "milknado",
9
+ "source": "./plugins/milknado"
10
+ }
11
+ ]
12
+ }
@@ -0,0 +1,70 @@
1
+ name: Bug report
2
+ description: Something is broken or behaves incorrectly
3
+ labels: [bug]
4
+ body:
5
+ - type: markdown
6
+ attributes:
7
+ value: |
8
+ Thanks for taking the time to file a bug. Please fill out the fields
9
+ below — the more concrete the repro, the faster the fix.
10
+
11
+ - type: textarea
12
+ id: what-happened
13
+ attributes:
14
+ label: What happened?
15
+ description: A clear description of the bug.
16
+ placeholder: When I run X, Y happens instead of Z.
17
+ validations:
18
+ required: true
19
+
20
+ - type: textarea
21
+ id: repro
22
+ attributes:
23
+ label: Steps to reproduce
24
+ description: Minimal, copy-pasteable steps.
25
+ placeholder: |
26
+ 1. ...
27
+ 2. ...
28
+ 3. ...
29
+ validations:
30
+ required: true
31
+
32
+ - type: textarea
33
+ id: expected
34
+ attributes:
35
+ label: Expected behaviour
36
+ validations:
37
+ required: true
38
+
39
+ - type: input
40
+ id: version
41
+ attributes:
42
+ label: Version / commit
43
+ description: Output of `milknado --version` or the commit SHA.
44
+ validations:
45
+ required: true
46
+
47
+ - type: input
48
+ id: environment
49
+ attributes:
50
+ label: OS / runtime
51
+ description: e.g. macOS 14.5, Ubuntu 24.04, Python 3.12
52
+ validations:
53
+ required: false
54
+
55
+ - type: textarea
56
+ id: logs
57
+ attributes:
58
+ label: Logs / output
59
+ description: Paste relevant log output. Will be auto-formatted as code.
60
+ render: shell
61
+
62
+ - type: checkboxes
63
+ id: checks
64
+ attributes:
65
+ label: Pre-flight
66
+ options:
67
+ - label: I searched existing issues and this is not a duplicate
68
+ required: true
69
+ - label: I am running the latest released version
70
+ required: false
@@ -0,0 +1,8 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: Question or support
4
+ url: https://github.com/paulnsorensen/milknado/issues
5
+ about: Search existing issues or open a new one if none fit.
6
+ - name: Security vulnerability
7
+ url: https://github.com/paulnsorensen/milknado/security/advisories/new
8
+ about: Report a vulnerability privately via a draft security advisory.
@@ -0,0 +1,39 @@
1
+ name: Feature request
2
+ description: Suggest an enhancement or new capability
3
+ labels: [enhancement]
4
+ body:
5
+ - type: textarea
6
+ id: problem
7
+ attributes:
8
+ label: What problem does this solve?
9
+ description: Describe the user-facing pain, not the implementation.
10
+ validations:
11
+ required: true
12
+
13
+ - type: textarea
14
+ id: proposal
15
+ attributes:
16
+ label: Proposed solution
17
+ description: What would you like to see happen?
18
+ validations:
19
+ required: true
20
+
21
+ - type: textarea
22
+ id: alternatives
23
+ attributes:
24
+ label: Alternatives considered
25
+ description: Other approaches you weighed and why they did not fit.
26
+
27
+ - type: textarea
28
+ id: context
29
+ attributes:
30
+ label: Additional context
31
+ description: Links, screenshots, prior art.
32
+
33
+ - type: checkboxes
34
+ id: checks
35
+ attributes:
36
+ label: Pre-flight
37
+ options:
38
+ - label: I searched existing issues and this is not a duplicate
39
+ required: true
@@ -0,0 +1,29 @@
1
+ <!-- markdownlint-disable-file MD041 -->
2
+ <!--
3
+ Thanks for opening a PR. Please fill out the sections below — short is fine,
4
+ but blank is not. The reviewer should be able to understand intent and risk
5
+ from the description alone.
6
+ -->
7
+
8
+ ## What changed
9
+
10
+ <!-- One or two sentences. The "what". -->
11
+
12
+ ## Why
13
+
14
+ <!-- The motivation. Link any tracking issue: `Fixes #123`. -->
15
+
16
+ ## How to verify
17
+
18
+ <!-- Commands the reviewer can run, or what to click in the UI. -->
19
+
20
+ ## Risk / rollout notes
21
+
22
+ <!-- Anything reviewers should pay extra attention to. Write "none" if there is none. -->
23
+
24
+ ## Checklist
25
+
26
+ - [ ] Conventional Commits PR title (`feat:`, `fix:`, `chore:`, `docs:`, ...)
27
+ - [ ] Tests added or updated (or N/A)
28
+ - [ ] Documentation updated (or N/A)
29
+ - [ ] No secrets or credentials added
@@ -0,0 +1,72 @@
1
+ # Copilot Instructions
2
+
3
+ ## Engineering Principles
4
+
5
+ 1. **Input Validation** - Trust nothing from external sources. Validate at system boundaries (user input, external APIs, file I/O). Internal code trusts internal code.
6
+ 2. **Fail Fast and Loud** - Handle errors where they occur. No silent failures, no swallowed exceptions, no empty catch blocks. If something fails, the caller should know immediately.
7
+ 3. **Loose Coupling** - Separate business logic from infrastructure. Core models and domain logic must not import HTTP frameworks, ORMs, or I/O libraries. Use dependency injection or protocols/interfaces at boundaries.
8
+ 4. **YAGNI** - Build only what is needed now. No abstract base classes with one implementation, no plugin systems with one plugin, no configuration options that are never varied. If it is needed later, it can be written later.
9
+ 5. **Real-World Models** - Name things after business concepts, not technical abstractions. `Order`, not `DataProcessor`. `PricingRule`, not `StrategyHandler`.
10
+ 6. **Immutable Patterns** - Minimize state mutation. Prefer pure functions, return new values instead of mutating arguments, use immutable data structures where the language supports them.
11
+
12
+ ## Complexity Budget
13
+
14
+ - **Functions**: Maximum 40 lines
15
+ - **Files**: Maximum 300 lines
16
+ - **Parameters**: Maximum 4 per function
17
+ - **Nesting**: Maximum 3 levels deep
18
+
19
+ If a function or file exceeds these limits, decompose it.
20
+
21
+ ## Code Style
22
+
23
+ - **Classes**: PascalCase
24
+ - **Functions**: snake_case
25
+ - **Constants**: SCREAMING_SNAKE_CASE
26
+ - **Files**: kebab-case (or snake_case for Python modules, matching the existing tree)
27
+ - **Commits**: Conventional Commits format (`feat:`, `fix:`, `chore:`, etc.)
28
+
29
+ ## Architecture
30
+
31
+ Follow vertical slice architecture:
32
+
33
+ - Each domain concept gets its own module/directory (see `src/milknado/domains/`)
34
+ - Public API is exposed through an `__init__.py` barrel file only
35
+ - Do not reach into another slice's internals — import from its public API
36
+ - Core models stay pure: no ORM decorators, no framework imports, no I/O
37
+ - `common/` is a leaf — it imports nothing from sibling domains
38
+ - One-directional dependencies only; cross-slice translation lives in an explicit bridge module (e.g. `domains/planning/batching_bridge.py`), never inside the pure slice
39
+
40
+ **Growth pattern:**
41
+
42
+ 1. Start with one file per concept
43
+ 2. Extract a sibling file when the original gets crowded
44
+ 3. When a file needs helpers, it becomes a facade with a subdirectory
45
+
46
+ ## What NOT to Do
47
+
48
+ - Do not add docstrings to private methods or small helpers with clear names
49
+ - Do not create abstract base classes, factories, or registries unless there are multiple concrete implementations today
50
+ - Do not add error handling for conditions that cannot occur in the current system
51
+ - Do not add backwards-compatibility shims — change the code directly
52
+ - Do not wrap functions that add no logic — call the original directly
53
+ - Do not add type annotations to every local variable — annotate function signatures and let inference handle the rest
54
+
55
+ ## Tech Stack
56
+
57
+ - **Language**: Python (`requires-python >= 3.11`)
58
+ - **Package/Env manager**: `uv` (lockfile: `uv.lock`)
59
+ - **Test framework**: pytest (with `pytest-cov`)
60
+ - **Lint + format**: Ruff (`--preview`)
61
+ - **Task runner**: `just`
62
+ - **Key libraries**: fastmcp, ortools (CP-SAT), typer, tiktoken, pyyaml, rich, code-review-graph
63
+ - **Shape**: MCP server (`src/milknado/mcp_server.py`) over domain slices under `src/milknado/domains/`
64
+
65
+ ## Build, Test, and Lint Commands
66
+
67
+ - Full build (autofix → test → coverage gate): `just build`
68
+ - CI build (lint check, no autofix): `just build-ci`
69
+ - Lint (check only): `just lint`
70
+ - Lint (autofix + format): `just lint-fix`
71
+ - Tests: `just test` (or `just test-file <path>`)
72
+ - Coverage report: `just test-coverage` (threshold-gated by `just coverage-check`, min 90%)
@@ -0,0 +1,21 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: github-actions
4
+ directory: /
5
+ schedule:
6
+ interval: weekly
7
+ open-pull-requests-limit: 5
8
+ groups:
9
+ github-actions:
10
+ patterns:
11
+ - "*"
12
+
13
+ - package-ecosystem: pip
14
+ directory: /
15
+ schedule:
16
+ interval: weekly
17
+ open-pull-requests-limit: 10
18
+ groups:
19
+ python-dependencies:
20
+ patterns:
21
+ - "*"
@@ -0,0 +1,31 @@
1
+ ---
2
+ applyTo: "**"
3
+ excludeAgent: "coding-agent"
4
+ ---
5
+
6
+ ## Code Review Focus
7
+
8
+ Focus reviews on these categories, in priority order:
9
+
10
+ 1. **Security** - Flag hardcoded secrets, SQL injection, XSS, command injection, path traversal, and insecure deserialization
11
+ 2. **Silent failures** - Flag empty catch blocks, swallowed errors, missing error propagation, or functions that return `None`/null/undefined on failure without signaling
12
+ 3. **Coupling violations** - Flag domain/model code that imports infrastructure (HTTP, DB, file I/O, framework decorators)
13
+ 4. **Complexity violations** - Flag functions over 40 lines, files over 300 lines, functions with more than 4 parameters, nesting deeper than 3 levels
14
+ 5. **Architectural violations** - Flag cross-slice internal imports, mutable shared state, God classes/modules
15
+ 6. **Weak tests** - Flag tests that prove nothing: no assertions, `is_ok()`/`is_some()` without checking inner values, tautological assertions, mirror-implementation tests that re-derive expected values from the same logic, mock echo tests, `.len()`-only collection checks, assertions gated behind conditional branches that silently pass, and happy-path-only coverage with no error/boundary tests
16
+
17
+ ## What NOT to Comment On
18
+
19
+ - Linting — handled by Ruff in CI
20
+ - Formatting and whitespace — handled by `ruff format` in CI
21
+ - Import ordering — handled by tooling
22
+ - Missing docstrings on internal or private functions
23
+ - Style preferences that are consistent with the rest of the codebase
24
+ - Nitpicks with no functional impact
25
+
26
+ ## Review Style
27
+
28
+ - Only comment when confidence is high
29
+ - If a pattern is used consistently elsewhere in the codebase, do not flag it as wrong
30
+ - Suggest specific fixes, not vague improvements
31
+ - One comment per issue — do not repeat the same feedback on multiple occurrences
@@ -0,0 +1,26 @@
1
+ ---
2
+ applyTo: "**"
3
+ excludeAgent: "code-review"
4
+ ---
5
+
6
+ ## Coding Agent Guidelines
7
+
8
+ When implementing changes:
9
+
10
+ - Read existing code before modifying it — understand the patterns in use
11
+ - Follow the existing code style of the file you are editing
12
+ - Keep changes minimal and focused on the issue at hand
13
+ - Do not refactor surrounding code unless the issue requires it
14
+ - Do not add docstrings to helper functions or private methods with clear names
15
+ - Do not introduce new dependencies without explicit approval
16
+ - Write tests for new functionality — match the existing test patterns in `tests/`
17
+ - Prefer editing existing files over creating new ones
18
+ - Run `just build` before opening a PR — it must pass (lint, tests, and the 90% coverage gate)
19
+
20
+ ## Architecture Rules
21
+
22
+ - New domain concepts go in their own module under `src/milknado/domains/`
23
+ - Public API is exposed through `__init__.py` barrel files only
24
+ - Do not create abstract classes, interfaces, or factories unless there are 2+ concrete implementations
25
+ - Core models must not import infrastructure code
26
+ - Cross-slice translation belongs in an explicit bridge module, not inside the pure slice
@@ -0,0 +1,10 @@
1
+ ---
2
+ applyTo: "**/*.py"
3
+ ---
4
+ - Use type hints on all function signatures and return types
5
+ - Use `uv` for dependency management, not pip directly
6
+ - Use pytest for tests, not unittest
7
+ - Use Ruff for linting and formatting (`just lint-fix`)
8
+ - Prefer frozen dataclasses over raw dicts for structured data
9
+ - Use `from __future__ import annotations` for forward references
10
+ - Raise specific exceptions; avoid `raise Exception`, and use bare `raise` only to re-raise the active exception
@@ -0,0 +1,54 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ concurrency:
10
+ group: ${{ github.workflow }}-${{ github.ref }}
11
+ cancel-in-progress: true
12
+
13
+ permissions:
14
+ contents: read
15
+
16
+ jobs:
17
+ build:
18
+ runs-on: ubuntu-latest
19
+ permissions:
20
+ contents: read
21
+ id-token: write
22
+ strategy:
23
+ matrix:
24
+ python-version: ["3.11", "3.12"]
25
+
26
+ steps:
27
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
28
+
29
+ - name: Set up Python ${{ matrix.python-version }}
30
+ uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
31
+ with:
32
+ python-version: ${{ matrix.python-version }}
33
+
34
+ - name: Install uv
35
+ uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
36
+ with:
37
+ enable-cache: true
38
+
39
+ - name: Install just
40
+ run: |
41
+ sudo apt-get update
42
+ sudo apt-get install -y just
43
+
44
+ - name: Run full build (lint → test → coverage)
45
+ run: just build-ci
46
+
47
+ - name: Upload coverage to Codecov
48
+ uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v6
49
+ if: matrix.python-version == '3.11'
50
+ with:
51
+ files: ./coverage.xml
52
+ flags: unittests
53
+ fail_ci_if_error: false
54
+ use_oidc: true
@@ -0,0 +1,42 @@
1
+ name: codeql
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+ schedule:
9
+ - cron: "26 4 * * 1"
10
+
11
+ permissions:
12
+ contents: read
13
+
14
+ jobs:
15
+ analyze:
16
+ name: analyze (${{ matrix.language }})
17
+ runs-on: ubuntu-latest
18
+ permissions:
19
+ security-events: write
20
+ packages: read
21
+ actions: read
22
+ contents: read
23
+ strategy:
24
+ fail-fast: false
25
+ matrix:
26
+ language: [python]
27
+ steps:
28
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
29
+ - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
30
+ with:
31
+ python-version: "3.12"
32
+ - uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
33
+ with:
34
+ enable-cache: true
35
+ - uses: github/codeql-action/init@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2
36
+ with:
37
+ languages: ${{ matrix.language }}
38
+ queries: security-and-quality
39
+ - run: uv sync --locked
40
+ - uses: github/codeql-action/analyze@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2
41
+ with:
42
+ category: "/language:${{ matrix.language }}"
@@ -0,0 +1,18 @@
1
+ name: dependency review
2
+
3
+ on:
4
+ pull_request:
5
+ branches: [main]
6
+
7
+ permissions:
8
+ contents: read
9
+
10
+ jobs:
11
+ review:
12
+ runs-on: ubuntu-latest
13
+ steps:
14
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
15
+ - uses: actions/dependency-review-action@a1d282b36b6f3519aa1f3fc636f609c47dddb294 # v5
16
+ with:
17
+ fail-on-severity: moderate
18
+ comment-summary-in-pr: on-failure
@@ -0,0 +1,39 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ jobs:
12
+ build-and-publish:
13
+ name: Build and publish to PyPI
14
+ runs-on: ubuntu-latest
15
+ environment: pypi
16
+ permissions:
17
+ contents: read
18
+ id-token: write # required for OIDC trusted publishing
19
+
20
+ steps:
21
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
22
+
23
+ - name: Install uv
24
+ uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
25
+
26
+ - name: Assert tag matches pyproject.toml version
27
+ run: |
28
+ pkg_version=$(python3 -c "import tomllib; d=tomllib.load(open('pyproject.toml','rb')); print(d['project']['version'])")
29
+ tag_version="${GITHUB_REF_NAME#v}"
30
+ if [ "$pkg_version" != "$tag_version" ]; then
31
+ echo "Version mismatch: tag is v$tag_version but pyproject.toml has $pkg_version"
32
+ exit 1
33
+ fi
34
+
35
+ - name: Build sdist and wheel
36
+ run: uv build
37
+
38
+ - name: Publish to PyPI
39
+ uses: pypa/gh-action-pypi-publish@76f52bc884231f62b9a034ebfe128415bbaabdfc # v1.12.4
@@ -0,0 +1,40 @@
1
+ name: scorecard
2
+
3
+ on:
4
+ branch_protection_rule:
5
+ schedule:
6
+ - cron: "26 4 * * 1"
7
+ push:
8
+ branches: [main]
9
+
10
+ permissions: read-all
11
+
12
+ jobs:
13
+ analysis:
14
+ name: scorecard analysis
15
+ runs-on: ubuntu-latest
16
+ permissions:
17
+ security-events: write
18
+ id-token: write
19
+ contents: read
20
+ actions: read
21
+ steps:
22
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
23
+ with:
24
+ persist-credentials: false
25
+
26
+ - uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3
27
+ with:
28
+ results_file: results.sarif
29
+ results_format: sarif
30
+ publish_results: true
31
+
32
+ - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
33
+ with:
34
+ name: SARIF file
35
+ path: results.sarif
36
+ retention-days: 5
37
+
38
+ - uses: github/codeql-action/upload-sarif@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2
39
+ with:
40
+ sarif_file: results.sarif