coderio 0.4.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 (190) hide show
  1. coderio-0.4.0/.github/dependabot.yml +28 -0
  2. coderio-0.4.0/.github/workflows/ci.yml +100 -0
  3. coderio-0.4.0/.github/workflows/release.yml +122 -0
  4. coderio-0.4.0/.gitignore +41 -0
  5. coderio-0.4.0/CHANGELOG.md +390 -0
  6. coderio-0.4.0/CONTRIBUTING.md +83 -0
  7. coderio-0.4.0/LICENSE +21 -0
  8. coderio-0.4.0/PKG-INFO +490 -0
  9. coderio-0.4.0/README.md +442 -0
  10. coderio-0.4.0/README_en.md +445 -0
  11. coderio-0.4.0/THIRD_PARTY_LICENSES.md +18 -0
  12. coderio-0.4.0/docs/coderio-architecture.md +446 -0
  13. coderio-0.4.0/pyproject.toml +234 -0
  14. coderio-0.4.0/scripts/verify_deepagent_live.py +85 -0
  15. coderio-0.4.0/scripts/verify_harness_live.py +136 -0
  16. coderio-0.4.0/src/coderio/__init__.py +14 -0
  17. coderio-0.4.0/src/coderio/agent/__init__.py +5 -0
  18. coderio-0.4.0/src/coderio/agent/_deepagents_compat.py +139 -0
  19. coderio-0.4.0/src/coderio/agent/command_review.py +140 -0
  20. coderio-0.4.0/src/coderio/agent/deep_loop.py +758 -0
  21. coderio-0.4.0/src/coderio/agent/harness.py +768 -0
  22. coderio-0.4.0/src/coderio/agent/harness_middleware.py +293 -0
  23. coderio-0.4.0/src/coderio/agent/permission_middleware.py +52 -0
  24. coderio-0.4.0/src/coderio/agent/prompts.py +304 -0
  25. coderio-0.4.0/src/coderio/agent/skill_tool.py +70 -0
  26. coderio-0.4.0/src/coderio/agent/state.py +144 -0
  27. coderio-0.4.0/src/coderio/agent/stream.py +93 -0
  28. coderio-0.4.0/src/coderio/cli/__init__.py +0 -0
  29. coderio-0.4.0/src/coderio/cli/app.py +257 -0
  30. coderio-0.4.0/src/coderio/cli/commands.py +339 -0
  31. coderio-0.4.0/src/coderio/cli/credentials.py +70 -0
  32. coderio-0.4.0/src/coderio/cli/mcp_cmd.py +227 -0
  33. coderio-0.4.0/src/coderio/cli/multimodal.py +94 -0
  34. coderio-0.4.0/src/coderio/cli/onboarding.py +270 -0
  35. coderio-0.4.0/src/coderio/cli/providers.py +113 -0
  36. coderio-0.4.0/src/coderio/cli/render.py +28 -0
  37. coderio-0.4.0/src/coderio/cli/repl.py +189 -0
  38. coderio-0.4.0/src/coderio/cli/run_cmd.py +171 -0
  39. coderio-0.4.0/src/coderio/cli/skills_cmd.py +77 -0
  40. coderio-0.4.0/src/coderio/cli/stream.py +224 -0
  41. coderio-0.4.0/src/coderio/cli/tui.py +1584 -0
  42. coderio-0.4.0/src/coderio/cli/tui_onboarding.py +465 -0
  43. coderio-0.4.0/src/coderio/cli/tui_screens.py +334 -0
  44. coderio-0.4.0/src/coderio/cli/tui_widgets.py +453 -0
  45. coderio-0.4.0/src/coderio/config/__init__.py +21 -0
  46. coderio-0.4.0/src/coderio/config/bootstrap.py +38 -0
  47. coderio-0.4.0/src/coderio/config/loader.py +273 -0
  48. coderio-0.4.0/src/coderio/config/models.py +193 -0
  49. coderio-0.4.0/src/coderio/config/trust.py +136 -0
  50. coderio-0.4.0/src/coderio/llm/__init__.py +3 -0
  51. coderio-0.4.0/src/coderio/llm/factory.py +164 -0
  52. coderio-0.4.0/src/coderio/llm/probe.py +153 -0
  53. coderio-0.4.0/src/coderio/mcp_loader.py +274 -0
  54. coderio-0.4.0/src/coderio/session/__init__.py +3 -0
  55. coderio-0.4.0/src/coderio/session/message.py +79 -0
  56. coderio-0.4.0/src/coderio/session/store.py +244 -0
  57. coderio-0.4.0/src/coderio/skills/__init__.py +4 -0
  58. coderio-0.4.0/src/coderio/skills/bundled/executing-plans/SKILL.md +15 -0
  59. coderio-0.4.0/src/coderio/skills/lion-skills/LICENSE +21 -0
  60. coderio-0.4.0/src/coderio/skills/lion-skills/README.md +114 -0
  61. coderio-0.4.0/src/coderio/skills/lion-skills/skills/clarifying-questions/SKILL.md +119 -0
  62. coderio-0.4.0/src/coderio/skills/lion-skills/skills/clarifying-questions/evals/evals.json +40 -0
  63. coderio-0.4.0/src/coderio/skills/lion-skills/skills/code-review/SKILL.md +102 -0
  64. coderio-0.4.0/src/coderio/skills/lion-skills/skills/code-review/evals/evals.json +40 -0
  65. coderio-0.4.0/src/coderio/skills/lion-skills/skills/commit-message/SKILL.md +97 -0
  66. coderio-0.4.0/src/coderio/skills/lion-skills/skills/commit-message/evals/evals.json +20 -0
  67. coderio-0.4.0/src/coderio/skills/lion-skills/skills/debugging/SKILL.md +116 -0
  68. coderio-0.4.0/src/coderio/skills/lion-skills/skills/debugging/evals/evals.json +40 -0
  69. coderio-0.4.0/src/coderio/skills/lion-skills/skills/error-handling/SKILL.md +74 -0
  70. coderio-0.4.0/src/coderio/skills/lion-skills/skills/error-handling/evals/evals.json +20 -0
  71. coderio-0.4.0/src/coderio/skills/lion-skills/skills/lion-writing-skills/SKILL.md +85 -0
  72. coderio-0.4.0/src/coderio/skills/lion-skills/skills/lion-writing-skills/evals/evals.json +20 -0
  73. coderio-0.4.0/src/coderio/skills/lion-skills/skills/naming/SKILL.md +85 -0
  74. coderio-0.4.0/src/coderio/skills/lion-skills/skills/naming/evals/evals.json +20 -0
  75. coderio-0.4.0/src/coderio/skills/lion-skills/skills/onboarding-unknown-codebase/SKILL.md +95 -0
  76. coderio-0.4.0/src/coderio/skills/lion-skills/skills/onboarding-unknown-codebase/evals/evals.json +20 -0
  77. coderio-0.4.0/src/coderio/skills/lion-skills/skills/spec-writing/SKILL.md +154 -0
  78. coderio-0.4.0/src/coderio/skills/lion-skills/skills/spec-writing/evals/evals.json +40 -0
  79. coderio-0.4.0/src/coderio/skills/lion-skills/skills/task-breakdown/SKILL.md +134 -0
  80. coderio-0.4.0/src/coderio/skills/lion-skills/skills/task-breakdown/evals/evals.json +46 -0
  81. coderio-0.4.0/src/coderio/skills/lion-skills/skills/testing/SKILL.md +134 -0
  82. coderio-0.4.0/src/coderio/skills/lion-skills/skills/testing/evals/evals.json +40 -0
  83. coderio-0.4.0/src/coderio/skills/lion-skills/skills/verify-and-fix/SKILL.md +132 -0
  84. coderio-0.4.0/src/coderio/skills/lion-skills/skills/verify-and-fix/evals/evals.json +40 -0
  85. coderio-0.4.0/src/coderio/skills/models.py +66 -0
  86. coderio-0.4.0/src/coderio/skills/parser.py +50 -0
  87. coderio-0.4.0/src/coderio/skills/store.py +102 -0
  88. coderio-0.4.0/src/coderio/tools/__init__.py +94 -0
  89. coderio-0.4.0/src/coderio/tools/base.py +55 -0
  90. coderio-0.4.0/src/coderio/tools/bash.py +168 -0
  91. coderio-0.4.0/src/coderio/tools/command_policy.py +364 -0
  92. coderio-0.4.0/src/coderio/tools/edit_file.py +55 -0
  93. coderio-0.4.0/src/coderio/tools/glob_tool.py +21 -0
  94. coderio-0.4.0/src/coderio/tools/grep_tool.py +90 -0
  95. coderio-0.4.0/src/coderio/tools/linux_sandbox.py +196 -0
  96. coderio-0.4.0/src/coderio/tools/list_dir.py +58 -0
  97. coderio-0.4.0/src/coderio/tools/multi_edit.py +62 -0
  98. coderio-0.4.0/src/coderio/tools/note.py +72 -0
  99. coderio-0.4.0/src/coderio/tools/permission.py +214 -0
  100. coderio-0.4.0/src/coderio/tools/read_file.py +51 -0
  101. coderio-0.4.0/src/coderio/tools/sandbox_runner.py +113 -0
  102. coderio-0.4.0/src/coderio/tools/todo.py +71 -0
  103. coderio-0.4.0/src/coderio/tools/web_fetch.py +188 -0
  104. coderio-0.4.0/src/coderio/tools/web_search.py +49 -0
  105. coderio-0.4.0/src/coderio/tools/win_job.py +214 -0
  106. coderio-0.4.0/src/coderio/tools/win_sandbox.py +639 -0
  107. coderio-0.4.0/src/coderio/tools/write_file.py +25 -0
  108. coderio-0.4.0/tests/__init__.py +0 -0
  109. coderio-0.4.0/tests/agent/__init__.py +0 -0
  110. coderio-0.4.0/tests/agent/conftest.py +121 -0
  111. coderio-0.4.0/tests/agent/test_command_review.py +237 -0
  112. coderio-0.4.0/tests/agent/test_deep_integration.py +387 -0
  113. coderio-0.4.0/tests/agent/test_deep_loop.py +234 -0
  114. coderio-0.4.0/tests/agent/test_deep_loop_unit.py +454 -0
  115. coderio-0.4.0/tests/agent/test_deepagents_compat.py +201 -0
  116. coderio-0.4.0/tests/agent/test_harness.py +818 -0
  117. coderio-0.4.0/tests/agent/test_harness_middleware.py +354 -0
  118. coderio-0.4.0/tests/agent/test_perf_baseline.py +155 -0
  119. coderio-0.4.0/tests/agent/test_prompts.py +179 -0
  120. coderio-0.4.0/tests/agent/test_skill_tool.py +68 -0
  121. coderio-0.4.0/tests/agent/test_state.py +111 -0
  122. coderio-0.4.0/tests/agent/test_stream.py +251 -0
  123. coderio-0.4.0/tests/cli/__init__.py +0 -0
  124. coderio-0.4.0/tests/cli/test_app.py +24 -0
  125. coderio-0.4.0/tests/cli/test_command_menu.py +224 -0
  126. coderio-0.4.0/tests/cli/test_commands.py +283 -0
  127. coderio-0.4.0/tests/cli/test_credentials.py +39 -0
  128. coderio-0.4.0/tests/cli/test_input_isolation.py +69 -0
  129. coderio-0.4.0/tests/cli/test_live_thinking.py +201 -0
  130. coderio-0.4.0/tests/cli/test_mcp_cmd.py +244 -0
  131. coderio-0.4.0/tests/cli/test_multimodal.py +79 -0
  132. coderio-0.4.0/tests/cli/test_onboarding.py +130 -0
  133. coderio-0.4.0/tests/cli/test_onboarding_logic.py +152 -0
  134. coderio-0.4.0/tests/cli/test_providers.py +65 -0
  135. coderio-0.4.0/tests/cli/test_render.py +30 -0
  136. coderio-0.4.0/tests/cli/test_repl_loop.py +49 -0
  137. coderio-0.4.0/tests/cli/test_repl_reset.py +65 -0
  138. coderio-0.4.0/tests/cli/test_run_cmd.py +152 -0
  139. coderio-0.4.0/tests/cli/test_skills_cmd.py +67 -0
  140. coderio-0.4.0/tests/cli/test_status_bar.py +145 -0
  141. coderio-0.4.0/tests/cli/test_stream.py +117 -0
  142. coderio-0.4.0/tests/cli/test_truncation.py +125 -0
  143. coderio-0.4.0/tests/cli/test_tui_onboarding.py +239 -0
  144. coderio-0.4.0/tests/cli/test_tui_picker.py +85 -0
  145. coderio-0.4.0/tests/cli/test_tui_screens.py +292 -0
  146. coderio-0.4.0/tests/cli/test_tui_startup.py +222 -0
  147. coderio-0.4.0/tests/cli/test_tui_widgets.py +474 -0
  148. coderio-0.4.0/tests/cli/test_ux_features.py +124 -0
  149. coderio-0.4.0/tests/config/__init__.py +0 -0
  150. coderio-0.4.0/tests/config/test_bootstrap.py +20 -0
  151. coderio-0.4.0/tests/config/test_loader.py +383 -0
  152. coderio-0.4.0/tests/config/test_models.py +21 -0
  153. coderio-0.4.0/tests/config/test_trust.py +93 -0
  154. coderio-0.4.0/tests/conftest.py +9 -0
  155. coderio-0.4.0/tests/e2e/__init__.py +0 -0
  156. coderio-0.4.0/tests/llm/__init__.py +0 -0
  157. coderio-0.4.0/tests/llm/test_factory.py +240 -0
  158. coderio-0.4.0/tests/llm/test_probe.py +160 -0
  159. coderio-0.4.0/tests/session/__init__.py +0 -0
  160. coderio-0.4.0/tests/session/test_message.py +81 -0
  161. coderio-0.4.0/tests/session/test_store.py +216 -0
  162. coderio-0.4.0/tests/skills/__init__.py +0 -0
  163. coderio-0.4.0/tests/skills/test_bundled.py +16 -0
  164. coderio-0.4.0/tests/skills/test_parser.py +46 -0
  165. coderio-0.4.0/tests/skills/test_skill_tools.py +101 -0
  166. coderio-0.4.0/tests/skills/test_store.py +49 -0
  167. coderio-0.4.0/tests/test_mcp_loader.py +285 -0
  168. coderio-0.4.0/tests/test_p0_stability.py +77 -0
  169. coderio-0.4.0/tests/test_repl.py +72 -0
  170. coderio-0.4.0/tests/test_version.py +38 -0
  171. coderio-0.4.0/tests/tools/__init__.py +0 -0
  172. coderio-0.4.0/tests/tools/test_bash.py +84 -0
  173. coderio-0.4.0/tests/tools/test_command_policy.py +369 -0
  174. coderio-0.4.0/tests/tools/test_concrete_gates.py +27 -0
  175. coderio-0.4.0/tests/tools/test_edit_prefix.py +33 -0
  176. coderio-0.4.0/tests/tools/test_file_tools.py +67 -0
  177. coderio-0.4.0/tests/tools/test_glob_tool.py +55 -0
  178. coderio-0.4.0/tests/tools/test_grep_tool.py +122 -0
  179. coderio-0.4.0/tests/tools/test_list_dir.py +56 -0
  180. coderio-0.4.0/tests/tools/test_multi_edit.py +144 -0
  181. coderio-0.4.0/tests/tools/test_note.py +67 -0
  182. coderio-0.4.0/tests/tools/test_permission.py +306 -0
  183. coderio-0.4.0/tests/tools/test_registry.py +20 -0
  184. coderio-0.4.0/tests/tools/test_sandbox.py +413 -0
  185. coderio-0.4.0/tests/tools/test_search_tools.py +56 -0
  186. coderio-0.4.0/tests/tools/test_todo.py +35 -0
  187. coderio-0.4.0/tests/tools/test_web.py +72 -0
  188. coderio-0.4.0/tests/tools/test_web_fetch.py +65 -0
  189. coderio-0.4.0/tests/tools/test_win_job.py +113 -0
  190. coderio-0.4.0/uv.lock +3224 -0
@@ -0,0 +1,28 @@
1
+ version: 2
2
+ updates:
3
+ # Python dependencies — checks pyproject.toml for updates
4
+ - package-ecosystem: "pip"
5
+ directory: "/"
6
+ schedule:
7
+ interval: "weekly"
8
+ open-pull-requests-limit: 5
9
+ labels:
10
+ - "dependencies"
11
+ commit-message:
12
+ prefix: "deps"
13
+ # Group minor/patch updates to reduce PR noise
14
+ groups:
15
+ minor-patch:
16
+ update-types:
17
+ - "minor"
18
+ - "patch"
19
+
20
+ # GitHub Actions — keeps workflow action versions current
21
+ - package-ecosystem: "github-actions"
22
+ directory: "/"
23
+ schedule:
24
+ interval: "weekly"
25
+ labels:
26
+ - "ci"
27
+ commit-message:
28
+ prefix: "ci"
@@ -0,0 +1,100 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ jobs:
10
+ lint:
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - uses: actions/checkout@v7
14
+ - uses: actions/setup-python@v7
15
+ with:
16
+ python-version: "3.12"
17
+ - name: Install ruff
18
+ run: pip install "ruff>=0.16"
19
+ - name: Ruff check (lint)
20
+ run: ruff check src tests
21
+ - name: Ruff format check
22
+ # --check only verifies, doesn't modify files. Fails if any file
23
+ # isn't formatted — catches "forgot to format" in PRs.
24
+ run: ruff format --check src tests
25
+
26
+ test:
27
+ runs-on: ${{ matrix.os }}
28
+ strategy:
29
+ fail-fast: false
30
+ matrix:
31
+ os: [ubuntu-latest, windows-latest, macos-latest]
32
+ python-version: ["3.11", "3.12"]
33
+
34
+ env:
35
+ # Windows runners default to cp1252; Rich/Textual output contains CJK
36
+ # text (Chinese UI strings) that charmap can't encode. Force UTF-8 so
37
+ # `coderio --help` and subprocess-based tests don't crash with
38
+ # UnicodeEncodeError on windows-latest.
39
+ PYTHONIOENCODING: utf-8
40
+ PYTHONUTF8: "1"
41
+
42
+ steps:
43
+ - uses: actions/checkout@v7
44
+
45
+ # uv replaces pip for dependency installation (2026-08-14 migration).
46
+ # uv.lock is a first-class lockfile for both uv and Dependabot: CI gets
47
+ # fully reproducible installs (P1-4), while Dependabot updates pyproject
48
+ # constraints AND regenerates uv.lock in its PRs — the two mechanisms
49
+ # cooperate instead of fighting (the bare requirements-dev.txt approach
50
+ # had Dependabot produce internally-inconsistent updates; see PR #6).
51
+ - uses: astral-sh/setup-uv@v7
52
+ with:
53
+ python-version: ${{ matrix.python-version }}
54
+ enable-cache: true
55
+
56
+ - name: Install dependencies (locked)
57
+ # --frozen: install EXACTLY what uv.lock pins; error if the lock is
58
+ # out of sync with pyproject.toml (forces committing both together).
59
+ # --extra dev: the dev dependency group (pytest/ruff/mypy/build).
60
+ run: uv sync --frozen --extra dev
61
+
62
+ - name: Check dependency consistency
63
+ # uv-managed venvs ship WITHOUT the pip module (uv manages installs
64
+ # itself), so `python -m pip check` fails there. `uv pip check` reads
65
+ # the same installed-package metadata via uv's own interface.
66
+ run: uv pip check
67
+
68
+ - name: Audit dependencies for known vulnerabilities
69
+ # Scans installed packages against the PyPI advisory database.
70
+ # Non-blocking (continue-on-error) — reports issues without failing CI.
71
+ shell: bash
72
+ continue-on-error: true
73
+ run: |
74
+ uv pip install pip-audit
75
+ uv run pip-audit
76
+
77
+ - name: Run tests with coverage
78
+ # Enforces a coverage floor so coverage can't silently regress.
79
+ # The 70% floor is conservative (current baseline is ~75%) — it catches
80
+ # gross regressions (a module losing its tests) without failing on
81
+ # minor fluctuations. pyproject.toml's [tool.coverage.report]
82
+ # fail_under=60 is the local-dev default; CI enforces the stricter 70%.
83
+ shell: bash
84
+ run: |
85
+ uv run python -m pytest -q --cov=coderio --cov-report=term-missing --cov-fail-under=70
86
+
87
+ - name: Type check (mypy)
88
+ # HARD GATE for clean modules. pyproject.toml's [[tool.mypy.overrides]]
89
+ # lists modules with known type issues (ignore_errors=true) — each is a
90
+ # tracked cleanup TODO. Modules NOT in that list must stay type-clean,
91
+ # so new type errors in clean code fail CI.
92
+ shell: bash
93
+ run: |
94
+ uv run python -m mypy src/coderio
95
+
96
+ - name: Build wheel (smoke)
97
+ shell: bash
98
+ run: |
99
+ uv build --wheel -o /tmp/wheel-test
100
+ echo "Wheel built successfully"
@@ -0,0 +1,122 @@
1
+ name: Release
2
+
3
+ # Triggered by pushing a tag like v0.4.0. Builds wheel + sdist, runs the test
4
+ # suite, verifies both artifacts in a clean venv, publishes to PyPI (Trusted
5
+ # Publishing, no token) and attaches both to a GitHub Release.
6
+ #
7
+ # To cut a release:
8
+ # git tag v0.4.0
9
+ # git push origin v0.4.0
10
+ #
11
+ # PyPI publishing uses Trusted Publishing (OIDC). One-time setup (repo owner):
12
+ # pypi.org → Account settings → Publishing → Add a new pending publisher:
13
+ # PyPI project name: coderio
14
+ # Owner: Lion-1209 / Repository: coderio
15
+ # Workflow name: release.yml / Environment: pypi
16
+ # Then create the "pypi" environment in the repo (Settings → Environments).
17
+
18
+ on:
19
+ push:
20
+ tags:
21
+ - "v*"
22
+
23
+ permissions:
24
+ contents: write # needed to create the release + upload assets
25
+
26
+ jobs:
27
+ # Test gate: a tag is a release — it must not ship broken code. The CI
28
+ # workflow covers pushes/PRs, but a tag could be cut from a commit that
29
+ # predates a fix; this gate makes the release itself fail loudly instead.
30
+ test:
31
+ runs-on: ubuntu-latest
32
+ steps:
33
+ - uses: actions/checkout@v7
34
+ - uses: astral-sh/setup-uv@v7
35
+ with:
36
+ python-version: "3.12"
37
+ enable-cache: true
38
+ - name: Run test suite
39
+ run: |
40
+ uv sync --frozen --extra dev
41
+ uv run python -m pytest -q
42
+
43
+ release:
44
+ needs: test
45
+ runs-on: ubuntu-latest
46
+ steps:
47
+ - uses: actions/checkout@v7
48
+
49
+ - uses: actions/setup-python@v7
50
+ with:
51
+ python-version: "3.12"
52
+
53
+ - name: Build wheel + sdist
54
+ run: |
55
+ pip install build
56
+ python -m build
57
+
58
+ - name: Verify wheel in clean venv (full deps)
59
+ # Install the wheel WITH all dependencies (not --no-deps) to verify
60
+ # the full user install path. Then run --help + import the deepagents
61
+ # engine + verify bundled skills. This catches missing deps that the
62
+ # old --no-deps + manual 5-package approach missed.
63
+ run: |
64
+ python -m venv /tmp/wheel-test-venv
65
+ /tmp/wheel-test-venv/bin/pip install dist/*.whl
66
+ /tmp/wheel-test-venv/bin/coderio --help
67
+ /tmp/wheel-test-venv/bin/coderio run --help
68
+ # Verify the deepagents engine imports (the production path).
69
+ /tmp/wheel-test-venv/bin/python -c "
70
+ from coderio.agent.deep_loop import run_deep_agent
71
+ from coderio.agent.harness_middleware import HarnessMiddleware
72
+ from coderio.agent.permission_middleware import PermissionMiddleware
73
+ from coderio.cli.tui import CoderioTUI
74
+ print('deepagents engine imports OK')
75
+ "
76
+ # Verify bundled skills are importable from the installed package.
77
+ /tmp/wheel-test-venv/bin/python -c "
78
+ from coderio.skills.store import load_skill_store
79
+ from pathlib import Path
80
+ import coderio
81
+ pkg = Path(coderio.__file__).parent / 'skills'
82
+ store = load_skill_store(pkg, 0, None)
83
+ assert len(store.names()) > 0, 'no bundled skills found'
84
+ print(f'{len(store.names())} bundled skills OK')
85
+ "
86
+
87
+ - name: Verify sdist installs
88
+ # sdist is the source-of-truth artifact; verify it installs and runs
89
+ # too (a broken sdist — missing files, bad metadata — only shows up
90
+ # at install time).
91
+ run: |
92
+ python -m venv /tmp/sdist-test-venv
93
+ /tmp/sdist-test-venv/bin/pip install dist/*.tar.gz
94
+ /tmp/sdist-test-venv/bin/coderio --help
95
+
96
+ - name: Create GitHub Release + attach artifacts
97
+ uses: softprops/action-gh-release@v3
98
+ with:
99
+ generate_release_notes: true
100
+ files: dist/*.whl dist/*.tar.gz
101
+
102
+ publish-pypi:
103
+ # PyPI via Trusted Publishing (OIDC) — no API token to manage or leak.
104
+ # Requires the one-time pending-publisher setup described at the top.
105
+ needs: release
106
+ runs-on: ubuntu-latest
107
+ environment: pypi
108
+ permissions:
109
+ id-token: write # OIDC token for Trusted Publishing
110
+ steps:
111
+ - uses: actions/checkout@v7
112
+ - uses: actions/setup-python@v7
113
+ with:
114
+ python-version: "3.12"
115
+ - name: Build (same commit as the verified artifacts)
116
+ run: |
117
+ pip install build
118
+ python -m build
119
+ - name: Publish to PyPI
120
+ uses: pypa/gh-action-pypi-publish@release/v1
121
+ with:
122
+ attestations: true
@@ -0,0 +1,41 @@
1
+ # OS
2
+ .DS_Store
3
+ Thumbs.db
4
+ desktop.ini
5
+
6
+ # IDE / Editor
7
+ .vscode/
8
+ .idea/
9
+ *.swp
10
+ *.swo
11
+
12
+ # Node
13
+ node_modules/
14
+ npm-debug.log*
15
+ yarn-debug.log*
16
+ yarn-error.log*
17
+
18
+ # Python
19
+ __pycache__/
20
+ *.py[cod]
21
+ .venv/
22
+ venv/
23
+ *.egg-info/
24
+ build/
25
+ dist/
26
+
27
+ # Testing / linting
28
+ .pytest_cache/
29
+ .mypy_cache/
30
+ .coverage
31
+ coverage.xml
32
+ htmlcov/
33
+
34
+ # coderio user data (project-local layer)
35
+ .coderio/
36
+
37
+ # Misc
38
+ *.log
39
+ .tmp/
40
+ tmp/
41
+ .zcode/