Skip to content

Release v0.26.1

Latest

Choose a tag to compare

@github-actions github-actions released this 05 Jun 14:00

[0.26.1] - 2026-06-05

Theme: GitFlow + non-Python UX patch. Four bug fixes from continued fabricOS dogfood — all paths where codeindex silently no-op'd or warned about state that wasn't real. No contract changes.

Fixed

  • codeindex hooks install post-commit now warns when .codeindex.yaml disables the hook (GH #87): codeindex init ships the yaml with hooks.post_commit.enabled: false by default, so the installed .git/hooks/post-commit wrapper would check the flag at runtime and silently no-op. The install command printed ✓, the user committed code, and README_AI.md never updated — classic "installed but not working" trap. New _maybe_warn_post_commit_disabled helper reads the yaml after install; when post_commit.enabled is false (or absent), prints an actionable reminder with the exact yaml snippet to flip. No behavior change to the install itself — patch-safe. (The doubly-opt-in default itself is a separate contract question deliberately deferred from this patch; the reminder is enough to unblock the first-time path.)
  • codeindex init no longer false-flags installed TS/JS parsers as missing + install hint matches the documented pipx path (GH #86): init_wizard.PARSER_PACKAGES enumerated only python/php/java even though scanner gained TS/JS parsers (#73) and the parser modules exist under src/codeindex/parsers/{typescript,javascript}/. Result on a TS-only project: init --yes printed Warning: Missing parsers for: javascript, typescript despite pipx inject ai-codeindex tree-sitter-{typescript,javascript} confirming the packages were already installed. Worse, the hint said Install with: pip install ai-codeindex[...] — contradicts the entire documented install path (pipx install ai-codeindex everywhere else in CLAUDE.md, README, hooks/index SKILL) and doesn't even work cleanly for a pipx-managed env. Fix: extend PARSER_PACKAGES to include typescript/javascript; change the install hint to pipx inject ai-codeindex tree-sitter-<lang> [tree-sitter-<lang2>...] (matches the rest of the doc surface). New structural test test_parser_package_map_covers_scanner_supported_set locks the invariant — adding a language to scanner.py without exposing it via PARSER_PACKAGES will fail the test, preventing the GH #86 drift class from recurring (same pattern as the #73 structural guard).
  • scan-all --ai no longer caches AI refusal text as enrichment: ok (GH #85): when the configured AI backend declined to answer for a directory (e.g. haiku returning "I don't see any file names or symbol names provided…"), Phase 2 wrote the refusal verbatim into the directory's README_AI.md blockquote AND stamped <!-- enrichment: ok -->. Subsequent scan-all --ai runs saw the ok marker, skipped re-enrichment, and the garbage description stuck in the cache forever. New enricher.looks_like_refusal(text) helper detects common refusal prefixes (case-insensitive: I don't, I cannot, I'm unable, no file, insufficient context, as an AI, etc.); when matched, the directory is marked failed (reason: ai-refused) so the next run retries automatically (idempotent re-enrichment policy already in place). Refusal-pattern detection happens on the cleaned/truncated AI output (~80 chars) — refusal phrasing always lives in the first ~30 chars so truncation doesn't blind the check.
  • Post-commit hook now fires on merge commits (GH #84): the shell wrapper's loop guard used git diff-tree --no-commit-id --name-only -r HEAD, which returns empty on merge commits by default — -m is required to enumerate per-parent changes. Empty → NON_DOC_FILES empty → wrapper exits 0 without delegating to codeindex hooks run post-commit. Net effect on GitFlow projects: README_AI.md files never auto-updated on PR merges (the commits that actually bring new code to main / develop). Reported live on fabricOS HEAD 171702b (Merge PR #7). Fix: add -m to the diff-tree command. Verified against a real merge commit in this repo (e240ba0 — Merge develop for 0.26.0 release): old logic saw 0 files, new logic sees the 20 files actually changed. New regression test in tests/test_cli_hooks.py::TestHookGeneration::test_post_commit_loop_guard_handles_merge_commits locks both directions (rejects the broken pattern, requires either -m or git show --name-only).