cursorfleet 0.1.0__tar.gz → 0.1.1__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.
- cursorfleet-0.1.1/.github/workflows/container.yml +50 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/.github/workflows/release.yml +29 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/CHANGELOG.md +15 -1
- cursorfleet-0.1.1/Dockerfile +11 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/PKG-INFO +38 -15
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/README.md +34 -12
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/evidence/b0-live-validation-2026-10-12.md +2 -2
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/evidence/external-alpha-results.md +2 -1
- cursorfleet-0.1.1/docs/evidence/pypi-trusted-publishing-setup.md +36 -0
- cursorfleet-0.1.1/docs/evidence/release-v0.1.0-owner-runbook.md +31 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/evidence/v0.1.1-backlog.md +1 -1
- cursorfleet-0.1.1/docs/evidence/v01-release-baseline.md +14 -0
- cursorfleet-0.1.1/docs/evidence/v01-release-ready.md +23 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/quickstart.md +3 -2
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/status.md +2 -1
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/public-docs/getting-started/installation.md +14 -8
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/public-docs/index.md +4 -2
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/pyproject.toml +4 -3
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/__init__.py +1 -1
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/tui/app.py +25 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/tui/help.py +1 -1
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/tui/views.py +39 -5
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/tui/test_tui_app.py +42 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/uv.lock +1 -1
- cursorfleet-0.1.0/docs/evidence/pypi-trusted-publishing-setup.md +0 -30
- cursorfleet-0.1.0/docs/evidence/v01-release-baseline.md +0 -14
- cursorfleet-0.1.0/docs/evidence/v01-release-ready.md +0 -28
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/.cursor/rules/privacy-and-hooks.mdc +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/.cursor/rules/python-conventions.mdc +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/.github/workflows/ci.yml +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/.github/workflows/pages.yml +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/.gitignore +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/AGENTS.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/CONTRIBUTING.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/LICENSE +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/SECURITY.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/.gitkeep +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/adr/0000-template.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/adr/0001-cursor-capabilities.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/adr/0002-storage-layout-and-runtime-directory.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/adr/0003-event-model-and-sanitization.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/adr/0004-no-chain-of-thought-and-hook-policy.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/adr/0005-naming-and-trademark.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/adr/0006-agent-declared-events.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/adr/0007-narrower-v01-hook-policy.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/adr/0008-enforcement-boundaries.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/adr/0009-install-uninstall-ownership.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/adr/0010-reducer-state-semantics.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/adr/0011-evidence-trust-model.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/adr/0012-roster-and-worktree-ownership.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/adr/0013-run-metadata-and-association.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/adr/README.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/architecture.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/demo.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/docs-site-plan.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/empirical-test-plan.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/evidence/a2-contract-decision-matrix.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/evidence/a2-hook-matrix.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/evidence/adr-0005-naming-gate.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/evidence/b0-run-association-spike.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/evidence/b1-prototype-signoff.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/evidence/dogfood-week.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/evidence/latency-13b-linux-ide.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/evidence/live-validation-index.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/evidence/product-hunt-gate.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/evidence/so01-permission-hooks.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/evidence/v01-adr-truth-table.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/evidence/v01-doc-allowlist.json +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/external-alpha.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/follow-ups.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/governance.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/hook-latency.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/kit.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/platform-support.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/privacy.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/product-contract.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/release-checklist.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/security-review-v0.1.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/spike-prep.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/status-json.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/threat-model.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/docs/tui.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/public-docs/.meta.yml +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/public-docs/assets/apple-touch-icon.png +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/public-docs/assets/cursorfleet-icon-source.png +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/public-docs/assets/cursorfleet-wordmark.png +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/public-docs/assets/favicon-32.png +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/public-docs/assets/logo-circle.png +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/public-docs/assets/og-card.png +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/public-docs/changelog.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/public-docs/cli/doctor.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/public-docs/cli/init.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/public-docs/cli/status.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/public-docs/cli/validate.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/public-docs/concepts/agents-and-events.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/public-docs/concepts/sessions.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/public-docs/concepts/worktrees.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/public-docs/contributing.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/public-docs/getting-started/quickstart.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/public-docs/known-limitations.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/public-docs/overrides/main.html +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/public-docs/privacy-and-security.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/public-docs/stylesheets/site-brand.css +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/public-docs/tui/current-status.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/public-docs/tui/overview.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/schemas/.gitkeep +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/schemas/config.schema.json +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/schemas/event.schema.json +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/schemas/policy.schema.json +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/schemas/roster.schema.json +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/scripts/bench_hook.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/scripts/check_dist.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/scripts/demo.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/scripts/demo.sh +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/scripts/gen_schemas.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/scripts/smoke_wheel.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/spike/README.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/spike/analyze.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/spike/bench_latency.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/spike/capture_hook.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/spike/doc_examples/README.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/spike/doc_examples/afterFileEdit.doc-derived.json +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/spike/doc_examples/afterShellExecution.doc-derived.json +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/spike/doc_examples/beforeShellExecution.doc-derived.json +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/spike/doc_examples/postToolUse.doc-derived.json +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/spike/doc_examples/postToolUseFailure.doc-derived.json +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/spike/doc_examples/preCompact.doc-derived.json +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/spike/doc_examples/preToolUse.doc-derived.json +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/spike/doc_examples/sessionEnd.doc-derived.json +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/spike/doc_examples/sessionStart.doc-derived.json +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/spike/doc_examples/stop.doc-derived.json +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/spike/doc_examples/subagentStart.doc-derived.json +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/spike/doc_examples/subagentStop.doc-derived.json +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/spike/hooks.json.example +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/spike/hooks.windows.json.example +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/spike/questions.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/spike/results/latency-linux.json +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/adapters/__init__.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/adapters/cursor/__init__.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/adapters/cursor/blocks.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/adapters/cursor/diagnostics.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/adapters/cursor/fsutil.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/adapters/cursor/hook_main.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/adapters/cursor/hook_normalize.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/adapters/cursor/hook_policy.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/adapters/cursor/hook_sanitize.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/adapters/cursor/hooksjson.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/adapters/cursor/installer.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/adapters/cursor/kit.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/adapters/cursor/kit_probe.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/adapters/cursor/lock.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/adapters/cursor/templates.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/adapters/cursor/validation.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/adapters/cursor/workspace.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/cli/__init__.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/cli/commands/__init__.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/cli/commands/_common.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/cli/commands/_resolution.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/cli/commands/doctor.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/cli/commands/events.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/cli/commands/index.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/cli/commands/init.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/cli/commands/migrate.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/cli/commands/replay.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/cli/commands/run.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/cli/commands/status.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/cli/commands/tui.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/cli/commands/uninstall.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/cli/commands/validate.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/cli/main.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/config/__init__.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/config/io.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/config/models.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/config/roster.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/events/__init__.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/events/forbidden.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/events/ids.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/events/kinds.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/events/models.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/events/pathcheck.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/git/__init__.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/git/collector.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/git/runner.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/git/worktrees.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/policy/__init__.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/py.typed +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/safeexe.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/schema_gen.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/state/__init__.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/state/artifact_scan.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/state/context.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/state/event_store.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/state/indexer.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/state/lock.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/state/models.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/state/reducer.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/state/retention.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/state/run_builder.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/state/run_model.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/state/run_store.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/state/runtime.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/state/spool.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/state/spool_read.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/state/status_doc.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/tui/__init__.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/tui/data.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/tui/filters.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/tui/gates.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/tui/layout.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/tui/theme.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/tui/watch.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/workflow/__init__.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/workflow/artifacts.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/src/cursorfleet/workflow/frontmatter.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/templates/cursor/agents/architect.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/templates/cursor/agents/implementer.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/templates/cursor/agents/patcher.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/templates/cursor/agents/qa.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/templates/cursor/agents/reviewer.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/templates/cursor/agents/scout.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/templates/cursor/agents/tester.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/templates/cursor/agents-md/root.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/templates/cursor/agents-md/work.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/templates/cursor/config/config.toml +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/templates/cursor/hooks/entry.json +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/templates/cursor/rules/cursorfleet-core.mdc +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/templates/cursor/rules/cursorfleet-handoff.mdc +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/templates/cursor/skills/cursorfleet-artifacts/SKILL.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/templates/cursor/skills/cursorfleet-coordinator/SKILL.md +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/conftest.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/event_factory.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/fixtures/cursor/.gitkeep +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/fixtures/cursor/legacy_test_completed.jsonl +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/fixtures/cursor/post_m25_verification_observed.jsonl +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/fixtures/status/status.v1.golden.json +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/integration/test_cli_state.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/integration/test_doctor_validate_resolution.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/integration/test_git_collector.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/integration/test_hook_main.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/integration/test_kit_doctor_validate.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/integration/test_kit_init_uninstall.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/integration/test_runtime_inheritance.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/integration/test_runtime_resolution.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/integration/test_spool_migration.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/kit_helpers.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/m2_helpers.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/m2_strategies.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/perf/test_hook_benchmark.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/security/test_event_privacy.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/security/test_hook_policy.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/security/test_hook_privacy.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/security/test_hook_redos.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/security/test_hostile_repo.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/security/test_kit_installer_policy.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/security/test_no_network.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/security/test_runtime_trust.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/security/test_terminal_injection.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/tui/test_tui_cli.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/tui/test_tui_data.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/tui/test_tui_gates.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/tui/test_tui_privacy.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/tui_helpers.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/unit/test_artifact_scan.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/unit/test_cli.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/unit/test_config_models.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/unit/test_event_models.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/unit/test_event_store.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/unit/test_fs_names.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/unit/test_hook_normalize.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/unit/test_hook_sanitize.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/unit/test_ids.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/unit/test_indexer.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/unit/test_kit_blocks.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/unit/test_kit_frontmatter.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/unit/test_kit_hooksjson.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/unit/test_kit_probe.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/unit/test_kit_templates.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/unit/test_reducer.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/unit/test_retention.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/unit/test_roster.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/unit/test_run_builder.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/unit/test_run_store.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/unit/test_schemas.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/unit/test_spike_analyze.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/tests/unit/test_spool.py +0 -0
- {cursorfleet-0.1.0 → cursorfleet-0.1.1}/zensical.toml +0 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
name: Container (GHCR)
|
|
2
|
+
|
|
3
|
+
# PyPI wheels do not appear under github.com/.../packages; this workflow publishes
|
|
4
|
+
# ghcr.io/<owner>/cursorfleet so the repo shows a linked container package.
|
|
5
|
+
|
|
6
|
+
on:
|
|
7
|
+
workflow_dispatch:
|
|
8
|
+
inputs:
|
|
9
|
+
version:
|
|
10
|
+
description: "cursorfleet PyPI version (e.g. 0.1.0)"
|
|
11
|
+
required: true
|
|
12
|
+
default: "0.1.0"
|
|
13
|
+
tag:
|
|
14
|
+
description: "Extra GHCR tag (defaults to version; use latest to also tag latest)"
|
|
15
|
+
required: false
|
|
16
|
+
default: ""
|
|
17
|
+
|
|
18
|
+
permissions:
|
|
19
|
+
contents: read
|
|
20
|
+
packages: write
|
|
21
|
+
|
|
22
|
+
jobs:
|
|
23
|
+
publish:
|
|
24
|
+
name: publish ghcr.io image
|
|
25
|
+
runs-on: ubuntu-latest
|
|
26
|
+
steps:
|
|
27
|
+
- uses: actions/checkout@v4
|
|
28
|
+
- name: Resolve image tags
|
|
29
|
+
id: meta
|
|
30
|
+
run: |
|
|
31
|
+
version="${{ inputs.version }}"
|
|
32
|
+
extra="${{ inputs.tag }}"
|
|
33
|
+
tags="ghcr.io/${GITHUB_REPOSITORY,,}:${version}"
|
|
34
|
+
if [ "${extra}" = "latest" ] || [ "${version}" = "0.1.0" ]; then
|
|
35
|
+
tags="${tags},ghcr.io/${GITHUB_REPOSITORY,,}:latest"
|
|
36
|
+
elif [ -n "${extra}" ]; then
|
|
37
|
+
tags="${tags},ghcr.io/${GITHUB_REPOSITORY,,}:${extra}"
|
|
38
|
+
fi
|
|
39
|
+
echo "tags=${tags}" >> "$GITHUB_OUTPUT"
|
|
40
|
+
- uses: docker/login-action@v3
|
|
41
|
+
with:
|
|
42
|
+
registry: ghcr.io
|
|
43
|
+
username: ${{ github.actor }}
|
|
44
|
+
password: ${{ secrets.GITHUB_TOKEN }}
|
|
45
|
+
- uses: docker/build-push-action@v6
|
|
46
|
+
with:
|
|
47
|
+
context: .
|
|
48
|
+
push: true
|
|
49
|
+
tags: ${{ steps.meta.outputs.tags }}
|
|
50
|
+
build-args: CURSORFLEET_VERSION=${{ inputs.version }}
|
|
@@ -104,3 +104,32 @@ jobs:
|
|
|
104
104
|
name: dist
|
|
105
105
|
path: dist/
|
|
106
106
|
- uses: pypa/gh-action-pypi-publish@release/v1
|
|
107
|
+
|
|
108
|
+
publish-container:
|
|
109
|
+
name: publish container (GHCR)
|
|
110
|
+
runs-on: ubuntu-latest
|
|
111
|
+
needs: publish-pypi
|
|
112
|
+
if: vars.RELEASE_ENABLED == 'true'
|
|
113
|
+
permissions:
|
|
114
|
+
contents: read
|
|
115
|
+
packages: write
|
|
116
|
+
steps:
|
|
117
|
+
- uses: actions/checkout@v4
|
|
118
|
+
- name: Package version from tag
|
|
119
|
+
id: ver
|
|
120
|
+
run: |
|
|
121
|
+
echo "version=${GITHUB_REF_NAME#v}" >> "$GITHUB_OUTPUT"
|
|
122
|
+
echo "image=ghcr.io/${GITHUB_REPOSITORY,,}" >> "$GITHUB_OUTPUT"
|
|
123
|
+
- uses: docker/login-action@v3
|
|
124
|
+
with:
|
|
125
|
+
registry: ghcr.io
|
|
126
|
+
username: ${{ github.actor }}
|
|
127
|
+
password: ${{ secrets.GITHUB_TOKEN }}
|
|
128
|
+
- uses: docker/build-push-action@v6
|
|
129
|
+
with:
|
|
130
|
+
context: .
|
|
131
|
+
push: true
|
|
132
|
+
tags: |
|
|
133
|
+
${{ steps.ver.outputs.image }}:${{ steps.ver.outputs.version }}
|
|
134
|
+
${{ steps.ver.outputs.image }}:latest
|
|
135
|
+
build-args: CURSORFLEET_VERSION=${{ steps.ver.outputs.version }}
|
|
@@ -8,7 +8,21 @@ CursorFleet is an unofficial tool: it is not affiliated with or endorsed by Anys
|
|
|
8
8
|
|
|
9
9
|
## [Unreleased]
|
|
10
10
|
|
|
11
|
-
Development
|
|
11
|
+
Development on `main` after v0.1.1. Planned: external alpha metrics, evidence closure.
|
|
12
|
+
|
|
13
|
+
## [0.1.1] - 2026-10-13
|
|
14
|
+
|
|
15
|
+
PyPI/README refresh and small UX fixes after the v0.1.0 launch.
|
|
16
|
+
|
|
17
|
+
### Added
|
|
18
|
+
|
|
19
|
+
- TUI: attach suggested sessions from Active run (Enter).
|
|
20
|
+
- Optional `ghcr.io/m9nx/cursorfleet` container for GitHub Packages visibility.
|
|
21
|
+
|
|
22
|
+
### Changed
|
|
23
|
+
|
|
24
|
+
- README and [docs site](https://m9nx.github.io/cursorfleet/) document PyPI install and v0.1.0 release status.
|
|
25
|
+
- PyPI `project.urls` Homepage/Documentation point at GitHub Pages.
|
|
12
26
|
|
|
13
27
|
## [0.1.0] - 2026-10-12
|
|
14
28
|
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Optional runtime image for GitHub Container Registry (ghcr.io).
|
|
2
|
+
# Primary install path remains PyPI: pip install cursorfleet
|
|
3
|
+
FROM python:3.12-slim-bookworm
|
|
4
|
+
|
|
5
|
+
ARG CURSORFLEET_VERSION
|
|
6
|
+
RUN test -n "${CURSORFLEET_VERSION}" || (echo "CURSORFLEET_VERSION build-arg required" >&2 && exit 1)
|
|
7
|
+
|
|
8
|
+
RUN pip install --no-cache-dir "cursorfleet==${CURSORFLEET_VERSION}"
|
|
9
|
+
|
|
10
|
+
ENTRYPOINT ["cursorfleet"]
|
|
11
|
+
CMD ["--help"]
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: cursorfleet
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.1
|
|
4
4
|
Summary: Unofficial local TUI and workflow harness (observe-only) for Cursor agent teams.
|
|
5
|
-
Project-URL: Homepage, https://github.
|
|
6
|
-
Project-URL: Documentation, https://github.
|
|
5
|
+
Project-URL: Homepage, https://m9nx.github.io/cursorfleet/
|
|
6
|
+
Project-URL: Documentation, https://m9nx.github.io/cursorfleet/
|
|
7
7
|
Project-URL: Source, https://github.com/M9nx/cursorfleet
|
|
8
8
|
Project-URL: Issues, https://github.com/M9nx/cursorfleet/issues
|
|
9
9
|
Project-URL: Changelog, https://github.com/M9nx/cursorfleet/blob/main/CHANGELOG.md
|
|
10
10
|
Project-URL: Security, https://github.com/M9nx/cursorfleet/blob/main/SECURITY.md
|
|
11
|
+
Project-URL: Release notes, https://github.com/M9nx/cursorfleet/releases/tag/v0.1.1
|
|
11
12
|
Author: M9nx
|
|
12
13
|
License-Expression: MIT
|
|
13
14
|
License-File: LICENSE
|
|
@@ -50,13 +51,16 @@ Description-Content-Type: text/markdown
|
|
|
50
51
|
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="License: MIT" /></a>
|
|
51
52
|
<img src="https://img.shields.io/badge/status-pre--alpha-orange.svg" alt="Status: pre-alpha" />
|
|
52
53
|
<img src="https://img.shields.io/badge/python-3.11%2B-blue.svg" alt="Python 3.11+" />
|
|
53
|
-
<a href="https://
|
|
54
|
+
<a href="https://pypi.org/project/cursorfleet/"><img src="https://img.shields.io/pypi/v/cursorfleet.svg" alt="PyPI version" /></a>
|
|
55
|
+
<a href="https://m9nx.github.io/cursorfleet/"><img src="https://img.shields.io/badge/docs-m9nx.github.io-222?style=flat-square&logo=readthedocs&logoColor=white" alt="Documentation site" /></a>
|
|
54
56
|
</p>
|
|
55
57
|
|
|
56
58
|
<p>
|
|
57
|
-
<a href="https://m9nx.github.io/cursorfleet/">
|
|
59
|
+
<a href="https://m9nx.github.io/cursorfleet/">Documentation</a>
|
|
58
60
|
·
|
|
59
|
-
<a href="
|
|
61
|
+
<a href="https://pypi.org/project/cursorfleet/">PyPI</a>
|
|
62
|
+
·
|
|
63
|
+
<a href="https://m9nx.github.io/cursorfleet/getting-started/quickstart/">Quickstart</a>
|
|
60
64
|
·
|
|
61
65
|
<a href="docs/demo.md">Demo</a>
|
|
62
66
|
·
|
|
@@ -72,7 +76,9 @@ are doing what, from passive hooks and read-only git, without sending anything a
|
|
|
72
76
|
|
|
73
77
|
## Status
|
|
74
78
|
|
|
75
|
-
**Pre-alpha
|
|
79
|
+
**Pre-alpha.** **[v0.1.0](https://github.com/M9nx/cursorfleet/releases/tag/v0.1.0)** is on
|
|
80
|
+
[PyPI](https://pypi.org/project/cursorfleet/) and
|
|
81
|
+
[GitHub Releases](https://github.com/M9nx/cursorfleet/releases). Latest on PyPI: **0.1.1**; `main` may be ahead.
|
|
76
82
|
|
|
77
83
|
- v0.1 is **Observe**: no enforcement, no forced approvals, and no cloud-agent visibility
|
|
78
84
|
(local Cursor sessions only). It is not a security boundary: a malicious or prompt-injected
|
|
@@ -99,16 +105,29 @@ are doing what, from passive hooks and read-only git, without sending anything a
|
|
|
99
105
|
|
|
100
106
|
## Install
|
|
101
107
|
|
|
102
|
-
Needs Python 3.11+ and git.
|
|
108
|
+
Needs Python 3.11+ and git.
|
|
103
109
|
|
|
104
110
|
```bash
|
|
105
|
-
|
|
106
|
-
uv tool install . # or: pipx install .
|
|
111
|
+
uv tool install cursorfleet # or: pipx install cursorfleet
|
|
107
112
|
cursorfleet --version
|
|
108
113
|
```
|
|
109
114
|
|
|
110
|
-
|
|
111
|
-
|
|
115
|
+
From a git checkout (contributors or unreleased `main`):
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
git clone https://github.com/M9nx/cursorfleet && cd cursorfleet
|
|
119
|
+
uv tool install .
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
See the [installation guide](https://m9nx.github.io/cursorfleet/getting-started/installation/)
|
|
123
|
+
on the docs site and the [release checklist](docs/release-checklist.md).
|
|
124
|
+
|
|
125
|
+
Optional container (shows under [GitHub Packages](https://github.com/M9nx?tab=packages&repo_name=cursorfleet);
|
|
126
|
+
install with pip for normal use):
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
docker run --rm ghcr.io/m9nx/cursorfleet:0.1.0 --help
|
|
130
|
+
```
|
|
112
131
|
|
|
113
132
|
## Quickstart
|
|
114
133
|
|
|
@@ -123,8 +142,9 @@ cursorfleet status --json # stable machine-readable snapshot for scr
|
|
|
123
142
|
cursorfleet uninstall # remove exactly what init added
|
|
124
143
|
```
|
|
125
144
|
|
|
126
|
-
Full walkthrough: [docs
|
|
127
|
-
[
|
|
145
|
+
Full walkthrough: [Quickstart on the docs site](https://m9nx.github.io/cursorfleet/getting-started/quickstart/)
|
|
146
|
+
(in-repo: [docs/quickstart.md](docs/quickstart.md)). No Cursor handy? Run the
|
|
147
|
+
[synthetic demo](docs/demo.md) (`scripts/demo.sh`).
|
|
128
148
|
|
|
129
149
|
Dashboard keys: `o` overview, `l` timeline, `w` worktrees, `g` gates, `e` evidence, `v`
|
|
130
150
|
violations (v0.2 placeholder), `/` filter, `p` pin, `t` tiles (160+ columns), `r` re-read,
|
|
@@ -134,7 +154,10 @@ gate tiles are heuristic and non-authoritative, not proof that anything passed.
|
|
|
134
154
|
|
|
135
155
|
## Documentation
|
|
136
156
|
|
|
137
|
-
[
|
|
157
|
+
**[Docs site (GitHub Pages)](https://m9nx.github.io/cursorfleet/)** — start with
|
|
158
|
+
[Getting started](https://m9nx.github.io/cursorfleet/getting-started/installation/).
|
|
159
|
+
|
|
160
|
+
In-repo: [Quickstart](docs/quickstart.md) · [governance model](docs/governance.md) ·
|
|
138
161
|
[demo](docs/demo.md) · [kit reference](docs/kit.md) · [TUI](docs/tui.md) ·
|
|
139
162
|
[`status --json`](docs/status-json.md) · [product contract](docs/product-contract.md) ·
|
|
140
163
|
[architecture](docs/architecture.md) · [privacy](docs/privacy.md) ·
|
|
@@ -12,13 +12,16 @@
|
|
|
12
12
|
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="License: MIT" /></a>
|
|
13
13
|
<img src="https://img.shields.io/badge/status-pre--alpha-orange.svg" alt="Status: pre-alpha" />
|
|
14
14
|
<img src="https://img.shields.io/badge/python-3.11%2B-blue.svg" alt="Python 3.11+" />
|
|
15
|
-
<a href="https://
|
|
15
|
+
<a href="https://pypi.org/project/cursorfleet/"><img src="https://img.shields.io/pypi/v/cursorfleet.svg" alt="PyPI version" /></a>
|
|
16
|
+
<a href="https://m9nx.github.io/cursorfleet/"><img src="https://img.shields.io/badge/docs-m9nx.github.io-222?style=flat-square&logo=readthedocs&logoColor=white" alt="Documentation site" /></a>
|
|
16
17
|
</p>
|
|
17
18
|
|
|
18
19
|
<p>
|
|
19
|
-
<a href="https://m9nx.github.io/cursorfleet/">
|
|
20
|
+
<a href="https://m9nx.github.io/cursorfleet/">Documentation</a>
|
|
20
21
|
·
|
|
21
|
-
<a href="
|
|
22
|
+
<a href="https://pypi.org/project/cursorfleet/">PyPI</a>
|
|
23
|
+
·
|
|
24
|
+
<a href="https://m9nx.github.io/cursorfleet/getting-started/quickstart/">Quickstart</a>
|
|
22
25
|
·
|
|
23
26
|
<a href="docs/demo.md">Demo</a>
|
|
24
27
|
·
|
|
@@ -34,7 +37,9 @@ are doing what, from passive hooks and read-only git, without sending anything a
|
|
|
34
37
|
|
|
35
38
|
## Status
|
|
36
39
|
|
|
37
|
-
**Pre-alpha
|
|
40
|
+
**Pre-alpha.** **[v0.1.0](https://github.com/M9nx/cursorfleet/releases/tag/v0.1.0)** is on
|
|
41
|
+
[PyPI](https://pypi.org/project/cursorfleet/) and
|
|
42
|
+
[GitHub Releases](https://github.com/M9nx/cursorfleet/releases). Latest on PyPI: **0.1.1**; `main` may be ahead.
|
|
38
43
|
|
|
39
44
|
- v0.1 is **Observe**: no enforcement, no forced approvals, and no cloud-agent visibility
|
|
40
45
|
(local Cursor sessions only). It is not a security boundary: a malicious or prompt-injected
|
|
@@ -61,16 +66,29 @@ are doing what, from passive hooks and read-only git, without sending anything a
|
|
|
61
66
|
|
|
62
67
|
## Install
|
|
63
68
|
|
|
64
|
-
Needs Python 3.11+ and git.
|
|
69
|
+
Needs Python 3.11+ and git.
|
|
65
70
|
|
|
66
71
|
```bash
|
|
67
|
-
|
|
68
|
-
uv tool install . # or: pipx install .
|
|
72
|
+
uv tool install cursorfleet # or: pipx install cursorfleet
|
|
69
73
|
cursorfleet --version
|
|
70
74
|
```
|
|
71
75
|
|
|
72
|
-
|
|
73
|
-
|
|
76
|
+
From a git checkout (contributors or unreleased `main`):
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
git clone https://github.com/M9nx/cursorfleet && cd cursorfleet
|
|
80
|
+
uv tool install .
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
See the [installation guide](https://m9nx.github.io/cursorfleet/getting-started/installation/)
|
|
84
|
+
on the docs site and the [release checklist](docs/release-checklist.md).
|
|
85
|
+
|
|
86
|
+
Optional container (shows under [GitHub Packages](https://github.com/M9nx?tab=packages&repo_name=cursorfleet);
|
|
87
|
+
install with pip for normal use):
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
docker run --rm ghcr.io/m9nx/cursorfleet:0.1.0 --help
|
|
91
|
+
```
|
|
74
92
|
|
|
75
93
|
## Quickstart
|
|
76
94
|
|
|
@@ -85,8 +103,9 @@ cursorfleet status --json # stable machine-readable snapshot for scr
|
|
|
85
103
|
cursorfleet uninstall # remove exactly what init added
|
|
86
104
|
```
|
|
87
105
|
|
|
88
|
-
Full walkthrough: [docs
|
|
89
|
-
[
|
|
106
|
+
Full walkthrough: [Quickstart on the docs site](https://m9nx.github.io/cursorfleet/getting-started/quickstart/)
|
|
107
|
+
(in-repo: [docs/quickstart.md](docs/quickstart.md)). No Cursor handy? Run the
|
|
108
|
+
[synthetic demo](docs/demo.md) (`scripts/demo.sh`).
|
|
90
109
|
|
|
91
110
|
Dashboard keys: `o` overview, `l` timeline, `w` worktrees, `g` gates, `e` evidence, `v`
|
|
92
111
|
violations (v0.2 placeholder), `/` filter, `p` pin, `t` tiles (160+ columns), `r` re-read,
|
|
@@ -96,7 +115,10 @@ gate tiles are heuristic and non-authoritative, not proof that anything passed.
|
|
|
96
115
|
|
|
97
116
|
## Documentation
|
|
98
117
|
|
|
99
|
-
[
|
|
118
|
+
**[Docs site (GitHub Pages)](https://m9nx.github.io/cursorfleet/)** — start with
|
|
119
|
+
[Getting started](https://m9nx.github.io/cursorfleet/getting-started/installation/).
|
|
120
|
+
|
|
121
|
+
In-repo: [Quickstart](docs/quickstart.md) · [governance model](docs/governance.md) ·
|
|
100
122
|
[demo](docs/demo.md) · [kit reference](docs/kit.md) · [TUI](docs/tui.md) ·
|
|
101
123
|
[`status --json`](docs/status-json.md) · [product contract](docs/product-contract.md) ·
|
|
102
124
|
[architecture](docs/architecture.md) · [privacy](docs/privacy.md) ·
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# B0 live validation (maintainer)
|
|
2
2
|
|
|
3
|
-
Status: **checklist for owner** — fill during Linux Cursor IDE session before
|
|
4
|
-
|
|
3
|
+
Status: **checklist for owner** — fill during Linux Cursor IDE session before **PyPI publish**
|
|
4
|
+
(`RELEASE_ENABLED`). Tag `v0.1.0` is already on GitHub; scenarios 1, 2, and 5 gate product claims.
|
|
5
5
|
|
|
6
6
|
| Field | Value |
|
|
7
7
|
| --- | --- |
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
Status: **not started** (2026-10-12).
|
|
4
4
|
|
|
5
|
-
v0.1.0
|
|
5
|
+
v0.1.0 is **tagged**; run external alpha after PyPI install path is available (see
|
|
6
|
+
[`../external-alpha.md`](../external-alpha.md), [`v0.1.1-backlog.md`](v0.1.1-backlog.md)).
|
|
6
7
|
Metrics from [`../external-alpha.md`](../external-alpha.md) will be recorded here when testers run.
|
|
7
8
|
|
|
8
9
|
| Metric | Target | Result |
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# PyPI Trusted Publishing setup (owner)
|
|
2
|
+
|
|
3
|
+
Status: **GitHub configured** (2026-10-12): `pypi` environment with required reviewer `M9nx`, `RELEASE_ENABLED=true`. **PyPI pending publisher** still required in UI (see below).
|
|
4
|
+
|
|
5
|
+
## PyPI project (first time) — **you must do this in the browser**
|
|
6
|
+
|
|
7
|
+
Log in at [pypi.org](https://pypi.org) as **M9nx**, then **Account settings → Publishing** (or [manage/account/publishing](https://pypi.org/manage/account/publishing/)) → **Add a new pending publisher**. Values must match GitHub OIDC exactly (from failed run `38301917759`):
|
|
8
|
+
|
|
9
|
+
| Field | Value |
|
|
10
|
+
| --- | --- |
|
|
11
|
+
| PyPI Project Name | `cursorfleet` (new project; created on first upload) |
|
|
12
|
+
| Owner | `M9nx` |
|
|
13
|
+
| Repository name | `cursorfleet` |
|
|
14
|
+
| Workflow name | `release.yml` |
|
|
15
|
+
| Environment name | `pypi` |
|
|
16
|
+
|
|
17
|
+
Save the publisher, then re-run the failed **publish to PyPI** job on the latest [Release workflow](https://github.com/M9nx/cursorfleet/actions/workflows/release.yml) for tag `v0.1.0` and approve the **`pypi`** environment again.
|
|
18
|
+
|
|
19
|
+
## GitHub repository
|
|
20
|
+
|
|
21
|
+
Done on `M9nx/cursorfleet`:
|
|
22
|
+
|
|
23
|
+
1. Environment **`pypi`** with required reviewer **M9nx**.
|
|
24
|
+
2. Repository variable **`RELEASE_ENABLED`** = **`true`** (kill switch in [release.yml](../../.github/workflows/release.yml)).
|
|
25
|
+
|
|
26
|
+
Optional: tag ruleset for `v*`.
|
|
27
|
+
|
|
28
|
+
## Release sequence
|
|
29
|
+
|
|
30
|
+
1. All gates in [v01-release-ready.md](v01-release-ready.md) closed.
|
|
31
|
+
2. Push tag `v0.1.0` matching [pyproject.toml](../../pyproject.toml) version.
|
|
32
|
+
3. Workflow creates **draft** GitHub release with wheel/sdist.
|
|
33
|
+
4. Approve **pypi** environment deployment after reviewing assets.
|
|
34
|
+
5. Publish GitHub release notes manually.
|
|
35
|
+
|
|
36
|
+
Do **not** enable `RELEASE_ENABLED` until SO-01 and B0 live rows are PASS.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# v0.1.0 owner runbook (post-tag)
|
|
2
|
+
|
|
3
|
+
Use this after the agent/repo prep; order matches [v01-release-ready.md](v01-release-ready.md).
|
|
4
|
+
|
|
5
|
+
## 1. Live Cursor (Linux IDE)
|
|
6
|
+
|
|
7
|
+
1. Follow [quickstart §4](../quickstart.md) two-run recipe.
|
|
8
|
+
2. Complete [b0-live-validation-2026-10-12.md](b0-live-validation-2026-10-12.md) scenarios 1, 2, 5.
|
|
9
|
+
3. Record [so01-permission-hooks.md](so01-permission-hooks.md) for `preToolUse` and `subagentStart`.
|
|
10
|
+
4. Run 13B paired measurement; fill [latency-13b-linux-ide.md](latency-13b-linux-ide.md).
|
|
11
|
+
5. Optional: add sanitized [active-run-screenshot.png](active-run-screenshot.png) and link from public docs.
|
|
12
|
+
|
|
13
|
+
Commit evidence updates on `main` (signed commits).
|
|
14
|
+
|
|
15
|
+
## 2. PyPI
|
|
16
|
+
|
|
17
|
+
1. Re-check PyPI name `cursorfleet` ([adr-0005-naming-gate.md](adr-0005-naming-gate.md)).
|
|
18
|
+
2. Complete [pypi-trusted-publishing-setup.md](pypi-trusted-publishing-setup.md).
|
|
19
|
+
3. Set repository variable `RELEASE_ENABLED=true` only when ready.
|
|
20
|
+
|
|
21
|
+
## 3. Publish
|
|
22
|
+
|
|
23
|
+
1. Open the **draft** [GitHub release for v0.1.0](https://github.com/M9nx/cursorfleet/releases).
|
|
24
|
+
2. Paste/edit notes from CHANGELOG `[0.1.0]`.
|
|
25
|
+
3. Publish the GitHub release (not draft).
|
|
26
|
+
4. Approve the **pypi** environment deployment for the tag workflow (or re-run publish job if needed).
|
|
27
|
+
|
|
28
|
+
## 4. Post-publish
|
|
29
|
+
|
|
30
|
+
1. Run [external alpha](../external-alpha.md); record [external-alpha-results.md](external-alpha-results.md).
|
|
31
|
+
2. Track [v0.1.1-backlog.md](v0.1.1-backlog.md) (attach picker, etc.).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# v0.1.1 backlog (post-v0.1.0)
|
|
2
2
|
|
|
3
|
-
- TUI attach picker for suggested sessions (B0 scenario 5 UX)
|
|
3
|
+
- ~~TUI attach picker for suggested sessions (B0 scenario 5 UX)~~ — Active run: select suggested row, Enter to attach
|
|
4
4
|
- Close B0 live validation checklist if still OPEN at tag time
|
|
5
5
|
- SO-01 and latency 13B evidence if still OPEN
|
|
6
6
|
- ADR 0006: optional `migrate artifacts --yes`, digest dedupe
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# v0.1.0 release baseline
|
|
2
|
+
|
|
3
|
+
Last updated: 2026-10-12.
|
|
4
|
+
|
|
5
|
+
| Field | Value |
|
|
6
|
+
| --- | --- |
|
|
7
|
+
| `main` HEAD | `df919a4803e2c2139346367660e931ccc291f4ac` |
|
|
8
|
+
| Tag `v0.1.0` | `626db23` (0.1.0 tree + release-check mypy fixes) |
|
|
9
|
+
| Version on `main` | `0.1.1.dev0` |
|
|
10
|
+
| Tests (local) | 1010 passed, 1 deselected |
|
|
11
|
+
| CI `main` | Green on `df919a4` |
|
|
12
|
+
| Release workflow | Green on tag ([38298997744](https://github.com/M9nx/cursorfleet/actions/runs/38298997744)) |
|
|
13
|
+
|
|
14
|
+
Tracking: [`v01-adr-truth-table.md`](v01-adr-truth-table.md), [`v01-release-ready.md`](v01-release-ready.md).
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# v0.1.0 tag readiness
|
|
2
|
+
|
|
3
|
+
Last updated: 2026-10-12 (`main` at `df919a4`, tag `v0.1.0` → `626db23`).
|
|
4
|
+
|
|
5
|
+
## Shipped
|
|
6
|
+
|
|
7
|
+
| Item | Status |
|
|
8
|
+
| --- | --- |
|
|
9
|
+
| CI on `main` | Green ([workflow](https://github.com/M9nx/cursorfleet/actions/workflows/ci.yml)) |
|
|
10
|
+
| Tag `v0.1.0` | Pushed; Release workflow green ([run](https://github.com/M9nx/cursorfleet/actions/runs/38298997744)) |
|
|
11
|
+
| GitHub release | [CursorFleet v0.1.0](https://github.com/M9nx/cursorfleet/releases/tag/v0.1.0) published (wheel + sdist) |
|
|
12
|
+
| `main` development | `0.1.1.dev0` |
|
|
13
|
+
| Code/docs prep | Privacy default, run-scoped git, quickstart runs, ADR amendments, fixtures |
|
|
14
|
+
|
|
15
|
+
## Before `RELEASE_ENABLED=true` and PyPI approve
|
|
16
|
+
|
|
17
|
+
1. **B0 live** — [b0-live-validation-2026-10-12.md](b0-live-validation-2026-10-12.md) scenarios **1, 2, 5** + optional [active-run-screenshot.png](active-run-screenshot.png)
|
|
18
|
+
2. **SO-01** — [so01-permission-hooks.md](so01-permission-hooks.md) on live Cursor
|
|
19
|
+
3. **Latency 13B** — [latency-13b-linux-ide.md](latency-13b-linux-ide.md) or dated PARTIAL + platform narrow
|
|
20
|
+
4. **PyPI** — [pypi-trusted-publishing-setup.md](pypi-trusted-publishing-setup.md) (`pypi` env, Trusted Publishing, day-of name check)
|
|
21
|
+
5. **Publish** — GitHub release is live; set `RELEASE_ENABLED=true`, approve `pypi` job to upload PyPI
|
|
22
|
+
|
|
23
|
+
External alpha remains **post-PyPI** ([status.md](../status.md), [v0.1.1-backlog.md](v0.1.1-backlog.md)).
|
|
@@ -11,8 +11,9 @@
|
|
|
11
11
|
|
|
12
12
|
## 1. Install
|
|
13
13
|
|
|
14
|
-
CursorFleet needs Python 3.11 or newer and `git`.
|
|
15
|
-
|
|
14
|
+
CursorFleet needs Python 3.11 or newer and `git`. **v0.1.0** is tagged on GitHub; PyPI publish
|
|
15
|
+
awaits owner approval (`RELEASE_ENABLED`). Until then, install from a checkout, the draft release
|
|
16
|
+
assets, or a local wheel.
|
|
16
17
|
|
|
17
18
|
```bash
|
|
18
19
|
# from a checkout (needs uv: https://docs.astral.sh/uv/)
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# Project status
|
|
2
2
|
|
|
3
|
-
Last updated: 2026-10-12. CursorFleet is unofficial
|
|
3
|
+
Last updated: 2026-10-12. CursorFleet is unofficial; **v0.1.0** is tagged on GitHub. PyPI publish
|
|
4
|
+
awaits `RELEASE_ENABLED` and owner approval (see [v01-release-ready.md](evidence/v01-release-ready.md)).
|
|
4
5
|
Everything here was written and reviewed by the same author: it is a self-review, not an
|
|
5
6
|
independent audit.
|
|
6
7
|
|
|
@@ -1,25 +1,31 @@
|
|
|
1
1
|
# Installation
|
|
2
2
|
|
|
3
|
-
CursorFleet needs **Python 3.11+** and **git**.
|
|
4
|
-
release exists, install from a git checkout.
|
|
3
|
+
CursorFleet needs **Python 3.11+** and **git**.
|
|
5
4
|
|
|
6
5
|
**Unofficial and pre-alpha.** CursorFleet is not affiliated with or endorsed by
|
|
7
6
|
Anysphere or Cursor.
|
|
8
7
|
|
|
9
|
-
## From
|
|
8
|
+
## From PyPI (recommended)
|
|
9
|
+
|
|
10
|
+
[v0.1.0](https://pypi.org/project/cursorfleet/) and later:
|
|
10
11
|
|
|
11
12
|
```bash
|
|
12
|
-
|
|
13
|
-
uv tool install . # or: pipx install .
|
|
13
|
+
uv tool install cursorfleet # or: pipx install cursorfleet
|
|
14
14
|
cursorfleet --version
|
|
15
15
|
```
|
|
16
16
|
|
|
17
17
|
`uv` is documented at [docs.astral.sh/uv](https://docs.astral.sh/uv/). `pipx`
|
|
18
18
|
is an alternative for the same console scripts.
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
## From a checkout
|
|
21
|
+
|
|
22
|
+
For contributors or unreleased `main`:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
git clone https://github.com/M9nx/cursorfleet && cd cursorfleet
|
|
26
|
+
uv tool install . # or: pipx install .
|
|
27
|
+
cursorfleet --version
|
|
28
|
+
```
|
|
23
29
|
|
|
24
30
|
## Check the hook entry point
|
|
25
31
|
|
|
@@ -18,8 +18,10 @@ Cursor. "Cursor" is a trademark of its respective owner. The name
|
|
|
18
18
|
|
|
19
19
|
## Status
|
|
20
20
|
|
|
21
|
-
**Pre-alpha
|
|
22
|
-
|
|
21
|
+
**Pre-alpha.** [v0.1.0](https://github.com/M9nx/cursorfleet/releases/tag/v0.1.0) is on
|
|
22
|
+
[PyPI](https://pypi.org/project/cursorfleet/) and
|
|
23
|
+
[GitHub Releases](https://github.com/M9nx/cursorfleet/releases). See
|
|
24
|
+
[Installation](getting-started/installation.md) (`pipx` / `uv tool install cursorfleet`).
|
|
23
25
|
|
|
24
26
|
- v0.1 is **Observe** only: no enforcement, no forced approvals, and no
|
|
25
27
|
cloud-agent visibility (local Cursor sessions only). It is not a security
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "cursorfleet"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.1"
|
|
8
8
|
description = "Unofficial local TUI and workflow harness (observe-only) for Cursor agent teams."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "MIT"
|
|
@@ -40,12 +40,13 @@ dependencies = [
|
|
|
40
40
|
watch = ["watchfiles>=0.21"]
|
|
41
41
|
|
|
42
42
|
[project.urls]
|
|
43
|
-
Homepage = "https://github.
|
|
44
|
-
Documentation = "https://github.
|
|
43
|
+
Homepage = "https://m9nx.github.io/cursorfleet/"
|
|
44
|
+
Documentation = "https://m9nx.github.io/cursorfleet/"
|
|
45
45
|
Source = "https://github.com/M9nx/cursorfleet"
|
|
46
46
|
Issues = "https://github.com/M9nx/cursorfleet/issues"
|
|
47
47
|
Changelog = "https://github.com/M9nx/cursorfleet/blob/main/CHANGELOG.md"
|
|
48
48
|
Security = "https://github.com/M9nx/cursorfleet/blob/main/SECURITY.md"
|
|
49
|
+
"Release notes" = "https://github.com/M9nx/cursorfleet/releases/tag/v0.1.1"
|
|
49
50
|
|
|
50
51
|
[project.scripts]
|
|
51
52
|
cursorfleet = "cursorfleet.cli.main:app"
|
|
@@ -26,6 +26,7 @@ from cursorfleet import __version__
|
|
|
26
26
|
from cursorfleet.adapters.cursor.kit_probe import HooksKitState
|
|
27
27
|
from cursorfleet.events.models import Event
|
|
28
28
|
from cursorfleet.state.event_store import DEFAULT_PAGE, MAX_PAGE, EventFilter
|
|
29
|
+
from cursorfleet.state.run_store import attach_session
|
|
29
30
|
from cursorfleet.tui import views
|
|
30
31
|
from cursorfleet.tui.data import DataSource, FleetData
|
|
31
32
|
from cursorfleet.tui.filters import parse_timeline_filter
|
|
@@ -522,11 +523,35 @@ class CursorFleetApp(App[None]):
|
|
|
522
523
|
widget.action_cursor_down() if step > 0 else widget.action_cursor_up()
|
|
523
524
|
|
|
524
525
|
def action_open_detail(self) -> None:
|
|
526
|
+
key = self._selected_key()
|
|
527
|
+
if (
|
|
528
|
+
self.view == "active_run"
|
|
529
|
+
and key is not None
|
|
530
|
+
and key.startswith("sug:")
|
|
531
|
+
and key != "ar:sug:h"
|
|
532
|
+
):
|
|
533
|
+
self._attach_suggested_session(key[4:])
|
|
534
|
+
return
|
|
525
535
|
if self._mode == SINGLE:
|
|
526
536
|
self.detail_open = True
|
|
527
537
|
self._apply_layout(self._width)
|
|
528
538
|
self.query_one("#detail", VerticalScroll).focus()
|
|
529
539
|
|
|
540
|
+
def _attach_suggested_session(self, session_id: str) -> None:
|
|
541
|
+
run = self.data.primary_run
|
|
542
|
+
runtime = self.data.runtime_dir
|
|
543
|
+
if run is None or runtime is None:
|
|
544
|
+
self.flash("no active run")
|
|
545
|
+
return
|
|
546
|
+
if run.run_id.startswith("inferred:"):
|
|
547
|
+
self.flash("start a run first: cursorfleet run start --task <slug>")
|
|
548
|
+
return
|
|
549
|
+
if not attach_session(runtime, run.run_id, session_id):
|
|
550
|
+
self.flash("attach failed (archived or missing run)")
|
|
551
|
+
return
|
|
552
|
+
self.flash(f"attached {safe(session_id, 32)}")
|
|
553
|
+
self.run_worker(self.refresh_data(), exclusive=False)
|
|
554
|
+
|
|
530
555
|
def action_pin(self) -> None:
|
|
531
556
|
key = self._selected_key()
|
|
532
557
|
if self.view != "overview" or key is None or key not in self.data.bundles:
|
|
@@ -21,7 +21,7 @@ KEYS: tuple[tuple[str, str], ...] = (
|
|
|
21
21
|
("g", "Observations: verification signals, display-only (no pass/fail score)"),
|
|
22
22
|
("e", "Evidence: observed runs vs SELF-REPORTED declarations"),
|
|
23
23
|
("j / k, arrows", "Move down / up (scrolls the detail when it has focus)"),
|
|
24
|
-
("Enter", "Open
|
|
24
|
+
("Enter", "Open detail; on Active run, attach a suggested session"),
|
|
25
25
|
("Esc", "Back: leave detail, close or clear the filter"),
|
|
26
26
|
("/", "Filter (timeline: agent: session: kind: risk: source: file: since: until: words)"),
|
|
27
27
|
("m", "Timeline: load more events"),
|