dreamcatcher 5.5.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.
- dreamcatcher-5.5.0/.agents/skills/uncoded-code-navigation/SKILL.md +113 -0
- dreamcatcher-5.5.0/.agents/skills/uncoded-consistency-review/SKILL.md +145 -0
- dreamcatcher-5.5.0/.agents/skills/uncoded-doc-navigation/SKILL.md +29 -0
- dreamcatcher-5.5.0/.claude/skills/uncoded-code-navigation/SKILL.md +113 -0
- dreamcatcher-5.5.0/.claude/skills/uncoded-consistency-review/SKILL.md +145 -0
- dreamcatcher-5.5.0/.claude/skills/uncoded-doc-navigation/SKILL.md +29 -0
- dreamcatcher-5.5.0/.gitattributes +17 -0
- dreamcatcher-5.5.0/.github/dependabot.yml +38 -0
- dreamcatcher-5.5.0/.github/workflows/ci.yml +87 -0
- dreamcatcher-5.5.0/.github/workflows/dependency-review.yml +17 -0
- dreamcatcher-5.5.0/.github/workflows/docs.yml +44 -0
- dreamcatcher-5.5.0/.github/workflows/publish.yml +57 -0
- dreamcatcher-5.5.0/.gitignore +218 -0
- dreamcatcher-5.5.0/.markdownlint-cli2.yaml +14 -0
- dreamcatcher-5.5.0/.pre-commit-config.yaml +120 -0
- dreamcatcher-5.5.0/.prettierignore +4 -0
- dreamcatcher-5.5.0/.prettierrc +4 -0
- dreamcatcher-5.5.0/.python-version +1 -0
- dreamcatcher-5.5.0/AGENTS.md +308 -0
- dreamcatcher-5.5.0/CLAUDE.md +1 -0
- dreamcatcher-5.5.0/LICENSE +21 -0
- dreamcatcher-5.5.0/PKG-INFO +38 -0
- dreamcatcher-5.5.0/README.md +17 -0
- dreamcatcher-5.5.0/docs/architecture.md +641 -0
- dreamcatcher-5.5.0/docs/changelog.md +335 -0
- dreamcatcher-5.5.0/docs/command-reference.md +232 -0
- dreamcatcher-5.5.0/docs/compatibility.md +75 -0
- dreamcatcher-5.5.0/docs/configuration-reference.md +142 -0
- dreamcatcher-5.5.0/docs/configure.md +124 -0
- dreamcatcher-5.5.0/docs/contract.md +230 -0
- dreamcatcher-5.5.0/docs/customise-skills.md +56 -0
- dreamcatcher-5.5.0/docs/discuss-an-issue.md +67 -0
- dreamcatcher-5.5.0/docs/index.md +89 -0
- dreamcatcher-5.5.0/docs/measurement.md +136 -0
- dreamcatcher-5.5.0/docs/ontology.md +564 -0
- dreamcatcher-5.5.0/docs/releasing.md +61 -0
- dreamcatcher-5.5.0/docs/review-an-assignment.md +68 -0
- dreamcatcher-5.5.0/docs/run-and-monitor.md +102 -0
- dreamcatcher-5.5.0/docs/special-cases.md +21 -0
- dreamcatcher-5.5.0/docs/standard.md +260 -0
- dreamcatcher-5.5.0/docs/stop-and-recover.md +127 -0
- dreamcatcher-5.5.0/docs/stylesheets/dusk.css +189 -0
- dreamcatcher-5.5.0/docs/stylesheets/hero.css +341 -0
- dreamcatcher-5.5.0/docs/stylesheets/nature.css +211 -0
- dreamcatcher-5.5.0/docs/testing.md +81 -0
- dreamcatcher-5.5.0/docs/tutorial.md +206 -0
- dreamcatcher-5.5.0/dreamcatcher.toml +33 -0
- dreamcatcher-5.5.0/mkdocs.yml +93 -0
- dreamcatcher-5.5.0/overrides/home.html +98 -0
- dreamcatcher-5.5.0/overrides/main.html +5 -0
- dreamcatcher-5.5.0/pyproject.toml +174 -0
- dreamcatcher-5.5.0/specs/2026-08-17-skeleton/design.md +702 -0
- dreamcatcher-5.5.0/specs/2026-08-17-skeleton/plan.md +480 -0
- dreamcatcher-5.5.0/specs/2026-08-17-skeleton/requirements.md +120 -0
- dreamcatcher-5.5.0/specs/2026-08-17-skeleton/state.md +350 -0
- dreamcatcher-5.5.0/specs/2026-09-08-watchtower/design.md +405 -0
- dreamcatcher-5.5.0/specs/2026-09-08-watchtower/plan.md +205 -0
- dreamcatcher-5.5.0/specs/2026-09-08-watchtower/requirements.md +107 -0
- dreamcatcher-5.5.0/specs/2026-09-15-architecture-migration/roadmap.md +698 -0
- dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design-v1/Dreamcatcher Status.dc.html +525 -0
- dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design-v1/README.md +271 -0
- dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design-v1/assets/dreamcatcher-lockup.png +0 -0
- dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design-v1/assets/dreamcatcher-mark-phosphor.png +0 -0
- dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design-v1/assets/dreamcatcher-mark.png +0 -0
- dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design-v1/screenshots/01-home.png +0 -0
- dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design-v1/screenshots/02-feed.png +0 -0
- dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design-v1/support.js +1911 -0
- dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design-v2/Dreamcatcher Status Natural.dc.html +589 -0
- dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design-v2/Dreamcatcher Status.dc.html +528 -0
- dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design-v2/README.md +423 -0
- dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design-v2/assets/dreamcatcher-lockup.png +0 -0
- dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design-v2/assets/dreamcatcher-mark-ink.png +0 -0
- dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design-v2/assets/dreamcatcher-mark-phosphor.png +0 -0
- dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design-v2/assets/dreamcatcher-mark.png +0 -0
- dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design-v2/screenshots/01-matrix-home.png +0 -0
- dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design-v2/screenshots/02-matrix-feed.png +0 -0
- dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design-v2/screenshots/03-nature-home.png +0 -0
- dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design-v2/screenshots/04-nature-feed.png +0 -0
- dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design-v2/support.js +1911 -0
- dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design.md +464 -0
- dreamcatcher-5.5.0/specs/2026-09-17-web-ui/roadmap.md +288 -0
- dreamcatcher-5.5.0/specs/2026-09-21-issue-conversations/design.md +377 -0
- dreamcatcher-5.5.0/specs/2026-09-21-issue-conversations/reading-guide.md +245 -0
- dreamcatcher-5.5.0/specs/2026-09-21-issue-conversations/requirements.md +92 -0
- dreamcatcher-5.5.0/specs/2026-09-21-issue-conversations/roadmap.md +371 -0
- dreamcatcher-5.5.0/specs/2026-09-29-stop-controls/design.md +93 -0
- dreamcatcher-5.5.0/specs/2026-09-30-engineering-standard/agent-work-shape.md +1306 -0
- dreamcatcher-5.5.0/specs/2026-09-30-engineering-standard/documentation-plan.md +260 -0
- dreamcatcher-5.5.0/specs/2026-09-30-engineering-standard/roadmap.md +559 -0
- dreamcatcher-5.5.0/specs/2026-10-03-cancel-assignments/design.md +112 -0
- dreamcatcher-5.5.0/specs/2026-10-05-agent-work-facts/design.md +81 -0
- dreamcatcher-5.5.0/specs/2026-10-06-init/design.md +106 -0
- dreamcatcher-5.5.0/specs/AGENTS.md +26 -0
- dreamcatcher-5.5.0/src/dreamcatcher/__init__.py +1 -0
- dreamcatcher-5.5.0/src/dreamcatcher/agent_assignment_pull_requests.py +155 -0
- dreamcatcher-5.5.0/src/dreamcatcher/agent_assignments.py +571 -0
- dreamcatcher-5.5.0/src/dreamcatcher/agent_rounds.py +658 -0
- dreamcatcher-5.5.0/src/dreamcatcher/agent_work.py +116 -0
- dreamcatcher-5.5.0/src/dreamcatcher/claude.py +401 -0
- dreamcatcher-5.5.0/src/dreamcatcher/cli.py +477 -0
- dreamcatcher-5.5.0/src/dreamcatcher/clock.py +15 -0
- dreamcatcher-5.5.0/src/dreamcatcher/codex.py +380 -0
- dreamcatcher-5.5.0/src/dreamcatcher/commands.py +271 -0
- dreamcatcher-5.5.0/src/dreamcatcher/config.py +206 -0
- dreamcatcher-5.5.0/src/dreamcatcher/daemon.py +260 -0
- dreamcatcher-5.5.0/src/dreamcatcher/daemon_runs.py +16 -0
- dreamcatcher-5.5.0/src/dreamcatcher/default_config.toml +39 -0
- dreamcatcher-5.5.0/src/dreamcatcher/documents.py +343 -0
- dreamcatcher-5.5.0/src/dreamcatcher/errors.py +10 -0
- dreamcatcher-5.5.0/src/dreamcatcher/feed.py +195 -0
- dreamcatcher-5.5.0/src/dreamcatcher/git.py +219 -0
- dreamcatcher-5.5.0/src/dreamcatcher/github.py +703 -0
- dreamcatcher-5.5.0/src/dreamcatcher/harness_adapters.py +204 -0
- dreamcatcher-5.5.0/src/dreamcatcher/harnesses.py +74 -0
- dreamcatcher-5.5.0/src/dreamcatcher/issue_conversations.py +366 -0
- dreamcatcher-5.5.0/src/dreamcatcher/lock.py +121 -0
- dreamcatcher-5.5.0/src/dreamcatcher/prompts.py +158 -0
- dreamcatcher-5.5.0/src/dreamcatcher/relay.py +58 -0
- dreamcatcher-5.5.0/src/dreamcatcher/repository_setup.py +190 -0
- dreamcatcher-5.5.0/src/dreamcatcher/scheduler/__init__.py +22 -0
- dreamcatcher-5.5.0/src/dreamcatcher/scheduler/agent_work.py +112 -0
- dreamcatcher-5.5.0/src/dreamcatcher/scheduler/assignments.py +446 -0
- dreamcatcher-5.5.0/src/dreamcatcher/scheduler/conversations.py +510 -0
- dreamcatcher-5.5.0/src/dreamcatcher/scheduler/faults.py +101 -0
- dreamcatcher-5.5.0/src/dreamcatcher/scheduler/issues.py +249 -0
- dreamcatcher-5.5.0/src/dreamcatcher/scheduler/models.py +261 -0
- dreamcatcher-5.5.0/src/dreamcatcher/scheduler/tick.py +263 -0
- dreamcatcher-5.5.0/src/dreamcatcher/state.py +90 -0
- dreamcatcher-5.5.0/src/dreamcatcher/static/assignment.js +172 -0
- dreamcatcher-5.5.0/src/dreamcatcher/static/base.js +5 -0
- dreamcatcher-5.5.0/src/dreamcatcher/static/dreamcatcher-mark-ink.png +0 -0
- dreamcatcher-5.5.0/src/dreamcatcher/static/dreamcatcher-mark-phosphor.png +0 -0
- dreamcatcher-5.5.0/src/dreamcatcher/static/home.js +82 -0
- dreamcatcher-5.5.0/src/dreamcatcher/static/matrix.css +797 -0
- dreamcatcher-5.5.0/src/dreamcatcher/static/nature.css +837 -0
- dreamcatcher-5.5.0/src/dreamcatcher/static/nature.js +38 -0
- dreamcatcher-5.5.0/src/dreamcatcher/static/vendor/README.md +10 -0
- dreamcatcher-5.5.0/src/dreamcatcher/static/vendor/htmx-2.0.10.LICENSE +13 -0
- dreamcatcher-5.5.0/src/dreamcatcher/static/vendor/htmx-2.0.10.min.js +1 -0
- dreamcatcher-5.5.0/src/dreamcatcher/static/vendor/idiomorph-0.7.4.LICENSE +13 -0
- dreamcatcher-5.5.0/src/dreamcatcher/static/vendor/idiomorph-ext-0.7.4.min.js +1 -0
- dreamcatcher-5.5.0/src/dreamcatcher/status/__init__.py +49 -0
- dreamcatcher-5.5.0/src/dreamcatcher/status/agent_work.py +94 -0
- dreamcatcher-5.5.0/src/dreamcatcher/status/assignments.py +342 -0
- dreamcatcher-5.5.0/src/dreamcatcher/status/conversations.py +448 -0
- dreamcatcher-5.5.0/src/dreamcatcher/status/report.py +524 -0
- dreamcatcher-5.5.0/src/dreamcatcher/status/rounds.py +116 -0
- dreamcatcher-5.5.0/src/dreamcatcher/teardown.py +115 -0
- dreamcatcher-5.5.0/src/dreamcatcher/templates/assignment.html +48 -0
- dreamcatcher-5.5.0/src/dreamcatcher/templates/base.html +20 -0
- dreamcatcher-5.5.0/src/dreamcatcher/templates/conversation.html +49 -0
- dreamcatcher-5.5.0/src/dreamcatcher/templates/error.html +9 -0
- dreamcatcher-5.5.0/src/dreamcatcher/templates/home.html +52 -0
- dreamcatcher-5.5.0/src/dreamcatcher/templates/partials/agent-work-control.html +8 -0
- dreamcatcher-5.5.0/src/dreamcatcher/templates/partials/agent-work-detail.html +1 -0
- dreamcatcher-5.5.0/src/dreamcatcher/templates/partials/agent-work-foot.html +12 -0
- dreamcatcher-5.5.0/src/dreamcatcher/templates/partials/agent-work-retry.html +1 -0
- dreamcatcher-5.5.0/src/dreamcatcher/templates/partials/agent-work-status.html +1 -0
- dreamcatcher-5.5.0/src/dreamcatcher/templates/partials/assignment-card.html +15 -0
- dreamcatcher-5.5.0/src/dreamcatcher/templates/partials/assignment-rounds.html +15 -0
- dreamcatcher-5.5.0/src/dreamcatcher/templates/partials/conversation-card.html +16 -0
- dreamcatcher-5.5.0/src/dreamcatcher/templates/partials/failed-setup-row.html +4 -0
- dreamcatcher-5.5.0/src/dreamcatcher/templates/partials/feed-line.html +4 -0
- dreamcatcher-5.5.0/src/dreamcatcher/templates/partials/instance.html +10 -0
- dreamcatcher-5.5.0/src/dreamcatcher/templates/partials/issue-reference.html +7 -0
- dreamcatcher-5.5.0/src/dreamcatcher/templates/partials/issue-row.html +7 -0
- dreamcatcher-5.5.0/src/dreamcatcher/templates/partials/site-header.html +12 -0
- dreamcatcher-5.5.0/src/dreamcatcher/templates/tail.html +12 -0
- dreamcatcher-5.5.0/src/dreamcatcher/tui/__init__.py +17 -0
- dreamcatcher-5.5.0/src/dreamcatcher/tui/shared.py +156 -0
- dreamcatcher-5.5.0/src/dreamcatcher/tui/status.py +200 -0
- dreamcatcher-5.5.0/src/dreamcatcher/tui/views.py +553 -0
- dreamcatcher-5.5.0/src/dreamcatcher/version.py +5 -0
- dreamcatcher-5.5.0/src/dreamcatcher/web/__init__.py +6 -0
- dreamcatcher-5.5.0/src/dreamcatcher/web/app.py +598 -0
- dreamcatcher-5.5.0/src/dreamcatcher/web/feed.py +242 -0
- dreamcatcher-5.5.0/src/dreamcatcher/web/models.py +204 -0
- dreamcatcher-5.5.0/src/dreamcatcher/web/server.py +81 -0
- dreamcatcher-5.5.0/src/dreamcatcher/web/views.py +302 -0
- dreamcatcher-5.5.0/src/dreamcatcher/words.py +71 -0
- dreamcatcher-5.5.0/tests/clocks.py +24 -0
- dreamcatcher-5.5.0/tests/conftest.py +406 -0
- dreamcatcher-5.5.0/tests/fakes.py +270 -0
- dreamcatcher-5.5.0/tests/fixtures/assignment/fault.txt +23 -0
- dreamcatcher-5.5.0/tests/fixtures/assignment/older-assignments.txt +25 -0
- dreamcatcher-5.5.0/tests/fixtures/assignment/silent-round.txt +18 -0
- dreamcatcher-5.5.0/tests/fixtures/assignment/waiting-to-start.txt +14 -0
- dreamcatcher-5.5.0/tests/fixtures/assignment/working.txt +19 -0
- dreamcatcher-5.5.0/tests/fixtures/claude/background-command.feed.txt +8 -0
- dreamcatcher-5.5.0/tests/fixtures/claude/background-command.harness-feed.txt +8 -0
- dreamcatcher-5.5.0/tests/fixtures/claude/background-command.jsonl +16 -0
- dreamcatcher-5.5.0/tests/fixtures/claude/failed-round.feed.txt +4 -0
- dreamcatcher-5.5.0/tests/fixtures/claude/failed-round.harness-feed.txt +4 -0
- dreamcatcher-5.5.0/tests/fixtures/claude/failed-round.jsonl +5 -0
- dreamcatcher-5.5.0/tests/fixtures/claude/rate-limited.feed.txt +14 -0
- dreamcatcher-5.5.0/tests/fixtures/claude/rate-limited.harness-feed.txt +14 -0
- dreamcatcher-5.5.0/tests/fixtures/claude/rate-limited.jsonl +15 -0
- dreamcatcher-5.5.0/tests/fixtures/claude/round.feed.txt +16 -0
- dreamcatcher-5.5.0/tests/fixtures/claude/round.harness-feed.txt +16 -0
- dreamcatcher-5.5.0/tests/fixtures/claude/round.jsonl +26 -0
- dreamcatcher-5.5.0/tests/fixtures/codex/failed-round.feed.txt +3 -0
- dreamcatcher-5.5.0/tests/fixtures/codex/failed-round.harness-feed.txt +3 -0
- dreamcatcher-5.5.0/tests/fixtures/codex/failed-round.jsonl +5 -0
- dreamcatcher-5.5.0/tests/fixtures/codex/rate-limited.feed.txt +2 -0
- dreamcatcher-5.5.0/tests/fixtures/codex/rate-limited.harness-feed.txt +2 -0
- dreamcatcher-5.5.0/tests/fixtures/codex/rate-limited.jsonl +4 -0
- dreamcatcher-5.5.0/tests/fixtures/codex/resumed-round.feed.txt +5 -0
- dreamcatcher-5.5.0/tests/fixtures/codex/resumed-round.harness-feed.txt +5 -0
- dreamcatcher-5.5.0/tests/fixtures/codex/resumed-round.jsonl +7 -0
- dreamcatcher-5.5.0/tests/fixtures/codex/round.feed.txt +9 -0
- dreamcatcher-5.5.0/tests/fixtures/codex/round.harness-feed.txt +9 -0
- dreamcatcher-5.5.0/tests/fixtures/codex/round.jsonl +13 -0
- dreamcatcher-5.5.0/tests/fixtures/feed/older-assignments.txt +2 -0
- dreamcatcher-5.5.0/tests/fixtures/feed/working.txt +11 -0
- dreamcatcher-5.5.0/tests/fixtures/github/pull-request-52/conversation.json +1 -0
- dreamcatcher-5.5.0/tests/fixtures/github/pull-request-52/inline-comments.json +1 -0
- dreamcatcher-5.5.0/tests/fixtures/github/pull-request-52/reviews.json +1 -0
- dreamcatcher-5.5.0/tests/fixtures/status/at-cap.txt +13 -0
- dreamcatcher-5.5.0/tests/fixtures/status/dead-daemon.txt +23 -0
- dreamcatcher-5.5.0/tests/fixtures/status/everything.txt +26 -0
- dreamcatcher-5.5.0/tests/fixtures/status/failed-setup.txt +12 -0
- dreamcatcher-5.5.0/tests/fixtures/status/nothing.txt +9 -0
- dreamcatcher-5.5.0/tests/fixtures/status/repeat-assignments.txt +10 -0
- dreamcatcher-5.5.0/tests/fixtures/status/silent-round.txt +10 -0
- dreamcatcher-5.5.0/tests/fixtures/web/assignments/cancelled.html +95 -0
- dreamcatcher-5.5.0/tests/fixtures/web/assignments/complete.html +109 -0
- dreamcatcher-5.5.0/tests/fixtures/web/assignments/fault.html +113 -0
- dreamcatcher-5.5.0/tests/fixtures/web/assignments/silent-round.html +109 -0
- dreamcatcher-5.5.0/tests/fixtures/web/assignments/waiting-to-start.html +81 -0
- dreamcatcher-5.5.0/tests/fixtures/web/assignments/working.html +130 -0
- dreamcatcher-5.5.0/tests/fixtures/web/at-cap.html +111 -0
- dreamcatcher-5.5.0/tests/fixtures/web/dead-daemon.html +257 -0
- dreamcatcher-5.5.0/tests/fixtures/web/everything.html +262 -0
- dreamcatcher-5.5.0/tests/fixtures/web/failed-setup.html +106 -0
- dreamcatcher-5.5.0/tests/fixtures/web/nothing.html +69 -0
- dreamcatcher-5.5.0/tests/fixtures/web/repeat-assignments.html +121 -0
- dreamcatcher-5.5.0/tests/fixtures/web/silent-round.html +90 -0
- dreamcatcher-5.5.0/tests/fixtures/web/tail.html +27 -0
- dreamcatcher-5.5.0/tests/fixtures/web/titles-and-pull-requests.html +178 -0
- dreamcatcher-5.5.0/tests/observations.py +120 -0
- dreamcatcher-5.5.0/tests/recordings.py +21 -0
- dreamcatcher-5.5.0/tests/records.py +229 -0
- dreamcatcher-5.5.0/tests/serve_fabricated_web.py +37 -0
- dreamcatcher-5.5.0/tests/status_fabrications.py +590 -0
- dreamcatcher-5.5.0/tests/test_agent_assignments.py +1365 -0
- dreamcatcher-5.5.0/tests/test_agent_rounds.py +1008 -0
- dreamcatcher-5.5.0/tests/test_agent_work.py +103 -0
- dreamcatcher-5.5.0/tests/test_architecture.py +147 -0
- dreamcatcher-5.5.0/tests/test_assignment_scheduling.py +569 -0
- dreamcatcher-5.5.0/tests/test_browser.py +236 -0
- dreamcatcher-5.5.0/tests/test_claude.py +421 -0
- dreamcatcher-5.5.0/tests/test_cli.py +753 -0
- dreamcatcher-5.5.0/tests/test_clock.py +7 -0
- dreamcatcher-5.5.0/tests/test_codex.py +395 -0
- dreamcatcher-5.5.0/tests/test_commands.py +207 -0
- dreamcatcher-5.5.0/tests/test_config.py +431 -0
- dreamcatcher-5.5.0/tests/test_conversation_scheduling.py +2127 -0
- dreamcatcher-5.5.0/tests/test_conversation_status.py +750 -0
- dreamcatcher-5.5.0/tests/test_conversation_tui.py +594 -0
- dreamcatcher-5.5.0/tests/test_conversation_web.py +705 -0
- dreamcatcher-5.5.0/tests/test_daemon.py +709 -0
- dreamcatcher-5.5.0/tests/test_documents.py +377 -0
- dreamcatcher-5.5.0/tests/test_encoding_gate.py +9 -0
- dreamcatcher-5.5.0/tests/test_fakes.py +101 -0
- dreamcatcher-5.5.0/tests/test_feed.py +265 -0
- dreamcatcher-5.5.0/tests/test_git.py +350 -0
- dreamcatcher-5.5.0/tests/test_github.py +687 -0
- dreamcatcher-5.5.0/tests/test_github_integration.py +95 -0
- dreamcatcher-5.5.0/tests/test_harnesses.py +10 -0
- dreamcatcher-5.5.0/tests/test_issue_availability.py +520 -0
- dreamcatcher-5.5.0/tests/test_issue_conversations.py +547 -0
- dreamcatcher-5.5.0/tests/test_lock.py +214 -0
- dreamcatcher-5.5.0/tests/test_prompts.py +156 -0
- dreamcatcher-5.5.0/tests/test_recordings.py +74 -0
- dreamcatcher-5.5.0/tests/test_relay.py +263 -0
- dreamcatcher-5.5.0/tests/test_repository_setup.py +329 -0
- dreamcatcher-5.5.0/tests/test_scheduler.py +1451 -0
- dreamcatcher-5.5.0/tests/test_state.py +61 -0
- dreamcatcher-5.5.0/tests/test_status.py +1118 -0
- dreamcatcher-5.5.0/tests/test_teardown.py +54 -0
- dreamcatcher-5.5.0/tests/test_tui.py +920 -0
- dreamcatcher-5.5.0/tests/test_view_goldens.py +31 -0
- dreamcatcher-5.5.0/tests/test_web.py +1730 -0
- dreamcatcher-5.5.0/tests/test_words.py +68 -0
- dreamcatcher-5.5.0/tests/web_browser.py +71 -0
- dreamcatcher-5.5.0/tools/forbid_invisible_characters.py +41 -0
- dreamcatcher-5.5.0/tools/measure_source.py +127 -0
- dreamcatcher-5.5.0/tools/mkdocs_static.py +34 -0
- dreamcatcher-5.5.0/tools/require_keyword_parameters.py +85 -0
- dreamcatcher-5.5.0/uv.lock +1389 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: uncoded-code-navigation
|
|
3
|
+
description: Load once per session, before the first search, read, or edit of Python source in a codebase indexed by uncoded. Covers locating a symbol, reading a definition, or checking references before you refactor, rename, or delete.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
<!-- Generated by uncoded — do not edit; regeneration overwrites. -->
|
|
7
|
+
|
|
8
|
+
# Code Navigation
|
|
9
|
+
|
|
10
|
+
This codebase uses [uncoded](https://github.com/alimanfoo/uncoded) to maintain a
|
|
11
|
+
symbol index over its source code, with two associated CLI tools: `uncoded body`
|
|
12
|
+
for reading a symbol's body and `uncoded refs` for finding references.
|
|
13
|
+
|
|
14
|
+
## The dispatch rule
|
|
15
|
+
|
|
16
|
+
**If your search term is the name of a Python symbol, use the index. Python
|
|
17
|
+
symbols are classes, functions, methods, attributes, and module-level constants.
|
|
18
|
+
If it's a pattern, regex, or free-text phrase, use grep.**
|
|
19
|
+
|
|
20
|
+
This dispatch rule applies to every tool call where you find code, not just the
|
|
21
|
+
first in the session. The pretrained reflex for "find X" is grep, and that
|
|
22
|
+
reflex is wrong here. Reaching for `grep -rn 'def parse_config'` to read a
|
|
23
|
+
function's body is a case for `uncoded body`. Reaching for
|
|
24
|
+
`grep -rn 'validate_input'` to check callers before a refactor is a case for
|
|
25
|
+
`uncoded refs`. Reaching for `grep` then `Edit` to delete dead code is a case
|
|
26
|
+
for `uncoded refs` to confirm the code is dead, then `Edit`. The grep version of
|
|
27
|
+
any of these is noisier and less reliable. Grep matches comments, strings, and
|
|
28
|
+
unrelated attributes. Grep misses re-exports, so caller and delete checks come
|
|
29
|
+
back incomplete. Grep forces offset arithmetic to slice a body. The indexed
|
|
30
|
+
tools don't.
|
|
31
|
+
|
|
32
|
+
## How to execute the rule
|
|
33
|
+
|
|
34
|
+
The index has two parts: a namespace map and per-file stubs. Follow this
|
|
35
|
+
sequence.
|
|
36
|
+
|
|
37
|
+
**Step 1: Orient. Read the namespace map first.** If the map is missing, run the
|
|
38
|
+
repository's configured `uncoded sync` command. Then, before answering the user,
|
|
39
|
+
before any other tool call:
|
|
40
|
+
|
|
41
|
+
```text
|
|
42
|
+
Read .uncoded/namespace.yaml
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
This lists every symbol in the codebase: directories, files, classes, methods,
|
|
46
|
+
functions. Without it loaded, "find X" answers come from pretrained guesses.
|
|
47
|
+
They reflect what a project like this probably contains, not what is actually
|
|
48
|
+
here. Read it once, in full, at session start.
|
|
49
|
+
|
|
50
|
+
**Step 2: Understand. Read the `.pyi` stub before any `.py` source.** Stub paths
|
|
51
|
+
mirror source paths under `.uncoded/stubs/`:
|
|
52
|
+
|
|
53
|
+
```text
|
|
54
|
+
src/foo/bar.py → .uncoded/stubs/src/foo/bar.pyi
|
|
55
|
+
tests/test_foo.py → .uncoded/stubs/tests/test_foo.pyi
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Read the stub for every file you intend to touch or reference, including tests.
|
|
59
|
+
The stub contains imports, every signature with types, module-level assignments,
|
|
60
|
+
and class attributes. That is enough for most navigation. Skipping straight to
|
|
61
|
+
source means reading many lines to learn what the stub would have told you in
|
|
62
|
+
one. If no stub exists at the expected path, the file has no symbols indexed. In
|
|
63
|
+
that narrow case, read source directly.
|
|
64
|
+
|
|
65
|
+
**Step 3: Act.** Use `uncoded body` to read a symbol's body. Use `uncoded refs`
|
|
66
|
+
to find every reference to a symbol. Use `Edit` (with `uncoded body`'s output as
|
|
67
|
+
`old_string`) to change a symbol. With the map and stub loaded, you have the
|
|
68
|
+
exact `relative_path` and `name_path` each tool needs. Use `ClassName/method`
|
|
69
|
+
for a method and `function_name` for a top-level function. Per task:
|
|
70
|
+
|
|
71
|
+
- **Read a symbol's body.** `uvx uncoded body <name_path> --in <relative_path>`
|
|
72
|
+
prints the symbol's source text to stdout, byte-identical to disk. Returns
|
|
73
|
+
exactly the symbol. No offset arithmetic, no risk of reading too much. Its
|
|
74
|
+
output has every byte `Edit` needs as `old_string`. You need no extra `Read`
|
|
75
|
+
for partial edits. Stay on stubs for a wider sweep.
|
|
76
|
+
|
|
77
|
+
- **Find every reference to a symbol.**
|
|
78
|
+
`uvx uncoded refs <name_path> --in <relative_path>`. Prints one reference per
|
|
79
|
+
line as `<path>:<line>:<col>`, sorted by path, then line, then column. Each
|
|
80
|
+
path is relative to the current working directory when possible and otherwise
|
|
81
|
+
absolute. Grep on the name misses re-exports and adds false positives from
|
|
82
|
+
comments, strings, and attribute lookups on other types. If the next move
|
|
83
|
+
depends on the answer being complete, grep cannot give you that.
|
|
84
|
+
|
|
85
|
+
- **Edit a symbol.** `uvx uncoded body <name_path> --in <relative_path>` gives
|
|
86
|
+
the exact `old_string`; then `Edit` to apply the change.
|
|
87
|
+
|
|
88
|
+
- **Rename.** `uvx uncoded refs <name_path> --in <relative_path>` enumerates
|
|
89
|
+
every site; then `Edit` at each.
|
|
90
|
+
|
|
91
|
+
- **Safely delete.** `uvx uncoded refs <name_path> --in <relative_path>` must
|
|
92
|
+
return empty; then `Edit` to remove.
|
|
93
|
+
|
|
94
|
+
**Step 4: Refresh.** After every modification to indexed Python source, run the
|
|
95
|
+
repository's configured `uncoded sync` command before the next code-navigation
|
|
96
|
+
operation. The modification can change the namespace map and stubs.
|
|
97
|
+
|
|
98
|
+
## Where Read, Edit, and grep are still the right tools
|
|
99
|
+
|
|
100
|
+
The rule is about source navigation by symbol name. Outside that, Read, Edit,
|
|
101
|
+
and grep stay correct:
|
|
102
|
+
|
|
103
|
+
- Free-text or pattern search outside source: Markdown, YAML, TOML, configs,
|
|
104
|
+
commit messages, notebook JSON, fixture data.
|
|
105
|
+
- Pattern search across signatures (regex over type annotations, decorator
|
|
106
|
+
usage, alias declarations). These are not symbol-name lookups, even though
|
|
107
|
+
they sit inside source.
|
|
108
|
+
- Partial-line edits inside a symbol body, once you have retrieved it via
|
|
109
|
+
`uncoded body`.
|
|
110
|
+
- The rare stub-less Python file that needs exploratory reading.
|
|
111
|
+
|
|
112
|
+
The dispatch rule turns on the search term. A symbol name goes to the index. A
|
|
113
|
+
regex or free-text phrase goes to grep.
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: uncoded-consistency-review
|
|
3
|
+
description: Review a Python codebase for semantic and naming consistency. It reports only concrete disagreements between two claims about the same concept, with verbatim evidence for each claim. It assumes uncoded is installed (.uncoded/namespace.yaml and .uncoded/stubs/ present).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
<!-- Generated by uncoded — do not edit; regeneration overwrites. -->
|
|
7
|
+
|
|
8
|
+
# Semantic Consistency Review
|
|
9
|
+
|
|
10
|
+
Review a Python codebase for concrete disagreements in its vocabulary and symbol
|
|
11
|
+
contracts. A finding must identify two claims about the same concept that ought
|
|
12
|
+
to agree, but do not.
|
|
13
|
+
|
|
14
|
+
## Guardrails
|
|
15
|
+
|
|
16
|
+
Admit a finding only when the codebase supports both claims, their observable
|
|
17
|
+
difference, and the reason that they should agree. Quote both claims verbatim.
|
|
18
|
+
Omit a candidate when either claim or the reason for comparing them is
|
|
19
|
+
unsupported.
|
|
20
|
+
|
|
21
|
+
Review semantic and naming consistency, not formatting or style consistency. Do
|
|
22
|
+
not report general bugs, complexity, performance, security, or design
|
|
23
|
+
preferences unless they appear as a disagreement between two supported claims.
|
|
24
|
+
Do not report overgrown public surfaces, private imports, cross-domain imports,
|
|
25
|
+
zero-reference symbols, or redundant public surfaces merely because they exist.
|
|
26
|
+
|
|
27
|
+
## Prerequisites
|
|
28
|
+
|
|
29
|
+
Run the repository's configured `uncoded sync` command. Read the repository's
|
|
30
|
+
agent instructions and follow its navigation rules.
|
|
31
|
+
|
|
32
|
+
## Orientation
|
|
33
|
+
|
|
34
|
+
Read `.uncoded/namespace.yaml` in full. Use its package structure and symbol
|
|
35
|
+
names to map the codebase's main concepts and vocabulary.
|
|
36
|
+
|
|
37
|
+
## Vocabulary sweep
|
|
38
|
+
|
|
39
|
+
Use the namespace and stubs to find candidates, then confirm semantic overlap
|
|
40
|
+
from signatures, docstrings, or bodies. Look for:
|
|
41
|
+
|
|
42
|
+
- **Competing terms:** different names for substantively the same concept.
|
|
43
|
+
- **Conflicting use:** the same term used incompatibly within a shared context.
|
|
44
|
+
- **Stale qualifiers:** names such as `legacy`, `v2`, or `final` whose
|
|
45
|
+
distinction conflicts with another symbol or a symbol's docstring.
|
|
46
|
+
|
|
47
|
+
Similar spelling, low vocabulary overlap, or the presence of a qualifier is not
|
|
48
|
+
evidence on its own. A finding needs two concrete claims that establish the
|
|
49
|
+
shared concept and the disagreement.
|
|
50
|
+
|
|
51
|
+
## Symbol-contract sweep
|
|
52
|
+
|
|
53
|
+
Compare a symbol's name, signature, docstring, and, when needed, behaviour.
|
|
54
|
+
Findings may cover:
|
|
55
|
+
|
|
56
|
+
- name-signature disagreement
|
|
57
|
+
- name-docstring disagreement
|
|
58
|
+
- docstring-signature disagreement
|
|
59
|
+
- name-behaviour disagreement
|
|
60
|
+
|
|
61
|
+
Read each relevant source file's stub for names and signatures. Run the
|
|
62
|
+
repository's configured `uncoded body` command only when a docstring or
|
|
63
|
+
implementation is needed to confirm a candidate. Do not retrieve every symbol
|
|
64
|
+
body.
|
|
65
|
+
|
|
66
|
+
## Report
|
|
67
|
+
|
|
68
|
+
Return the report directly as the final turn output.
|
|
69
|
+
|
|
70
|
+
Use this structure:
|
|
71
|
+
|
|
72
|
+
```markdown
|
|
73
|
+
## Semantic Consistency Review
|
|
74
|
+
|
|
75
|
+
### Scope
|
|
76
|
+
|
|
77
|
+
<What was reviewed and intentionally omitted.>
|
|
78
|
+
|
|
79
|
+
### Summary
|
|
80
|
+
|
|
81
|
+
<Two or three sentences that summarise the supported findings.>
|
|
82
|
+
|
|
83
|
+
### Vocabulary findings
|
|
84
|
+
|
|
85
|
+
#### 1. <Summary>
|
|
86
|
+
|
|
87
|
+
**Claim A** — `<path>` · `<symbol>` · name | signature | docstring | body
|
|
88
|
+
|
|
89
|
+
> Verbatim evidence
|
|
90
|
+
|
|
91
|
+
**Claim B** — `<path>` · `<symbol>` · name | signature | docstring | body
|
|
92
|
+
|
|
93
|
+
> Verbatim evidence
|
|
94
|
+
|
|
95
|
+
**How they differ:** <The observable disagreement.>
|
|
96
|
+
|
|
97
|
+
**Why these should agree:** <Evidence that both claims describe the same
|
|
98
|
+
concept.>
|
|
99
|
+
|
|
100
|
+
### Symbol-contract findings
|
|
101
|
+
|
|
102
|
+
#### 1. <Summary>
|
|
103
|
+
|
|
104
|
+
<Use the same finding structure.>
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Keep both finding headings. If a group has no supported findings, state that
|
|
108
|
+
under its heading. Number findings independently within each group.
|
|
109
|
+
|
|
110
|
+
## Examples
|
|
111
|
+
|
|
112
|
+
### Vocabulary finding
|
|
113
|
+
|
|
114
|
+
#### 1. Customer lookup uses competing verbs
|
|
115
|
+
|
|
116
|
+
**Claim A** — `storage.py` · `fetch_customer` · signature
|
|
117
|
+
|
|
118
|
+
> `fetch_customer(customer_id: str) -> Customer`
|
|
119
|
+
|
|
120
|
+
**Claim B** — `adapter.py` · `load_customer` · signature
|
|
121
|
+
|
|
122
|
+
> `load_customer(customer_id: str) -> Customer`
|
|
123
|
+
|
|
124
|
+
**How they differ:** The same lookup uses `fetch` in one module and `load` in
|
|
125
|
+
another.
|
|
126
|
+
|
|
127
|
+
**Why these should agree:** Both signatures accept a customer ID and return a
|
|
128
|
+
customer through sibling adapters.
|
|
129
|
+
|
|
130
|
+
### Symbol-contract finding
|
|
131
|
+
|
|
132
|
+
#### 1. Predicate name promises a boolean but returns a value
|
|
133
|
+
|
|
134
|
+
**Claim A** — `cache.py` · `is_cached` · name
|
|
135
|
+
|
|
136
|
+
> `is_cached`
|
|
137
|
+
|
|
138
|
+
**Claim B** — `cache.py` · `is_cached` · signature
|
|
139
|
+
|
|
140
|
+
> `is_cached(key: str) -> str | None`
|
|
141
|
+
|
|
142
|
+
**How they differ:** The name promises a predicate, while the return type holds
|
|
143
|
+
a cached value or absence.
|
|
144
|
+
|
|
145
|
+
**Why these should agree:** Both claims describe the contract of `is_cached`.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: uncoded-doc-navigation
|
|
3
|
+
description: Load once per session, before the first search or read of a codebase's Markdown documentation indexed by uncoded. Covers locating which file and section cover a topic, or orienting to what documentation exists.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
<!-- Generated by uncoded — do not edit; regeneration overwrites. -->
|
|
7
|
+
|
|
8
|
+
# Documentation Navigation
|
|
9
|
+
|
|
10
|
+
This codebase uses [uncoded](https://github.com/alimanfoo/uncoded) to maintain a
|
|
11
|
+
documentation index.
|
|
12
|
+
|
|
13
|
+
**Step 1: Orient. Read the docs map first.** If the map is missing, run the
|
|
14
|
+
repository's configured `uncoded sync` command. Then, before answering the user,
|
|
15
|
+
before any other tool call:
|
|
16
|
+
|
|
17
|
+
```text
|
|
18
|
+
Read .uncoded/docs.yaml
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
`.uncoded/docs.yaml` is an orientation outline: it lists every Markdown file and
|
|
22
|
+
its heading hierarchy. Read it once, in full, at session start.
|
|
23
|
+
|
|
24
|
+
**Step 2: Navigate.** Headings in the map are literal text. Use `Read` or `grep`
|
|
25
|
+
to navigate to a specific section identified in the map.
|
|
26
|
+
|
|
27
|
+
**Step 3: Refresh.** After every modification to indexed Markdown, run the
|
|
28
|
+
repository's configured `uncoded sync` command before the next
|
|
29
|
+
documentation-navigation operation. The modification can change the heading map.
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: uncoded-code-navigation
|
|
3
|
+
description: Load once per session, before the first search, read, or edit of Python source in a codebase indexed by uncoded. Covers locating a symbol, reading a definition, or checking references before you refactor, rename, or delete.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
<!-- Generated by uncoded — do not edit; regeneration overwrites. -->
|
|
7
|
+
|
|
8
|
+
# Code Navigation
|
|
9
|
+
|
|
10
|
+
This codebase uses [uncoded](https://github.com/alimanfoo/uncoded) to maintain a
|
|
11
|
+
symbol index over its source code, with two associated CLI tools: `uncoded body`
|
|
12
|
+
for reading a symbol's body and `uncoded refs` for finding references.
|
|
13
|
+
|
|
14
|
+
## The dispatch rule
|
|
15
|
+
|
|
16
|
+
**If your search term is the name of a Python symbol, use the index. Python
|
|
17
|
+
symbols are classes, functions, methods, attributes, and module-level constants.
|
|
18
|
+
If it's a pattern, regex, or free-text phrase, use grep.**
|
|
19
|
+
|
|
20
|
+
This dispatch rule applies to every tool call where you find code, not just the
|
|
21
|
+
first in the session. The pretrained reflex for "find X" is grep, and that
|
|
22
|
+
reflex is wrong here. Reaching for `grep -rn 'def parse_config'` to read a
|
|
23
|
+
function's body is a case for `uncoded body`. Reaching for
|
|
24
|
+
`grep -rn 'validate_input'` to check callers before a refactor is a case for
|
|
25
|
+
`uncoded refs`. Reaching for `grep` then `Edit` to delete dead code is a case
|
|
26
|
+
for `uncoded refs` to confirm the code is dead, then `Edit`. The grep version of
|
|
27
|
+
any of these is noisier and less reliable. Grep matches comments, strings, and
|
|
28
|
+
unrelated attributes. Grep misses re-exports, so caller and delete checks come
|
|
29
|
+
back incomplete. Grep forces offset arithmetic to slice a body. The indexed
|
|
30
|
+
tools don't.
|
|
31
|
+
|
|
32
|
+
## How to execute the rule
|
|
33
|
+
|
|
34
|
+
The index has two parts: a namespace map and per-file stubs. Follow this
|
|
35
|
+
sequence.
|
|
36
|
+
|
|
37
|
+
**Step 1: Orient. Read the namespace map first.** If the map is missing, run the
|
|
38
|
+
repository's configured `uncoded sync` command. Then, before answering the user,
|
|
39
|
+
before any other tool call:
|
|
40
|
+
|
|
41
|
+
```text
|
|
42
|
+
Read .uncoded/namespace.yaml
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
This lists every symbol in the codebase: directories, files, classes, methods,
|
|
46
|
+
functions. Without it loaded, "find X" answers come from pretrained guesses.
|
|
47
|
+
They reflect what a project like this probably contains, not what is actually
|
|
48
|
+
here. Read it once, in full, at session start.
|
|
49
|
+
|
|
50
|
+
**Step 2: Understand. Read the `.pyi` stub before any `.py` source.** Stub paths
|
|
51
|
+
mirror source paths under `.uncoded/stubs/`:
|
|
52
|
+
|
|
53
|
+
```text
|
|
54
|
+
src/foo/bar.py → .uncoded/stubs/src/foo/bar.pyi
|
|
55
|
+
tests/test_foo.py → .uncoded/stubs/tests/test_foo.pyi
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Read the stub for every file you intend to touch or reference, including tests.
|
|
59
|
+
The stub contains imports, every signature with types, module-level assignments,
|
|
60
|
+
and class attributes. That is enough for most navigation. Skipping straight to
|
|
61
|
+
source means reading many lines to learn what the stub would have told you in
|
|
62
|
+
one. If no stub exists at the expected path, the file has no symbols indexed. In
|
|
63
|
+
that narrow case, read source directly.
|
|
64
|
+
|
|
65
|
+
**Step 3: Act.** Use `uncoded body` to read a symbol's body. Use `uncoded refs`
|
|
66
|
+
to find every reference to a symbol. Use `Edit` (with `uncoded body`'s output as
|
|
67
|
+
`old_string`) to change a symbol. With the map and stub loaded, you have the
|
|
68
|
+
exact `relative_path` and `name_path` each tool needs. Use `ClassName/method`
|
|
69
|
+
for a method and `function_name` for a top-level function. Per task:
|
|
70
|
+
|
|
71
|
+
- **Read a symbol's body.** `uvx uncoded body <name_path> --in <relative_path>`
|
|
72
|
+
prints the symbol's source text to stdout, byte-identical to disk. Returns
|
|
73
|
+
exactly the symbol. No offset arithmetic, no risk of reading too much. Its
|
|
74
|
+
output has every byte `Edit` needs as `old_string`. You need no extra `Read`
|
|
75
|
+
for partial edits. Stay on stubs for a wider sweep.
|
|
76
|
+
|
|
77
|
+
- **Find every reference to a symbol.**
|
|
78
|
+
`uvx uncoded refs <name_path> --in <relative_path>`. Prints one reference per
|
|
79
|
+
line as `<path>:<line>:<col>`, sorted by path, then line, then column. Each
|
|
80
|
+
path is relative to the current working directory when possible and otherwise
|
|
81
|
+
absolute. Grep on the name misses re-exports and adds false positives from
|
|
82
|
+
comments, strings, and attribute lookups on other types. If the next move
|
|
83
|
+
depends on the answer being complete, grep cannot give you that.
|
|
84
|
+
|
|
85
|
+
- **Edit a symbol.** `uvx uncoded body <name_path> --in <relative_path>` gives
|
|
86
|
+
the exact `old_string`; then `Edit` to apply the change.
|
|
87
|
+
|
|
88
|
+
- **Rename.** `uvx uncoded refs <name_path> --in <relative_path>` enumerates
|
|
89
|
+
every site; then `Edit` at each.
|
|
90
|
+
|
|
91
|
+
- **Safely delete.** `uvx uncoded refs <name_path> --in <relative_path>` must
|
|
92
|
+
return empty; then `Edit` to remove.
|
|
93
|
+
|
|
94
|
+
**Step 4: Refresh.** After every modification to indexed Python source, run the
|
|
95
|
+
repository's configured `uncoded sync` command before the next code-navigation
|
|
96
|
+
operation. The modification can change the namespace map and stubs.
|
|
97
|
+
|
|
98
|
+
## Where Read, Edit, and grep are still the right tools
|
|
99
|
+
|
|
100
|
+
The rule is about source navigation by symbol name. Outside that, Read, Edit,
|
|
101
|
+
and grep stay correct:
|
|
102
|
+
|
|
103
|
+
- Free-text or pattern search outside source: Markdown, YAML, TOML, configs,
|
|
104
|
+
commit messages, notebook JSON, fixture data.
|
|
105
|
+
- Pattern search across signatures (regex over type annotations, decorator
|
|
106
|
+
usage, alias declarations). These are not symbol-name lookups, even though
|
|
107
|
+
they sit inside source.
|
|
108
|
+
- Partial-line edits inside a symbol body, once you have retrieved it via
|
|
109
|
+
`uncoded body`.
|
|
110
|
+
- The rare stub-less Python file that needs exploratory reading.
|
|
111
|
+
|
|
112
|
+
The dispatch rule turns on the search term. A symbol name goes to the index. A
|
|
113
|
+
regex or free-text phrase goes to grep.
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: uncoded-consistency-review
|
|
3
|
+
description: Review a Python codebase for semantic and naming consistency. It reports only concrete disagreements between two claims about the same concept, with verbatim evidence for each claim. It assumes uncoded is installed (.uncoded/namespace.yaml and .uncoded/stubs/ present).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
<!-- Generated by uncoded — do not edit; regeneration overwrites. -->
|
|
7
|
+
|
|
8
|
+
# Semantic Consistency Review
|
|
9
|
+
|
|
10
|
+
Review a Python codebase for concrete disagreements in its vocabulary and symbol
|
|
11
|
+
contracts. A finding must identify two claims about the same concept that ought
|
|
12
|
+
to agree, but do not.
|
|
13
|
+
|
|
14
|
+
## Guardrails
|
|
15
|
+
|
|
16
|
+
Admit a finding only when the codebase supports both claims, their observable
|
|
17
|
+
difference, and the reason that they should agree. Quote both claims verbatim.
|
|
18
|
+
Omit a candidate when either claim or the reason for comparing them is
|
|
19
|
+
unsupported.
|
|
20
|
+
|
|
21
|
+
Review semantic and naming consistency, not formatting or style consistency. Do
|
|
22
|
+
not report general bugs, complexity, performance, security, or design
|
|
23
|
+
preferences unless they appear as a disagreement between two supported claims.
|
|
24
|
+
Do not report overgrown public surfaces, private imports, cross-domain imports,
|
|
25
|
+
zero-reference symbols, or redundant public surfaces merely because they exist.
|
|
26
|
+
|
|
27
|
+
## Prerequisites
|
|
28
|
+
|
|
29
|
+
Run the repository's configured `uncoded sync` command. Read the repository's
|
|
30
|
+
agent instructions and follow its navigation rules.
|
|
31
|
+
|
|
32
|
+
## Orientation
|
|
33
|
+
|
|
34
|
+
Read `.uncoded/namespace.yaml` in full. Use its package structure and symbol
|
|
35
|
+
names to map the codebase's main concepts and vocabulary.
|
|
36
|
+
|
|
37
|
+
## Vocabulary sweep
|
|
38
|
+
|
|
39
|
+
Use the namespace and stubs to find candidates, then confirm semantic overlap
|
|
40
|
+
from signatures, docstrings, or bodies. Look for:
|
|
41
|
+
|
|
42
|
+
- **Competing terms:** different names for substantively the same concept.
|
|
43
|
+
- **Conflicting use:** the same term used incompatibly within a shared context.
|
|
44
|
+
- **Stale qualifiers:** names such as `legacy`, `v2`, or `final` whose
|
|
45
|
+
distinction conflicts with another symbol or a symbol's docstring.
|
|
46
|
+
|
|
47
|
+
Similar spelling, low vocabulary overlap, or the presence of a qualifier is not
|
|
48
|
+
evidence on its own. A finding needs two concrete claims that establish the
|
|
49
|
+
shared concept and the disagreement.
|
|
50
|
+
|
|
51
|
+
## Symbol-contract sweep
|
|
52
|
+
|
|
53
|
+
Compare a symbol's name, signature, docstring, and, when needed, behaviour.
|
|
54
|
+
Findings may cover:
|
|
55
|
+
|
|
56
|
+
- name-signature disagreement
|
|
57
|
+
- name-docstring disagreement
|
|
58
|
+
- docstring-signature disagreement
|
|
59
|
+
- name-behaviour disagreement
|
|
60
|
+
|
|
61
|
+
Read each relevant source file's stub for names and signatures. Run the
|
|
62
|
+
repository's configured `uncoded body` command only when a docstring or
|
|
63
|
+
implementation is needed to confirm a candidate. Do not retrieve every symbol
|
|
64
|
+
body.
|
|
65
|
+
|
|
66
|
+
## Report
|
|
67
|
+
|
|
68
|
+
Return the report directly as the final turn output.
|
|
69
|
+
|
|
70
|
+
Use this structure:
|
|
71
|
+
|
|
72
|
+
```markdown
|
|
73
|
+
## Semantic Consistency Review
|
|
74
|
+
|
|
75
|
+
### Scope
|
|
76
|
+
|
|
77
|
+
<What was reviewed and intentionally omitted.>
|
|
78
|
+
|
|
79
|
+
### Summary
|
|
80
|
+
|
|
81
|
+
<Two or three sentences that summarise the supported findings.>
|
|
82
|
+
|
|
83
|
+
### Vocabulary findings
|
|
84
|
+
|
|
85
|
+
#### 1. <Summary>
|
|
86
|
+
|
|
87
|
+
**Claim A** — `<path>` · `<symbol>` · name | signature | docstring | body
|
|
88
|
+
|
|
89
|
+
> Verbatim evidence
|
|
90
|
+
|
|
91
|
+
**Claim B** — `<path>` · `<symbol>` · name | signature | docstring | body
|
|
92
|
+
|
|
93
|
+
> Verbatim evidence
|
|
94
|
+
|
|
95
|
+
**How they differ:** <The observable disagreement.>
|
|
96
|
+
|
|
97
|
+
**Why these should agree:** <Evidence that both claims describe the same
|
|
98
|
+
concept.>
|
|
99
|
+
|
|
100
|
+
### Symbol-contract findings
|
|
101
|
+
|
|
102
|
+
#### 1. <Summary>
|
|
103
|
+
|
|
104
|
+
<Use the same finding structure.>
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Keep both finding headings. If a group has no supported findings, state that
|
|
108
|
+
under its heading. Number findings independently within each group.
|
|
109
|
+
|
|
110
|
+
## Examples
|
|
111
|
+
|
|
112
|
+
### Vocabulary finding
|
|
113
|
+
|
|
114
|
+
#### 1. Customer lookup uses competing verbs
|
|
115
|
+
|
|
116
|
+
**Claim A** — `storage.py` · `fetch_customer` · signature
|
|
117
|
+
|
|
118
|
+
> `fetch_customer(customer_id: str) -> Customer`
|
|
119
|
+
|
|
120
|
+
**Claim B** — `adapter.py` · `load_customer` · signature
|
|
121
|
+
|
|
122
|
+
> `load_customer(customer_id: str) -> Customer`
|
|
123
|
+
|
|
124
|
+
**How they differ:** The same lookup uses `fetch` in one module and `load` in
|
|
125
|
+
another.
|
|
126
|
+
|
|
127
|
+
**Why these should agree:** Both signatures accept a customer ID and return a
|
|
128
|
+
customer through sibling adapters.
|
|
129
|
+
|
|
130
|
+
### Symbol-contract finding
|
|
131
|
+
|
|
132
|
+
#### 1. Predicate name promises a boolean but returns a value
|
|
133
|
+
|
|
134
|
+
**Claim A** — `cache.py` · `is_cached` · name
|
|
135
|
+
|
|
136
|
+
> `is_cached`
|
|
137
|
+
|
|
138
|
+
**Claim B** — `cache.py` · `is_cached` · signature
|
|
139
|
+
|
|
140
|
+
> `is_cached(key: str) -> str | None`
|
|
141
|
+
|
|
142
|
+
**How they differ:** The name promises a predicate, while the return type holds
|
|
143
|
+
a cached value or absence.
|
|
144
|
+
|
|
145
|
+
**Why these should agree:** Both claims describe the contract of `is_cached`.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: uncoded-doc-navigation
|
|
3
|
+
description: Load once per session, before the first search or read of a codebase's Markdown documentation indexed by uncoded. Covers locating which file and section cover a topic, or orienting to what documentation exists.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
<!-- Generated by uncoded — do not edit; regeneration overwrites. -->
|
|
7
|
+
|
|
8
|
+
# Documentation Navigation
|
|
9
|
+
|
|
10
|
+
This codebase uses [uncoded](https://github.com/alimanfoo/uncoded) to maintain a
|
|
11
|
+
documentation index.
|
|
12
|
+
|
|
13
|
+
**Step 1: Orient. Read the docs map first.** If the map is missing, run the
|
|
14
|
+
repository's configured `uncoded sync` command. Then, before answering the user,
|
|
15
|
+
before any other tool call:
|
|
16
|
+
|
|
17
|
+
```text
|
|
18
|
+
Read .uncoded/docs.yaml
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
`.uncoded/docs.yaml` is an orientation outline: it lists every Markdown file and
|
|
22
|
+
its heading hierarchy. Read it once, in full, at session start.
|
|
23
|
+
|
|
24
|
+
**Step 2: Navigate.** Headings in the map are literal text. Use `Read` or `grep`
|
|
25
|
+
to navigate to a specific section identified in the map.
|
|
26
|
+
|
|
27
|
+
**Step 3: Refresh.** After every modification to indexed Markdown, run the
|
|
28
|
+
repository's configured `uncoded sync` command before the next
|
|
29
|
+
documentation-navigation operation. The modification can change the heading map.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Collapse generated files in a diff, and keep them out of the language
|
|
2
|
+
# statistics. uncoded writes the skills; uv writes the lock.
|
|
3
|
+
.claude/skills/** linguist-generated=true
|
|
4
|
+
.agents/skills/** linguist-generated=true
|
|
5
|
+
uv.lock linguist-generated=true
|
|
6
|
+
|
|
7
|
+
# A recorded stream is read back byte for byte by a golden test, so no checkout
|
|
8
|
+
# rewrites its line endings.
|
|
9
|
+
tests/fixtures/** -text
|
|
10
|
+
|
|
11
|
+
# Vendored release files are checked against upstream by checksum, so a
|
|
12
|
+
# checkout must not rewrite their line endings.
|
|
13
|
+
src/dreamcatcher/static/vendor/** -text
|
|
14
|
+
|
|
15
|
+
# init writes the default configuration into a user's checkout as it is here,
|
|
16
|
+
# so no checkout rewrites its line endings.
|
|
17
|
+
src/dreamcatcher/default_config.toml text eol=lf
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
|
|
3
|
+
# Each ecosystem opens one pull request for its version updates and one for
|
|
4
|
+
# its security updates, majors included, because a group applies to one kind.
|
|
5
|
+
|
|
6
|
+
updates:
|
|
7
|
+
- package-ecosystem: "uv"
|
|
8
|
+
directory: "/"
|
|
9
|
+
schedule:
|
|
10
|
+
interval: "weekly"
|
|
11
|
+
groups:
|
|
12
|
+
uv:
|
|
13
|
+
patterns: ["*"]
|
|
14
|
+
uv-security:
|
|
15
|
+
applies-to: security-updates
|
|
16
|
+
patterns: ["*"]
|
|
17
|
+
|
|
18
|
+
- package-ecosystem: "pre-commit"
|
|
19
|
+
directory: "/"
|
|
20
|
+
schedule:
|
|
21
|
+
interval: "weekly"
|
|
22
|
+
groups:
|
|
23
|
+
pre-commit:
|
|
24
|
+
patterns: ["*"]
|
|
25
|
+
pre-commit-security:
|
|
26
|
+
applies-to: security-updates
|
|
27
|
+
patterns: ["*"]
|
|
28
|
+
|
|
29
|
+
- package-ecosystem: "github-actions"
|
|
30
|
+
directory: "/"
|
|
31
|
+
schedule:
|
|
32
|
+
interval: "weekly"
|
|
33
|
+
groups:
|
|
34
|
+
github-actions:
|
|
35
|
+
patterns: ["*"]
|
|
36
|
+
github-actions-security:
|
|
37
|
+
applies-to: security-updates
|
|
38
|
+
patterns: ["*"]
|