Commit Graph
527 Commits
Author SHA1 Message Date
AIOSAI 52c3effd86 merge main into #373 — take Track B version of hooks.py (superset of Track A) 2026-04-21 08:30:08 -07:00
AIPass b418e7087f Merge pull request #372 from AIOSAI/citizen/seedgo-hook-consolidation-track-a
feat(hooks): DPLAN-0139 Track A — hook consolidation
2026-04-21 08:28:59 -07:00
AIOSAI 3e5bb8cc0f merge main into #372 — take main versions of auto_fix_diagnostics + pre_edit_gate (supersets of Track A baseline) 2026-04-21 08:28:39 -07:00
AIPass e213d68afa Merge pull request #370 from AIOSAI/citizen/seedgo-ruff-checklist-gap
feat(seedgo+hooks): close ruff F401 checklist gap — hard-block lint in pre-edit gate
2026-04-21 08:27:38 -07:00
AIOSAI 16be5ab96e merge main into #370 — take Track E v1.3.0 (compatible with #370's auto_fix lint additions) 2026-04-21 08:26:59 -07:00
AIPass 1a19e7388e Merge pull request #371 from AIOSAI/citizen/seedgo-hook-probe-suite
feat(seedgo+hooks): DPLAN-0139 Track H — hook probe suite + drone @seedgo hooks probe
2026-04-21 08:24:27 -07:00
AIPass 16fa4e0906 Merge pull request #368 from padddypaddypaddy-boop/fix/mac-test-symlink-resolve
fix(drone): resolve tempdir fixture in registry_handler tests — unblock Mac (issue #360 finding A1)
2026-04-21 08:24:12 -07:00
AIPass 2d77d65204 Merge pull request #374 from AIOSAI/proto/drone-dplan-0140-phase1
proto(drone): DPLAN-0140 Phase 1 — GitPython @git status prototype + investigation
2026-04-21 08:21:11 -07:00
AIPass 378db873ca Merge pull request #375 from AIOSAI/citizen/seedgo-track-e-single-path
feat(hooks+seedgo): DPLAN-0139 Track E — single-path enforcement
2026-04-21 08:20:59 -07:00
AIOSAIandClaude Sonnet 4.6 49c599062e feat(hooks+seedgo): DPLAN-0139 Track E — single-path enforcement
Adds physical blockers so agents cannot bypass the correct delivery paths:

1. pre_edit_gate.py v1.3.0 (.claude/hooks/) — two new Track E rules:
   - Rule 1: block any write to *.ai_mail.local/inbox.json (use drone @ai_mail email)
   - Rule 2: block cross-branch writes unless CWD branch is in TRUSTED_CROSS_WRITERS

2. permissions.py (seedgo/apps/modules/) — single source of truth:
   - TRUSTED_CROSS_WRITERS = ("devpulse", "seedgo", "spawn")
   - is_trusted_caller(name), identify_caller(cwd)

3. drone auth.py — ALLOWED_CALLERS now imported from permissions.py
   (extended from ["devpulse"] to all three trusted cross-writers)

4. ai_mail delivery.py — deliver_to_inbox_file() helper added:
   - Single canonical path for direct-path inbox writes, always fires notify-send
   - reply.py _deliver_via_reply_path() backdoor routes through this helper

5. inbox_audit.py (seedgo/apps/modules/) — drone @seedgo audit inbox-ids:
   - Scans all inbox.json files for non-8-hex message ids
   - Alerts with drone @ai_mail email command when violations found

6. test_hooks_track_e.py — 26 tests, all passing (359 total in suite)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 08:18:07 -07:00
AIOSAIand@drone 5dd66bd05b proto(drone): DPLAN-0140 Phase 1 — GitPython @git status prototype + investigation
Phase 1 deliverables:
- Subprocess audit: ~44 calls across 8 files inventoried
- Library comparison: GitPython recommended (maturity, pure-Python, Windows support)
- Prototype: status_handler_gitpython.py implements get_branch_status() via GitPython
- Benchmark results: subprocess 13.9ms avg vs GitPython 27.9ms avg (acceptable delta)
- Pathspec scope limitation documented (hit by @seedgo PRs #371-#373)
- Phase 2 surface expansion priorities listed

Co-Authored-By: @drone <drone@aipass>
2026-04-21 00:42:25 -07:00
AIOSAI d46a649cc0 feat(seedgo+hooks): DPLAN-0139 Track B — hook test suite unification
- hooks.py v1.1.0: new test and list subcommands
- hooks_ext.py: cmd_hooks_test (pytest per test file, Rich table) +
  cmd_hooks_list (reads ~/.claude/settings.json + .claude/settings.json,
  shows all wired hooks with version, event, matcher, exists status)
- Version headers added to notification_sound.py, stop_sound.py,
  tool_use_sound.py (all 10 hooks now have version headers)
- test_hooks_utility.py: 14 smoke tests for 7 previously uncovered hooks
  (branch_prompt_loader, email_notification, identity_injector, pre_compact,
  notification_sound, stop_sound, tool_use_sound)
- test_hooks_track_b.py: 7 tests for hooks test + hooks list subcommands
- 443 total tests passing (422 → 443)

Note: drone @git pr scope bug (DPLAN-0140) hit again — raw git/gh used.
2026-04-21 00:31:08 -07:00
AIOSAI 56555aff12 feat(seedgo+hooks): DPLAN-0139 Track H — hook probe suite + drone @seedgo hooks probe
Adds an observational probe harness for every Claude Code hook event type.
Used to verify hook wiring, scaffold new hooks, and answer Q12 (subagent
hook propagation / env-var matrix).

## What ships

**7 probe scripts** at `.claude/hooks/probes/`:
- probe_pre_tool_use.py, probe_post_tool_use.py, probe_user_prompt_submit.py
- probe_subagent_stop.py, probe_pre_compact.py, probe_stop.py, probe_notification.py

Each probe: reads stdin JSON, appends one entry to last_ping.jsonl
(APPEND mode, never overwrites), exits 0 always. Fields recorded:
event, tool, cwd, agent_id, timestamp, script_elapsed_ms, cli_version,
env_has_claude_project_dir, env_has_aipass_home.

Pure stdlib, no aipass imports. Silent fail on any exception.
OPT-IN — not auto-wired in settings.json (each probe docstring has
the settings.json snippet to enable it).

**drone @seedgo hooks probe** — new seedgo module (apps/modules/hooks.py):
- No flags: reads last_ping.jsonl, prints Rich [PROBE] table of recent entries
- --subagent: spawns claude -p headless, reads probe log, reports whether
  PostToolUse / SubagentStop fired (definitive Q12 data for headless mode)
- --matrix: analyzes last_ping.jsonl by event type, reports env var
  propagation patterns, writes Q12_findings_2026-04-20.md

**Tests**: 69 new tests in tests/test_hooks_probe.py covering stdin parse,
output shape, malformed input resilience, and module dispatch.
402 total tests pass.

**README.md** at .claude/hooks/probes/README.md — enable instructions,
example output, flag reference.

last_ping.jsonl added to .gitignore (live log, not source).
2026-04-21 00:13:18 -07:00
AIOSAI fe3e07f791 feat(seedgo+hooks): DPLAN-0139 Track A — hook consolidation
- auto_fix_diagnostics.py v5.3.0: [SILENT-FIX] label, IDE fallback with
  loud stderr announce when pyright unavailable, ruff lint hard-block
- pre_edit_gate.py v1.2.0: added to AIPass/.claude/hooks/ + wired to
  PreToolUse in ~/.claude/settings.json (first time gate runs in production)
- Delete .claude/global_hooks/ (v4.3.0 stale, nothing references it)
- MANIFEST.in + pyproject.toml force-include: .claude/hooks/ in pip wheel
  at aipass/_hooks/ — verified via pip wheel build
- 20 new tests (test_hooks_track_a.py): auto_fix, pre_edit_gate,
  subagent_stop_gate — all pass (422 total)

Note: drone @git pr scope bug (DPLAN-0140) blocked staging .claude/hooks/
changes — raw git used. ~/.claude/settings.json PreToolUse update is
out-of-repo (not in this commit).
2026-04-21 00:06:40 -07:00
AIOSAI a06421a35d feat(seedgo+hooks): DPLAN-0139 Track H — hook probe suite + drone @seedgo hooks probe
Adds an observational probe harness for every Claude Code hook event type.
Used to verify hook wiring, scaffold new hooks, and answer Q12 (subagent
hook propagation / env-var matrix).

## What ships

**7 probe scripts** at `.claude/hooks/probes/`:
- probe_pre_tool_use.py, probe_post_tool_use.py, probe_user_prompt_submit.py
- probe_subagent_stop.py, probe_pre_compact.py, probe_stop.py, probe_notification.py

Each probe: reads stdin JSON, appends one entry to last_ping.jsonl
(APPEND mode, never overwrites), exits 0 always. Fields recorded:
event, tool, cwd, agent_id, timestamp, script_elapsed_ms, cli_version,
env_has_claude_project_dir, env_has_aipass_home.

Pure stdlib, no aipass imports. Silent fail on any exception.
OPT-IN — not auto-wired in settings.json (each probe docstring has
the settings.json snippet to enable it).

**drone @seedgo hooks probe** — new seedgo module (apps/modules/hooks.py):
- No flags: reads last_ping.jsonl, prints Rich [PROBE] table of recent entries
- --subagent: spawns claude -p headless, reads probe log, reports whether
  PostToolUse / SubagentStop fired (definitive Q12 data for headless mode)
- --matrix: analyzes last_ping.jsonl by event type, reports env var
  propagation patterns, writes Q12_findings_2026-04-20.md

**Tests**: 69 new tests in tests/test_hooks_probe.py covering stdin parse,
output shape, malformed input resilience, and module dispatch.
402 total tests pass.

**README.md** at .claude/hooks/probes/README.md — enable instructions,
example output, flag reference.

last_ping.jsonl added to .gitignore (live log, not source).
2026-04-20 23:44:58 -07:00
AIOSAI d5053abb9d feat(seedgo+hooks): close ruff F401 checklist gap — hard-block lint errors in pre-edit gate
ruff_check was branch_level only so drone @seedgo checklist <file> skipped
it entirely. F401 unused imports slipped through to main twice (PRs #349,
#357) because neither checklist nor the pre-edit gate caught them per-file.

Changes:
- ruff_check.py v1.1.0: add check_module() for single-file ruff runs +
  _find_ruff_bypass_from_file() to locate .seedgo/ruff_bypass.json from
  any file path. AUDIT_SCOPE stays branch_level (audit pipeline unchanged).
- checklist.py: update _is_applicable() — branch_level checkers that also
  implement check_module() are now eligible for per-file checklist runs.
  ruff_check gains per-file enforcement; dead_code/test_quality/unused_function
  remain skipped (genuinely need full branch context).
- auto_fix_diagnostics.py v5.2.0: add run_ruff_lint_structured() — runs
  ruff --output-format=json and saves violations as {line, message} dicts
  alongside pyright errors in the state file. Pre-edit gate now hard-blocks
  on F401/lint just like type errors.
- pre_edit_gate.py v1.2.0: generalize reason message from "type error(s)"
  to "error(s)" since state now contains lint violations too.

Verification: drone @seedgo checklist <F401 file> now shows ✗ ruff: 2
violation(s) — F401 L1/L2. 333 seedgo tests pass.
2026-04-20 17:37:31 -07:00
AIPass 32b97c45cc Merge branch 'main' into fix/mac-test-symlink-resolve 2026-04-20 17:09:45 -07:00
AIPass fc4b5801a1 Merge pull request #369 from AIOSAI/system/devpulse-choreaimail-remove-unused-imports-in-test-files-un
feat(system): chore(ai_mail): remove unused imports in test files — unblock CI for PR #368
2026-04-20 17:09:18 -07:00
AIOSAIand@devpulse 714b059403 feat(system): chore(ai_mail): remove unused imports in test files — unblock CI for PR #368
Co-Authored-By: @devpulse <devpulse@aipass>
2026-04-20 17:08:21 -07:00
PaddyandClaude Opus 4.7 e9fed96518 fix(drone): resolve tempdir fixture in registry_handler tests — unblock Mac (issue #360 finding A1)
Two tests failed on macOS due to the /var/folders → /private/var/folders symlink:
- test_relative_paths_resolved (line 126: string startswith mismatch)
- test_find_registry_from_child_dir (line 377: Path == comparison)

Root cause: tempfile.mkdtemp() returns the unresolved /var/folders/... form on Mac. Production code (PR #361 / 8a5fbf6) correctly calls Path.resolve() which follows the symlink and canonicalizes to /private/var/folders/.... The test fixture's registry_dir stored the unresolved form, so one side of each comparison had /private/ and the other didn't.

One-line fix: .resolve() the fixture path too so both sides are canonical on every platform.

Platform behavior:
- Linux: no-op (no symlink, path already canonical) — was passing, stays passing
- macOS: follows /var/folders → /private/var/folders — was failing (2/33), now passing (33/33)
- Windows: normalizes short-path to long-path consistently with production code — was passing, stays passing

Verified locally on macOS 12.7.6 Intel: 33/33 in test_registry_handler.py green after fix.

Surfaced during the Mac install feedback session on issue #360. Linux @devpulse green-lit the direct PR.

Follow-up recommendation (NOT this PR, separate cleanup): migrate registry_dir fixture to pytest's built-in tmp_path, which returns a pre-resolved Path. Eliminates the class of fixture bug entirely across the test suite.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 14:54:37 -07:00
AIPass 7ce3c3ccc6 Merge pull request #367 from AIOSAI/system/devpulse-fixsetup-bootstrap-banner-count-15-11-reflects-act
feat(system): fix(setup): bootstrap banner count 15 → 11 — reflects actual core branch count (#360 finding B5)
2026-04-20 14:31:35 -07:00
AIOSAIand@devpulse a8abdedfa5 feat(system): fix(setup): bootstrap banner count 15 → 11 — reflects actual core branch count (#360 finding B5)
Co-Authored-By: @devpulse <devpulse@aipass>
2026-04-20 14:31:23 -07:00
AIPass f10ec5c619 Merge pull request #366 from AIOSAI/citizen/drone
feat(drone): UX fixes batch — sync --autostash, fix --dry-run + help, mail view N by index (B1/B2/B3)
2026-04-20 14:30:29 -07:00
AIOSAIand@drone 7860fdba13 feat(drone): UX fixes batch: sync --autostash, fix --dry-run + help, mail view N by index (B1/B2/B3 from issue #360)
Co-Authored-By: @drone <drone@aipass>
2026-04-20 14:28:37 -07:00
AIPass b30beb5d4a Merge pull request #365 from AIOSAI/memory/fix-json-handler-test-harness
fix(memory/tests): repair test_json_handler harness — KeyError on sys.modules (#360 finding A2)
2026-04-20 14:24:03 -07:00
AIOSAIandClaude Sonnet 4.6 960925b84a fix(memory/tests): repair test_json_handler harness — KeyError on sys.modules lookup
_get_json_handler() was reading sys.modules[] directly after _fresh_json_handler
had just popped the module out. importlib.import_module() replaces the lookup so
the module is actually imported fresh each test. Also removes dead reload/pop
code from the fixture that never ran. Fixes 27 failures (issue #360 finding A2).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-20 14:22:56 -07:00
AIPass a8164eb691 Merge pull request #364 from AIOSAI/system/devpulse-docspolicy-propagate-git-checkout-deny-rule-throug
feat(system): docs(policy): propagate git-checkout deny rule through global prompt + devpulse prompt + drone @git --help
2026-04-20 14:16:38 -07:00
AIOSAIand@devpulse 4211990cce feat(system): docs(policy): propagate git-checkout deny rule through global prompt + devpulse prompt + drone @git --help
Co-Authored-By: @devpulse <devpulse@aipass>
2026-04-20 14:16:26 -07:00
AIPass 78df75cc98 Merge pull request #363 from AIOSAI/system/devpulse-choredeny-add-git-checkout-to-bash-deny-list-enfor
feat(system): chore(deny): add git checkout to Bash deny list — enforces drone-only git policy via permission gate
2026-04-20 14:13:26 -07:00
AIOSAIand@devpulse d7f471809a feat(system): chore(deny): add git checkout to Bash deny list — enforces drone-only git policy via permission gate
Co-Authored-By: @devpulse <devpulse@aipass>
2026-04-20 14:13:04 -07:00
AIPass 3d3754283d Merge pull request #361 from AIOSAI/citizen/ai_mail
feat(ai_mail): fix(daemon): resolve relative registry branch paths to absolute before spawn — fix @ai_mail cwd=repo-root bug (issue #360 finding #3)
2026-04-20 13:08:03 -07:00
AIOSAIand@ai_mail 9287b36d52 feat(ai_mail): fix(daemon): resolve relative registry branch paths to absolute before spawn — fix @ai_mail cwd=repo-root bug (issue #360 finding #3)
Co-Authored-By: @ai_mail <ai_mail@aipass>
2026-04-20 13:06:24 -07:00
AIOSAIandClaude Sonnet 4.6 8a5fbf6152 feat(memory): add [memory] extras group — unblock contributor pytest (#360 finding #1)
- pyproject.toml: add memory = ["numpy>=2.0", "chromadb>=1.0"] optional-deps group
- setup.sh: install .[dev,memory] so fresh-clone pytest works end-to-end
- test_vector.py: gate with pytest.importorskip("numpy"/"chromadb") — skip cleanly without extras
- memory_watcher.py: _check_vector_deps() probes venv at startup; health report now honest when chromadb absent
- bypass.json: 4 entries covering test_vector.py seedgo false-positives (architecture/docs/encapsulation/meta)
- dispatch/daemon.py: resolve relative branch_path to absolute before use
- dispatch/dispatch_monitor.py: resolve lock_file path so claude cwd is always absolute

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-20 13:06:20 -07:00
AIPass 71f6226f0d Merge pull request #359 from AIOSAI/citizen/drone
feat(drone): switch merge_plugin from --squash to --merge (straight merge commits only)
2026-04-20 12:12:58 -07:00
AIOSAIand@drone 6ca052f915 feat(drone): switch merge_plugin from --squash to --merge (straight merge commits only)
Co-Authored-By: @drone <drone@aipass>
2026-04-20 12:11:00 -07:00
AIPassand@ai_mail 7feafdf660 feat(ai_mail): daemon: recognize AIPASS-TEST ping token — auto-ack without spawning (Phase 3.5 redo on fresh main) (#358)
Co-authored-by: @ai_mail <ai_mail@aipass>
2026-04-20 12:02:16 -07:00
AIPassand@ai_mail 6766ae6380 feat(ai_mail): wake: manual wake blocklist — protect @devpulse from cross-branch wakes (re-do of #352 on fresh main) (#357)
Co-authored-by: @ai_mail <ai_mail@aipass>
2026-04-20 11:50:12 -07:00
AIPassand@devpulse 74a6a57894 feat(system): chore: gitignore src/aipass/aipass/ — S95 under-construction branch, locks in intended working-tree state that was never committed (#356)
Co-authored-by: @devpulse <devpulse@aipass>
2026-04-20 11:37:27 -07:00
9560e5b934 feat(system): fix(setup): add branch_info block to passport template — path + email no longer 'unknown' on fresh installs (closes #353 finding 6) + gitignore .claude/worktrees (#355)
* feat(devpulse): watchdog: breadcrumb on exit + default timeout 1800s to 600s (FPLAN-0189)

Co-Authored-By: @devpulse <devpulse@aipass>

* feat(drone): fix pr_handler: scope commit to branch_dir pathspec — prevents concurrent-PR index contamination (FPLAN-0190 Task A)

Co-Authored-By: @drone <drone@aipass>

* feat(system): fix(setup): add branch_info block to passport template — path + email no longer 'unknown' on fresh installs (closes #353 finding 6) + gitignore .claude/worktrees

Co-Authored-By: @devpulse <devpulse@aipass>

---------

Co-authored-by: @devpulse <devpulse@aipass>
Co-authored-by: @drone <drone@aipass>
2026-04-20 11:27:41 -07:00
AIPassand@devpulse c8b3093ec5 feat(devpulse): watchdog: breadcrumb on exit + default timeout 1800s to 600s (FPLAN-0189) (#349)
Co-authored-by: @devpulse <devpulse@aipass>
2026-04-20 11:26:04 -07:00
1253ee8f09 feat(dispatch): auto-spawn watchdog after every dispatch (FPLAN-0189 Task A) (#350)
* feat(devpulse): watchdog: breadcrumb on exit + default timeout 1800s to 600s (FPLAN-0189)

Co-Authored-By: @devpulse <devpulse@aipass>

* feat(dispatch): auto-spawn watchdog after every dispatch (FPLAN-0189 Task A)

_orchestrate_dispatch_send now spawns `drone @devpulse watchdog agent <target>`
as a detached background process (start_new_session=True) after a successful
wake. cwd=devpulse_path bypasses _guard_caller's cross-branch rejection.
--no-watchdog flag opts out. 6 new tests cover registry lookup, path
resolution, and error paths.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: @devpulse <devpulse@aipass>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-20 11:24:44 -07:00
905f2a45fb feat(drone): fix pr_handler: scope commit to branch_dir pathspec — prevents concurrent-PR index contamination (FPLAN-0190 Task A) (#351)
* feat(devpulse): watchdog: breadcrumb on exit + default timeout 1800s to 600s (FPLAN-0189)

Co-Authored-By: @devpulse <devpulse@aipass>

* feat(drone): fix pr_handler: scope commit to branch_dir pathspec — prevents concurrent-PR index contamination (FPLAN-0190 Task A)

Co-Authored-By: @drone <drone@aipass>

---------

Co-authored-by: @devpulse <devpulse@aipass>
Co-authored-by: @drone <drone@aipass>
2026-04-20 11:24:33 -07:00
c941c3d6ac fix(setup): make setup.sh self-sufficient on macOS (no admin required) (#354)
Fresh-install testing on macOS 12 Intel surfaced five friction points that
blocked or silently broke installation for users without admin rights.
All fixes are Mac-only, gated behind a new IS_MACOS flag. Linux and
Windows paths are untouched. See #353 for full context.

1. Stock macOS 12 ships /usr/bin/python3 at 3.9.6; setup.sh aborts at
   the 3.10+ minimum check. Fix: probe versioned python3.10-3.13
   binaries before falling back to plain python3.

2. Homebrew auto-install is not a universal fallback. Non-admin Mac
   accounts cannot install Homebrew at all because its installer
   requires admin/sudo. Fix: add uv (astral.sh/uv) as a no-sudo,
   no-admin fallback. uv drops into ~/.local/bin via curl and downloads
   a prebuilt standalone Python 3.11 to ~/.local/share/uv/python; the
   venv is created from that.

3. macOS defaults to zsh since Catalina (2019). Writing AIPASS_HOME to
   ~/.bashrc silently fails because zsh does not source it. Fix: on
   Mac, pick ~/.zshrc (or ~/.bash_profile for bash) based on SHELL.

4. The final symlink used sudo ln -sf /usr/local/bin/drone, which
   prompts for a password on Mac and breaks entirely for non-admin
   users. Fix: on Mac, link into ~/.local/bin (user-writable, no sudo)
   and ensure it is on PATH via the profile rc.

5. HOOK_PYTHON was set to plain python3 on Unix. On Mac that resolves
   to /usr/bin/python3 (3.9.6), which cannot parse hook scripts using
   PEP 604 union syntax (X | None). Hooks silently crash on every
   prompt. Fix: on Mac, point HOOK_PYTHON at the venv python (3.11)
   that setup just built.

Tested end-to-end on a fresh clone, non-admin user, zsh, Intel: all 11
branches bootstrapped, drone CLI works, hooks fire and execute cleanly,
ai_mail delivery verified, sub-agents spawn successfully.

Refs #353

Co-authored-by: Paddy <padddypaddypaddy-boop@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 11:16:39 -07:00
AIPass 6998cc5ba7 Merge pull request #347 from AIOSAI/citizen/seedgo
feat(seedgo): fix(bypass): resolve relative registry paths in get_branch_from_path and _load_bypass_for_file — bypass.json entries silently failed for all checklist invocations because branch paths from registry are relative (src/aipass/seedgo) but were compared directly against absolute resolved file paths
2026-04-16 19:18:20 -07:00
AIOSAIand@seedgo 26f02be103 feat(seedgo): fix(bypass): resolve relative registry paths in get_branch_from_path and _load_bypass_for_file — bypass.json entries silently failed for all checklist invocations because branch paths from registry are relative (src/aipass/seedgo) but were compared directly against absolute resolved file paths
Co-Authored-By: @seedgo <seedgo@aipass>
2026-04-16 17:07:37 -07:00
AIPassand@devpulse 127b874c5f feat(system): doc(prompt): add 'run ruff before PR' habit rule to global prompt — habit not safety net, prevents silent format/lint debt from accumulating. Rationale in session S94: CI already catches drift, seedgo already audits structure. The missing piece is the agent-side habit. Culture-over-containers. (#346)
Co-authored-by: @devpulse <devpulse@aipass>
2026-04-16 15:00:39 -07:00
AIPassand@devpulse 4a402d287b feat(system): chore(lint)+chore(deps): ruff format sweep — 535 files reformatted (whitespace/line-breaks, zero behavior change) + add pytest-timeout to dev extras (was missing, tests use --timeout flag). Unblocks CI lint job which has been failing on the format-check step. (#345)
Co-authored-by: @devpulse <devpulse@aipass>
2026-04-16 14:08:23 -07:00
AIPassand@devpulse b92014a20e feat(system): fix(setup): Gemini hook install NameError — hook_python was undefined in the Gemini block (only defined in Claude block above). Pass HOOK_PYTHON through explicitly like the Claude flow does. (#344)
Co-authored-by: @devpulse <devpulse@aipass>
2026-04-16 13:57:17 -07:00
AIPassand@devpulse 8be6ac0418 feat(system): fix(setup): warn on Windows when shadowing drone installs are detected (#317 system Python pip aipass, #321 legacy npm aipass-drone scripts) — prints precise uninstall commands, doesn't auto-modify the user's system (#343)
Co-authored-by: @devpulse <devpulse@aipass>
2026-04-16 13:56:22 -07:00
AIPassand@devpulse e4a42f2186 feat(system): feat(windows): cherry-pick Windows parity fixes from #328 — watchdog ctypes (#323), dispatch monitor projects dir encoding (#324), prax atomic_write retry on PermissionError (#325), prax _WindowsSafeRotatingHandler (#318), branch_detector forward-slash normalize, memory_bank config seed (#322), PS profile wrapper (#319/#340). All Windows-only branches or no-op on Linux. 3146 tests pass, ruff zero. Closes #328 scope. Input-X credit preserved. (#342)
Co-authored-by: @devpulse <devpulse@aipass>
2026-04-16 13:41:31 -07:00