difflicious 0.11.0__tar.gz → 0.12.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- difflicious-0.12.0/.github/workflows/pages.yml +39 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/CHANGELOG.md +15 -2
- {difflicious-0.11.0 → difflicious-0.12.0}/CLAUDE.md +2 -1
- difflicious-0.12.0/CONTRIBUTING.md +8 -0
- difflicious-0.11.0/CONTRIBUTING.md → difflicious-0.12.0/DEVELOPING.md +6 -36
- {difflicious-0.11.0 → difflicious-0.12.0}/INSTALLATION.md +18 -5
- difflicious-0.12.0/PKG-INFO +112 -0
- difflicious-0.12.0/README.md +74 -0
- difflicious-0.12.0/docs/plans/2026-04-12-presentation-layer-separation.md +1823 -0
- difflicious-0.12.0/docs/presentation-layer-separation.md +184 -0
- difflicious-0.12.0/docs/screenshots/.gitkeep +1 -0
- difflicious-0.12.0/docs/screenshots/dark.png +0 -0
- difflicious-0.12.0/docs/screenshots/light.png +0 -0
- difflicious-0.12.0/docs/site/_config.yml +6 -0
- difflicious-0.12.0/docs/site/assets/logo.png +0 -0
- difflicious-0.12.0/docs/site/index.md +14 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/pyproject.toml +2 -0
- difflicious-0.12.0/scripts/screenshot.py +259 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/__init__.py +1 -1
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/app.py +16 -12
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/blueprints/auto_reload_routes.py +3 -2
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/blueprints/views.py +1 -2
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/services/template_service.py +6 -23
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/css/styles.css +130 -1
- difflicious-0.12.0/src/difflicious/static/css/tailwind.css +1 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/js/alpine-init.js +2 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/js/main.js +2 -48
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/js/modules/auto-reload.js +3 -5
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/js/modules/context-expansion-ui.js +4 -4
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/js/modules/full-diff.js +4 -4
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/js/modules/hunk-operations.js +13 -13
- difflicious-0.12.0/src/difflicious/static/js/modules/toolbar.js +52 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/js/stores/diffStore.js +49 -2
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/js/stores/themeStore.js +7 -22
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/templates/base.html +25 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/templates/diff_file.html +32 -30
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/templates/diff_groups.html +6 -6
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/templates/diff_hunk.html +30 -22
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/templates/partials/global_controls.html +4 -4
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/templates/partials/toolbar.html +10 -128
- {difflicious-0.11.0 → difflicious-0.12.0}/tests/js/auto-reload.test.js +1 -1
- {difflicious-0.11.0 → difflicious-0.12.0}/tests/js/context-expansion-ui.test.js +6 -6
- {difflicious-0.11.0 → difflicious-0.12.0}/tests/js/context-expansion.test.js +5 -5
- difflicious-0.12.0/tests/js/diffStore-actions.test.js +83 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/tests/js/full-diff.test.js +1 -1
- {difflicious-0.11.0 → difflicious-0.12.0}/tests/js/stores/themeStore.test.js +13 -18
- difflicious-0.12.0/tests/js/toolbar.test.js +42 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/tests/services/test_template_service.py +73 -22
- {difflicious-0.11.0 → difflicious-0.12.0}/uv.lock +59 -1
- difflicious-0.11.0/PKG-INFO +0 -213
- difflicious-0.11.0/README.md +0 -176
- difflicious-0.11.0/src/difflicious/static/css/tailwind.css +0 -1
- difflicious-0.11.0/src/difflicious/static/js/modules/file-operations.js +0 -177
- difflicious-0.11.0/src/difflicious/static/js/modules/state.js +0 -277
- {difflicious-0.11.0 → difflicious-0.12.0}/.dockerignore +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/.github/workflows/auto-release.yml +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/.github/workflows/ci.yml +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/.github/workflows/docker-publish.yml +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/.github/workflows/pypi-publish.yml +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/.gitignore +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/AGENTS.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/Dockerfile +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/LICENSE +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/PLAN.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/cilicious.sh +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/2025-11-18-alpine-component-architecture.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/CSS-STYLE-GUIDE.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/TROUBLESHOOTING.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/notes/2025-08-03-1009-claude-fixing-uncommon-off-by-one-error.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/notes/2025-08-19-1925-expandable-context.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/notes/2025-08-19-1925-troubleshooting-context-expansion-2025-07-29.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/notes/2025-11-18-alpine-js-migration-progress.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/notes/2025-11-18-alpine-js-migration-status.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/prompts/2025-08-19-1934-phase-1-css-foundation-dark-theme.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/proposals/2025-07-29-1916-code-structure-refactoring-recommendations.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/proposals/2025-07-29-1917-extract-context-expansion-module.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/proposals/2025-07-29-1918-extract-business-logic-service-layer.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/proposals/2025-07-30-1701-jinja2-server-side-diff-rendering.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/proposals/2025-07-30-1730-virtual-scrolling-lazy-rendering.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/proposals/2025-08-03-2106-typescript-migration-plan.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/proposals/2025-08-04-2130-simplify-diff-logic-and-ui.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/proposals/2025-08-18-1954-font-configuration-proposal.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/proposals/2025-08-18-1954-font-implementation-plan.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/proposals/2025-08-18-1954-font-implementation-summary.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/proposals/2025-08-19-1430-dark-light-mode-implementation.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/proposals/2025-11-18-0130-alpine-js-dom-manipulation.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/reports/2025-07-29-2100-context-expansion-extraction-report.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/reports/2025-07-30-1647-diff-rendering-performance-analysis.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/reports/2025-07-30-1655-backend-migration-performance-analysis.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/reports/2025-08-18-1200-dead-code-analysis-report.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/reports/2025-09-22-1857-production-readiness-analysis.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/reports/2025-09-22-1949-ui-css-cleanup-analysis.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/reports/2025-10-30-2201-production-readiness-update.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/reports/2025-10-31-1253-test-coverage-analysis.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/reports/2025-10-31-1718-test-coverage-improvement-summary.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/reports/2025-10-31-1720-0.9-release-plan.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/reports/2025-11-05-1857-css-rationalization-analysis.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/reports/2025-11-05-2019-color-audit.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/reports/2025-11-05-2019-phase2-implementation-plan.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/reports/2025-11-17-1730-codebase-improvements-analysis.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/reports/2026-02-05-v1.0-release-readiness-audit.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/sessions/2025-07-27-1256-project-setup-and-modern-python-packaging.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/sessions/2025-07-27-1415-git-integration-and-security-implementation.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/sessions/2025-07-27-1820-diff-parser-and-side-by-side-ui.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/sessions/2025-07-28-0953-syntax-highlighting-implementation.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/sessions/2025-07-28-1500-commit-comparison-and-ui-enhancements.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/sessions/2025-07-28-1805-untracked-files-implementation-and-bugfix.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/sessions/2025-07-31-1730-pygments-syntax-highlighting.compacted.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/internal/sessions/2025-11-18-0130-alpine-js-migration-implementation.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/javascript-modularization-plan.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/plans/2025-07-29-1015-expandable-context-feature.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/plans/2025-11-04-2318-gitpython-migration-plan.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/plans/2025-11-22-1.0-release-execution-plan.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/reference/app.js.reference +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/reference/diff-interactions.js.reference +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/docs/tailwind-design-system.md +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/package-lock.json +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/package.json +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/pnpm-lock.yaml +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/postcss.config.cjs +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/blueprints/__init__.py +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/blueprints/context_routes.py +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/blueprints/diff_routes.py +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/blueprints/git_routes.py +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/blueprints/helpers.py +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/cli.py +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/config.py +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/diff_parser.py +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/dummy_data.json +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/git_operations.py +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/services/__init__.py +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/services/base_service.py +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/services/diff_service.py +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/services/dtos.py +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/services/exceptions.py +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/services/file_watcher.py +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/services/git_service.py +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/services/syntax_service.py +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/css/tailwind.input.css +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/data/language_map.json +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/js/components/fileComponent.js +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/js/components/groupComponent.js +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/js/components/hunkComponent.js +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/js/components/searchComponent.js +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/js/modules/context-expansion.js +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/js/modules/design-system.js +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/js/modules/dom-utils.js +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/js/modules/navigation.js +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/js/modules/search.js +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/js/modules/theme.js +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/static/js/stores/searchStore.js +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/templates/index.html +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/templates/partials/empty_state.html +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/src/difflicious/templates/partials/loading_state.html +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/tailwind.config.cjs +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/tests/__init__.py +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/tests/conftest.py +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/tests/integration/conftest.py +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/tests/integration/test_api.py +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/tests/integration/test_api_detailed.py +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/tests/integration/test_frontend.py +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/tests/js/components/fileComponent.test.js +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/tests/js/components/groupComponent.test.js +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/tests/js/components/hunkComponent.test.js +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/tests/js/design-system.test.js +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/tests/js/diff-state-persistence.test.js.old +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/tests/js/dom-utils.test.js +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/tests/js/navigation.test.js +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/tests/js/search.test.js +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/tests/js/setup.js +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/tests/js/stores/diffStore.test.js +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/tests/js/stores/searchStore.test.js +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/tests/sample_01.diff +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/tests/services/__init__.py +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/tests/services/test_base_service.py +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/tests/services/test_diff_service.py +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/tests/services/test_exceptions.py +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/tests/services/test_file_watcher.py +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/tests/services/test_git_service.py +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/tests/services/test_syntax_service.py +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/tests/test_app.py +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/tests/test_auto_reload_routes.py +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/tests/test_cli.py +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/tests/test_git_operations.py +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/tests/unit/test_diff_parser_line_count.py +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/tests/unit/test_diff_parser_side_by_side.py +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/tests/unit/test_diff_rendering.py +0 -0
- {difflicious-0.11.0 → difflicious-0.12.0}/tests/unit/test_parser.py +0 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
name: Deploy GitHub Pages
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
paths:
|
|
7
|
+
- "docs/site/**"
|
|
8
|
+
workflow_dispatch:
|
|
9
|
+
|
|
10
|
+
permissions:
|
|
11
|
+
contents: read
|
|
12
|
+
pages: write
|
|
13
|
+
id-token: write
|
|
14
|
+
|
|
15
|
+
concurrency:
|
|
16
|
+
group: "pages"
|
|
17
|
+
cancel-in-progress: false
|
|
18
|
+
|
|
19
|
+
jobs:
|
|
20
|
+
build:
|
|
21
|
+
runs-on: ubuntu-latest
|
|
22
|
+
steps:
|
|
23
|
+
- uses: actions/checkout@v4
|
|
24
|
+
- uses: actions/configure-pages@v5
|
|
25
|
+
- uses: actions/jekyll-build-pages@v1
|
|
26
|
+
with:
|
|
27
|
+
source: ./docs/site
|
|
28
|
+
destination: ./_site
|
|
29
|
+
- uses: actions/upload-pages-artifact@v3
|
|
30
|
+
|
|
31
|
+
deploy:
|
|
32
|
+
environment:
|
|
33
|
+
name: github-pages
|
|
34
|
+
url: ${{ steps.deployment.outputs.page_url }}
|
|
35
|
+
runs-on: ubuntu-latest
|
|
36
|
+
needs: build
|
|
37
|
+
steps:
|
|
38
|
+
- id: deployment
|
|
39
|
+
uses: actions/deploy-pages@v4
|
|
@@ -5,10 +5,23 @@ All notable changes to difflicious will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
-
## [0.
|
|
8
|
+
## [0.12.0] - 2026-04-14
|
|
9
|
+
|
|
10
|
+
### Presentation Layer Separation
|
|
11
|
+
|
|
12
|
+
Enforced explicit contracts between the data, service, template, CSS, and JS layers. Full design rationale in [`docs/presentation-layer-separation.md`](docs/presentation-layer-separation.md).
|
|
9
13
|
|
|
10
14
|
### Changed
|
|
11
|
-
-
|
|
15
|
+
- **Removed dual state** — deleted `state.js` and `file-operations.js`; `diffStore` is now the single source of truth for expansion state
|
|
16
|
+
- **Template→JS contract** — all JS query-hook CSS selectors prefixed `js-` (e.g. `js-hunk`, `js-expansion-btn`) to distinguish them from styled classes
|
|
17
|
+
- **Template→CSS contract** — inline Tailwind colour utilities moved to semantic component classes (`.file-card`, `.file-card-header`, `.file-card-nav-btn`)
|
|
18
|
+
- **ThemeStore init** — reads initial theme from the server-rendered `data-theme` DOM attribute only; no redundant localStorage/matchMedia read on boot
|
|
19
|
+
|
|
20
|
+
### Fixed
|
|
21
|
+
- **Flash of unstyled content** — added the missing `[x-cloak] { display: none !important }` CSS rule; every prior `x-cloak` attribute was inert without it
|
|
22
|
+
- **Flash of expansion state** — server now embeds repo name as `window.DIFFLICIOUS_REPO`; an inline pre-warming script reads localStorage before Alpine boots so the first render reflects saved state
|
|
23
|
+
- **File content animation** — removed vertical scale transform; transition is now a plain opacity fade
|
|
24
|
+
- **Ctrl+C shutdown** — SIGINT now triggers `os._exit(0)` matching the existing SIGTERM handler, so a single keypress exits cleanly regardless of open SSE connections
|
|
12
25
|
|
|
13
26
|
## [1.0.0] - 2026-02-06
|
|
14
27
|
|
|
@@ -535,7 +535,8 @@ The application is designed for multiple distribution channels:
|
|
|
535
535
|
- `README.md` - User-facing documentation and installation instructions
|
|
536
536
|
- `CLAUDE.md` - This file - AI assistant guidance and codebase overview
|
|
537
537
|
- `PLAN.md` - Original project plan and technical decisions
|
|
538
|
-
- `CONTRIBUTING.md` -
|
|
538
|
+
- `CONTRIBUTING.md` - Brief contribution pointer
|
|
539
|
+
- `DEVELOPING.md` - Full development setup, workflow, and conventions
|
|
539
540
|
- `CHANGELOG.md` - Version history and changes
|
|
540
541
|
- `INSTALLATION.md` - Installation and usage guide (PyPI, Docker, configuration)
|
|
541
542
|
|
|
@@ -1,36 +1,20 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Developing Difflicious
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
This document covers development environment setup, workflow, and code conventions.
|
|
4
4
|
|
|
5
5
|
## Table of Contents
|
|
6
6
|
|
|
7
|
-
- [
|
|
8
|
-
- [Development Setup](#development-setup)
|
|
7
|
+
- [Setup](#setup)
|
|
9
8
|
- [Development Workflow](#development-workflow)
|
|
10
9
|
- [Testing](#testing)
|
|
11
10
|
- [Code Style](#code-style)
|
|
12
|
-
- [
|
|
11
|
+
- [Commit Messages](#commit-messages)
|
|
13
12
|
- [Submitting Changes](#submitting-changes)
|
|
14
13
|
- [Releasing New Versions](#releasing-new-versions)
|
|
15
14
|
- [Development Commands](#development-commands)
|
|
16
15
|
- [Project Structure](#project-structure)
|
|
17
|
-
- [Getting Help](#getting-help)
|
|
18
16
|
|
|
19
|
-
##
|
|
20
|
-
|
|
21
|
-
1. **Fork the repository** on GitHub
|
|
22
|
-
2. **Clone your fork**:
|
|
23
|
-
```bash
|
|
24
|
-
git clone https://github.com/YOUR_USERNAME/difflicious.git
|
|
25
|
-
cd difflicious
|
|
26
|
-
```
|
|
27
|
-
3. **Add the upstream repository**:
|
|
28
|
-
```bash
|
|
29
|
-
git remote add upstream https://github.com/insipid/difflicious.git
|
|
30
|
-
```
|
|
31
|
-
4. **Create a branch** for your changes
|
|
32
|
-
|
|
33
|
-
## Development Setup
|
|
17
|
+
## Setup
|
|
34
18
|
|
|
35
19
|
### Prerequisites
|
|
36
20
|
|
|
@@ -217,9 +201,7 @@ This ensures:
|
|
|
217
201
|
- All tests pass
|
|
218
202
|
- Code is formatted correctly
|
|
219
203
|
|
|
220
|
-
##
|
|
221
|
-
|
|
222
|
-
### Commit Messages
|
|
204
|
+
## Commit Messages
|
|
223
205
|
|
|
224
206
|
Write clear, descriptive commit messages:
|
|
225
207
|
|
|
@@ -482,15 +464,3 @@ difflicious/
|
|
|
482
464
|
└── README.md # Project overview
|
|
483
465
|
```
|
|
484
466
|
|
|
485
|
-
## Getting Help
|
|
486
|
-
|
|
487
|
-
If you need help:
|
|
488
|
-
- **Check existing issues** on GitHub
|
|
489
|
-
- **Open a new issue** with questions
|
|
490
|
-
- **Ask in discussions** for non-urgent queries
|
|
491
|
-
- **Check the README** for project overview
|
|
492
|
-
- **Read existing code** for examples
|
|
493
|
-
|
|
494
|
-
## Thank You
|
|
495
|
-
|
|
496
|
-
Contributions are what make open source great. Thank you for taking the time to contribute to difflicious!
|
|
@@ -207,9 +207,23 @@ docker-compose up
|
|
|
207
207
|
|
|
208
208
|
### Font Customization
|
|
209
209
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
210
|
+
Set the `DIFFLICIOUS_FONT` environment variable to choose a programming font:
|
|
211
|
+
|
|
212
|
+
| Key | Font |
|
|
213
|
+
|-----|------|
|
|
214
|
+
| `jetbrains-mono` | JetBrains Mono (default) |
|
|
215
|
+
| `fira-code` | Fira Code |
|
|
216
|
+
| `source-code-pro` | Source Code Pro |
|
|
217
|
+
| `ibm-plex-mono` | IBM Plex Mono |
|
|
218
|
+
| `roboto-mono` | Roboto Mono |
|
|
219
|
+
| `inconsolata` | Inconsolata |
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
DIFFLICIOUS_FONT=fira-code difflicious
|
|
223
|
+
|
|
224
|
+
# List all available fonts
|
|
225
|
+
difflicious --list-fonts
|
|
226
|
+
```
|
|
213
227
|
|
|
214
228
|
### Disable Google Fonts
|
|
215
229
|
|
|
@@ -277,7 +291,6 @@ For more troubleshooting help, see [TROUBLESHOOTING.md](TROUBLESHOOTING.md).
|
|
|
277
291
|
|
|
278
292
|
## Next Steps
|
|
279
293
|
|
|
280
|
-
- Learn how to [contribute](CONTRIBUTING.md) to difflicious
|
|
281
294
|
- Check [troubleshooting](TROUBLESHOOTING.md) for common issues
|
|
282
295
|
- Read the main [README](../README.md) for features
|
|
283
|
-
- Explore
|
|
296
|
+
- Explore [DEVELOPING.md](../DEVELOPING.md) for development setup and workflow
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: difflicious
|
|
3
|
+
Version: 0.12.0
|
|
4
|
+
Summary: A sleek web-based git diff visualization tool for developers
|
|
5
|
+
Project-URL: Homepage, https://github.com/insipid/difflicious
|
|
6
|
+
Project-URL: Repository, https://github.com/insipid/difflicious
|
|
7
|
+
Project-URL: Issues, https://github.com/insipid/difflicious/issues
|
|
8
|
+
Project-URL: Documentation, https://github.com/insipid/difflicious#readme
|
|
9
|
+
Project-URL: Changelog, https://github.com/insipid/difflicious/blob/main/CHANGELOG.md
|
|
10
|
+
Author: Drew
|
|
11
|
+
License: MIT
|
|
12
|
+
License-File: LICENSE
|
|
13
|
+
Keywords: development,diff,git,visualization,web
|
|
14
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
15
|
+
Classifier: Environment :: Web Environment
|
|
16
|
+
Classifier: Framework :: Flask
|
|
17
|
+
Classifier: Intended Audience :: Developers
|
|
18
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
19
|
+
Classifier: Programming Language :: Python :: 3
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
24
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
25
|
+
Classifier: Topic :: Software Development :: Version Control :: Git
|
|
26
|
+
Classifier: Topic :: Text Processing :: General
|
|
27
|
+
Requires-Python: >=3.9
|
|
28
|
+
Requires-Dist: click<9.0,>=8.0.0
|
|
29
|
+
Requires-Dist: flask<3.0,>=2.3.0
|
|
30
|
+
Requires-Dist: gitpython<4.0,>=3.1.40
|
|
31
|
+
Requires-Dist: jinja-partials<1.0,>=0.2.0
|
|
32
|
+
Requires-Dist: markupsafe<3.0,>=2.1.0
|
|
33
|
+
Requires-Dist: pygments<3.0,>=2.17.0
|
|
34
|
+
Requires-Dist: unidiff<1.0,>=0.7.5
|
|
35
|
+
Requires-Dist: waitress>=3.0.0
|
|
36
|
+
Requires-Dist: watchdog<4.0,>=3.0.0
|
|
37
|
+
Description-Content-Type: text/markdown
|
|
38
|
+
|
|
39
|
+
# Difflicious
|
|
40
|
+
|
|
41
|
+
[](https://pypi.org/project/difflicious/)
|
|
42
|
+
[](https://pypi.org/project/difflicious/)
|
|
43
|
+
[](https://opensource.org/licenses/MIT)
|
|
44
|
+
|
|
45
|
+
A local web application for reviewing git diffs. Run it in your working directory and view your changes in a browser with side-by-side visualization, syntax highlighting, and context expansion.
|
|
46
|
+
|
|
47
|
+
## Screenshots
|
|
48
|
+
|
|
49
|
+
| Light mode | Dark mode |
|
|
50
|
+
|------------|-----------|
|
|
51
|
+
|  |  |
|
|
52
|
+
|
|
53
|
+
> To regenerate: `uv run python scripts/screenshot.py`
|
|
54
|
+
> Prerequisites: `uv add --dev playwright && uv run playwright install chromium`
|
|
55
|
+
|
|
56
|
+
## Installation
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
pip install difflicious
|
|
60
|
+
difflicious
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Open `http://localhost:5000` in your browser.
|
|
64
|
+
|
|
65
|
+
See [INSTALLATION.md](INSTALLATION.md) for Docker, source installation, and full configuration options.
|
|
66
|
+
|
|
67
|
+
## Features
|
|
68
|
+
|
|
69
|
+
- Side-by-side diff view with line numbering
|
|
70
|
+
- Syntax highlighting for 100+ languages (via Pygments)
|
|
71
|
+
- Context expansion to see more surrounding code
|
|
72
|
+
- Search and filter across files
|
|
73
|
+
- Light and dark themes
|
|
74
|
+
- Live auto-reload on file changes (SSE)
|
|
75
|
+
- Font customization via `DIFFLICIOUS_FONT` environment variable
|
|
76
|
+
|
|
77
|
+
## Configuration
|
|
78
|
+
|
|
79
|
+
Set environment variables to configure behavior:
|
|
80
|
+
|
|
81
|
+
| Variable | Default | Description |
|
|
82
|
+
|----------|---------|-------------|
|
|
83
|
+
| `DIFFLICIOUS_PORT` | `5000` | Port to listen on |
|
|
84
|
+
| `DIFFLICIOUS_HOST` | `127.0.0.1` | Host to bind to |
|
|
85
|
+
| `DIFFLICIOUS_FONT` | `jetbrains-mono` | Code font (see `--list-fonts`) |
|
|
86
|
+
| `DIFFLICIOUS_DISABLE_GOOGLE_FONTS` | `false` | Use system fonts only |
|
|
87
|
+
| `DIFFLICIOUS_AUTO_RELOAD` | `true` | Auto-reload on file changes |
|
|
88
|
+
| `DIFFLICIOUS_DEBUG` | `false` | Verbose debug logging |
|
|
89
|
+
|
|
90
|
+
See [INSTALLATION.md](INSTALLATION.md) for full configuration details.
|
|
91
|
+
|
|
92
|
+
## Technology
|
|
93
|
+
|
|
94
|
+
- **Backend**: Flask, GitPython, Pygments, unidiff
|
|
95
|
+
- **Frontend**: Alpine.js, Tailwind CSS
|
|
96
|
+
- **Real-time**: Server-Sent Events
|
|
97
|
+
|
|
98
|
+
## Documentation
|
|
99
|
+
|
|
100
|
+
- [INSTALLATION.md](INSTALLATION.md) — installation options, configuration, environment variables
|
|
101
|
+
- [DEVELOPING.md](DEVELOPING.md) — development setup, testing, code conventions
|
|
102
|
+
- [CHANGELOG.md](CHANGELOG.md) — version history
|
|
103
|
+
- [docs/CSS-STYLE-GUIDE.md](docs/CSS-STYLE-GUIDE.md) — CSS conventions and design tokens
|
|
104
|
+
- [docs/TROUBLESHOOTING.md](docs/TROUBLESHOOTING.md) — common issues
|
|
105
|
+
|
|
106
|
+
## Contributing
|
|
107
|
+
|
|
108
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md).
|
|
109
|
+
|
|
110
|
+
## License
|
|
111
|
+
|
|
112
|
+
MIT License — see [LICENSE](LICENSE) file for details.
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Difflicious
|
|
2
|
+
|
|
3
|
+
[](https://pypi.org/project/difflicious/)
|
|
4
|
+
[](https://pypi.org/project/difflicious/)
|
|
5
|
+
[](https://opensource.org/licenses/MIT)
|
|
6
|
+
|
|
7
|
+
A local web application for reviewing git diffs. Run it in your working directory and view your changes in a browser with side-by-side visualization, syntax highlighting, and context expansion.
|
|
8
|
+
|
|
9
|
+
## Screenshots
|
|
10
|
+
|
|
11
|
+
| Light mode | Dark mode |
|
|
12
|
+
|------------|-----------|
|
|
13
|
+
|  |  |
|
|
14
|
+
|
|
15
|
+
> To regenerate: `uv run python scripts/screenshot.py`
|
|
16
|
+
> Prerequisites: `uv add --dev playwright && uv run playwright install chromium`
|
|
17
|
+
|
|
18
|
+
## Installation
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
pip install difflicious
|
|
22
|
+
difflicious
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Open `http://localhost:5000` in your browser.
|
|
26
|
+
|
|
27
|
+
See [INSTALLATION.md](INSTALLATION.md) for Docker, source installation, and full configuration options.
|
|
28
|
+
|
|
29
|
+
## Features
|
|
30
|
+
|
|
31
|
+
- Side-by-side diff view with line numbering
|
|
32
|
+
- Syntax highlighting for 100+ languages (via Pygments)
|
|
33
|
+
- Context expansion to see more surrounding code
|
|
34
|
+
- Search and filter across files
|
|
35
|
+
- Light and dark themes
|
|
36
|
+
- Live auto-reload on file changes (SSE)
|
|
37
|
+
- Font customization via `DIFFLICIOUS_FONT` environment variable
|
|
38
|
+
|
|
39
|
+
## Configuration
|
|
40
|
+
|
|
41
|
+
Set environment variables to configure behavior:
|
|
42
|
+
|
|
43
|
+
| Variable | Default | Description |
|
|
44
|
+
|----------|---------|-------------|
|
|
45
|
+
| `DIFFLICIOUS_PORT` | `5000` | Port to listen on |
|
|
46
|
+
| `DIFFLICIOUS_HOST` | `127.0.0.1` | Host to bind to |
|
|
47
|
+
| `DIFFLICIOUS_FONT` | `jetbrains-mono` | Code font (see `--list-fonts`) |
|
|
48
|
+
| `DIFFLICIOUS_DISABLE_GOOGLE_FONTS` | `false` | Use system fonts only |
|
|
49
|
+
| `DIFFLICIOUS_AUTO_RELOAD` | `true` | Auto-reload on file changes |
|
|
50
|
+
| `DIFFLICIOUS_DEBUG` | `false` | Verbose debug logging |
|
|
51
|
+
|
|
52
|
+
See [INSTALLATION.md](INSTALLATION.md) for full configuration details.
|
|
53
|
+
|
|
54
|
+
## Technology
|
|
55
|
+
|
|
56
|
+
- **Backend**: Flask, GitPython, Pygments, unidiff
|
|
57
|
+
- **Frontend**: Alpine.js, Tailwind CSS
|
|
58
|
+
- **Real-time**: Server-Sent Events
|
|
59
|
+
|
|
60
|
+
## Documentation
|
|
61
|
+
|
|
62
|
+
- [INSTALLATION.md](INSTALLATION.md) — installation options, configuration, environment variables
|
|
63
|
+
- [DEVELOPING.md](DEVELOPING.md) — development setup, testing, code conventions
|
|
64
|
+
- [CHANGELOG.md](CHANGELOG.md) — version history
|
|
65
|
+
- [docs/CSS-STYLE-GUIDE.md](docs/CSS-STYLE-GUIDE.md) — CSS conventions and design tokens
|
|
66
|
+
- [docs/TROUBLESHOOTING.md](docs/TROUBLESHOOTING.md) — common issues
|
|
67
|
+
|
|
68
|
+
## Contributing
|
|
69
|
+
|
|
70
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md).
|
|
71
|
+
|
|
72
|
+
## License
|
|
73
|
+
|
|
74
|
+
MIT License — see [LICENSE](LICENSE) file for details.
|