shikiru-cli 0.2.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.
- shikiru_cli-0.2.0/.github/ISSUE_TEMPLATE/bug_report.yml +33 -0
- shikiru_cli-0.2.0/.github/ISSUE_TEMPLATE/feature_request.yml +24 -0
- shikiru_cli-0.2.0/.github/pull_request_template.md +12 -0
- shikiru_cli-0.2.0/.github/workflows/ci.yml +104 -0
- shikiru_cli-0.2.0/.github/workflows/release.yml +136 -0
- shikiru_cli-0.2.0/.gitignore +14 -0
- shikiru_cli-0.2.0/.python-version +1 -0
- shikiru_cli-0.2.0/AGENTS.md +11 -0
- shikiru_cli-0.2.0/CLAUDE.md +1 -0
- shikiru_cli-0.2.0/CONTRIBUTING.md +113 -0
- shikiru_cli-0.2.0/LICENSE +21 -0
- shikiru_cli-0.2.0/PKG-INFO +428 -0
- shikiru_cli-0.2.0/README.md +405 -0
- shikiru_cli-0.2.0/SECURITY.md +21 -0
- shikiru_cli-0.2.0/docs/assets/shikiru-dashboard.gif +0 -0
- shikiru_cli-0.2.0/docs/design/references/cli-output-examples.html +2222 -0
- shikiru_cli-0.2.0/docs/design/references/dashboard-example.html +2683 -0
- shikiru_cli-0.2.0/docs/design.md +403 -0
- shikiru_cli-0.2.0/docs/plans/periodic-push-and-squash.md +124 -0
- shikiru_cli-0.2.0/docs/plans/quota-and-task-usage.md +107 -0
- shikiru_cli-0.2.0/docs/plans/release-and-deployment.md +89 -0
- shikiru_cli-0.2.0/docs/plans/release-automation.md +128 -0
- shikiru_cli-0.2.0/docs/plans/release-simplification.md +124 -0
- shikiru_cli-0.2.0/docs/plans/release-workflow.md +191 -0
- shikiru_cli-0.2.0/docs/plans/test-robustness.md +168 -0
- shikiru_cli-0.2.0/docs/plans/test-suite-audit.md +251 -0
- shikiru_cli-0.2.0/docs/plans/test-suite-speed.md +38 -0
- shikiru_cli-0.2.0/pyproject.toml +361 -0
- shikiru_cli-0.2.0/scripts/release-readiness-smoke.sh +583 -0
- shikiru_cli-0.2.0/scripts/release_notes.py +172 -0
- shikiru_cli-0.2.0/src/shikiru/__init__.py +1 -0
- shikiru_cli-0.2.0/src/shikiru/__main__.py +8 -0
- shikiru_cli-0.2.0/src/shikiru/agents/__init__.py +3 -0
- shikiru_cli-0.2.0/src/shikiru/agents/contracts.py +590 -0
- shikiru_cli-0.2.0/src/shikiru/agents/registry.py +87 -0
- shikiru_cli-0.2.0/src/shikiru/agents/sdk/__init__.py +17 -0
- shikiru_cli-0.2.0/src/shikiru/agents/sdk/reset_time.py +137 -0
- shikiru_cli-0.2.0/src/shikiru/agents/sdk/turn.py +335 -0
- shikiru_cli-0.2.0/src/shikiru/agents/settings.py +151 -0
- shikiru_cli-0.2.0/src/shikiru/agents/testing/__init__.py +26 -0
- shikiru_cli-0.2.0/src/shikiru/agents/testing/contract_suite.py +653 -0
- shikiru_cli-0.2.0/src/shikiru/agents/testing/resume.py +15 -0
- shikiru_cli-0.2.0/src/shikiru/bootstrap.py +1277 -0
- shikiru_cli-0.2.0/src/shikiru/cli/__init__.py +1 -0
- shikiru_cli-0.2.0/src/shikiru/cli/app.py +770 -0
- shikiru_cli-0.2.0/src/shikiru/cli/context.py +63 -0
- shikiru_cli-0.2.0/src/shikiru/cli/render.py +1475 -0
- shikiru_cli-0.2.0/src/shikiru/cli/report.py +156 -0
- shikiru_cli-0.2.0/src/shikiru/cli/session_prompt.py +63 -0
- shikiru_cli-0.2.0/src/shikiru/cli/view.py +131 -0
- shikiru_cli-0.2.0/src/shikiru/clock.py +41 -0
- shikiru_cli-0.2.0/src/shikiru/config/__init__.py +8 -0
- shikiru_cli-0.2.0/src/shikiru/config/defaults.toml +131 -0
- shikiru_cli-0.2.0/src/shikiru/config/loader.py +178 -0
- shikiru_cli-0.2.0/src/shikiru/config/settings.py +392 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/__init__.py +3 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/actions_list.py +799 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/activity.py +150 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/app.py +1765 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/blocker_evidence.py +122 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/blocker_rows.py +84 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/briefing_view.py +871 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/contract.py +1086 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/covered.py +32 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/detail.py +1209 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/detail_fold.py +244 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/detail_hint.py +68 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/details_list_view.py +150 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/diagnostics.py +80 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/diagnostics_sections.py +186 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/evidence_table.py +123 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/extra_details.py +214 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/fault_guidance.py +216 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/fold_bodies.py +276 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/help_keys.py +166 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/help_screen.py +204 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/interaction.py +17 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/ladder_editor.py +544 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/live_settings.py +62 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/motion.py +368 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/orchestration_fields.py +201 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/palette.py +1606 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/palette_app.py +89 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/palette_drafts.py +33 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/resolution.py +573 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/resolution_view.py +302 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/row_list.py +256 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/section_rows.py +173 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/services.py +665 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/session_history.py +402 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/shikiru_init_ascii_art.txt +40 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/task_picker.py +358 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/tick.py +59 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/timeline_filter.py +129 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/timeline_section.py +385 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/usage_body.py +269 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/views.py +2314 -0
- shikiru_cli-0.2.0/src/shikiru/dashboard/wizard.py +1389 -0
- shikiru_cli-0.2.0/src/shikiru/domain/__init__.py +1 -0
- shikiru_cli-0.2.0/src/shikiru/domain/acceptance.py +130 -0
- shikiru_cli-0.2.0/src/shikiru/domain/activity.py +28 -0
- shikiru_cli-0.2.0/src/shikiru/domain/attempts.py +333 -0
- shikiru_cli-0.2.0/src/shikiru/domain/briefing.py +257 -0
- shikiru_cli-0.2.0/src/shikiru/domain/commands.py +219 -0
- shikiru_cli-0.2.0/src/shikiru/domain/decisions.py +231 -0
- shikiru_cli-0.2.0/src/shikiru/domain/docker.py +262 -0
- shikiru_cli-0.2.0/src/shikiru/domain/engine_uptime.py +87 -0
- shikiru_cli-0.2.0/src/shikiru/domain/escalation.py +194 -0
- shikiru_cli-0.2.0/src/shikiru/domain/escalation_evidence.py +186 -0
- shikiru_cli-0.2.0/src/shikiru/domain/escalation_panel.py +144 -0
- shikiru_cli-0.2.0/src/shikiru/domain/events.py +71 -0
- shikiru_cli-0.2.0/src/shikiru/domain/evidence_export.py +89 -0
- shikiru_cli-0.2.0/src/shikiru/domain/faults.py +86 -0
- shikiru_cli-0.2.0/src/shikiru/domain/feedback.py +180 -0
- shikiru_cli-0.2.0/src/shikiru/domain/feedback_rounds.py +172 -0
- shikiru_cli-0.2.0/src/shikiru/domain/fencing.py +31 -0
- shikiru_cli-0.2.0/src/shikiru/domain/ladder.py +102 -0
- shikiru_cli-0.2.0/src/shikiru/domain/ladder_text.py +44 -0
- shikiru_cli-0.2.0/src/shikiru/domain/levels.py +44 -0
- shikiru_cli-0.2.0/src/shikiru/domain/motion.py +199 -0
- shikiru_cli-0.2.0/src/shikiru/domain/packet_evidence.py +377 -0
- shikiru_cli-0.2.0/src/shikiru/domain/pushes.py +47 -0
- shikiru_cli-0.2.0/src/shikiru/domain/quota_blocks.py +44 -0
- shikiru_cli-0.2.0/src/shikiru/domain/quota_waits.py +219 -0
- shikiru_cli-0.2.0/src/shikiru/domain/recovery.py +194 -0
- shikiru_cli-0.2.0/src/shikiru/domain/reports.py +498 -0
- shikiru_cli-0.2.0/src/shikiru/domain/results.py +217 -0
- shikiru_cli-0.2.0/src/shikiru/domain/runs.py +85 -0
- shikiru_cli-0.2.0/src/shikiru/domain/scheduling.py +231 -0
- shikiru_cli-0.2.0/src/shikiru/domain/status_tasks.py +40 -0
- shikiru_cli-0.2.0/src/shikiru/domain/steps.py +325 -0
- shikiru_cli-0.2.0/src/shikiru/domain/tasks.py +174 -0
- shikiru_cli-0.2.0/src/shikiru/domain/timeline.py +208 -0
- shikiru_cli-0.2.0/src/shikiru/domain/timeline_phrases.py +271 -0
- shikiru_cli-0.2.0/src/shikiru/domain/versions.py +18 -0
- shikiru_cli-0.2.0/src/shikiru/domain/workflow.py +372 -0
- shikiru_cli-0.2.0/src/shikiru/engine/__init__.py +0 -0
- shikiru_cli-0.2.0/src/shikiru/engine/acceptance.py +90 -0
- shikiru_cli-0.2.0/src/shikiru/engine/agents.py +61 -0
- shikiru_cli-0.2.0/src/shikiru/engine/cosmetic_decorator.py +99 -0
- shikiru_cli-0.2.0/src/shikiru/engine/daemon.py +409 -0
- shikiru_cli-0.2.0/src/shikiru/engine/dependency.py +37 -0
- shikiru_cli-0.2.0/src/shikiru/engine/escalation_filing.py +110 -0
- shikiru_cli-0.2.0/src/shikiru/engine/escalations.py +401 -0
- shikiru_cli-0.2.0/src/shikiru/engine/events.py +285 -0
- shikiru_cli-0.2.0/src/shikiru/engine/evidence.py +81 -0
- shikiru_cli-0.2.0/src/shikiru/engine/fault_reporter.py +144 -0
- shikiru_cli-0.2.0/src/shikiru/engine/feedback.py +577 -0
- shikiru_cli-0.2.0/src/shikiru/engine/feedback_audit.py +80 -0
- shikiru_cli-0.2.0/src/shikiru/engine/feedback_intake.py +95 -0
- shikiru_cli-0.2.0/src/shikiru/engine/feedback_snapshot.py +148 -0
- shikiru_cli-0.2.0/src/shikiru/engine/flow.py +87 -0
- shikiru_cli-0.2.0/src/shikiru/engine/handlers/__init__.py +33 -0
- shikiru_cli-0.2.0/src/shikiru/engine/handlers/base.py +148 -0
- shikiru_cli-0.2.0/src/shikiru/engine/handlers/engine.py +24 -0
- shikiru_cli-0.2.0/src/shikiru/engine/handlers/escalations.py +174 -0
- shikiru_cli-0.2.0/src/shikiru/engine/handlers/operator.py +81 -0
- shikiru_cli-0.2.0/src/shikiru/engine/handlers/tasks.py +237 -0
- shikiru_cli-0.2.0/src/shikiru/engine/history.py +128 -0
- shikiru_cli-0.2.0/src/shikiru/engine/integration.py +1234 -0
- shikiru_cli-0.2.0/src/shikiru/engine/integration_turns.py +337 -0
- shikiru_cli-0.2.0/src/shikiru/engine/layout_guard.py +362 -0
- shikiru_cli-0.2.0/src/shikiru/engine/lifecycle.py +60 -0
- shikiru_cli-0.2.0/src/shikiru/engine/monitor.py +317 -0
- shikiru_cli-0.2.0/src/shikiru/engine/notification_delivery.py +124 -0
- shikiru_cli-0.2.0/src/shikiru/engine/notification_feed.py +57 -0
- shikiru_cli-0.2.0/src/shikiru/engine/notifier.py +91 -0
- shikiru_cli-0.2.0/src/shikiru/engine/pull_request_closing.py +117 -0
- shikiru_cli-0.2.0/src/shikiru/engine/push_service.py +177 -0
- shikiru_cli-0.2.0/src/shikiru/engine/quota_probe_threads.py +79 -0
- shikiru_cli-0.2.0/src/shikiru/engine/quota_reconciler.py +210 -0
- shikiru_cli-0.2.0/src/shikiru/engine/quota_schedule.py +24 -0
- shikiru_cli-0.2.0/src/shikiru/engine/quota_waits.py +102 -0
- shikiru_cli-0.2.0/src/shikiru/engine/reconcile.py +91 -0
- shikiru_cli-0.2.0/src/shikiru/engine/recovery.py +284 -0
- shikiru_cli-0.2.0/src/shikiru/engine/retention.py +102 -0
- shikiru_cli-0.2.0/src/shikiru/engine/root_preparation.py +86 -0
- shikiru_cli-0.2.0/src/shikiru/engine/scheduler.py +320 -0
- shikiru_cli-0.2.0/src/shikiru/engine/session_guard.py +46 -0
- shikiru_cli-0.2.0/src/shikiru/engine/sessions.py +95 -0
- shikiru_cli-0.2.0/src/shikiru/engine/signalled.py +75 -0
- shikiru_cli-0.2.0/src/shikiru/engine/step_runner.py +140 -0
- shikiru_cli-0.2.0/src/shikiru/engine/supervisor.py +101 -0
- shikiru_cli-0.2.0/src/shikiru/engine/takeover.py +223 -0
- shikiru_cli-0.2.0/src/shikiru/engine/task_facts.py +46 -0
- shikiru_cli-0.2.0/src/shikiru/engine/tick_guard.py +95 -0
- shikiru_cli-0.2.0/src/shikiru/engine/titles.py +297 -0
- shikiru_cli-0.2.0/src/shikiru/engine/transitions.py +79 -0
- shikiru_cli-0.2.0/src/shikiru/engine/turn_context.py +206 -0
- shikiru_cli-0.2.0/src/shikiru/engine/turn_execution.py +30 -0
- shikiru_cli-0.2.0/src/shikiru/engine/turn_loop.py +230 -0
- shikiru_cli-0.2.0/src/shikiru/engine/turn_processes.py +79 -0
- shikiru_cli-0.2.0/src/shikiru/engine/turns.py +457 -0
- shikiru_cli-0.2.0/src/shikiru/errors.py +144 -0
- shikiru_cli-0.2.0/src/shikiru/helper/__init__.py +3 -0
- shikiru_cli-0.2.0/src/shikiru/helper/helper.py +182 -0
- shikiru_cli-0.2.0/src/shikiru/helper/models.py +11 -0
- shikiru_cli-0.2.0/src/shikiru/mcp/__init__.py +1 -0
- shikiru_cli-0.2.0/src/shikiru/mcp/server.py +196 -0
- shikiru_cli-0.2.0/src/shikiru/operator/__init__.py +33 -0
- shikiru_cli-0.2.0/src/shikiru/operator/attachment.py +24 -0
- shikiru_cli-0.2.0/src/shikiru/operator/commands.py +319 -0
- shikiru_cli-0.2.0/src/shikiru/operator/detectors.py +374 -0
- shikiru_cli-0.2.0/src/shikiru/operator/doctor.py +351 -0
- shikiru_cli-0.2.0/src/shikiru/operator/events.py +57 -0
- shikiru_cli-0.2.0/src/shikiru/operator/evidence_export.py +498 -0
- shikiru_cli-0.2.0/src/shikiru/operator/evidence_writer.py +78 -0
- shikiru_cli-0.2.0/src/shikiru/operator/lifecycle.py +294 -0
- shikiru_cli-0.2.0/src/shikiru/operator/plugin_checks.py +194 -0
- shikiru_cli-0.2.0/src/shikiru/operator/probe.py +287 -0
- shikiru_cli-0.2.0/src/shikiru/operator/queries.py +1601 -0
- shikiru_cli-0.2.0/src/shikiru/operator/services.py +36 -0
- shikiru_cli-0.2.0/src/shikiru/operator/sessions.py +378 -0
- shikiru_cli-0.2.0/src/shikiru/operator/strip_views.py +162 -0
- shikiru_cli-0.2.0/src/shikiru/operator/timeline.py +416 -0
- shikiru_cli-0.2.0/src/shikiru/operator/toml_text.py +62 -0
- shikiru_cli-0.2.0/src/shikiru/palette.py +18 -0
- shikiru_cli-0.2.0/src/shikiru/paths.py +91 -0
- shikiru_cli-0.2.0/src/shikiru/plugins/__init__.py +0 -0
- shikiru_cli-0.2.0/src/shikiru/plugins/agents/__init__.py +1 -0
- shikiru_cli-0.2.0/src/shikiru/plugins/agents/claude/__init__.py +5 -0
- shikiru_cli-0.2.0/src/shikiru/plugins/agents/claude/agent.py +251 -0
- shikiru_cli-0.2.0/src/shikiru/plugins/agents/claude/context.py +116 -0
- shikiru_cli-0.2.0/src/shikiru/plugins/agents/claude/headless.py +92 -0
- shikiru_cli-0.2.0/src/shikiru/plugins/agents/claude/hook.py +57 -0
- shikiru_cli-0.2.0/src/shikiru/plugins/agents/claude/model_catalog.py +105 -0
- shikiru_cli-0.2.0/src/shikiru/plugins/agents/claude/options.py +62 -0
- shikiru_cli-0.2.0/src/shikiru/plugins/agents/claude/turn.py +1018 -0
- shikiru_cli-0.2.0/src/shikiru/plugins/agents/codex/__init__.py +5 -0
- shikiru_cli-0.2.0/src/shikiru/plugins/agents/codex/agent.py +486 -0
- shikiru_cli-0.2.0/src/shikiru/plugins/agents/codex/headless.py +166 -0
- shikiru_cli-0.2.0/src/shikiru/plugins/agents/codex/home.py +14 -0
- shikiru_cli-0.2.0/src/shikiru/plugins/agents/codex/model_catalog.py +128 -0
- shikiru_cli-0.2.0/src/shikiru/plugins/agents/codex/options.py +94 -0
- shikiru_cli-0.2.0/src/shikiru/plugins/agents/codex/quota.py +195 -0
- shikiru_cli-0.2.0/src/shikiru/plugins/agents/codex/sandbox.py +31 -0
- shikiru_cli-0.2.0/src/shikiru/plugins/agents/codex/sandbox_probe.py +97 -0
- shikiru_cli-0.2.0/src/shikiru/plugins/agents/codex/turn.py +767 -0
- shikiru_cli-0.2.0/src/shikiru/plugins/agents/codex/usage.py +106 -0
- shikiru_cli-0.2.0/src/shikiru/plugins/agents/shared_settings.py +62 -0
- shikiru_cli-0.2.0/src/shikiru/plugins/widgets/__init__.py +3 -0
- shikiru_cli-0.2.0/src/shikiru/plugins/widgets/dialogue.py +144 -0
- shikiru_cli-0.2.0/src/shikiru/plugins/widgets/disk.py +123 -0
- shikiru_cli-0.2.0/src/shikiru/plugins/widgets/docker.py +225 -0
- shikiru_cli-0.2.0/src/shikiru/plugins/widgets/escalations.py +402 -0
- shikiru_cli-0.2.0/src/shikiru/plugins/widgets/faults.py +204 -0
- shikiru_cli-0.2.0/src/shikiru/plugins/widgets/header.py +321 -0
- shikiru_cli-0.2.0/src/shikiru/plugins/widgets/queue.py +1140 -0
- shikiru_cli-0.2.0/src/shikiru/plugins/widgets/queue_hint.py +93 -0
- shikiru_cli-0.2.0/src/shikiru/plugins/widgets/resources.py +105 -0
- shikiru_cli-0.2.0/src/shikiru/plugins/widgets/strips.py +82 -0
- shikiru_cli-0.2.0/src/shikiru/plugins/widgets/usage.py +176 -0
- shikiru_cli-0.2.0/src/shikiru/private.py +94 -0
- shikiru_cli-0.2.0/src/shikiru/process.py +535 -0
- shikiru_cli-0.2.0/src/shikiru/prompts/__init__.py +3 -0
- shikiru_cli-0.2.0/src/shikiru/prompts/renderer.py +85 -0
- shikiru_cli-0.2.0/src/shikiru/prompts/templates/_base.md.j2 +17 -0
- shikiru_cli-0.2.0/src/shikiru/prompts/templates/_macros.md.j2 +61 -0
- shikiru_cli-0.2.0/src/shikiru/prompts/templates/conflicts.md.j2 +22 -0
- shikiru_cli-0.2.0/src/shikiru/prompts/templates/consult.md.j2 +5 -0
- shikiru_cli-0.2.0/src/shikiru/prompts/templates/continue.md.j2 +4 -0
- shikiru_cli-0.2.0/src/shikiru/prompts/templates/feedback_analysis.md.j2 +29 -0
- shikiru_cli-0.2.0/src/shikiru/prompts/templates/feedback_rework.md.j2 +33 -0
- shikiru_cli-0.2.0/src/shikiru/prompts/templates/feedback_verify.md.j2 +33 -0
- shikiru_cli-0.2.0/src/shikiru/prompts/templates/handoff.md.j2 +23 -0
- shikiru_cli-0.2.0/src/shikiru/prompts/templates/implement.md.j2 +13 -0
- shikiru_cli-0.2.0/src/shikiru/prompts/templates/plan.md.j2 +30 -0
- shikiru_cli-0.2.0/src/shikiru/prompts/templates/rework.md.j2 +13 -0
- shikiru_cli-0.2.0/src/shikiru/prompts/templates/triage.md.j2 +20 -0
- shikiru_cli-0.2.0/src/shikiru/prompts/templates/verify.md.j2 +29 -0
- shikiru_cli-0.2.0/src/shikiru/store/__init__.py +1 -0
- shikiru_cli-0.2.0/src/shikiru/store/commands.py +242 -0
- shikiru_cli-0.2.0/src/shikiru/store/database.py +297 -0
- shikiru_cli-0.2.0/src/shikiru/store/escalations.py +240 -0
- shikiru_cli-0.2.0/src/shikiru/store/events.py +213 -0
- shikiru_cli-0.2.0/src/shikiru/store/feedback.py +266 -0
- shikiru_cli-0.2.0/src/shikiru/store/migrations/001_initial.sql +63 -0
- shikiru_cli-0.2.0/src/shikiru/store/migrations/002_headless_turns.sql +31 -0
- shikiru_cli-0.2.0/src/shikiru/store/migrations/003_drop_command_handled_at.sql +1 -0
- shikiru_cli-0.2.0/src/shikiru/store/migrations/004_repo_base_ref.sql +3 -0
- shikiru_cli-0.2.0/src/shikiru/store/migrations/005_complexity_explicit.sql +3 -0
- shikiru_cli-0.2.0/src/shikiru/store/migrations/006_events_kind_index.sql +1 -0
- shikiru_cli-0.2.0/src/shikiru/store/migrations/007_notification_cursor.sql +1 -0
- shikiru_cli-0.2.0/src/shikiru/store/migrations/008_reported_usage.sql +1 -0
- shikiru_cli-0.2.0/src/shikiru/store/migrations/009_billing_declarations.sql +2 -0
- shikiru_cli-0.2.0/src/shikiru/store/migrations/010_canonical_quota_windows.sql +3 -0
- shikiru_cli-0.2.0/src/shikiru/store/migrations/012_drop_task_quota_evidence.sql +2 -0
- shikiru_cli-0.2.0/src/shikiru/store/migrations/013_push_targets.sql +7 -0
- shikiru_cli-0.2.0/src/shikiru/store/migrations/014_agent_block_time.sql +6 -0
- shikiru_cli-0.2.0/src/shikiru/store/migrations/015_repair_orphan_agent_blocks.sql +3 -0
- shikiru_cli-0.2.0/src/shikiru/store/migrations/016_feedback_rounds.sql +29 -0
- shikiru_cli-0.2.0/src/shikiru/store/migrations/017_feedback_round_comments.sql +5 -0
- shikiru_cli-0.2.0/src/shikiru/store/migrations/__init__.py +1 -0
- shikiru_cli-0.2.0/src/shikiru/store/notification_cursor.py +29 -0
- shikiru_cli-0.2.0/src/shikiru/store/pushes.py +117 -0
- shikiru_cli-0.2.0/src/shikiru/store/quotas.py +153 -0
- shikiru_cli-0.2.0/src/shikiru/store/reader.py +310 -0
- shikiru_cli-0.2.0/src/shikiru/store/retention.py +92 -0
- shikiru_cli-0.2.0/src/shikiru/store/runs.py +227 -0
- shikiru_cli-0.2.0/src/shikiru/store/tasks.py +949 -0
- shikiru_cli-0.2.0/src/shikiru/telemetry/__init__.py +1 -0
- shikiru_cli-0.2.0/src/shikiru/telemetry/disk.py +167 -0
- shikiru_cli-0.2.0/src/shikiru/telemetry/docker.py +164 -0
- shikiru_cli-0.2.0/src/shikiru/telemetry/resources.py +296 -0
- shikiru_cli-0.2.0/src/shikiru/tmux/__init__.py +3 -0
- shikiru_cli-0.2.0/src/shikiru/tmux/client.py +637 -0
- shikiru_cli-0.2.0/src/shikiru/tmux/decorator.py +225 -0
- shikiru_cli-0.2.0/src/shikiru/tmux/layout.py +200 -0
- shikiru_cli-0.2.0/src/shikiru/tmux/session.py +381 -0
- shikiru_cli-0.2.0/src/shikiru/ui/__init__.py +9 -0
- shikiru_cli-0.2.0/src/shikiru/ui/age.py +45 -0
- shikiru_cli-0.2.0/src/shikiru/ui/bubbles.py +41 -0
- shikiru_cli-0.2.0/src/shikiru/ui/compact.py +1209 -0
- shikiru_cli-0.2.0/src/shikiru/ui/console.py +49 -0
- shikiru_cli-0.2.0/src/shikiru/ui/fold.py +50 -0
- shikiru_cli-0.2.0/src/shikiru/ui/gated_static.py +117 -0
- shikiru_cli-0.2.0/src/shikiru/ui/gauge.py +40 -0
- shikiru_cli-0.2.0/src/shikiru/ui/glyphs.py +109 -0
- shikiru_cli-0.2.0/src/shikiru/ui/keys.py +57 -0
- shikiru_cli-0.2.0/src/shikiru/ui/live_interval.py +42 -0
- shikiru_cli-0.2.0/src/shikiru/ui/popup.py +311 -0
- shikiru_cli-0.2.0/src/shikiru/ui/quota_status.py +26 -0
- shikiru_cli-0.2.0/src/shikiru/ui/recent_window.py +78 -0
- shikiru_cli-0.2.0/src/shikiru/ui/screen.py +57 -0
- shikiru_cli-0.2.0/src/shikiru/ui/section.py +193 -0
- shikiru_cli-0.2.0/src/shikiru/ui/session.py +65 -0
- shikiru_cli-0.2.0/src/shikiru/ui/size.py +17 -0
- shikiru_cli-0.2.0/src/shikiru/ui/splash.py +42 -0
- shikiru_cli-0.2.0/src/shikiru/ui/status.py +47 -0
- shikiru_cli-0.2.0/src/shikiru/ui/status_strip.py +149 -0
- shikiru_cli-0.2.0/src/shikiru/ui/stream.py +152 -0
- shikiru_cli-0.2.0/src/shikiru/ui/strip.py +332 -0
- shikiru_cli-0.2.0/src/shikiru/ui/theme.py +83 -0
- shikiru_cli-0.2.0/src/shikiru/ui/tokens.py +51 -0
- shikiru_cli-0.2.0/src/shikiru/view_log.py +126 -0
- shikiru_cli-0.2.0/src/shikiru/workspace/__init__.py +3 -0
- shikiru_cli-0.2.0/src/shikiru/workspace/base_refs.py +160 -0
- shikiru_cli-0.2.0/src/shikiru/workspace/caches.py +136 -0
- shikiru_cli-0.2.0/src/shikiru/workspace/facts.py +118 -0
- shikiru_cli-0.2.0/src/shikiru/workspace/git.py +601 -0
- shikiru_cli-0.2.0/src/shikiru/workspace/github.py +744 -0
- shikiru_cli-0.2.0/src/shikiru/workspace/messages.py +107 -0
- shikiru_cli-0.2.0/src/shikiru/workspace/reports.py +145 -0
- shikiru_cli-0.2.0/src/shikiru/workspace/roots.py +180 -0
- shikiru_cli-0.2.0/tests/__init__.py +0 -0
- shikiru_cli-0.2.0/tests/conftest.py +137 -0
- shikiru_cli-0.2.0/tests/e2e/__init__.py +0 -0
- shikiru_cli-0.2.0/tests/e2e/budgets.py +51 -0
- shikiru_cli-0.2.0/tests/e2e/conftest.py +163 -0
- shikiru_cli-0.2.0/tests/e2e/diagnostics.py +182 -0
- shikiru_cli-0.2.0/tests/e2e/real_agent_config.py +9 -0
- shikiru_cli-0.2.0/tests/e2e/test_operator_fake_agent.py +237 -0
- shikiru_cli-0.2.0/tests/e2e/test_real_agents.py +1210 -0
- shikiru_cli-0.2.0/tests/e2e/watchdog.py +86 -0
- shikiru_cli-0.2.0/tests/fake_agent/pyproject.toml +19 -0
- shikiru_cli-0.2.0/tests/fake_agent/src/fake_agent/__init__.py +1 -0
- shikiru_cli-0.2.0/tests/fake_agent/src/fake_agent/agent.py +168 -0
- shikiru_cli-0.2.0/tests/fake_agent/src/fake_agent/headless.py +36 -0
- shikiru_cli-0.2.0/tests/fake_agent/src/fake_agent/py.typed +0 -0
- shikiru_cli-0.2.0/tests/fake_agent/src/fake_agent/script.py +175 -0
- shikiru_cli-0.2.0/tests/fake_agent/src/fake_agent/scripted.py +432 -0
- shikiru_cli-0.2.0/tests/fake_agent/src/fake_agent/turn_cli.py +336 -0
- shikiru_cli-0.2.0/tests/fake_agent/src/fake_agent/turns.py +295 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/claude/README.md +70 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_background_result_compaction.jsonl +8 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_background_result_then_activity.jsonl +11 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_compact_ineffective.jsonl +3 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_compact_process.jsonl +4 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_compaction_failed.jsonl +2 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_context_failure.jsonl +2 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_context_failure.stderr.log +1 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_credit_exhausted.jsonl +2 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_hook_compact_live_redacted.jsonl +5 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_hook_continue_live_redacted.jsonl +4 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_hook_stop_live_redacted.jsonl +10 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_list_cost.jsonl +3 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_openrouter.jsonl +3 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_openrouter_live_redacted.jsonl +3 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_openrouter_report_live_redacted.jsonl +9 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_rate_limit.jsonl +3 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_rate_limit.stderr.log +1 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_rerun_success.jsonl +3 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_subscription.jsonl +6 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_tool_error.jsonl +5 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_unknown_error.jsonl +2 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_unknown_error.stderr.log +1 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_unrecognized_model.jsonl +2 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/claude/turn_unrecognized_model.stderr.log +1 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/codex/README.md +72 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/codex/rollout_first.jsonl +4 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/codex/rollout_midturn_compaction_live_redacted.jsonl +13 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/codex/rollout_model_change_turn_context_live_redacted.jsonl +4 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/codex/rollout_openrouter_live_redacted.jsonl +1 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/codex/rollout_rerun_compaction.jsonl +4 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/codex/rollout_resume_model_change.jsonl +8 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/codex/turn_context_failure.jsonl +3 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/codex/turn_empty.stderr.log +0 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/codex/turn_failed_command_incomplete.jsonl +3 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/codex/turn_first.jsonl +10 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/codex/turn_first.stderr.log +1 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/codex/turn_midturn_compaction_live_redacted.jsonl +28 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/codex/turn_model_capacity.jsonl +2 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/codex/turn_openrouter_live_redacted.jsonl +3 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/codex/turn_openrouter_live_redacted.stderr.log +1 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/codex/turn_rerun_success.jsonl +4 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/codex/turn_resume_model_change.jsonl +10 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/codex/turn_resume_model_change.stderr.log +0 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/codex/turn_tool_outcomes.jsonl +10 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/fake/turn_compact_process.jsonl +2 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/fake/turn_compacted.jsonl +6 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/fake/turn_compacted.stderr.log +0 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/fake/turn_compaction_failed.jsonl +1 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/fake/turn_context_failure.jsonl +2 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/fake/turn_full.jsonl +6 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/fake/turn_full.stderr.log +0 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/fake/turn_quota_error.jsonl +2 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/fake/turn_quota_error.stderr.log +0 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/fake/turn_retry_context_failure.jsonl +2 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/fake/turn_retry_success.jsonl +4 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/fake/turn_threshold_reached.jsonl +4 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/fake/turn_unknown_error.jsonl +2 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/fake/turn_unknown_error.stderr.log +0 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/fake/turn_unmapped_error.jsonl +1 -0
- shikiru_cli-0.2.0/tests/fixtures/agents/fake/turn_unmapped_error.stderr.log +1 -0
- shikiru_cli-0.2.0/tests/fixtures/sample-project/.gitignore +2 -0
- shikiru_cli-0.2.0/tests/fixtures/sample-project/AGENTS.md +4 -0
- shikiru_cli-0.2.0/tests/fixtures/sample-project/CLAUDE.md +1 -0
- shikiru_cli-0.2.0/tests/fixtures/sample-project/pyproject.toml +11 -0
- shikiru_cli-0.2.0/tests/fixtures/sample-project/sample_project/__init__.py +2 -0
- shikiru_cli-0.2.0/tests/fixtures/sample-project/tasks/plan.md +25 -0
- shikiru_cli-0.2.0/tests/fixtures/sample-project/tasks/todo.md +8 -0
- shikiru_cli-0.2.0/tests/fixtures/sample-project/tests/__init__.py +0 -0
- shikiru_cli-0.2.0/tests/fixtures/sample-project/tests/test_sample_project.py +5 -0
- shikiru_cli-0.2.0/tests/integration/__init__.py +0 -0
- shikiru_cli-0.2.0/tests/integration/dashboard_wizard_support.py +753 -0
- shikiru_cli-0.2.0/tests/integration/test_actions_list.py +1075 -0
- shikiru_cli-0.2.0/tests/integration/test_agent_sdk_turn.py +1011 -0
- shikiru_cli-0.2.0/tests/integration/test_agents_registry.py +67 -0
- shikiru_cli-0.2.0/tests/integration/test_billing_declarations.py +206 -0
- shikiru_cli-0.2.0/tests/integration/test_claude_compaction.py +104 -0
- shikiru_cli-0.2.0/tests/integration/test_claude_headless_contract.py +1085 -0
- shikiru_cli-0.2.0/tests/integration/test_cli.py +22 -0
- shikiru_cli-0.2.0/tests/integration/test_cli_report.py +176 -0
- shikiru_cli-0.2.0/tests/integration/test_cli_restart.py +72 -0
- shikiru_cli-0.2.0/tests/integration/test_codex_headless_contract.py +1645 -0
- shikiru_cli-0.2.0/tests/integration/test_codex_sandbox_probe.py +67 -0
- shikiru_cli-0.2.0/tests/integration/test_codex_worktree_sandbox.py +97 -0
- shikiru_cli-0.2.0/tests/integration/test_config_ladder_round_trip.py +101 -0
- shikiru_cli-0.2.0/tests/integration/test_dashboard_app.py +5645 -0
- shikiru_cli-0.2.0/tests/integration/test_dashboard_bar_templates.py +396 -0
- shikiru_cli-0.2.0/tests/integration/test_dashboard_briefing.py +720 -0
- shikiru_cli-0.2.0/tests/integration/test_dashboard_diagnostics_panel.py +678 -0
- shikiru_cli-0.2.0/tests/integration/test_dashboard_disk_section.py +265 -0
- shikiru_cli-0.2.0/tests/integration/test_dashboard_docker_section.py +319 -0
- shikiru_cli-0.2.0/tests/integration/test_dashboard_escalation_follow.py +350 -0
- shikiru_cli-0.2.0/tests/integration/test_dashboard_fault_cards.py +142 -0
- shikiru_cli-0.2.0/tests/integration/test_dashboard_live_work.py +295 -0
- shikiru_cli-0.2.0/tests/integration/test_dashboard_motion.py +2066 -0
- shikiru_cli-0.2.0/tests/integration/test_dashboard_motion_skips.py +239 -0
- shikiru_cli-0.2.0/tests/integration/test_dashboard_palette.py +1268 -0
- shikiru_cli-0.2.0/tests/integration/test_dashboard_popup_focus.py +386 -0
- shikiru_cli-0.2.0/tests/integration/test_dashboard_quota_waits.py +577 -0
- shikiru_cli-0.2.0/tests/integration/test_dashboard_remaining_widgets.py +1538 -0
- shikiru_cli-0.2.0/tests/integration/test_dashboard_resolution.py +886 -0
- shikiru_cli-0.2.0/tests/integration/test_dashboard_results.py +397 -0
- shikiru_cli-0.2.0/tests/integration/test_dashboard_services.py +275 -0
- shikiru_cli-0.2.0/tests/integration/test_dashboard_settings_reload.py +250 -0
- shikiru_cli-0.2.0/tests/integration/test_dashboard_tab_stops.py +365 -0
- shikiru_cli-0.2.0/tests/integration/test_dashboard_task_detail.py +2835 -0
- shikiru_cli-0.2.0/tests/integration/test_dashboard_task_work.py +40 -0
- shikiru_cli-0.2.0/tests/integration/test_dashboard_usage_panel.py +646 -0
- shikiru_cli-0.2.0/tests/integration/test_dashboard_view_cache.py +159 -0
- shikiru_cli-0.2.0/tests/integration/test_dashboard_widgets.py +566 -0
- shikiru_cli-0.2.0/tests/integration/test_dashboard_wizard.py +386 -0
- shikiru_cli-0.2.0/tests/integration/test_dashboard_wizard_agents.py +370 -0
- shikiru_cli-0.2.0/tests/integration/test_dashboard_wizard_navigation.py +412 -0
- shikiru_cli-0.2.0/tests/integration/test_disk_sampler.py +184 -0
- shikiru_cli-0.2.0/tests/integration/test_docker_sampler.py +249 -0
- shikiru_cli-0.2.0/tests/integration/test_e2e_guards.py +247 -0
- shikiru_cli-0.2.0/tests/integration/test_e2e_results.py +126 -0
- shikiru_cli-0.2.0/tests/integration/test_engine_agents.py +21 -0
- shikiru_cli-0.2.0/tests/integration/test_engine_daemon.py +2409 -0
- shikiru_cli-0.2.0/tests/integration/test_engine_decomposition.py +188 -0
- shikiru_cli-0.2.0/tests/integration/test_engine_escalation_faults.py +246 -0
- shikiru_cli-0.2.0/tests/integration/test_engine_escalations.py +279 -0
- shikiru_cli-0.2.0/tests/integration/test_engine_evidence.py +45 -0
- shikiru_cli-0.2.0/tests/integration/test_engine_faults.py +610 -0
- shikiru_cli-0.2.0/tests/integration/test_engine_feedback.py +468 -0
- shikiru_cli-0.2.0/tests/integration/test_engine_feedback_landing.py +131 -0
- shikiru_cli-0.2.0/tests/integration/test_engine_feedback_recovery.py +307 -0
- shikiru_cli-0.2.0/tests/integration/test_engine_feedback_rounds.py +386 -0
- shikiru_cli-0.2.0/tests/integration/test_engine_flow.py +606 -0
- shikiru_cli-0.2.0/tests/integration/test_engine_flow_liveness.py +185 -0
- shikiru_cli-0.2.0/tests/integration/test_engine_flow_pinning.py +263 -0
- shikiru_cli-0.2.0/tests/integration/test_engine_holds.py +302 -0
- shikiru_cli-0.2.0/tests/integration/test_engine_hung_remote.py +105 -0
- shikiru_cli-0.2.0/tests/integration/test_engine_integration.py +1507 -0
- shikiru_cli-0.2.0/tests/integration/test_engine_layout.py +465 -0
- shikiru_cli-0.2.0/tests/integration/test_engine_monitor.py +310 -0
- shikiru_cli-0.2.0/tests/integration/test_engine_notification_delivery.py +282 -0
- shikiru_cli-0.2.0/tests/integration/test_engine_notifications.py +259 -0
- shikiru_cli-0.2.0/tests/integration/test_engine_pull_request.py +810 -0
- shikiru_cli-0.2.0/tests/integration/test_engine_push.py +703 -0
- shikiru_cli-0.2.0/tests/integration/test_engine_recovery.py +1086 -0
- shikiru_cli-0.2.0/tests/integration/test_engine_resources.py +19 -0
- shikiru_cli-0.2.0/tests/integration/test_engine_restart.py +738 -0
- shikiru_cli-0.2.0/tests/integration/test_engine_retention.py +325 -0
- shikiru_cli-0.2.0/tests/integration/test_engine_scheduler.py +1829 -0
- shikiru_cli-0.2.0/tests/integration/test_engine_sessions.py +245 -0
- shikiru_cli-0.2.0/tests/integration/test_engine_signals.py +96 -0
- shikiru_cli-0.2.0/tests/integration/test_engine_squash.py +774 -0
- shikiru_cli-0.2.0/tests/integration/test_engine_start_failure.py +112 -0
- shikiru_cli-0.2.0/tests/integration/test_engine_tick_guard.py +182 -0
- shikiru_cli-0.2.0/tests/integration/test_engine_titles.py +381 -0
- shikiru_cli-0.2.0/tests/integration/test_engine_turns.py +353 -0
- shikiru_cli-0.2.0/tests/integration/test_fake_agent_contract.py +504 -0
- shikiru_cli-0.2.0/tests/integration/test_fake_agent_environment.py +56 -0
- shikiru_cli-0.2.0/tests/integration/test_fake_agent_script_order.py +55 -0
- shikiru_cli-0.2.0/tests/integration/test_gated_static.py +115 -0
- shikiru_cli-0.2.0/tests/integration/test_git_mutation_cancel.py +133 -0
- shikiru_cli-0.2.0/tests/integration/test_github_feedback.py +462 -0
- shikiru_cli-0.2.0/tests/integration/test_helper.py +376 -0
- shikiru_cli-0.2.0/tests/integration/test_home_recent_window.py +469 -0
- shikiru_cli-0.2.0/tests/integration/test_import_contract_completeness.py +60 -0
- shikiru_cli-0.2.0/tests/integration/test_mcp_server.py +97 -0
- shikiru_cli-0.2.0/tests/integration/test_operator_cli.py +514 -0
- shikiru_cli-0.2.0/tests/integration/test_operator_doctor.py +515 -0
- shikiru_cli-0.2.0/tests/integration/test_operator_fault_status.py +164 -0
- shikiru_cli-0.2.0/tests/integration/test_operator_plugin_checks.py +138 -0
- shikiru_cli-0.2.0/tests/integration/test_operator_render.py +244 -0
- shikiru_cli-0.2.0/tests/integration/test_operator_services.py +676 -0
- shikiru_cli-0.2.0/tests/integration/test_operator_sessions.py +1733 -0
- shikiru_cli-0.2.0/tests/integration/test_operator_stop_wait.py +116 -0
- shikiru_cli-0.2.0/tests/integration/test_private_dirs.py +32 -0
- shikiru_cli-0.2.0/tests/integration/test_process.py +351 -0
- shikiru_cli-0.2.0/tests/integration/test_prompts_renderer.py +127 -0
- shikiru_cli-0.2.0/tests/integration/test_quota_reconciler.py +71 -0
- shikiru_cli-0.2.0/tests/integration/test_quota_visibility.py +605 -0
- shikiru_cli-0.2.0/tests/integration/test_reconcile_orphans.py +148 -0
- shikiru_cli-0.2.0/tests/integration/test_release_notes.py +232 -0
- shikiru_cli-0.2.0/tests/integration/test_release_workflow.py +63 -0
- shikiru_cli-0.2.0/tests/integration/test_resource_sampler_cpu.py +94 -0
- shikiru_cli-0.2.0/tests/integration/test_resource_sampler_identity.py +132 -0
- shikiru_cli-0.2.0/tests/integration/test_soak_smoke.py +53 -0
- shikiru_cli-0.2.0/tests/integration/test_store_commands.py +55 -0
- shikiru_cli-0.2.0/tests/integration/test_store_database.py +482 -0
- shikiru_cli-0.2.0/tests/integration/test_store_escalations.py +82 -0
- shikiru_cli-0.2.0/tests/integration/test_store_events.py +70 -0
- shikiru_cli-0.2.0/tests/integration/test_store_quotas.py +233 -0
- shikiru_cli-0.2.0/tests/integration/test_store_reader.py +198 -0
- shikiru_cli-0.2.0/tests/integration/test_store_runs.py +131 -0
- shikiru_cli-0.2.0/tests/integration/test_store_tasks.py +472 -0
- shikiru_cli-0.2.0/tests/integration/test_task_blocker_evidence.py +550 -0
- shikiru_cli-0.2.0/tests/integration/test_task_browser.py +1020 -0
- shikiru_cli-0.2.0/tests/integration/test_task_detail_bodies.py +1187 -0
- shikiru_cli-0.2.0/tests/integration/test_task_detail_folds.py +369 -0
- shikiru_cli-0.2.0/tests/integration/test_task_evidence_export.py +781 -0
- shikiru_cli-0.2.0/tests/integration/test_task_family_and_blockers.py +1109 -0
- shikiru_cli-0.2.0/tests/integration/test_task_picker.py +146 -0
- shikiru_cli-0.2.0/tests/integration/test_task_timeline.py +1211 -0
- shikiru_cli-0.2.0/tests/integration/test_tmux_decorator.py +341 -0
- shikiru_cli-0.2.0/tests/integration/test_tmux_layout.py +126 -0
- shikiru_cli-0.2.0/tests/integration/test_tmux_palette_binding.py +248 -0
- shikiru_cli-0.2.0/tests/integration/test_tmux_session.py +435 -0
- shikiru_cli-0.2.0/tests/integration/test_turn_ordering.py +81 -0
- shikiru_cli-0.2.0/tests/integration/test_turn_processes.py +145 -0
- shikiru_cli-0.2.0/tests/integration/test_version_from_tag.py +43 -0
- shikiru_cli-0.2.0/tests/integration/test_view.py +93 -0
- shikiru_cli-0.2.0/tests/integration/test_workspace_base_sync.py +193 -0
- shikiru_cli-0.2.0/tests/integration/test_workspace_caches.py +175 -0
- shikiru_cli-0.2.0/tests/integration/test_workspace_facts.py +175 -0
- shikiru_cli-0.2.0/tests/integration/test_workspace_messages.py +31 -0
- shikiru_cli-0.2.0/tests/integration/test_workspace_roots.py +338 -0
- shikiru_cli-0.2.0/tests/integration/test_workspace_walkthroughs.py +755 -0
- shikiru_cli-0.2.0/tests/soak/__init__.py +0 -0
- shikiru_cli-0.2.0/tests/soak/__main__.py +40 -0
- shikiru_cli-0.2.0/tests/soak/arena.py +283 -0
- shikiru_cli-0.2.0/tests/soak/chaos.py +214 -0
- shikiru_cli-0.2.0/tests/soak/driver.py +119 -0
- shikiru_cli-0.2.0/tests/soak/hook.py +28 -0
- shikiru_cli-0.2.0/tests/soak/hosting.py +75 -0
- shikiru_cli-0.2.0/tests/soak/invariants.py +386 -0
- shikiru_cli-0.2.0/tests/soak/model.py +120 -0
- shikiru_cli-0.2.0/tests/soak/operators.py +200 -0
- shikiru_cli-0.2.0/tests/soak/probe.py +48 -0
- shikiru_cli-0.2.0/tests/soak/processes.py +58 -0
- shikiru_cli-0.2.0/tests/soak/reporter.py +75 -0
- shikiru_cli-0.2.0/tests/soak/run.py +192 -0
- shikiru_cli-0.2.0/tests/soak/scenarios.py +218 -0
- shikiru_cli-0.2.0/tests/soak/supervisor.py +62 -0
- shikiru_cli-0.2.0/tests/support/README.md +40 -0
- shikiru_cli-0.2.0/tests/support/__init__.py +1 -0
- shikiru_cli-0.2.0/tests/support/actions.py +234 -0
- shikiru_cli-0.2.0/tests/support/cells.py +150 -0
- shikiru_cli-0.2.0/tests/support/cli_project.py +77 -0
- shikiru_cli-0.2.0/tests/support/clock.py +83 -0
- shikiru_cli-0.2.0/tests/support/comment_rule.py +79 -0
- shikiru_cli-0.2.0/tests/support/config.py +34 -0
- shikiru_cli-0.2.0/tests/support/dashboard.py +442 -0
- shikiru_cli-0.2.0/tests/support/e2e_attempts.py +25 -0
- shikiru_cli-0.2.0/tests/support/e2e_provenance.py +43 -0
- shikiru_cli-0.2.0/tests/support/engine.py +490 -0
- shikiru_cli-0.2.0/tests/support/engine_project.py +178 -0
- shikiru_cli-0.2.0/tests/support/entry_points.py +35 -0
- shikiru_cli-0.2.0/tests/support/escalations.py +291 -0
- shikiru_cli-0.2.0/tests/support/factories.py +205 -0
- shikiru_cli-0.2.0/tests/support/fake_gh.py +404 -0
- shikiru_cli-0.2.0/tests/support/fake_monitor_claude.py +260 -0
- shikiru_cli-0.2.0/tests/support/feedback_rounds.py +367 -0
- shikiru_cli-0.2.0/tests/support/flow.py +370 -0
- shikiru_cli-0.2.0/tests/support/git_repo.py +64 -0
- shikiru_cli-0.2.0/tests/support/github.py +257 -0
- shikiru_cli-0.2.0/tests/support/handshake.py +41 -0
- shikiru_cli-0.2.0/tests/support/literal_rule.py +236 -0
- shikiru_cli-0.2.0/tests/support/permissions.py +14 -0
- shikiru_cli-0.2.0/tests/support/process_tree.py +97 -0
- shikiru_cli-0.2.0/tests/support/project_dir.py +27 -0
- shikiru_cli-0.2.0/tests/support/quota_waits.py +68 -0
- shikiru_cli-0.2.0/tests/support/release_wait.py +282 -0
- shikiru_cli-0.2.0/tests/support/render.py +31 -0
- shikiru_cli-0.2.0/tests/support/resource_agent.py +163 -0
- shikiru_cli-0.2.0/tests/support/spawn_hook.py +125 -0
- shikiru_cli-0.2.0/tests/support/spawn_then_die.py +30 -0
- shikiru_cli-0.2.0/tests/support/store.py +95 -0
- shikiru_cli-0.2.0/tests/support/store_reader_process.py +42 -0
- shikiru_cli-0.2.0/tests/support/store_submit_process.py +29 -0
- shikiru_cli-0.2.0/tests/support/tmux.py +154 -0
- shikiru_cli-0.2.0/tests/support/waiting.py +214 -0
- shikiru_cli-0.2.0/tests/support/workspace.py +34 -0
- shikiru_cli-0.2.0/tests/support/xdist_workers.py +27 -0
- shikiru_cli-0.2.0/tests/unit/__init__.py +0 -0
- shikiru_cli-0.2.0/tests/unit/test_agent_model_choices.py +55 -0
- shikiru_cli-0.2.0/tests/unit/test_agent_settings.py +90 -0
- shikiru_cli-0.2.0/tests/unit/test_agents_contract_obligations.py +125 -0
- shikiru_cli-0.2.0/tests/unit/test_agents_contracts.py +67 -0
- shikiru_cli-0.2.0/tests/unit/test_agents_sdk_reset_time.py +159 -0
- shikiru_cli-0.2.0/tests/unit/test_claude_context.py +69 -0
- shikiru_cli-0.2.0/tests/unit/test_claude_model_catalog.py +76 -0
- shikiru_cli-0.2.0/tests/unit/test_claude_result_records.py +171 -0
- shikiru_cli-0.2.0/tests/unit/test_claude_usage.py +99 -0
- shikiru_cli-0.2.0/tests/unit/test_codex_capacity.py +235 -0
- shikiru_cli-0.2.0/tests/unit/test_codex_model_catalog.py +95 -0
- shikiru_cli-0.2.0/tests/unit/test_codex_quota_evidence.py +233 -0
- shikiru_cli-0.2.0/tests/unit/test_codex_turn_parser.py +444 -0
- shikiru_cli-0.2.0/tests/unit/test_codex_usage.py +33 -0
- shikiru_cli-0.2.0/tests/unit/test_comment_rule.py +38 -0
- shikiru_cli-0.2.0/tests/unit/test_config_loader.py +249 -0
- shikiru_cli-0.2.0/tests/unit/test_config_settings.py +185 -0
- shikiru_cli-0.2.0/tests/unit/test_domain_acceptance.py +111 -0
- shikiru_cli-0.2.0/tests/unit/test_domain_activity.py +45 -0
- shikiru_cli-0.2.0/tests/unit/test_domain_attempts.py +281 -0
- shikiru_cli-0.2.0/tests/unit/test_domain_briefing.py +150 -0
- shikiru_cli-0.2.0/tests/unit/test_domain_decisions.py +87 -0
- shikiru_cli-0.2.0/tests/unit/test_domain_docker.py +208 -0
- shikiru_cli-0.2.0/tests/unit/test_domain_engine_uptime.py +179 -0
- shikiru_cli-0.2.0/tests/unit/test_domain_escalation.py +137 -0
- shikiru_cli-0.2.0/tests/unit/test_domain_escalation_evidence.py +82 -0
- shikiru_cli-0.2.0/tests/unit/test_domain_escalation_panel.py +81 -0
- shikiru_cli-0.2.0/tests/unit/test_domain_faults.py +99 -0
- shikiru_cli-0.2.0/tests/unit/test_domain_feedback.py +270 -0
- shikiru_cli-0.2.0/tests/unit/test_domain_feedback_rounds.py +85 -0
- shikiru_cli-0.2.0/tests/unit/test_domain_fencing.py +57 -0
- shikiru_cli-0.2.0/tests/unit/test_domain_ladder.py +242 -0
- shikiru_cli-0.2.0/tests/unit/test_domain_levels.py +54 -0
- shikiru_cli-0.2.0/tests/unit/test_domain_motion.py +303 -0
- shikiru_cli-0.2.0/tests/unit/test_domain_pushes.py +71 -0
- shikiru_cli-0.2.0/tests/unit/test_domain_quota_blocks.py +98 -0
- shikiru_cli-0.2.0/tests/unit/test_domain_quota_waits.py +267 -0
- shikiru_cli-0.2.0/tests/unit/test_domain_recovery.py +305 -0
- shikiru_cli-0.2.0/tests/unit/test_domain_reports.py +222 -0
- shikiru_cli-0.2.0/tests/unit/test_domain_results.py +226 -0
- shikiru_cli-0.2.0/tests/unit/test_domain_runs.py +30 -0
- shikiru_cli-0.2.0/tests/unit/test_domain_scheduling.py +319 -0
- shikiru_cli-0.2.0/tests/unit/test_domain_status_tasks.py +124 -0
- shikiru_cli-0.2.0/tests/unit/test_domain_steps.py +461 -0
- shikiru_cli-0.2.0/tests/unit/test_domain_task_titles.py +42 -0
- shikiru_cli-0.2.0/tests/unit/test_domain_versions.py +24 -0
- shikiru_cli-0.2.0/tests/unit/test_domain_workflow.py +620 -0
- shikiru_cli-0.2.0/tests/unit/test_engine_feedback_snapshot.py +174 -0
- shikiru_cli-0.2.0/tests/unit/test_fake_clock.py +98 -0
- shikiru_cli-0.2.0/tests/unit/test_ladder_text.py +45 -0
- shikiru_cli-0.2.0/tests/unit/test_literal_rule.py +69 -0
- shikiru_cli-0.2.0/tests/unit/test_orchestration_fields.py +64 -0
- shikiru_cli-0.2.0/tests/unit/test_packet_evidence.py +127 -0
- shikiru_cli-0.2.0/tests/unit/test_process_identity.py +40 -0
- shikiru_cli-0.2.0/tests/unit/test_quota_normalization.py +91 -0
- shikiru_cli-0.2.0/tests/unit/test_task_timeline_parser.py +71 -0
- shikiru_cli-0.2.0/tests/unit/test_timeline_phrases.py +97 -0
- shikiru_cli-0.2.0/tests/unit/test_tmux_session_name.py +18 -0
- shikiru_cli-0.2.0/tests/unit/test_ui_age.py +38 -0
- shikiru_cli-0.2.0/tests/unit/test_ui_cpu_format.py +19 -0
- shikiru_cli-0.2.0/tests/unit/test_ui_glyphs.py +24 -0
- shikiru_cli-0.2.0/tests/unit/test_ui_keys.py +39 -0
- shikiru_cli-0.2.0/tests/unit/test_ui_recent_window.py +121 -0
- shikiru_cli-0.2.0/tests/unit/test_ui_size.py +21 -0
- shikiru_cli-0.2.0/tests/unit/test_ui_strip.py +152 -0
- shikiru_cli-0.2.0/tests/unit/test_usage_rows.py +121 -0
- shikiru_cli-0.2.0/tests/unit/test_view_log.py +16 -0
- shikiru_cli-0.2.0/tests/unit/test_view_tail.py +148 -0
- shikiru_cli-0.2.0/tests/unit/test_waiting_time_scale.py +23 -0
- shikiru_cli-0.2.0/tests/unit/test_workspace_slugify.py +9 -0
- shikiru_cli-0.2.0/tests/unit/test_xdist_workers.py +28 -0
- shikiru_cli-0.2.0/uv.lock +1152 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
name: Bug report
|
|
2
|
+
description: Report a problem with Shikiru
|
|
3
|
+
labels: ["bug"]
|
|
4
|
+
body:
|
|
5
|
+
- type: markdown
|
|
6
|
+
attributes:
|
|
7
|
+
value: >-
|
|
8
|
+
Do not paste secrets or private project content. State files, prompts and reports can contain
|
|
9
|
+
it; redact before posting.
|
|
10
|
+
- type: textarea
|
|
11
|
+
id: what-happened
|
|
12
|
+
attributes:
|
|
13
|
+
label: What happened?
|
|
14
|
+
validations:
|
|
15
|
+
required: true
|
|
16
|
+
- type: textarea
|
|
17
|
+
id: expected
|
|
18
|
+
attributes:
|
|
19
|
+
label: What did you expect?
|
|
20
|
+
validations:
|
|
21
|
+
required: true
|
|
22
|
+
- type: textarea
|
|
23
|
+
id: steps
|
|
24
|
+
attributes:
|
|
25
|
+
label: Steps to reproduce
|
|
26
|
+
description: The commands you ran, in order.
|
|
27
|
+
- type: textarea
|
|
28
|
+
id: environment
|
|
29
|
+
attributes:
|
|
30
|
+
label: Environment
|
|
31
|
+
description: Output of `shikiru --version` and `shikiru doctor`, and your operating system.
|
|
32
|
+
validations:
|
|
33
|
+
required: true
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
name: Feature request
|
|
2
|
+
description: Suggest a change to Shikiru
|
|
3
|
+
labels: ["enhancement"]
|
|
4
|
+
body:
|
|
5
|
+
- type: markdown
|
|
6
|
+
attributes:
|
|
7
|
+
value: >-
|
|
8
|
+
Open this before starting anything larger than a small fix, so the approach can be agreed first.
|
|
9
|
+
- type: textarea
|
|
10
|
+
id: problem
|
|
11
|
+
attributes:
|
|
12
|
+
label: What problem does this solve?
|
|
13
|
+
validations:
|
|
14
|
+
required: true
|
|
15
|
+
- type: textarea
|
|
16
|
+
id: proposal
|
|
17
|
+
attributes:
|
|
18
|
+
label: Proposed behaviour
|
|
19
|
+
validations:
|
|
20
|
+
required: true
|
|
21
|
+
- type: textarea
|
|
22
|
+
id: alternatives
|
|
23
|
+
attributes:
|
|
24
|
+
label: Alternatives considered
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
## Summary
|
|
2
|
+
|
|
3
|
+
<!-- What changes and why. Link the issue if there is one. -->
|
|
4
|
+
|
|
5
|
+
## Quality gate
|
|
6
|
+
|
|
7
|
+
Result of `PYTEST_ADDOPTS='--dist=loadfile' uv run poe check` on this branch (green, or the failing check):
|
|
8
|
+
|
|
9
|
+
## Checklist
|
|
10
|
+
|
|
11
|
+
- [ ] Commits follow Conventional Commits.
|
|
12
|
+
- [ ] `AGENTS.md` conventions are followed.
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
11
|
+
concurrency:
|
|
12
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
13
|
+
cancel-in-progress: true
|
|
14
|
+
|
|
15
|
+
jobs:
|
|
16
|
+
check:
|
|
17
|
+
name: ${{ matrix.os }}
|
|
18
|
+
runs-on: ${{ matrix.os }}
|
|
19
|
+
timeout-minutes: 45
|
|
20
|
+
strategy:
|
|
21
|
+
fail-fast: false
|
|
22
|
+
max-parallel: 2
|
|
23
|
+
matrix:
|
|
24
|
+
os: [ubuntu-24.04, macos-15]
|
|
25
|
+
env:
|
|
26
|
+
PYTEST_ADDOPTS: --dist=loadfile --durations=15
|
|
27
|
+
SHIKIRU_TEST_CPUS_PER_WORKER: "1"
|
|
28
|
+
UV_NO_PROGRESS: "true"
|
|
29
|
+
NODE_OPTIONS: --max-old-space-size=1536
|
|
30
|
+
TERM: xterm-256color
|
|
31
|
+
|
|
32
|
+
steps:
|
|
33
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
34
|
+
with:
|
|
35
|
+
fetch-depth: 0
|
|
36
|
+
persist-credentials: false
|
|
37
|
+
|
|
38
|
+
- uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2
|
|
39
|
+
with:
|
|
40
|
+
version: "0.12.5"
|
|
41
|
+
python-version: "3.14"
|
|
42
|
+
activate-environment: true
|
|
43
|
+
enable-cache: false
|
|
44
|
+
|
|
45
|
+
- name: Install required host tools
|
|
46
|
+
run: |
|
|
47
|
+
if [[ "$RUNNER_OS" == Linux ]]; then
|
|
48
|
+
sudo apt-get update
|
|
49
|
+
sudo apt-get install --yes \
|
|
50
|
+
bison build-essential ca-certificates curl git libevent-dev libncurses-dev pkg-config
|
|
51
|
+
TMUX_VERSION=3.5a
|
|
52
|
+
TMUX_SHA256=16216bd0877170dfcc64157085ba9013610b12b082548c7c9542cc0103198951
|
|
53
|
+
TMUX_ARCHIVE="$RUNNER_TEMP/tmux-$TMUX_VERSION.tar.gz"
|
|
54
|
+
TMUX_SOURCE="$RUNNER_TEMP/tmux-$TMUX_VERSION"
|
|
55
|
+
curl --fail --location --silent --show-error \
|
|
56
|
+
"https://github.com/tmux/tmux/releases/download/$TMUX_VERSION/tmux-$TMUX_VERSION.tar.gz" \
|
|
57
|
+
--output "$TMUX_ARCHIVE"
|
|
58
|
+
printf '%s %s\n' "$TMUX_SHA256" "$TMUX_ARCHIVE" | sha256sum --check
|
|
59
|
+
tar --extract --gzip --file "$TMUX_ARCHIVE" --directory "$RUNNER_TEMP"
|
|
60
|
+
cd "$TMUX_SOURCE"
|
|
61
|
+
./configure --prefix=/usr/local
|
|
62
|
+
make -j2
|
|
63
|
+
sudo make install
|
|
64
|
+
else
|
|
65
|
+
brew install git tmux
|
|
66
|
+
fi
|
|
67
|
+
|
|
68
|
+
- name: Sync locked environment
|
|
69
|
+
run: uv sync --locked
|
|
70
|
+
|
|
71
|
+
- name: Check required host tool versions
|
|
72
|
+
run: |
|
|
73
|
+
uv run --locked python - <<'PY'
|
|
74
|
+
import asyncio
|
|
75
|
+
|
|
76
|
+
from shikiru.domain.versions import parse_version
|
|
77
|
+
from shikiru.operator.doctor import GIT_MINIMUM_VERSION, TMUX_MINIMUM_VERSION
|
|
78
|
+
from shikiru.process import SubprocessRunner
|
|
79
|
+
|
|
80
|
+
COMMAND_TIMEOUT = 5
|
|
81
|
+
REQUIREMENTS = (
|
|
82
|
+
("git", "--version", GIT_MINIMUM_VERSION),
|
|
83
|
+
("tmux", "-V", TMUX_MINIMUM_VERSION),
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
async def check_versions():
|
|
87
|
+
runner = SubprocessRunner()
|
|
88
|
+
for executable, flag, minimum in REQUIREMENTS:
|
|
89
|
+
result = await runner.run(
|
|
90
|
+
(executable, flag), timeout=COMMAND_TIMEOUT, check=True
|
|
91
|
+
)
|
|
92
|
+
version = parse_version(result.stdout)
|
|
93
|
+
if version is None or version < minimum:
|
|
94
|
+
raise SystemExit(f"{executable} must be at least {minimum}")
|
|
95
|
+
print(f"{executable}: {result.stdout.strip()}")
|
|
96
|
+
|
|
97
|
+
asyncio.run(check_versions())
|
|
98
|
+
PY
|
|
99
|
+
|
|
100
|
+
- name: Run quality gate
|
|
101
|
+
run: uv run --locked poe check
|
|
102
|
+
|
|
103
|
+
- name: Build and exercise package distributions
|
|
104
|
+
run: bash scripts/release-readiness-smoke.sh
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags: ["v*"]
|
|
6
|
+
|
|
7
|
+
permissions: {}
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
check:
|
|
11
|
+
name: Check CI passed on the tagged commit
|
|
12
|
+
runs-on: ubuntu-24.04
|
|
13
|
+
timeout-minutes: 10
|
|
14
|
+
permissions:
|
|
15
|
+
contents: read
|
|
16
|
+
actions: read
|
|
17
|
+
|
|
18
|
+
steps:
|
|
19
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
20
|
+
with:
|
|
21
|
+
fetch-depth: 0
|
|
22
|
+
persist-credentials: false
|
|
23
|
+
|
|
24
|
+
- name: Check the tagged commit is on main and CI passed on it
|
|
25
|
+
env:
|
|
26
|
+
GH_TOKEN: ${{ github.token }}
|
|
27
|
+
GH_REPO: ${{ github.repository }}
|
|
28
|
+
run: |
|
|
29
|
+
if ! git merge-base --is-ancestor "$GITHUB_SHA" origin/main; then
|
|
30
|
+
echo "::error::the tag must point at a commit on main" >&2
|
|
31
|
+
exit 1
|
|
32
|
+
fi
|
|
33
|
+
passed="$(gh run list --workflow ci.yml --commit "$GITHUB_SHA" --json conclusion \
|
|
34
|
+
--jq 'any(.[]; .conclusion == "success")')"
|
|
35
|
+
if [[ "$passed" != true ]]; then
|
|
36
|
+
echo "::error::CI has not passed on this commit; wait for it and push the tag again" >&2
|
|
37
|
+
exit 1
|
|
38
|
+
fi
|
|
39
|
+
|
|
40
|
+
build:
|
|
41
|
+
name: Build the distributions
|
|
42
|
+
needs: check
|
|
43
|
+
runs-on: ubuntu-24.04
|
|
44
|
+
timeout-minutes: 15
|
|
45
|
+
env:
|
|
46
|
+
TAG: ${{ github.ref_name }}
|
|
47
|
+
UV_NO_PROGRESS: "true"
|
|
48
|
+
|
|
49
|
+
steps:
|
|
50
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
51
|
+
with:
|
|
52
|
+
fetch-depth: 0
|
|
53
|
+
persist-credentials: false
|
|
54
|
+
|
|
55
|
+
- uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2
|
|
56
|
+
with:
|
|
57
|
+
version: "0.12.5"
|
|
58
|
+
python-version: "3.14"
|
|
59
|
+
enable-cache: false
|
|
60
|
+
|
|
61
|
+
- name: Build the distributions
|
|
62
|
+
run: uv build
|
|
63
|
+
|
|
64
|
+
- name: Check the build carries the tag's version
|
|
65
|
+
run: |
|
|
66
|
+
VERSION="${TAG#v}"
|
|
67
|
+
if [[ ! -f "dist/shikiru_cli-$VERSION-py3-none-any.whl" ]]; then
|
|
68
|
+
echo "::error::tag $TAG does not build as shikiru-cli $VERSION" >&2
|
|
69
|
+
exit 1
|
|
70
|
+
fi
|
|
71
|
+
|
|
72
|
+
- name: Upload the distributions
|
|
73
|
+
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
|
|
74
|
+
with:
|
|
75
|
+
name: dist
|
|
76
|
+
path: dist/
|
|
77
|
+
if-no-files-found: error
|
|
78
|
+
|
|
79
|
+
pypi:
|
|
80
|
+
name: Publish to PyPI
|
|
81
|
+
needs: build
|
|
82
|
+
runs-on: ubuntu-24.04
|
|
83
|
+
timeout-minutes: 10
|
|
84
|
+
environment:
|
|
85
|
+
name: pypi
|
|
86
|
+
permissions:
|
|
87
|
+
id-token: write
|
|
88
|
+
|
|
89
|
+
steps:
|
|
90
|
+
- name: Download the distributions
|
|
91
|
+
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
|
|
92
|
+
with:
|
|
93
|
+
name: dist
|
|
94
|
+
path: dist/
|
|
95
|
+
|
|
96
|
+
- name: Publish with trusted publishing
|
|
97
|
+
uses: pypa/gh-action-pypi-publish@7245906fb61fa33a13554f9d5fb856fe61758086 # v1.14.3
|
|
98
|
+
|
|
99
|
+
github:
|
|
100
|
+
name: Create the GitHub release
|
|
101
|
+
needs: pypi
|
|
102
|
+
runs-on: ubuntu-24.04
|
|
103
|
+
timeout-minutes: 15
|
|
104
|
+
permissions:
|
|
105
|
+
contents: write
|
|
106
|
+
env:
|
|
107
|
+
TAG: ${{ github.ref_name }}
|
|
108
|
+
|
|
109
|
+
steps:
|
|
110
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
111
|
+
with:
|
|
112
|
+
fetch-depth: 0
|
|
113
|
+
persist-credentials: false
|
|
114
|
+
|
|
115
|
+
- name: Download the distributions
|
|
116
|
+
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
|
|
117
|
+
with:
|
|
118
|
+
name: dist
|
|
119
|
+
path: dist/
|
|
120
|
+
|
|
121
|
+
- name: Write the release notes
|
|
122
|
+
run: |
|
|
123
|
+
python3 scripts/release_notes.py "$TAG" --repo "$GITHUB_REPOSITORY" \
|
|
124
|
+
> "$RUNNER_TEMP/release-notes.md"
|
|
125
|
+
|
|
126
|
+
- name: Create the GitHub release
|
|
127
|
+
env:
|
|
128
|
+
GH_TOKEN: ${{ github.token }}
|
|
129
|
+
run: |
|
|
130
|
+
version="${TAG#v}"
|
|
131
|
+
prerelease=()
|
|
132
|
+
if [[ "${version%%.*}" == "0" ]]; then
|
|
133
|
+
prerelease+=(--prerelease)
|
|
134
|
+
fi
|
|
135
|
+
gh release create "$TAG" dist/* --verify-tag --title "$TAG" \
|
|
136
|
+
--notes-file "$RUNNER_TEMP/release-notes.md" "${prerelease[@]}"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.14
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Shikiru — Agent Conventions
|
|
2
|
+
|
|
3
|
+
- **Read first**: `docs/design.md`.
|
|
4
|
+
- **Conventions**: SOLID, KISS, YAGNI. One responsibility per class; pure functions in `domain`; constructor injection; no comments, clear names; docstrings only on public contracts and their implementations. No literals: tunables go in `defaults.toml`, protocol values in named constants. No silent fallbacks, no bare `except`. Build nothing beyond the task.
|
|
5
|
+
- **Tests**: behaviour over implementation. Unit tests only for `domain` rules, models and parsers; integration tests for the rest (real SQLite, git, tmux via `tmux_server`, fake agent). Wait with `wait_until`, time with `FakeClock`, never sleep. No mocks of our own classes, no snapshot spam. Coverage ≥ 80%.
|
|
6
|
+
- **Test value**: test domain rules and invariants, not the framework or data shape — no tests for pydantic features (frozen, extra, defaults), enum or constant listings, trivial wiring, or message/description wording. One table per rule. Integration tests assert observable behaviour at boundaries; coverage beyond the gate is not a goal.
|
|
7
|
+
- **Environment**: In each fresh worktree run `uv sync --locked`. Verify that Python imports and tool entrypoints resolve to this worktree. If a copied `.venv` points elsewhere, recreate it before verification.
|
|
8
|
+
- **Verification**: Match checks to the change. For documentation-only changes, including agent instructions, review the diff and run `git diff --check`; do not run application tests. For code or executable configuration changes, run relevant checks while developing, then `PYTEST_ADDOPTS='--dist=loadfile' uv run poe check` (the local worker count is half the CPU cores unless `SHIKIRU_TEST_CPUS_PER_WORKER` overrides the divisor; CI uses one worker per CPU, so do not pass `-n` locally) on the final changes before the final commit and completion report; it must be green. Repeat the full gate only when subsequent changes invalidate that result.
|
|
9
|
+
- **Execution**: Prefer foreground checks. For background commands, retain their process handle and log path, inspect their exit status, and check existing results when resuming. Do not rely solely on completion notifications or start duplicate checks.
|
|
10
|
+
- **Commits**: Conventional commits, one coherent change each. Separate independent refactorings; keep small supporting refactorings with the behavior they enable. The subject is what the release notes show, so write it for a user: `type(scope): what changed`. A change that breaks behavior, configuration or the schema marks the type with `!` or adds a `BREAKING CHANGE:` line to the body.
|
|
11
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@AGENTS.md
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# Contributing to Shikiru
|
|
2
|
+
|
|
3
|
+
Thank you for helping. Before you start:
|
|
4
|
+
|
|
5
|
+
- Open an issue before anything larger than a small fix, so the approach can be agreed first.
|
|
6
|
+
- Read [AGENTS.md](AGENTS.md) and [the design](docs/design.md). Its conventions apply to people as
|
|
7
|
+
well as agents.
|
|
8
|
+
- Commit with [Conventional Commits](https://www.conventionalcommits.org/), one coherent change per
|
|
9
|
+
commit.
|
|
10
|
+
- Before you open a pull request, make sure the quality gate is green. Its result goes in the pull
|
|
11
|
+
request template.
|
|
12
|
+
- CI runs the same gate on Ubuntu and macOS.
|
|
13
|
+
|
|
14
|
+
## Validate a checkout and a real project
|
|
15
|
+
|
|
16
|
+
```sh
|
|
17
|
+
uv sync --locked
|
|
18
|
+
PYTEST_ADDOPTS='--dist=loadfile' uv run poe check
|
|
19
|
+
bash scripts/release-readiness-smoke.sh
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
The quality gate covers formatting, lint, boundaries, types, unused-code checks and behavior tests.
|
|
23
|
+
Real Claude/Codex adapter code is tested offline using recorded protocol output and controlled
|
|
24
|
+
subprocesses: invocation, parsing, resumption, compaction, usage and failures. Engine integration
|
|
25
|
+
uses the fake-agent plugin with real Git, SQLite and private tmux. Live provider contracts and
|
|
26
|
+
real-agent end-to-end scenarios are opt-in and excluded from normal CI.
|
|
27
|
+
The package smoke builds wheel/sdist and exercises an isolated installed package with a fake agent,
|
|
28
|
+
a disposable HOME/repository and private tmux server; it makes no paid provider calls. GitHub CI
|
|
29
|
+
syncs the locked development environment and runs both checks with one test worker per available CPU
|
|
30
|
+
and job timeouts. The isolated installation resolves the built package's declared runtime
|
|
31
|
+
dependencies.
|
|
32
|
+
Automated checks do not establish reliability for every provider or real project.
|
|
33
|
+
|
|
34
|
+
### Verify real agents
|
|
35
|
+
|
|
36
|
+
These checks use your authenticated agent CLIs and consume real provider usage. Run them locally
|
|
37
|
+
from the Shikiru checkout after `uv sync --locked`, with Git/tmux available and the agents you are
|
|
38
|
+
testing installed, authenticated and permitted to execute the scratch project's commands. Run
|
|
39
|
+
sequentially (`-n 0`); timeouts are not spending or RAM limits.
|
|
40
|
+
|
|
41
|
+
For a configured project's actual role ladders, start with `shikiru doctor --probe` in that project.
|
|
42
|
+
For automated adapter verification, choose model IDs supported by your account first:
|
|
43
|
+
|
|
44
|
+
- Claude contract tests accept `SHIKIRU_CLAUDE_LIVE_MODEL` and
|
|
45
|
+
`SHIKIRU_CLAUDE_LIVE_CHANGE_MODEL` for the initial and model-change checks. Set both to supported
|
|
46
|
+
models; the model-change check skips if no second model is configured.
|
|
47
|
+
- Codex contract tests currently use `_LIVE_MODEL`, `_LIVE_OTHER_MODEL` and `_EFFORT` in
|
|
48
|
+
[their test module](tests/integration/test_codex_headless_contract.py). Review/update those test
|
|
49
|
+
constants for your account; they are separate from project configuration and have no equivalent
|
|
50
|
+
model environment overrides.
|
|
51
|
+
|
|
52
|
+
Enable live checks only for the invocation below. Include just the test file for each agent you
|
|
53
|
+
have configured (both are shown):
|
|
54
|
+
|
|
55
|
+
```sh
|
|
56
|
+
SHIKIRU_E2E=1 uv run pytest -n 0 --no-cov -k live \
|
|
57
|
+
tests/integration/test_claude_headless_contract.py \
|
|
58
|
+
tests/integration/test_codex_headless_contract.py
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
These exercise report submission, measured usage, session/model resumption, stop/resume, structured
|
|
62
|
+
Helper answers and context compaction. The compaction check deliberately grows context and can
|
|
63
|
+
consume substantially more usage than a basic report check. Review skips as well as failures.
|
|
64
|
+
|
|
65
|
+
For complete workflow verification, review `REAL_AGENT`, `REAL_MODEL`, `REAL_EFFORT` and
|
|
66
|
+
`REAL_ROLE_LADDERS` in [real_agent_config.py](tests/e2e/real_agent_config.py); these configure all
|
|
67
|
+
roles in disposable fixture repositories, independently of your `.shikiru/config.toml`. Start
|
|
68
|
+
with one completion/integration scenario:
|
|
69
|
+
|
|
70
|
+
```sh
|
|
71
|
+
SHIKIRU_E2E=1 uv run pytest -n 0 --no-cov \
|
|
72
|
+
tests/e2e/test_real_agents.py::test_real_agents_e1_completes_and_integrates
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Then run all six real-agent scenarios:
|
|
76
|
+
|
|
77
|
+
```sh
|
|
78
|
+
SHIKIRU_E2E=1 uv run pytest -n 0 --no-cov tests/e2e/test_real_agents.py
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
They cover completion/integration, next-turn Operator messages, planning with dependent parallel
|
|
82
|
+
tasks, MCP decision resolution, restart recovery and takeover/handback. Tests use private tmux
|
|
83
|
+
servers and disposable projects under `~/.cache/shikiru-e2e/`, with cleanup afterwards. Results go
|
|
84
|
+
to `build/e2e/`; failure diagnostics go to `build/e2e/diagnostics/`. The harness has per-attempt and
|
|
85
|
+
one-hour invocation time budgets and can retry an eligible failed scenario once, consuming
|
|
86
|
+
additional usage. Its parallel-work scenarios disable CPU/free-RAM dispatch gates; monitor your
|
|
87
|
+
host and account usage. See [budgets.py](tests/e2e/budgets.py) for the current limits. These paid
|
|
88
|
+
checks are excluded from normal CI and have not been run as part of this cleanup.
|
|
89
|
+
|
|
90
|
+
### Check your own project
|
|
91
|
+
|
|
92
|
+
For a provider-backed check, clone a committed project into a fresh disposable directory, initialize
|
|
93
|
+
Shikiru, review its ladders and submit one small, reviewable change. While active, detach/reattach,
|
|
94
|
+
exercise a task pause and, where useful, Take over/Hand back; stop/start the engine to inspect
|
|
95
|
+
recovery. Confirm the resulting diff, tests and Git history. Use a model and account you are willing
|
|
96
|
+
to spend usage on; `doctor --probe` is also a live check.
|
|
97
|
+
|
|
98
|
+
## Releasing
|
|
99
|
+
|
|
100
|
+
A release is the commit tagged `v<version>`; see [the design](docs/design.md#releases-and-deployment).
|
|
101
|
+
Push the tag on a commit of `main` whose CI has passed:
|
|
102
|
+
|
|
103
|
+
```sh
|
|
104
|
+
git tag v<version> && git push origin v<version>
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
The Release workflow does the rest. If a run fails, fix the cause on `main` and cut a new tag; a tag
|
|
108
|
+
is not moved.
|
|
109
|
+
|
|
110
|
+
The owner sets up publishing once. On pypi.org, add a pending publisher for the project `shikiru-cli`
|
|
111
|
+
with owner `ferrum-code-dev`, repository `shikiru`, workflow `release.yml` and environment `pypi`. On
|
|
112
|
+
GitHub, create the environment `pypi` in the repository settings. No PyPI token is stored in the
|
|
113
|
+
repository.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Ferrum Code
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|