Commit Graph
102 Commits
Author SHA1 Message Date
akadeepesh 5ee834f792 fix(webui): use constant-time comparison for config UI auth token
Compare the request token with hmac.compare_digest instead of == to
close a timing side-channel on the local, single-use session token.
2026-08-26 01:04:14 +05:30
akadeepesh d9ca66d461 chore: bump version to 0.3.8 and update changelog for apply-zip feature v0.3.8 2026-08-24 09:01:04 +05:30
akadeepesh 4b1a306c77 docs: document apply-zip and the .contextzip/ workspace layout
Adds an 'Applying AI-returned changes' section covering the manifest
mechanism, the new/modified/unchanged/drifted/untracked classification
table, safety guarantees, and inbox/manifest resolution. Also updates
the command table, Python API table, and workspace layout diagram to
include inbox/, backups/, and the manifest sidecar.
2026-08-24 08:59:44 +05:30
akadeepesh ca14e0f6a0 feat(api): expose apply_zip() in the public API
Adds apply_zip() alongside get_files/get_git_changes/create_zip,
following the same plain-function, exception-raising style (no Click,
no Rich, no SystemExit). Exposes ApplyResult and ZipNotFoundError
from the package root.
2026-08-24 08:59:44 +05:30
akadeepesh 00dba7ac8c feat(cli): add 'contextzip apply-zip' command
Wires applier.py into the CLI: auto-detects a zip from
.contextzip/inbox/ (or takes an explicit path), prints a plan summary
(new/modified/unchanged/drifted/untracked counts), and only prompts
for confirmation when something looks risky — drift, untracked paths,
or no manifest at all. Clean modifications and new files apply with
no prompt.

Flags: --dry-run/-n, --verbose/-v, --yes/-y, --manifest.
2026-08-24 08:59:44 +05:30
akadeepesh c6871db8bd feat(applier): add apply-zip engine with local sidecar manifest
Introduces applier.py: resolves the AI-returned zip (inbox or explicit
path), diffs it against a per-zip manifest, and classifies every file
as new/modified/unchanged/drifted/untracked before writing anything.
Only ever adds or modifies files — no deletions are inferred.

packager.py now writes a <name>.manifest.json sidecar next to every
zip it creates, containing a hash of each included file. It's written
to disk only, never added as a zip entry, so it's never uploaded or
visible to whatever AI tool the zip is pasted into.

Safety: zip entries are validated against path traversal before
extraction; every file about to be overwritten is backed up under
.contextzip/backups/<timestamp>/ first; consumed zips are archived to
.contextzip/inbox/applied/ rather than deleted.
2026-08-24 08:59:43 +05:30
akadeepesh a840e7fbc0 feat: add visual config UI and first-run offer with enhanced exclusion suggestions v0.3.7 2026-08-24 02:09:30 +05:30
akadeepesh adda650263 chore: bump version to 0.3.7 2026-08-24 02:07:51 +05:30
akadeepesh ad18a39519 fix: update .gitignore to include config.json for version control 2026-08-24 02:07:48 +05:30
akadeepesh a0042ef837 docs: document the visual config UI 2026-08-24 02:06:43 +05:30
akadeepesh 5575a7899d feat(cli): wire up 'contextzip config --ui' and first-run offer
- 'contextzip config --ui' launches the local config UI directly
- First run in a project with no config at all offers to launch it
  interactively, gated on TTY + no CI env var + no --prompt/--output
- Declining is remembered per-machine (config.py) so it only asks once
- Accepting and saving mid-run reloads config and continues packaging
  immediately in the same invocation
2026-08-24 02:06:35 +05:30
akadeepesh 9d4bc08734 feat(webui): add local config UI frontend
Single-file HTML/CSS/JS, no build step, no CDN calls — colors and
typography matched to the showcase site's design tokens. Live file tree
with checkboxes, one-click exclude suggestions, working-config panel
with raw JSON preview, and a save flow with a success overlay.
2026-08-24 02:06:26 +05:30
akadeepesh a86855cd55 feat(webui): add local config UI server
Stdlib-only HTTP server bound to 127.0.0.1, with a random per-session
token (same approach as Jupyter Notebook) and no outbound network calls
of its own. Auto-shuts down on save, tab idle, or a hard time ceiling.

Includes:
- suggestions.py: detects PDFs, office docs, fonts, media, and anything
  over 1MB that isn't already covered by the default exclusion rules
- persist.py: writes always_include/always_exclude to
  .contextzip/config.json, reusing the existing workspace/.gitignore setup
2026-08-24 02:06:17 +05:30
akadeepesh 7b4e248862 feat(filters): add scan_all_files/classify_scanned_files for reusable tree scans
Splits file-tree scanning into a one-time disk walk (scan_all_files) plus
a pure in-memory classifier (classify_scanned_files) that can be run
against different include/exclude patterns without re-touching the
filesystem. resolve_files() is untouched — this is purely additive.

Prunes known-huge, always-irrelevant directories (.venv, node_modules,
.git, __pycache__, build output, etc.) during the walk itself, and
rejects symlinks that resolve outside the project tree (e.g. a venv's
bin/python pointing at the system interpreter).
2026-08-24 02:06:07 +05:30
akadeepesh 2bca7ceba9 bump version to 0.3.6 v0.3.6 2026-08-23 03:07:18 +05:30
akadeepesh 8dd3f48c8a feat: update workspace structure and improve gitignore handling 2026-08-23 03:03:34 +05:30
akadeepesh dc78feacf1 docs: document contextzip workspace and configuration 2026-08-23 03:03:10 +05:30
akadeepesh c828f50c02 feat: apply ai preferences to file selection 2026-08-23 03:03:02 +05:30
akadeepesh 587b6d2f4f feat: integrate project config into cli 2026-08-23 03:02:51 +05:30
akadeepesh 402266162b feat: organize contextzip output workspace 2026-08-23 03:02:38 +05:30
akadeepesh bcd89d2ac5 feat: apply project config to file selection 2026-08-23 03:02:31 +05:30
akadeepesh f0bbcf5a24 feat: add project-level contextzip configuration 2026-08-23 03:02:22 +05:30
akadeepesh 275fcb5387 feat: add cz as contextzip cli alias 2026-08-23 03:02:09 +05:30
akadeepesh b25406898c docs: document monorepo detection and workspace config; bump to 0.3.5
- README: expand framework detection section, new "Workspace
  location" section, drop stale exports/ mention left over from
  the eod/handoff removal
- Add CHANGELOG.md
- Bump version 0.3.4 -> 0.3.5 (pyproject.toml, __init__.py)
v0.3.5
2026-08-09 19:59:28 +05:30
akadeepesh f0b0f6779c feat(config): configurable .contextzip/ workspace location
Adds a precedence chain for where .contextzip/ is created:
env var (CONTEXTZIP_WORKSPACE_LOCATION) > project config
(.contextzip.json, git-committed, team-shared) > personal config
(per-machine, contextzip config --set-workspace) > default
(git-root, unchanged behavior).

Also fixes a latent bug this surfaced: .gitignore registration
derived git_root as workspace.parent, which only held true when
the workspace was always directly under git root. Now derives it
independently via _find_git_root and only registers .gitignore
when the workspace is actually inside the repo.

New: project_config.py (loads .contextzip.json), config.py
get/save/delete_workspace_location, cli.py --set-workspace/
--reset-workspace on `contextzip config`.
2026-08-09 19:59:01 +05:30
akadeepesh 9032a91ccf feat(detector): scan subdirectories for framework markers
Detection previously only checked project_dir itself, so a monorepo
like root/frontend/package.json + root/backend/requirements.txt
detected nothing and fell through to only the universal base
exclusion rules — leaving node_modules/, .venv/, etc. unexcluded
except by whatever .gitignore happened to catch.

Now scans project_dir plus a shallow, bounded subdirectory tree
(depth 2), skipping dependency/build dirs (node_modules, .venv,
.git, etc.) so it never walks into a large dependency tree. Runs
unconditionally, not just when root comes up empty, since a
root-level marker doesn't imply there's nothing else to find in
sibling directories.

DetectionResult now tracks which subdirectory each ecosystem was
found in (`sources`), surfaced in the CLI panel, e.g.
"Next.js (frontend/) + FastAPI (backend/)".
2026-08-09 19:58:46 +05:30
akadeepesh 64ff135102 Remove Claude.ai session key handling and related artifact fetching functionality 2026-08-09 04:15:04 +05:30
akadeepesh d8faf3acf2 chore: bump version to 0.4.0, add CHANGELOG entry and README section for eod/handoff v0.3.4 2026-07-17 08:10:35 +05:30
akadeepesh 5b54f95390 feat(cli): add eod and handoff subcommands, extend config with session key management 2026-07-17 08:10:21 +05:30
akadeepesh a140a3675d feat(cli_display,cli_onboard): add eod/handoff result panel and session key onboarding 2026-07-17 08:10:15 +05:30
akadeepesh 7a3580e396 feat(clipboard): add text-mode clipboard for eod/handoff prompts 2026-07-17 08:10:06 +05:30
akadeepesh 9e80971a1b refactor(packager,rules): generalise _ensure_gitignore and exclude exports/ from file scanning 2026-07-17 08:06:41 +05:30
akadeepesh 81e8ce3d6f feat(brief): add eod/handoff prompt orchestrator 2026-07-17 08:06:29 +05:30
akadeepesh 752f6261e2 feat(claude): add conversation export locator and artifact fetcher 2026-07-17 08:06:19 +05:30
akadeepesh 0126a909e8 feat(code_changes): add three-case file diff resolution for eod/handoff 2026-07-17 08:06:07 +05:30
akadeepesh f73902698f feat(config): add Claude session key storage alongside Gemini key 2026-07-17 08:05:58 +05:30
akadeepesh 4a4562b366 feat(markers): add per-branch checkpoint storage for eod/handoff 2026-07-17 08:03:28 +05:30
akadeepesh a533ad076f feat(git): add branch-aware primitives for eod/handoff diff resolution 2026-07-17 08:03:17 +05:30
akadeepesh 10247933b3 chore: bump version to 0.3.3 v0.3.3 2026-05-29 21:55:09 +05:30
akadeepesh 2de59c0b1c fix(packaging): include all subpackages in wheel by removing explicit allowlist 2026-05-29 21:53:59 +05:30
akadeepesh 859db2d24e feat: add Python API for contextzip with functions for git changes and file management 2026-05-25 16:27:09 +05:30
akadeepesh 55beeec917 chore: bump version to 0.3.2 and update changelog for new API features v0.3.2 2026-05-25 13:52:51 +05:30
akadeepesh 594257ec9b feat: add contextzip watch subcommand for automatic error detection and packaging 2026-05-25 13:52:29 +05:30
akadeepesh 79c22fc22b feat: add public API for contextzip with functions for git changes and file management
fix: revert version to 0.3.0 and update __all__ exports in __init__.py
feat: implement create_zip_silent for silent ZIP creation without console output
2026-05-25 13:50:05 +05:30
akadeepesh 4e15f2b9e6 chore: bump version to 0.3.1 v0.3.1 2026-05-25 13:46:48 +05:30
Deepesh KumarandGitHub 9aef7767f4 feat: terminal error watcher with automatic debug context generation (#9) 2026-05-25 13:45:05 +05:30
akadeepesh 06461ef644 fix(gemini): update default model identifier to gemini-2.5-flash-lite
refactor(filters): improve path handling in resolve_files function

cleanup(packager): remove legacy _safe_name helper function
2026-05-25 13:42:11 +05:30
akadeepesh 88ce0f9754 docs: update README with watch command documentation
Adds Terminal error watcher section covering the full flow, ZIP contents
table, Ctrl+C fallback, supported frameworks, and PTY/Windows note.
Updates features list and subcommands reference.
2026-05-25 13:41:59 +05:30
akadeepesh 1c05bd8997 feat(cli): add watch subcommand wired to watcher module
Adds `contextzip watch -- COMMAND [ARGS]` to the CLI group.
Runs ecosystem detection, prints the Windows PTY warning where relevant,
and delegates to watcher.run_watch().
2026-05-25 13:41:26 +05:30
akadeepesh 572edee026 refactor(cli): split cli.py into four focused modules
cli.py was 1,100+ lines. Extracted with no behaviour changes:
- cli_display.py  — all Rich rendering helpers
- cli_ai.py       — AI selection orchestration + normalize_pattern
- cli_onboard.py  — Gemini API key onboarding flow
cli.py retains only Click routing and _run().
2026-05-25 13:41:09 +05:30