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.
- milknado-0.1.0/.agents/plugins/marketplace.json +18 -0
- milknado-0.1.0/.claude-plugin/marketplace.json +12 -0
- milknado-0.1.0/.github/ISSUE_TEMPLATE/bug_report.yml +70 -0
- milknado-0.1.0/.github/ISSUE_TEMPLATE/config.yml +8 -0
- milknado-0.1.0/.github/ISSUE_TEMPLATE/feature_request.yml +39 -0
- milknado-0.1.0/.github/PULL_REQUEST_TEMPLATE.md +29 -0
- milknado-0.1.0/.github/copilot-instructions.md +72 -0
- milknado-0.1.0/.github/dependabot.yml +21 -0
- milknado-0.1.0/.github/instructions/code-review.instructions.md +31 -0
- milknado-0.1.0/.github/instructions/coding-agent.instructions.md +26 -0
- milknado-0.1.0/.github/instructions/python.instructions.md +10 -0
- milknado-0.1.0/.github/workflows/ci.yml +54 -0
- milknado-0.1.0/.github/workflows/codeql.yml +42 -0
- milknado-0.1.0/.github/workflows/dependency-review.yml +18 -0
- milknado-0.1.0/.github/workflows/release.yml +39 -0
- milknado-0.1.0/.github/workflows/scorecard.yml +40 -0
- milknado-0.1.0/.gitignore +224 -0
- milknado-0.1.0/.hallouminate/config.toml +21 -0
- milknado-0.1.0/.hallouminate/wiki/architecture/adapters.md +103 -0
- milknado-0.1.0/.hallouminate/wiki/architecture/batching.md +98 -0
- milknado-0.1.0/.hallouminate/wiki/architecture/distribution.md +55 -0
- milknado-0.1.0/.hallouminate/wiki/architecture/entry-points.md +83 -0
- milknado-0.1.0/.hallouminate/wiki/architecture/execution.md +306 -0
- milknado-0.1.0/.hallouminate/wiki/architecture/graph.md +146 -0
- milknado-0.1.0/.hallouminate/wiki/architecture/index.md +11 -0
- milknado-0.1.0/.hallouminate/wiki/architecture/planning.md +122 -0
- milknado-0.1.0/.hallouminate/wiki/conventions/build-and-gates.md +66 -0
- milknado-0.1.0/.hallouminate/wiki/conventions/code-style.md +57 -0
- milknado-0.1.0/.hallouminate/wiki/conventions/index.md +6 -0
- milknado-0.1.0/.hallouminate/wiki/history/index.md +9 -0
- milknado-0.1.0/.hallouminate/wiki/history/loop-vendor-in-decision.md +31 -0
- milknado-0.1.0/.hallouminate/wiki/history/nih-decisions.md +46 -0
- milknado-0.1.0/.hallouminate/wiki/history/pr137-loop-vendor-in.md +33 -0
- milknado-0.1.0/.hallouminate/wiki/history/pr94-refactor-split.md +44 -0
- milknado-0.1.0/.hallouminate/wiki/history/review-lessons.md +150 -0
- milknado-0.1.0/.hallouminate/wiki/index.md +35 -0
- milknado-0.1.0/.mcp.json +25 -0
- milknado-0.1.0/AGENTS.md +112 -0
- milknado-0.1.0/CLAUDE.md +1 -0
- milknado-0.1.0/CODE_OF_CONDUCT.md +41 -0
- milknado-0.1.0/CONTRIBUTING.md +48 -0
- milknado-0.1.0/LICENSE +21 -0
- milknado-0.1.0/PKG-INFO +15 -0
- milknado-0.1.0/README.md +53 -0
- milknado-0.1.0/SECURITY.md +38 -0
- milknado-0.1.0/codecov.yml +10 -0
- milknado-0.1.0/integrations/README.md +23 -0
- milknado-0.1.0/integrations/codex/README.md +34 -0
- milknado-0.1.0/integrations/codex/config.toml.example +14 -0
- milknado-0.1.0/integrations/cursor-milknado/.cursor-plugin/plugin.json +8 -0
- milknado-0.1.0/integrations/cursor-milknado/README.md +22 -0
- milknado-0.1.0/integrations/cursor-milknado/commands/milknado-agents-check.md +12 -0
- milknado-0.1.0/integrations/cursor-milknado/commands/milknado-plan.md +14 -0
- milknado-0.1.0/integrations/cursor-milknado/commands/milknado-run.md +14 -0
- milknado-0.1.0/integrations/cursor-milknado/commands/milknado-status.md +10 -0
- milknado-0.1.0/integrations/cursor-milknado/mcp.json +15 -0
- milknado-0.1.0/integrations/cursor-milknado/skills/milknado/SKILL.md +24 -0
- milknado-0.1.0/integrations/gemini-milknado/README.md +41 -0
- milknado-0.1.0/integrations/gemini-milknado/commands/milknado_agents_check.toml +7 -0
- milknado-0.1.0/integrations/gemini-milknado/commands/milknado_plan.toml +9 -0
- milknado-0.1.0/integrations/gemini-milknado/commands/milknado_run.toml +9 -0
- milknado-0.1.0/integrations/gemini-milknado/commands/milknado_status.toml +9 -0
- milknado-0.1.0/integrations/gemini-milknado/gemini-extension.json +17 -0
- milknado-0.1.0/integrations/spec/commands.yaml +54 -0
- milknado-0.1.0/integrations/spec/generate_integrations.py +81 -0
- milknado-0.1.0/integrations/spec/templates/cursor-command.md.tmpl +11 -0
- milknado-0.1.0/integrations/spec/templates/gemini-command.toml.tmpl +7 -0
- milknado-0.1.0/justfile +191 -0
- milknado-0.1.0/milknado.toml +12 -0
- milknado-0.1.0/plugins/milknado/.claude-plugin/plugin.json +5 -0
- milknado-0.1.0/plugins/milknado/.codex-plugin/plugin.json +5 -0
- milknado-0.1.0/plugins/milknado/.mcp.json +1 -0
- milknado-0.1.0/plugins/milknado/skills/harvest/SKILL.md +59 -0
- milknado-0.1.0/plugins/milknado/skills/load-roadmap/SKILL.md +53 -0
- milknado-0.1.0/plugins/milknado/skills/milknado-config/SKILL.md +189 -0
- milknado-0.1.0/plugins/milknado/skills/milknado-config/references/flavor-presets.md +169 -0
- milknado-0.1.0/pyproject.toml +52 -0
- milknado-0.1.0/scripts/mock_planner.py +46 -0
- milknado-0.1.0/src/milknado/__init__.py +3 -0
- milknado-0.1.0/src/milknado/_cli_helpers.py +61 -0
- milknado-0.1.0/src/milknado/_mcp_core.py +173 -0
- milknado-0.1.0/src/milknado/_ralph_node_runner.py +91 -0
- milknado-0.1.0/src/milknado/_vendor/README.md +20 -0
- milknado-0.1.0/src/milknado/_vendor/tiktoken-cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +100256 -0
- milknado-0.1.0/src/milknado/adapters/__init__.py +5 -0
- milknado-0.1.0/src/milknado/adapters/crg.py +153 -0
- milknado-0.1.0/src/milknado/adapters/git.py +167 -0
- milknado-0.1.0/src/milknado/adapters/loop.py +479 -0
- milknado-0.1.0/src/milknado/adapters/tilth.py +149 -0
- milknado-0.1.0/src/milknado/app/__init__.py +1 -0
- milknado-0.1.0/src/milknado/app/run_command.py +39 -0
- milknado-0.1.0/src/milknado/cli.py +233 -0
- milknado-0.1.0/src/milknado/cli_agents.py +58 -0
- milknado-0.1.0/src/milknado/cli_plan.py +417 -0
- milknado-0.1.0/src/milknado/cli_roadmap.py +65 -0
- milknado-0.1.0/src/milknado/cli_run.py +124 -0
- milknado-0.1.0/src/milknado/cli_tools.py +206 -0
- milknado-0.1.0/src/milknado/domains/__init__.py +0 -0
- milknado-0.1.0/src/milknado/domains/batching/README.md +345 -0
- milknado-0.1.0/src/milknado/domains/batching/__init__.py +33 -0
- milknado-0.1.0/src/milknado/domains/batching/_model.py +193 -0
- milknado-0.1.0/src/milknado/domains/batching/_tarjan.py +103 -0
- milknado-0.1.0/src/milknado/domains/batching/change.py +97 -0
- milknado-0.1.0/src/milknado/domains/batching/graph_build.py +282 -0
- milknado-0.1.0/src/milknado/domains/batching/solver.py +299 -0
- milknado-0.1.0/src/milknado/domains/batching/weights.py +178 -0
- milknado-0.1.0/src/milknado/domains/common/__init__.py +47 -0
- milknado-0.1.0/src/milknado/domains/common/agent_argv.py +204 -0
- milknado-0.1.0/src/milknado/domains/common/config.py +558 -0
- milknado-0.1.0/src/milknado/domains/common/doctor.py +94 -0
- milknado-0.1.0/src/milknado/domains/common/errors.py +115 -0
- milknado-0.1.0/src/milknado/domains/common/flavor_profile.py +72 -0
- milknado-0.1.0/src/milknado/domains/common/paths.py +29 -0
- milknado-0.1.0/src/milknado/domains/common/plugin.py +22 -0
- milknado-0.1.0/src/milknado/domains/common/process.py +34 -0
- milknado-0.1.0/src/milknado/domains/common/protocols.py +112 -0
- milknado-0.1.0/src/milknado/domains/common/toolchain.py +88 -0
- milknado-0.1.0/src/milknado/domains/common/types.py +112 -0
- milknado-0.1.0/src/milknado/domains/dispatch/__init__.py +51 -0
- milknado-0.1.0/src/milknado/domains/dispatch/_runstate.py +78 -0
- milknado-0.1.0/src/milknado/domains/dispatch/async_run.py +172 -0
- milknado-0.1.0/src/milknado/domains/dispatch/brief.py +73 -0
- milknado-0.1.0/src/milknado/domains/dispatch/cancel.py +160 -0
- milknado-0.1.0/src/milknado/domains/dispatch/lifecycle.py +123 -0
- milknado-0.1.0/src/milknado/domains/dispatch/reconcile.py +156 -0
- milknado-0.1.0/src/milknado/domains/dispatch/runner.py +285 -0
- milknado-0.1.0/src/milknado/domains/execution/__init__.py +23 -0
- milknado-0.1.0/src/milknado/domains/execution/_context.py +49 -0
- milknado-0.1.0/src/milknado/domains/execution/executor.py +521 -0
- milknado-0.1.0/src/milknado/domains/execution/headless.py +87 -0
- milknado-0.1.0/src/milknado/domains/execution/run_loop/__init__.py +330 -0
- milknado-0.1.0/src/milknado/domains/execution/run_loop/_completion.py +67 -0
- milknado-0.1.0/src/milknado/domains/execution/run_loop/_logging.py +33 -0
- milknado-0.1.0/src/milknado/domains/execution/run_loop/_result.py +22 -0
- milknado-0.1.0/src/milknado/domains/execution/run_loop/display.py +180 -0
- milknado-0.1.0/src/milknado/domains/execution/run_loop/input.py +91 -0
- milknado-0.1.0/src/milknado/domains/graph/__init__.py +4 -0
- milknado-0.1.0/src/milknado/domains/graph/_analytics_facade.py +50 -0
- milknado-0.1.0/src/milknado/domains/graph/_mutations.py +198 -0
- milknado-0.1.0/src/milknado/domains/graph/_persistence.py +613 -0
- milknado-0.1.0/src/milknado/domains/graph/_transitions.py +161 -0
- milknado-0.1.0/src/milknado/domains/graph/display.py +152 -0
- milknado-0.1.0/src/milknado/domains/graph/graph.py +612 -0
- milknado-0.1.0/src/milknado/domains/graph/runnability.py +101 -0
- milknado-0.1.0/src/milknado/domains/graph/status_flow.py +79 -0
- milknado-0.1.0/src/milknado/domains/graph/traversals.py +36 -0
- milknado-0.1.0/src/milknado/domains/planning/__init__.py +19 -0
- milknado-0.1.0/src/milknado/domains/planning/batching_bridge.py +142 -0
- milknado-0.1.0/src/milknado/domains/planning/context.py +314 -0
- milknado-0.1.0/src/milknado/domains/planning/manifest.py +321 -0
- milknado-0.1.0/src/milknado/domains/planning/planner.py +202 -0
- milknado-0.1.0/src/milknado/domains/planning/telemetry.py +58 -0
- milknado-0.1.0/src/milknado/domains/wiki/__init__.py +17 -0
- milknado-0.1.0/src/milknado/domains/wiki/_serialize.py +110 -0
- milknado-0.1.0/src/milknado/domains/wiki/exporter.py +225 -0
- milknado-0.1.0/src/milknado/domains/wiki/importer.py +154 -0
- milknado-0.1.0/src/milknado/loop/__init__.py +20 -0
- milknado-0.1.0/src/milknado/loop/_agent.py +1134 -0
- milknado-0.1.0/src/milknado/loop/_events.py +336 -0
- milknado-0.1.0/src/milknado/loop/_frontmatter.py +165 -0
- milknado-0.1.0/src/milknado/loop/_output.py +137 -0
- milknado-0.1.0/src/milknado/loop/_promise.py +24 -0
- milknado-0.1.0/src/milknado/loop/_resolver.py +91 -0
- milknado-0.1.0/src/milknado/loop/_run_types.py +235 -0
- milknado-0.1.0/src/milknado/loop/_runner.py +70 -0
- milknado-0.1.0/src/milknado/loop/_wind_down_shim.py +130 -0
- milknado-0.1.0/src/milknado/loop/adapters/__init__.py +76 -0
- milknado-0.1.0/src/milknado/loop/adapters/_generic.py +79 -0
- milknado-0.1.0/src/milknado/loop/adapters/_protocol.py +148 -0
- milknado-0.1.0/src/milknado/loop/adapters/claude.py +230 -0
- milknado-0.1.0/src/milknado/loop/adapters/codex.py +255 -0
- milknado-0.1.0/src/milknado/loop/adapters/copilot.py +158 -0
- milknado-0.1.0/src/milknado/loop/adapters/crush.py +129 -0
- milknado-0.1.0/src/milknado/loop/adapters/opencode.py +186 -0
- milknado-0.1.0/src/milknado/loop/engine.py +582 -0
- milknado-0.1.0/src/milknado/loop/hooks.py +244 -0
- milknado-0.1.0/src/milknado/loop/manager.py +256 -0
- milknado-0.1.0/src/milknado/mcp_ralph.py +240 -0
- milknado-0.1.0/src/milknado/mcp_run.py +273 -0
- milknado-0.1.0/src/milknado/mcp_server.py +248 -0
- milknado-0.1.0/src/milknado/mcp_todo.py +163 -0
- milknado-0.1.0/src/milknado/mcp_todo_mutate.py +237 -0
- milknado-0.1.0/src/milknado/mcp_wiki.py +62 -0
- milknado-0.1.0/src/milknado/plugins/__init__.py +4 -0
- milknado-0.1.0/src/milknado/plugins/loader.py +55 -0
- milknado-0.1.0/src/milknado/plugins/scaffold.py +81 -0
- milknado-0.1.0/tests/__init__.py +0 -0
- milknado-0.1.0/tests/adversarial/__init__.py +0 -0
- milknado-0.1.0/tests/adversarial/test_bridge_chaos.py +168 -0
- milknado-0.1.0/tests/adversarial/test_cli_chaos.py +254 -0
- milknado-0.1.0/tests/adversarial/test_context_chaos.py +166 -0
- milknado-0.1.0/tests/adversarial/test_manifest_chaos.py +306 -0
- milknado-0.1.0/tests/adversarial/test_telemetry_chaos.py +194 -0
- milknado-0.1.0/tests/adversarial/test_traversals_chaos.py +145 -0
- milknado-0.1.0/tests/batching/__init__.py +0 -0
- milknado-0.1.0/tests/batching/test_adversarial.py +448 -0
- milknado-0.1.0/tests/batching/test_change.py +123 -0
- milknado-0.1.0/tests/batching/test_graph_build.py +200 -0
- milknado-0.1.0/tests/batching/test_mcp_tool.py +329 -0
- milknado-0.1.0/tests/batching/test_press.py +587 -0
- milknado-0.1.0/tests/batching/test_solver.py +268 -0
- milknado-0.1.0/tests/batching/test_weights.py +224 -0
- milknado-0.1.0/tests/conftest.py +45 -0
- milknado-0.1.0/tests/fixtures/no_heading.md +3 -0
- milknado-0.1.0/tests/fixtures/not_md.txt +1 -0
- milknado-0.1.0/tests/fixtures/valid.md +3 -0
- milknado-0.1.0/tests/loop/__init__.py +0 -0
- milknado-0.1.0/tests/loop/conftest.py +18 -0
- milknado-0.1.0/tests/loop/fixtures/__init__.py +0 -0
- milknado-0.1.0/tests/loop/fixtures/adapters/claude_basic_run.jsonl +8 -0
- milknado-0.1.0/tests/loop/fixtures/adapters/codex_basic_run.jsonl +7 -0
- milknado-0.1.0/tests/loop/fixtures/adapters/copilot_basic_run.jsonl +5 -0
- milknado-0.1.0/tests/loop/fixtures/adapters/opencode_basic_run.jsonl +7 -0
- milknado-0.1.0/tests/loop/helpers.py +242 -0
- milknado-0.1.0/tests/loop/test_adapters_claude.py +190 -0
- milknado-0.1.0/tests/loop/test_adapters_codex.py +173 -0
- milknado-0.1.0/tests/loop/test_adapters_copilot.py +135 -0
- milknado-0.1.0/tests/loop/test_adapters_crush.py +116 -0
- milknado-0.1.0/tests/loop/test_adapters_golden.py +158 -0
- milknado-0.1.0/tests/loop/test_adapters_opencode.py +184 -0
- milknado-0.1.0/tests/loop/test_adapters_registry.py +57 -0
- milknado-0.1.0/tests/loop/test_agent.py +1826 -0
- milknado-0.1.0/tests/loop/test_engine.py +1713 -0
- milknado-0.1.0/tests/loop/test_events.py +222 -0
- milknado-0.1.0/tests/loop/test_frontmatter.py +271 -0
- milknado-0.1.0/tests/loop/test_hooks.py +183 -0
- milknado-0.1.0/tests/loop/test_manager.py +438 -0
- milknado-0.1.0/tests/loop/test_output.py +163 -0
- milknado-0.1.0/tests/loop/test_promise.py +42 -0
- milknado-0.1.0/tests/loop/test_resolver.py +216 -0
- milknado-0.1.0/tests/loop/test_run_types.py +284 -0
- milknado-0.1.0/tests/loop/test_runner.py +116 -0
- milknado-0.1.0/tests/loop/test_turn_cap.py +373 -0
- milknado-0.1.0/tests/loop/test_wind_down_shim.py +92 -0
- milknado-0.1.0/tests/test_adapters_crg.py +387 -0
- milknado-0.1.0/tests/test_adapters_git.py +275 -0
- milknado-0.1.0/tests/test_adapters_loop.py +633 -0
- milknado-0.1.0/tests/test_agent_argv.py +322 -0
- milknado-0.1.0/tests/test_cli.py +1845 -0
- milknado-0.1.0/tests/test_cli_agents.py +61 -0
- milknado-0.1.0/tests/test_cli_pty_smoke.py +169 -0
- milknado-0.1.0/tests/test_cli_roadmap.py +87 -0
- milknado-0.1.0/tests/test_config.py +247 -0
- milknado-0.1.0/tests/test_config_layered.py +471 -0
- milknado-0.1.0/tests/test_config_self_parse.py +96 -0
- milknado-0.1.0/tests/test_display.py +198 -0
- milknado-0.1.0/tests/test_doctor.py +94 -0
- milknado-0.1.0/tests/test_e2e_sonnet_worker.py +165 -0
- milknado-0.1.0/tests/test_errors.py +184 -0
- milknado-0.1.0/tests/test_execution.py +1228 -0
- milknado-0.1.0/tests/test_executor_duration.py +355 -0
- milknado-0.1.0/tests/test_executor_merge_back.py +412 -0
- milknado-0.1.0/tests/test_flavor_config.py +674 -0
- milknado-0.1.0/tests/test_graph.py +776 -0
- milknado-0.1.0/tests/test_graph_claim.py +298 -0
- milknado-0.1.0/tests/test_graph_persistence.py +458 -0
- milknado-0.1.0/tests/test_graph_traversals.py +45 -0
- milknado-0.1.0/tests/test_graph_wiki_ref.py +117 -0
- milknado-0.1.0/tests/test_headless.py +140 -0
- milknado-0.1.0/tests/test_justfile.py +12 -0
- milknado-0.1.0/tests/test_loop_verifier.py +366 -0
- milknado-0.1.0/tests/test_mcp_ralph.py +749 -0
- milknado-0.1.0/tests/test_mcp_run_enhancements.py +1221 -0
- milknado-0.1.0/tests/test_mcp_server.py +2123 -0
- milknado-0.1.0/tests/test_mcp_wiki.py +79 -0
- milknado-0.1.0/tests/test_mega_batch_detection.py +73 -0
- milknado-0.1.0/tests/test_node_kind_hierarchy.py +898 -0
- milknado-0.1.0/tests/test_paths.py +75 -0
- milknado-0.1.0/tests/test_planning.py +1138 -0
- milknado-0.1.0/tests/test_planning_batching_bridge.py +382 -0
- milknado-0.1.0/tests/test_planning_telemetry.py +223 -0
- milknado-0.1.0/tests/test_plugin_manifests.py +272 -0
- milknado-0.1.0/tests/test_plugin_scaffold.py +304 -0
- milknado-0.1.0/tests/test_process.py +34 -0
- milknado-0.1.0/tests/test_prompt_prepends.py +58 -0
- milknado-0.1.0/tests/test_run_loop.py +1554 -0
- milknado-0.1.0/tests/test_run_loop_completion.py +190 -0
- milknado-0.1.0/tests/test_run_loop_input.py +244 -0
- milknado-0.1.0/tests/test_run_loop_logging.py +105 -0
- milknado-0.1.0/tests/test_tilth_adapter.py +280 -0
- milknado-0.1.0/tests/test_toolchain.py +124 -0
- milknado-0.1.0/tests/test_vendor_loop_seams.py +231 -0
- milknado-0.1.0/tests/test_weights_per_symbol.py +164 -0
- milknado-0.1.0/tests/test_wiki_exporter.py +326 -0
- milknado-0.1.0/tests/test_wiki_importer.py +241 -0
- milknado-0.1.0/tests/test_wiki_serialize.py +182 -0
- milknado-0.1.0/tests/test_worker_env.py +131 -0
- milknado-0.1.0/tests/test_worktree_shared_graph.py +757 -0
- 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,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
|