docsweep 0.1.0__tar.gz → 0.2.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.
- {docsweep-0.1.0 → docsweep-0.2.0}/CHANGELOG.md +37 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/NOTICES.md +9 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/PKG-INFO +5 -2
- docsweep-0.2.0/README.en.md +458 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/README.md +4 -1
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/__init__.py +1 -1
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/cli.py +7 -4
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/inject.py +179 -54
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/mcp_server.py +7 -5
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/app.py +60 -0
- docsweep-0.2.0/docsweep/server/config_write.py +61 -0
- docsweep-0.2.0/docsweep/server/i18n.py +300 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/routes/board.py +59 -18
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/routes/brief.py +5 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/routes/capture.py +5 -1
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/routes/cross.py +5 -1
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/routes/graph.py +6 -1
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/routes/resurrect.py +5 -1
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/static/board.css +45 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/static/dnd.js +1 -1
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/static/edit.js +9 -15
- docsweep-0.2.0/docsweep/server/static/i18n.js +171 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/static/keymap.js +98 -65
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/templates/_board_body.html +17 -16
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/templates/_card.html +8 -8
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/templates/_change_picker.html +17 -16
- docsweep-0.2.0/docsweep/server/templates/_due_picker.html +13 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/templates/_edit_pane.html +13 -13
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/templates/_label_picker.html +8 -7
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/templates/_preview.html +2 -2
- docsweep-0.2.0/docsweep/server/templates/_settings.html +138 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/templates/board.html +32 -31
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/templates/brief.html +11 -9
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/templates/capture.html +18 -11
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/templates/cross.html +6 -6
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/templates/graph.html +2 -2
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/templates/resurrect.html +5 -5
- {docsweep-0.1.0 → docsweep-0.2.0}/pyproject.toml +1 -1
- {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_extras.py +65 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_server.py +167 -0
- docsweep-0.1.0/docsweep/server/templates/_due_picker.html +0 -13
- docsweep-0.1.0/docsweep/server/templates/_settings.html +0 -68
- {docsweep-0.1.0 → docsweep-0.2.0}/.docsweep.yaml +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/.github/workflows/publish.yml +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/.gitignore +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/AGENTS.md +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/CLAUDE.md +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/LICENSE +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/archive/plan_drop-last-updated-followup.md +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/archive/plan_name-docsweep-availability.md +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/archive/plan_templates-drop-last-updated-line.md +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/assets/icon-a-broom.svg +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/assets/icon-b-doc-check.svg +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/assets/icon-c-sweep-sparkle.svg +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/assets/icon.svg +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/assets/icons/apple-touch-icon.png +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/assets/icons/favicon-16.png +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/assets/icons/favicon-32.png +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/assets/icons/favicon-48.png +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/assets/icons/favicon.ico +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/assets/icons/favicon.svg +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/assets/icons/icon-192.png +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/assets/icons/icon-512.png +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/a-broom/apple-touch-icon.png +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/a-broom/favicon-16.png +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/a-broom/favicon-32.png +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/a-broom/favicon-48.png +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/a-broom/favicon.ico +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/a-broom/favicon.svg +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/a-broom/icon-192.png +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/a-broom/icon-512.png +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/b-doc-check/apple-touch-icon.png +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/b-doc-check/favicon-16.png +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/b-doc-check/favicon-32.png +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/b-doc-check/favicon-48.png +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/b-doc-check/favicon.ico +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/b-doc-check/favicon.svg +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/b-doc-check/icon-192.png +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/b-doc-check/icon-512.png +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/c-sweep-sparkle/apple-touch-icon.png +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/c-sweep-sparkle/favicon-16.png +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/c-sweep-sparkle/favicon-32.png +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/c-sweep-sparkle/favicon-48.png +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/c-sweep-sparkle/favicon.ico +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/c-sweep-sparkle/favicon.svg +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/c-sweep-sparkle/icon-192.png +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/c-sweep-sparkle/icon-512.png +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docs/D-skill-update-proposal.md +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docs/ai-agent-integration.md +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docs/conventions.md +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docs/guidance-rewrite-proposal.md +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docs/mockups/dashboard_v0.1.0.html +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docs/mockups/dashboard_v0.1.0.png +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docs/mockups/mcp_usage_v0.1.0.html +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docs/okf-export-format.md +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docs/okf-mapping.md +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docs/zenn/docsweep/2026-06-22_slash-commands-p-s-d/20260622-claude-code-slash-commands.md +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/__main__.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/activity.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/aggregate_index.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/archive.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/atomic.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/auto_triage.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/brief/__init__.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/brief/score.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/brief/service.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/capture/__init__.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/capture/heuristics.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/capture/llm.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/capture/models.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/capture/service.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/claim.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/completion.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/config.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/context.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/cross/__init__.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/cross/service.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/detect.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/engine.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/export.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/find.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/graph/__init__.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/graph/service.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/index.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/interactive.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/linkcheck.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/migrate.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/models.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/presets.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/related.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/reports.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/resurrect/__init__.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/resurrect/embedding.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/resurrect/service.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/resurrect/similarity.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/review.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/scan.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/security/__init__.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/security/path.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/__init__.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/routes/__init__.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/routes/cards.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/sanitize.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/security.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/static/htmx.min.js +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/static/icons/apple-touch-icon.png +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/static/icons/favicon.ico +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/static/icons/favicon.svg +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/static/icons/icon-192.png +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/static/icons/icon-512.png +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/services/__init__.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/services/archive.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/services/content.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/services/due.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/services/frontmatter.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/services/status.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/stale.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/state.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/states.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/templates_gen.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/timeline.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep-ui.cmd +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep-ui.command +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/docsweep-ui.sh +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/templates/.docsweep.yaml +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/templates/.githooks/docsweep-check.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/templates/AGENTS.md +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/templates/AGENT_GUIDE.md +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/templates/CLAUDE.md +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/templates/install-hooks.ps1 +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/templates/install-hooks.sh +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_activity.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_atomic.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_audit_fixes.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_audit_server.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_brief.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_c2_commands.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_c5_features.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_capture.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_config_due.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_cross.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_db_index.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_detect.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_engine.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_export.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_githooks.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_index_prune.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_index_stats.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_index_vacuum.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_index_wal.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_interactive.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_invariants.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_mcp_tools.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_mcp_write_tools.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_parser.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_resurrect.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_server_board.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_server_bulk.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_server_okf.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_services_archive.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_services_content.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_services_due.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_services_frontmatter.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_services_status.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_state.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_templates_gen.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_triage_schema.py +0 -0
- {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_undo.py +0 -0
|
@@ -3,6 +3,43 @@
|
|
|
3
3
|
本ファイルは [Keep a Changelog](https://keepachangelog.com/ja/1.1.0/) の考え方を緩く参照しています。
|
|
4
4
|
バージョニングは [SemVer](https://semver.org/lang/ja/) に従います。
|
|
5
5
|
|
|
6
|
+
## [0.2.0] - 2026-07-03
|
|
7
|
+
|
|
8
|
+
### Added
|
|
9
|
+
|
|
10
|
+
- **Web UI の英語対応**(plan_v0.2.0-english-support)。看板・設定モーダル・ピッカー・
|
|
11
|
+
brief / capture / cross / graph / resurrect の全画面文言を ja / en 二言語化
|
|
12
|
+
(サーバー側 `docsweep/server/i18n.py`・JS 側 `static/i18n.js` の二層辞書)。
|
|
13
|
+
言語は設定モーダル(⚙)の「日本語 / English」トグルで切替でき、cookie
|
|
14
|
+
`docsweep_lang` に保存される(`~/.docsweep/config.yaml` の `lang:` は変更しない)。
|
|
15
|
+
解決順は `?lang=` クエリ > cookie > `config.lang` > ja。ピッカーの状態ラベルは
|
|
16
|
+
`.docsweep.yaml` の states 二言語辞書から lang 解決するようになった。
|
|
17
|
+
- **README.en.md**(英語版 README)を追加し、README.md と相互リンク。
|
|
18
|
+
- **About & Licenses 表記**を設定モーダル末尾に追加(アプリ情報・MIT ライセンス表記・
|
|
19
|
+
同梱 OSS: htmx / CDN 参照: cytoscape.js / pip 依存の三層を UI から確認できる。
|
|
20
|
+
正本は NOTICES.md — CDN 節を追記)。
|
|
21
|
+
- **Web UI からのスキャンルート管理**(plan_web-roots-management)。設定モーダルに
|
|
22
|
+
Scan roots セクションを追加し、親ディレクトリ・個別プロジェクトフォルダのどちらも
|
|
23
|
+
追加・削除できる(`POST /api/config/roots`)。runtime に即反映しつつ
|
|
24
|
+
`~/.docsweep/config.yaml` の `roots:` キーだけを surgical に書き換えて永続化する
|
|
25
|
+
(他キー・コメントは温存)。最後の 1 個の root は削除不可。
|
|
26
|
+
|
|
27
|
+
- 注入文言(inject)の英語対応。guidance 導線・due ルール節・ラベル節・AGENTS.md ポインタ・
|
|
28
|
+
管理注記・`.docsweep.yaml` / `~/.docsweep/config.yaml` ひな型コメントを ja / en の二言語化し、
|
|
29
|
+
CLI `inject --lang {ja,en}`(プロジェクト注入では preset の言語を上書き、`--global` の既定は ja)と
|
|
30
|
+
MCP `inject` / `inject_global` の `lang` パラメータを追加。状態ラベルは従来から二言語辞書を
|
|
31
|
+
持っていたため、`lang: en` でラベルも `[Planned]` / `[Done]` 等の英語表記になる。
|
|
32
|
+
|
|
33
|
+
### Changed
|
|
34
|
+
|
|
35
|
+
- トップバーの「看板(カンバン)/ Kanban」サブタイトル表記を撤去(バージョン表示のみ残す)。
|
|
36
|
+
- `inject --global` の guidance に対応期日(`due:`)ルール節を同梱(guidance_version 3)。
|
|
37
|
+
従来 due ルールはプロジェクト inject のラベル節にのみ含まれ、プロジェクト注入していない
|
|
38
|
+
リポジトリでは AI が frontmatter を付けられなかった。due 節をラベル節から導線(guidance)側へ
|
|
39
|
+
移設し、既定=グローバル 1 回で全プロジェクトに効く/グローバルに寄せたくない場合は
|
|
40
|
+
プロジェクト inject(既定)で同内容が入る、の切り分けを既存フラグ(`--global` / `--no-guidance`)
|
|
41
|
+
だけで完結させた。
|
|
42
|
+
|
|
6
43
|
## [0.1.0] - 2026-07-03
|
|
7
44
|
|
|
8
45
|
初回リリース。AI コーディングツール(Claude Code / Codex 等)が生成する
|
|
@@ -30,6 +30,15 @@ Permission to use, copy, modify, and/or distribute this software for any purpose
|
|
|
30
30
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
31
31
|
```
|
|
32
32
|
|
|
33
|
+
## Loaded from CDN (not bundled)
|
|
34
|
+
|
|
35
|
+
### cytoscape.js 3.30.0
|
|
36
|
+
|
|
37
|
+
- 用途: Web UI の graph ページのネットワーク可視化
|
|
38
|
+
- 読込元: `https://unpkg.com/cytoscape@3.30.0/dist/cytoscape.min.js`(実行時に CDN から取得・配布物には含まれない)
|
|
39
|
+
- 出典: https://github.com/cytoscape/cytoscape.js
|
|
40
|
+
- ライセンス: **MIT License**(同梱していないため転載義務はないが、利用の透明性のため記録)
|
|
41
|
+
|
|
33
42
|
## Runtime dependencies (not bundled — pulled by pip)
|
|
34
43
|
|
|
35
44
|
参考。これらは wheel に含まれず、ユーザーの `pip install` 時に PyPI から個別に取得されます。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: docsweep
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.2.0
|
|
4
4
|
Summary: Sweep, triage and archive AI coding agents' plan/bugfix/pending Markdown across projects.
|
|
5
5
|
Project-URL: Homepage, https://github.com/ishizakahiroshi/docsweep
|
|
6
6
|
Project-URL: Repository, https://github.com/ishizakahiroshi/docsweep
|
|
@@ -52,6 +52,8 @@ Description-Content-Type: text/markdown
|
|
|
52
52
|
|
|
53
53
|
# docsweep
|
|
54
54
|
|
|
55
|
+
> English version: [README.en.md](README.en.md)
|
|
56
|
+
|
|
55
57
|
AI コーディングツール(Claude Code / Codex 等)が生成する `plan_*.md` / `bugfix_*.md` /
|
|
56
58
|
`pending_*.md` の **蓄積・陳腐化問題を解決する** クロスプラットフォーム CLI + Web UI ツール。
|
|
57
59
|
|
|
@@ -326,9 +328,10 @@ python -m docsweep inject --project ./foo --preset claude-jp
|
|
|
326
328
|
python -m docsweep inject --project ./foo --no-guidance # 導線を省きラベル節だけ(導線をグローバルに寄せる場合)
|
|
327
329
|
python -m docsweep eject --project ./foo # 管理ブロックだけ剥がす(手書きは温存。--purge で .docsweep.yaml も)
|
|
328
330
|
|
|
329
|
-
# 個人グローバルへ「セッション開始時に triage
|
|
331
|
+
# 個人グローバルへ「セッション開始時に triage を読む」導線+due ルールを一度だけ注入(全プロジェクトで有効)
|
|
330
332
|
python -m docsweep inject --global # 既定 agent=claude(~/.claude/CLAUDE.md に @import 1 行)
|
|
331
333
|
python -m docsweep inject --global --agent codex # ~/.codex/AGENTS.md にインライン(CODEX_HOME 尊重)
|
|
334
|
+
python -m docsweep inject --global --lang en # 注入文言を英語で生成(プロジェクト注入でも --lang 可)
|
|
332
335
|
python -m docsweep eject --global
|
|
333
336
|
|
|
334
337
|
python -m docsweep list # 注入済み(プロジェクト+グローバル)一覧
|
|
@@ -0,0 +1,458 @@
|
|
|
1
|
+
# docsweep
|
|
2
|
+
|
|
3
|
+
> 日本語版: [README.md](README.md)
|
|
4
|
+
|
|
5
|
+
A cross-platform CLI + Web UI tool that **solves the accumulation and staleness problem** of
|
|
6
|
+
`plan_*.md` / `bugfix_*.md` / `pending_*.md` files generated by AI coding tools
|
|
7
|
+
(Claude Code / Codex, etc.).
|
|
8
|
+
|
|
9
|
+
It mechanically reads H1 status labels (`[Done]` / `[Planned]` / `[Discarded]`, etc. — Japanese
|
|
10
|
+
labels such as `[完了]` / `[計画]` / `[廃止]` are supported out of the box), automatically moves
|
|
11
|
+
completed docs into each project's `archive/`, surfaces stale ones with a "needs decision" flag,
|
|
12
|
+
and gives you a cross-project INDEX at a glance.
|
|
13
|
+
|
|
14
|
+
## OKF (Open Knowledge Format) compatibility
|
|
15
|
+
|
|
16
|
+
docsweep adopts the **machine-readable type / status / related frontmatter** from
|
|
17
|
+
[OKF (Open Knowledge Format)](https://zenn.dev/knowledgesense/articles/14a874a9f423bb).
|
|
18
|
+
The YAML frontmatter at the top of each md file makes `type` / `status` / `tags` / `owner` /
|
|
19
|
+
`review_status` / `related` / `last_reviewed` machine-readable, so the files stay meaningful
|
|
20
|
+
even when read by tools that don't have docsweep installed.
|
|
21
|
+
|
|
22
|
+
docsweep adds only two conventions of its own:
|
|
23
|
+
|
|
24
|
+
- **The type set is fixed to `plan` / `bugfix` / `pending`** (slightly stricter than OKF).
|
|
25
|
+
This constraint enables archive automation; arbitrary type values are treated as unmanaged.
|
|
26
|
+
- **H1 status labels are kept alongside, not deprecated**. They preserve the human-facing value
|
|
27
|
+
of seeing the state the moment you open the file, and files without frontmatter fall back to
|
|
28
|
+
the H1 label (100% backward compatible).
|
|
29
|
+
|
|
30
|
+
See [docs/okf-mapping.md](docs/okf-mapping.md) for the full mapping table.
|
|
31
|
+
`docsweep export --okf` demonstrates that "your md files won't rot even if you leave docsweep"
|
|
32
|
+
([docs/okf-export-format.md](docs/okf-export-format.md)).
|
|
33
|
+
|
|
34
|
+
## Installation
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
pip install docsweep # Core + CLI (the main "wings" commands and the SQLite index included)
|
|
38
|
+
pip install 'docsweep[all]' # Also includes Web UI / interactive review / MCP / watch / resurrect
|
|
39
|
+
pip install 'docsweep[watch]' # Adds index-watch only (watchdog)
|
|
40
|
+
pip install 'docsweep[resurrect]' # Embedding path for resurrect (sentence-transformers)
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
docsweep is designed to work **without putting a `docsweep` command on PATH**.
|
|
44
|
+
The CLI / Web UI / MCP can all be launched as a module from the Python executable.
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
python -m docsweep triage
|
|
48
|
+
python -m docsweep mcp
|
|
49
|
+
python -m docsweep serve --root ~/dev
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
When registering with an MCP client, we recommend `python -m docsweep mcp` rather than
|
|
53
|
+
`docsweep mcp`. For maximum reproducibility, use the absolute path of the Python executable
|
|
54
|
+
as `command`.
|
|
55
|
+
|
|
56
|
+
```json
|
|
57
|
+
{
|
|
58
|
+
"mcpServers": {
|
|
59
|
+
"docsweep": {
|
|
60
|
+
"command": "C:\\Users\\you\\AppData\\Local\\Programs\\Python\\Python312\\python.exe",
|
|
61
|
+
"args": ["-m", "docsweep", "mcp"]
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
> Replace `Python312` above with **the Python version actually installed on your machine**.
|
|
68
|
+
> To check: `where python` on Windows, `which python3` on macOS / Linux.
|
|
69
|
+
> Or get the full path with `python -c "import sys; print(sys.executable)"`.
|
|
70
|
+
|
|
71
|
+
`docsweep ...` is a shorthand for environments where Python's Scripts/bin directory is on PATH.
|
|
72
|
+
|
|
73
|
+
## Where it goes after install, and how to use it (per OS)
|
|
74
|
+
|
|
75
|
+
`pip install docsweep` **places the library in Python's site-packages**.
|
|
76
|
+
No separate binary is produced; launching with `python -m docsweep ...` is the standard path.
|
|
77
|
+
|
|
78
|
+
### Common behavior
|
|
79
|
+
|
|
80
|
+
- **The `docsweep/` package itself**: installed into the site-packages resolved by the running Python
|
|
81
|
+
- **Config and state**: `~/.docsweep/` (the same logical path on every OS)
|
|
82
|
+
- **MCP setup**: register a single `python -m docsweep mcp` line in your AI client's config (Claude Code, etc.)
|
|
83
|
+
- **No PATH setup required**: every feature is reachable via `python -m docsweep ...` without putting `docsweep` on PATH
|
|
84
|
+
|
|
85
|
+
### Windows
|
|
86
|
+
|
|
87
|
+
| Item | Location |
|
|
88
|
+
|---|---|
|
|
89
|
+
| Python itself (standard per-user install) | `C:\Users\<you>\AppData\Local\Programs\Python\Python3XX\python.exe` |
|
|
90
|
+
| docsweep package (after pip install) | `C:\Users\<you>\AppData\Local\Programs\Python\Python3XX\Lib\site-packages\docsweep\` |
|
|
91
|
+
| docsweep config and state | `C:\Users\<you>\.docsweep\` (= `%USERPROFILE%\.docsweep\` = `~/.docsweep`) |
|
|
92
|
+
| `docsweep` launcher | `...\Python3XX\Scripts\docsweep.exe` (runs as plain `docsweep` if Scripts is on PATH) |
|
|
93
|
+
|
|
94
|
+
> **Avoid the Microsoft Store version of Python**. With the Store build behind
|
|
95
|
+
> `%LOCALAPPDATA%\Microsoft\WindowsApps\python.exe`, virtual-store placement restrictions can
|
|
96
|
+
> **block writes to the `Scripts/` directory** — `pip install` itself may succeed, yet the
|
|
97
|
+
> `docsweep.exe` launcher ends up missing or off PATH. The python.org installer (per-user)
|
|
98
|
+
> or pyenv-win is the safe choice.
|
|
99
|
+
|
|
100
|
+
```powershell
|
|
101
|
+
# Install
|
|
102
|
+
pip install 'docsweep[all]'
|
|
103
|
+
|
|
104
|
+
# Launch (always works regardless of PATH)
|
|
105
|
+
python -m docsweep triage
|
|
106
|
+
python -m docsweep serve --root C:\dev
|
|
107
|
+
python -m docsweep mcp
|
|
108
|
+
|
|
109
|
+
# MCP registration example (~\.claude\mcp.json) — an absolute path stays stable across Python switches
|
|
110
|
+
# {
|
|
111
|
+
# "mcpServers": {
|
|
112
|
+
# "docsweep": {
|
|
113
|
+
# "command": "C:\\Users\\you\\AppData\\Local\\Programs\\Python\\Python312\\python.exe",
|
|
114
|
+
# "args": ["-m", "docsweep", "mcp"]
|
|
115
|
+
# }
|
|
116
|
+
# }
|
|
117
|
+
# }
|
|
118
|
+
# Replace Python312 with your actual version. Check: `where python` or `python -c "import sys; print(sys.executable)"`
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### macOS
|
|
122
|
+
|
|
123
|
+
| Item | Location |
|
|
124
|
+
|---|---|
|
|
125
|
+
| Python itself (Homebrew example) | `/opt/homebrew/bin/python3` (Apple Silicon) / `/usr/local/bin/python3` (Intel) |
|
|
126
|
+
| docsweep package | `/opt/homebrew/lib/python3.XX/site-packages/docsweep/` etc. (check with `python3 -m site`) |
|
|
127
|
+
| docsweep config and state | `~/.docsweep/` (= `/Users/<you>/.docsweep/`) |
|
|
128
|
+
| `docsweep` launcher | `/opt/homebrew/bin/docsweep` etc. (often already on PATH) |
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
# Install (if PEP 668 protects the system Python, choose --user or a venv)
|
|
132
|
+
pip3 install 'docsweep[all]'
|
|
133
|
+
|
|
134
|
+
# Launch
|
|
135
|
+
python3 -m docsweep triage
|
|
136
|
+
python3 -m docsweep serve --root ~/dev
|
|
137
|
+
python3 -m docsweep mcp
|
|
138
|
+
|
|
139
|
+
# MCP registration example (~/.claude/mcp.json)
|
|
140
|
+
# {
|
|
141
|
+
# "mcpServers": {
|
|
142
|
+
# "docsweep": {
|
|
143
|
+
# "command": "/opt/homebrew/bin/python3",
|
|
144
|
+
# "args": ["-m", "docsweep", "mcp"]
|
|
145
|
+
# }
|
|
146
|
+
# }
|
|
147
|
+
# }
|
|
148
|
+
# Find your Python path with `which python3`
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Linux
|
|
152
|
+
|
|
153
|
+
> **PEP 668 note (Ubuntu 23.04+ / Debian 12+ / Fedora 38+, etc.)**: recent distros protect the
|
|
154
|
+
> system Python, so a bare `pip install` is rejected with `error: externally-managed-environment`.
|
|
155
|
+
> The fix is one of **venv**, **`--user`**, or **pipx** (as in the commands below).
|
|
156
|
+
> Forcing it with `--break-system-packages` invites conflicts with OS-managed packages and is
|
|
157
|
+
> not recommended.
|
|
158
|
+
|
|
159
|
+
| Item | Location |
|
|
160
|
+
|---|---|
|
|
161
|
+
| Python itself (distro pkg / pyenv, etc.) | `/usr/bin/python3` / `~/.pyenv/versions/3.XX.X/bin/python` etc. |
|
|
162
|
+
| docsweep package | `/usr/lib/python3.XX/site-packages/docsweep/` or `~/.local/lib/python3.XX/site-packages/docsweep/` (with `--user`) |
|
|
163
|
+
| docsweep config and state | `~/.docsweep/` |
|
|
164
|
+
| `docsweep` launcher | `/usr/local/bin/docsweep` / `~/.local/bin/docsweep` (add `~/.local/bin` to PATH on distros that don't) |
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
# Most distros keep pip away from the system Python. Prefer venv, --user, or pipx
|
|
168
|
+
python3 -m venv ~/.venvs/docsweep && source ~/.venvs/docsweep/bin/activate
|
|
169
|
+
pip install 'docsweep[all]'
|
|
170
|
+
|
|
171
|
+
# Or
|
|
172
|
+
pip install --user 'docsweep[all]'
|
|
173
|
+
|
|
174
|
+
# Launch
|
|
175
|
+
python3 -m docsweep triage
|
|
176
|
+
python3 -m docsweep serve --root ~/dev
|
|
177
|
+
python3 -m docsweep mcp
|
|
178
|
+
|
|
179
|
+
# MCP registration example (~/.claude/mcp.json) — point to the absolute path of the venv Python
|
|
180
|
+
# {
|
|
181
|
+
# "mcpServers": {
|
|
182
|
+
# "docsweep": {
|
|
183
|
+
# "command": "/home/you/.venvs/docsweep/bin/python",
|
|
184
|
+
# "args": ["-m", "docsweep", "mcp"]
|
|
185
|
+
# }
|
|
186
|
+
# }
|
|
187
|
+
# }
|
|
188
|
+
# Find your Python path with `which python3`
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### Choosing an install style
|
|
192
|
+
|
|
193
|
+
| Style | Best for |
|
|
194
|
+
|---|---|
|
|
195
|
+
| **Direct `pip install`** (into your user Python) | Casual use as a personal tool. Fewest steps |
|
|
196
|
+
| **venv isolation** (dedicated env via `python -m venv ...`) | Keeping dependencies out of your user Python. Point MCP config at the venv Python's absolute path |
|
|
197
|
+
| **pipx** (isolated CLI install) | Using only the docsweep CLI. For MCP, point to pipx's internal venv Python by absolute path |
|
|
198
|
+
| **`pip install -e .`** (clone the repo, editable install) | Developing or extending docsweep yourself. Source edits take effect immediately |
|
|
199
|
+
|
|
200
|
+
### Uninstall
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
pip uninstall docsweep
|
|
204
|
+
# To remove config as well
|
|
205
|
+
rm -rf ~/.docsweep # macOS / Linux
|
|
206
|
+
Remove-Item -Recurse ~/.docsweep # Windows PowerShell
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
## Usage
|
|
210
|
+
|
|
211
|
+
> **`brief` is your morning entry point**: even when you remember nothing, `python -m docsweep brief`
|
|
212
|
+
> decisively gives you "today's one item". For cross-project view use `python -m docsweep cross`.
|
|
213
|
+
> Details: [docs/ai-agent-integration.md](docs/ai-agent-integration.md).
|
|
214
|
+
|
|
215
|
+
```bash
|
|
216
|
+
# === Main new commands in wings (v0.2 series) ===
|
|
217
|
+
|
|
218
|
+
# Morning entry point — decide on "just one thing to do today" (cwd project)
|
|
219
|
+
python -m docsweep brief
|
|
220
|
+
python -m docsweep brief --all # Summary across all projects
|
|
221
|
+
python -m docsweep brief --continue # Skip the trailing dialog and copy context straight to the clipboard
|
|
222
|
+
|
|
223
|
+
# Bird's-eye view across all projects — top_pick + freeze candidates + project_summaries
|
|
224
|
+
python -m docsweep cross
|
|
225
|
+
python -m docsweep cross --project alpha,beta
|
|
226
|
+
python -m docsweep cross --explain plan_x.md # Score breakdown
|
|
227
|
+
|
|
228
|
+
# Extract plan/bugfix/pending drafts from conversation history (heuristic / LLM mock)
|
|
229
|
+
python -m docsweep capture --from clipboard
|
|
230
|
+
python -m docsweep capture --from file ./conv.md --save-all
|
|
231
|
+
|
|
232
|
+
# Check consistency between a plan's "files to change" and the actual implementation
|
|
233
|
+
python -m docsweep linkcheck --json
|
|
234
|
+
|
|
235
|
+
# Suggest state transitions (ruleset / future LLM delegation) + bulk apply
|
|
236
|
+
python -m docsweep auto-triage --suggest > decisions.json
|
|
237
|
+
python -m docsweep auto-triage --apply decisions.json --dry-run
|
|
238
|
+
|
|
239
|
+
# Relationship network (graph of plan/bugfix/pending and frontmatter related)
|
|
240
|
+
python -m docsweep graph --json
|
|
241
|
+
|
|
242
|
+
# Extract similar pairs between archive and active docs (embedding opt-in / Jaccard by default)
|
|
243
|
+
python -m docsweep resurrect --threshold 0.5
|
|
244
|
+
|
|
245
|
+
# SQLite index at ~/.docsweep/index.db
|
|
246
|
+
python -m docsweep index-sync # Incremental ingest (fast)
|
|
247
|
+
python -m docsweep index-rebuild # Full rebuild
|
|
248
|
+
python -m docsweep index-watch # Auto-sync via file watching (requires watchdog)
|
|
249
|
+
|
|
250
|
+
# === Existing commands (backward compatible) ===
|
|
251
|
+
|
|
252
|
+
# Scan (by default shows only needs-decision + pending)
|
|
253
|
+
python -m docsweep --root ~/dev
|
|
254
|
+
python -m docsweep ./thisproject # One-off scan, no config needed
|
|
255
|
+
python -m docsweep scan --all --json # Everything as machine-readable JSON
|
|
256
|
+
|
|
257
|
+
# Auto-archive (non-interactive, for cron / CI / AI delegation). Done/discarded only; watching is protected
|
|
258
|
+
python -m docsweep sweep --dry-run
|
|
259
|
+
python -m docsweep sweep
|
|
260
|
+
|
|
261
|
+
# Regenerate the cross-project INDEX (.docsweep/INDEX.md and INDEX.json)
|
|
262
|
+
python -m docsweep index
|
|
263
|
+
python -m docsweep pending # Show only [Pending] items across all projects at once
|
|
264
|
+
python -m docsweep report # Human-facing weekly report
|
|
265
|
+
python -m docsweep summary # Compressed JSON to hand to an AI
|
|
266
|
+
|
|
267
|
+
# Release cleanup (promote watching items to done in bulk and archive them)
|
|
268
|
+
python -m docsweep promote --state watching --to done
|
|
269
|
+
|
|
270
|
+
# Interactive checklist (humans only)
|
|
271
|
+
python -m docsweep review
|
|
272
|
+
|
|
273
|
+
# Instant template generation
|
|
274
|
+
python -m docsweep new plan my-topic
|
|
275
|
+
python -m docsweep new bugfix crash-on-start
|
|
276
|
+
|
|
277
|
+
# Export as an OKF-compatible zip (proof that your md files won't rot if you leave docsweep)
|
|
278
|
+
python -m docsweep export --okf # ./docsweep-okf-<date>.zip
|
|
279
|
+
python -m docsweep export --okf --out /tmp/snapshot.zip # Explicit output path
|
|
280
|
+
python -m docsweep export --okf --include-archive # Include archive/ as well
|
|
281
|
+
|
|
282
|
+
# Inject / remove the operating rules per project (CLAUDE.md = source of truth, AGENTS.md is a pointer to it)
|
|
283
|
+
python -m docsweep inject --project ./foo --preset claude-jp
|
|
284
|
+
python -m docsweep inject --project ./foo --no-guidance # Label section only, no entry-point wiring (when wiring lives in the global config)
|
|
285
|
+
python -m docsweep eject --project ./foo # Strip only the managed block (hand-written parts kept; --purge also removes .docsweep.yaml)
|
|
286
|
+
|
|
287
|
+
# One-time injection into your personal global config: a "read triage at session start" entry point + due rules (effective in all projects)
|
|
288
|
+
python -m docsweep inject --global # Default agent=claude (one @import line in ~/.claude/CLAUDE.md)
|
|
289
|
+
python -m docsweep inject --global --agent codex # Inline into ~/.codex/AGENTS.md (respects CODEX_HOME)
|
|
290
|
+
python -m docsweep inject --global --lang en # Generate the injected text in English (--lang also works for project injection)
|
|
291
|
+
python -m docsweep eject --global
|
|
292
|
+
|
|
293
|
+
python -m docsweep list # List injected targets (projects + global)
|
|
294
|
+
|
|
295
|
+
# Web UI (the UX centerpiece; 127.0.0.1, token-bearing URL). Inject/eject also available from the dashboard (preview required)
|
|
296
|
+
# UI language can be switched from the settings modal (Japanese / English), or via ?lang=en
|
|
297
|
+
python -m docsweep serve --root ~/dev
|
|
298
|
+
|
|
299
|
+
# MCP server (AI agent surface, stdio)
|
|
300
|
+
python -m docsweep mcp
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
## State model (linear, single source of truth)
|
|
304
|
+
|
|
305
|
+
```
|
|
306
|
+
plan: [Pending] → [Planned] → [In Progress] → [Watching] → [Done]
|
|
307
|
+
bugfix: [In Progress] → [Watching] → [Done]
|
|
308
|
+
(either can branch to [Discarded] from any state)
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
The Japanese label set (`[保留]` → `[計画]` → `[実行中]` → `[様子見]` → `[完了]` / `[対応中]` /
|
|
312
|
+
`[廃止]`) is supported by default and follows the same transitions.
|
|
313
|
+
|
|
314
|
+
- **`[Watching]`** = fixed but resting. **Never auto-archived** (protected as the queue awaiting
|
|
315
|
+
regression confirmation).
|
|
316
|
+
- Only **`[Done]` / `[Discarded]`** are archive targets. `[Discarded]` means quarantined into
|
|
317
|
+
`archive/`, not deleted (recoverable).
|
|
318
|
+
- The label vocabulary, archivability, and auto-archive eligibility come from the `states:`
|
|
319
|
+
config — **the single source of truth** — from which detection, the Web display, and the
|
|
320
|
+
injection templates are all derived.
|
|
321
|
+
|
|
322
|
+
## Configuration layers
|
|
323
|
+
|
|
324
|
+
Precedence: **(1) CLI flags > (2) project `.docsweep.yaml` > (3) global `~/.docsweep/config.yaml`**.
|
|
325
|
+
Write only the global config and it feels like a single layer; `.docsweep.yaml` applies partial
|
|
326
|
+
overrides only where present.
|
|
327
|
+
|
|
328
|
+
### Three common patterns (global `~/.docsweep/config.yaml`)
|
|
329
|
+
|
|
330
|
+
Project boundaries are auto-detected from concrete markers like `.git` / `package.json` /
|
|
331
|
+
`pyproject.toml`, so **projects can live at any depth under a root** (no hardcoded folder hierarchy).
|
|
332
|
+
|
|
333
|
+
**A. Manage everything under one parent directory**
|
|
334
|
+
|
|
335
|
+
```yaml
|
|
336
|
+
roots:
|
|
337
|
+
- ~/dev
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
**B. Manage several scattered directories**
|
|
341
|
+
|
|
342
|
+
```yaml
|
|
343
|
+
roots:
|
|
344
|
+
- ~/dev/github/public
|
|
345
|
+
- ~/dev/works/clientA
|
|
346
|
+
- ~/dev/works/clientB
|
|
347
|
+
- /d/sandbox/experiments
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
**C. Switch by purpose (profiles)**
|
|
351
|
+
|
|
352
|
+
```yaml
|
|
353
|
+
roots:
|
|
354
|
+
- ~/dev/github/public # Default scope (no arguments)
|
|
355
|
+
profiles:
|
|
356
|
+
work: # python -m docsweep triage --profile work
|
|
357
|
+
- ~/dev/works/clientA
|
|
358
|
+
- ~/dev/works/clientB
|
|
359
|
+
all: # python -m docsweep triage --profile all
|
|
360
|
+
- ~/dev/github/public
|
|
361
|
+
- ~/dev/works
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
For a **one-off scan** you can also pass positional arguments without writing any config:
|
|
365
|
+
|
|
366
|
+
```bash
|
|
367
|
+
python -m docsweep triage ~/dev/foo ~/projects/bar
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
## AI agent integration
|
|
371
|
+
|
|
372
|
+
> **The wings (v0.2 series) policy**: "works with every AI" comes first. Only the three
|
|
373
|
+
> morning-entry tools where natural-language invocation adds the most value
|
|
374
|
+
> (`brief` / `cross` / `capture_extract`+`capture_save`) are exposed via MCP; everything else
|
|
375
|
+
> supports all AIs through **direct CLI calls**. Details and the natural-language mapping table:
|
|
376
|
+
> [docs/ai-agent-integration.md](docs/ai-agent-integration.md).
|
|
377
|
+
|
|
378
|
+
### Recommended setup: CLI only, no MCP registration
|
|
379
|
+
|
|
380
|
+
Rather than registering the MCP server with each AI tool (Claude Code / Codex / Cursor …),
|
|
381
|
+
the simplest setup is to **let the AI call the CLI directly** (`python -m docsweep ...`).
|
|
382
|
+
|
|
383
|
+
- One install works from every AI tool (MCP registration is a separate file per AI tool)
|
|
384
|
+
- The return values and triage contents are identical to MCP — the AI-facing experience barely differs
|
|
385
|
+
- The only chore is **adding `python -m docsweep` to the AI's allowlist**
|
|
386
|
+
|
|
387
|
+
For Claude Code, add one line to `permissions.allow` in `~/.claude/settings.json`:
|
|
388
|
+
|
|
389
|
+
```json
|
|
390
|
+
{
|
|
391
|
+
"permissions": {
|
|
392
|
+
"allow": [
|
|
393
|
+
"Bash(python -m docsweep:*)"
|
|
394
|
+
]
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
> docsweep **never rewrites this JSON automatically** (it would be a permission-boundary
|
|
400
|
+
> operation). We deliberately leave it as something the user pastes in intentionally. To use MCP
|
|
401
|
+
> instead, use the "MCP registration example" above (also never auto-registered).
|
|
402
|
+
|
|
403
|
+
### What triage returns
|
|
404
|
+
|
|
405
|
+
`python -m docsweep triage` (or the MCP `triage` tool) returns the **remaining work, filtered to
|
|
406
|
+
needs-decision + pending items in oldest-first order**, as `counts` + `items[]` + `needs_fix[]`.
|
|
407
|
+
Each item carries `rel` (relative path), `title` (H1), `state` (label), `type`, `age_days`,
|
|
408
|
+
`summary`, and `actions` (a closed set of `discard`/`keep`/`resume`/`relabel`/`promote`). The
|
|
409
|
+
agent decides "which file to continue and how", then executes mechanically with
|
|
410
|
+
`python -m docsweep apply`. For a bird's-eye view of the whole cross-project INDEX, use
|
|
411
|
+
`python -m docsweep summary`. docsweep itself never calls any AI API (vendor-neutral).
|
|
412
|
+
|
|
413
|
+
To hand this remaining work to the AI automatically at session start, run
|
|
414
|
+
`python -m docsweep inject --global` (a one-time injection into your personal global config of a
|
|
415
|
+
"read triage before working" entry point — via `@import` for Claude, inline for Codex).
|
|
416
|
+
|
|
417
|
+
### Scoping to a single project (`--project`)
|
|
418
|
+
|
|
419
|
+
When you manage multiple roots, natural-language queries from an AI tend to be about
|
|
420
|
+
"just `<this repo>`" rather than "everything". `sweep` / `promote` / `triage` / `scan` /
|
|
421
|
+
`summary` all accept a common `--project <name>` flag to narrow down by project name
|
|
422
|
+
(the boundary folder name).
|
|
423
|
+
|
|
424
|
+
```bash
|
|
425
|
+
# "How many archive candidates does many-ai-cli have?"
|
|
426
|
+
python -m docsweep sweep --dry-run --project many-ai-cli
|
|
427
|
+
|
|
428
|
+
# "Any watching items ready for promotion in the docsweep project?"
|
|
429
|
+
python -m docsweep promote --dry-run --project docsweep
|
|
430
|
+
|
|
431
|
+
# "Any remaining work in many-ai-cli?"
|
|
432
|
+
python -m docsweep triage --project many-ai-cli
|
|
433
|
+
|
|
434
|
+
# "Dump everything in the docsweep project as JSON"
|
|
435
|
+
python -m docsweep scan --all --project docsweep --json
|
|
436
|
+
|
|
437
|
+
# "Compressed JSON overview of the docsweep project"
|
|
438
|
+
python -m docsweep summary --project docsweep
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
> The narrowing **keeps the scan roots fixed and filters afterwards**. Even if a project's
|
|
442
|
+
> `.gitignore` excludes `docs/local/`, the files are still covered as long as they are visible
|
|
443
|
+
> from the global config's `roots:` (this design avoids the trap where a one-off scan of the
|
|
444
|
+
> project via the positional argument `.` returns 0 items because of `.gitignore` exclusion).
|
|
445
|
+
>
|
|
446
|
+
> The `counts` from `triage` / `summary` are also aligned to the per-project scope (they match
|
|
447
|
+
> the filtered `items` count, so humans and AIs see consistent numbers).
|
|
448
|
+
|
|
449
|
+
The same narrowing works over MCP via arguments, e.g. `triage(project="many-ai-cli")` /
|
|
450
|
+
`summary(project="docsweep")` / `sweep(project="many-ai-cli", dry_run=True)`. Argument names
|
|
451
|
+
and behavior are kept fully identical between CLI and MCP.
|
|
452
|
+
|
|
453
|
+
See [docs/conventions.md](docs/conventions.md) and
|
|
454
|
+
[templates/AGENT_GUIDE.md](templates/AGENT_GUIDE.md) for details.
|
|
455
|
+
|
|
456
|
+
## License
|
|
457
|
+
|
|
458
|
+
MIT
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# docsweep
|
|
2
2
|
|
|
3
|
+
> English version: [README.en.md](README.en.md)
|
|
4
|
+
|
|
3
5
|
AI コーディングツール(Claude Code / Codex 等)が生成する `plan_*.md` / `bugfix_*.md` /
|
|
4
6
|
`pending_*.md` の **蓄積・陳腐化問題を解決する** クロスプラットフォーム CLI + Web UI ツール。
|
|
5
7
|
|
|
@@ -274,9 +276,10 @@ python -m docsweep inject --project ./foo --preset claude-jp
|
|
|
274
276
|
python -m docsweep inject --project ./foo --no-guidance # 導線を省きラベル節だけ(導線をグローバルに寄せる場合)
|
|
275
277
|
python -m docsweep eject --project ./foo # 管理ブロックだけ剥がす(手書きは温存。--purge で .docsweep.yaml も)
|
|
276
278
|
|
|
277
|
-
# 個人グローバルへ「セッション開始時に triage
|
|
279
|
+
# 個人グローバルへ「セッション開始時に triage を読む」導線+due ルールを一度だけ注入(全プロジェクトで有効)
|
|
278
280
|
python -m docsweep inject --global # 既定 agent=claude(~/.claude/CLAUDE.md に @import 1 行)
|
|
279
281
|
python -m docsweep inject --global --agent codex # ~/.codex/AGENTS.md にインライン(CODEX_HOME 尊重)
|
|
282
|
+
python -m docsweep inject --global --lang en # 注入文言を英語で生成(プロジェクト注入でも --lang 可)
|
|
280
283
|
python -m docsweep eject --global
|
|
281
284
|
|
|
282
285
|
python -m docsweep list # 注入済み(プロジェクト+グローバル)一覧
|
|
@@ -275,9 +275,10 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
275
275
|
p_inject.add_argument("--project", default=".", help="注入先プロジェクト(既定 .)")
|
|
276
276
|
p_inject.add_argument("--preset", help="プリセット名(claude-jp / frontmatter)")
|
|
277
277
|
p_inject.add_argument("--no-yaml", action="store_true", help=".docsweep.yaml を書かない")
|
|
278
|
-
p_inject.add_argument("--no-guidance", action="store_true", help="
|
|
279
|
-
p_inject.add_argument("--global", dest="is_global", action="store_true", help="
|
|
278
|
+
p_inject.add_argument("--no-guidance", action="store_true", help="導線と due ルールを省きラベル節だけ注入(グローバルに寄せる場合)")
|
|
279
|
+
p_inject.add_argument("--global", dest="is_global", action="store_true", help="個人グローバル設定へ導線+due ルールを注入(全プロジェクトで効く)")
|
|
280
280
|
p_inject.add_argument("--agent", choices=("claude", "codex"), default="claude", help="グローバル注入先の AI ツール(--global 時)")
|
|
281
|
+
p_inject.add_argument("--lang", choices=("ja", "en"), help="注入文言の言語(プロジェクト注入は preset の言語を上書き / --global の既定は ja)")
|
|
281
282
|
p_inject.add_argument("--global-target", dest="global_target", help="グローバル注入先を明示パスで上書き")
|
|
282
283
|
p_inject.add_argument("--dry-run", action="store_true")
|
|
283
284
|
|
|
@@ -1317,7 +1318,9 @@ def cmd_inject(args: argparse.Namespace) -> int:
|
|
|
1317
1318
|
|
|
1318
1319
|
tag = "(dry-run)" if args.dry_run else ""
|
|
1319
1320
|
if getattr(args, "is_global", False):
|
|
1320
|
-
r = inject_global(
|
|
1321
|
+
r = inject_global(
|
|
1322
|
+
agent=args.agent, target=args.global_target, lang=args.lang or "ja", dry_run=args.dry_run,
|
|
1323
|
+
)
|
|
1321
1324
|
print(f"inject {r.project}{tag}: 書込={r.written or '-'} 温存/不変={r.skipped or '-'}")
|
|
1322
1325
|
for w in r.warnings:
|
|
1323
1326
|
print(f" ⚠ {w}")
|
|
@@ -1325,7 +1328,7 @@ def cmd_inject(args: argparse.Namespace) -> int:
|
|
|
1325
1328
|
|
|
1326
1329
|
r = inject(
|
|
1327
1330
|
Path(args.project), preset=args.preset, write_yaml=not args.no_yaml,
|
|
1328
|
-
include_guidance=not args.no_guidance, dry_run=args.dry_run,
|
|
1331
|
+
include_guidance=not args.no_guidance, lang=args.lang, dry_run=args.dry_run,
|
|
1329
1332
|
)
|
|
1330
1333
|
print(f"inject {r.project}{tag}: 書込={r.written or '-'} 温存/不変={r.skipped or '-'}")
|
|
1331
1334
|
if r.yaml_path:
|