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.
Files changed (208) hide show
  1. {docsweep-0.1.0 → docsweep-0.2.0}/CHANGELOG.md +37 -0
  2. {docsweep-0.1.0 → docsweep-0.2.0}/NOTICES.md +9 -0
  3. {docsweep-0.1.0 → docsweep-0.2.0}/PKG-INFO +5 -2
  4. docsweep-0.2.0/README.en.md +458 -0
  5. {docsweep-0.1.0 → docsweep-0.2.0}/README.md +4 -1
  6. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/__init__.py +1 -1
  7. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/cli.py +7 -4
  8. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/inject.py +179 -54
  9. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/mcp_server.py +7 -5
  10. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/app.py +60 -0
  11. docsweep-0.2.0/docsweep/server/config_write.py +61 -0
  12. docsweep-0.2.0/docsweep/server/i18n.py +300 -0
  13. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/routes/board.py +59 -18
  14. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/routes/brief.py +5 -0
  15. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/routes/capture.py +5 -1
  16. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/routes/cross.py +5 -1
  17. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/routes/graph.py +6 -1
  18. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/routes/resurrect.py +5 -1
  19. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/static/board.css +45 -0
  20. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/static/dnd.js +1 -1
  21. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/static/edit.js +9 -15
  22. docsweep-0.2.0/docsweep/server/static/i18n.js +171 -0
  23. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/static/keymap.js +98 -65
  24. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/templates/_board_body.html +17 -16
  25. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/templates/_card.html +8 -8
  26. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/templates/_change_picker.html +17 -16
  27. docsweep-0.2.0/docsweep/server/templates/_due_picker.html +13 -0
  28. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/templates/_edit_pane.html +13 -13
  29. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/templates/_label_picker.html +8 -7
  30. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/templates/_preview.html +2 -2
  31. docsweep-0.2.0/docsweep/server/templates/_settings.html +138 -0
  32. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/templates/board.html +32 -31
  33. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/templates/brief.html +11 -9
  34. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/templates/capture.html +18 -11
  35. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/templates/cross.html +6 -6
  36. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/templates/graph.html +2 -2
  37. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/templates/resurrect.html +5 -5
  38. {docsweep-0.1.0 → docsweep-0.2.0}/pyproject.toml +1 -1
  39. {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_extras.py +65 -0
  40. {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_server.py +167 -0
  41. docsweep-0.1.0/docsweep/server/templates/_due_picker.html +0 -13
  42. docsweep-0.1.0/docsweep/server/templates/_settings.html +0 -68
  43. {docsweep-0.1.0 → docsweep-0.2.0}/.docsweep.yaml +0 -0
  44. {docsweep-0.1.0 → docsweep-0.2.0}/.github/workflows/publish.yml +0 -0
  45. {docsweep-0.1.0 → docsweep-0.2.0}/.gitignore +0 -0
  46. {docsweep-0.1.0 → docsweep-0.2.0}/AGENTS.md +0 -0
  47. {docsweep-0.1.0 → docsweep-0.2.0}/CLAUDE.md +0 -0
  48. {docsweep-0.1.0 → docsweep-0.2.0}/LICENSE +0 -0
  49. {docsweep-0.1.0 → docsweep-0.2.0}/archive/plan_drop-last-updated-followup.md +0 -0
  50. {docsweep-0.1.0 → docsweep-0.2.0}/archive/plan_name-docsweep-availability.md +0 -0
  51. {docsweep-0.1.0 → docsweep-0.2.0}/archive/plan_templates-drop-last-updated-line.md +0 -0
  52. {docsweep-0.1.0 → docsweep-0.2.0}/assets/icon-a-broom.svg +0 -0
  53. {docsweep-0.1.0 → docsweep-0.2.0}/assets/icon-b-doc-check.svg +0 -0
  54. {docsweep-0.1.0 → docsweep-0.2.0}/assets/icon-c-sweep-sparkle.svg +0 -0
  55. {docsweep-0.1.0 → docsweep-0.2.0}/assets/icon.svg +0 -0
  56. {docsweep-0.1.0 → docsweep-0.2.0}/assets/icons/apple-touch-icon.png +0 -0
  57. {docsweep-0.1.0 → docsweep-0.2.0}/assets/icons/favicon-16.png +0 -0
  58. {docsweep-0.1.0 → docsweep-0.2.0}/assets/icons/favicon-32.png +0 -0
  59. {docsweep-0.1.0 → docsweep-0.2.0}/assets/icons/favicon-48.png +0 -0
  60. {docsweep-0.1.0 → docsweep-0.2.0}/assets/icons/favicon.ico +0 -0
  61. {docsweep-0.1.0 → docsweep-0.2.0}/assets/icons/favicon.svg +0 -0
  62. {docsweep-0.1.0 → docsweep-0.2.0}/assets/icons/icon-192.png +0 -0
  63. {docsweep-0.1.0 → docsweep-0.2.0}/assets/icons/icon-512.png +0 -0
  64. {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/a-broom/apple-touch-icon.png +0 -0
  65. {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/a-broom/favicon-16.png +0 -0
  66. {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/a-broom/favicon-32.png +0 -0
  67. {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/a-broom/favicon-48.png +0 -0
  68. {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/a-broom/favicon.ico +0 -0
  69. {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/a-broom/favicon.svg +0 -0
  70. {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/a-broom/icon-192.png +0 -0
  71. {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/a-broom/icon-512.png +0 -0
  72. {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/b-doc-check/apple-touch-icon.png +0 -0
  73. {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/b-doc-check/favicon-16.png +0 -0
  74. {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/b-doc-check/favicon-32.png +0 -0
  75. {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/b-doc-check/favicon-48.png +0 -0
  76. {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/b-doc-check/favicon.ico +0 -0
  77. {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/b-doc-check/favicon.svg +0 -0
  78. {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/b-doc-check/icon-192.png +0 -0
  79. {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/b-doc-check/icon-512.png +0 -0
  80. {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/c-sweep-sparkle/apple-touch-icon.png +0 -0
  81. {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/c-sweep-sparkle/favicon-16.png +0 -0
  82. {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/c-sweep-sparkle/favicon-32.png +0 -0
  83. {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/c-sweep-sparkle/favicon-48.png +0 -0
  84. {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/c-sweep-sparkle/favicon.ico +0 -0
  85. {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/c-sweep-sparkle/favicon.svg +0 -0
  86. {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/c-sweep-sparkle/icon-192.png +0 -0
  87. {docsweep-0.1.0 → docsweep-0.2.0}/assets/proposals/c-sweep-sparkle/icon-512.png +0 -0
  88. {docsweep-0.1.0 → docsweep-0.2.0}/docs/D-skill-update-proposal.md +0 -0
  89. {docsweep-0.1.0 → docsweep-0.2.0}/docs/ai-agent-integration.md +0 -0
  90. {docsweep-0.1.0 → docsweep-0.2.0}/docs/conventions.md +0 -0
  91. {docsweep-0.1.0 → docsweep-0.2.0}/docs/guidance-rewrite-proposal.md +0 -0
  92. {docsweep-0.1.0 → docsweep-0.2.0}/docs/mockups/dashboard_v0.1.0.html +0 -0
  93. {docsweep-0.1.0 → docsweep-0.2.0}/docs/mockups/dashboard_v0.1.0.png +0 -0
  94. {docsweep-0.1.0 → docsweep-0.2.0}/docs/mockups/mcp_usage_v0.1.0.html +0 -0
  95. {docsweep-0.1.0 → docsweep-0.2.0}/docs/okf-export-format.md +0 -0
  96. {docsweep-0.1.0 → docsweep-0.2.0}/docs/okf-mapping.md +0 -0
  97. {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
  98. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/__main__.py +0 -0
  99. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/activity.py +0 -0
  100. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/aggregate_index.py +0 -0
  101. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/archive.py +0 -0
  102. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/atomic.py +0 -0
  103. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/auto_triage.py +0 -0
  104. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/brief/__init__.py +0 -0
  105. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/brief/score.py +0 -0
  106. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/brief/service.py +0 -0
  107. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/capture/__init__.py +0 -0
  108. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/capture/heuristics.py +0 -0
  109. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/capture/llm.py +0 -0
  110. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/capture/models.py +0 -0
  111. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/capture/service.py +0 -0
  112. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/claim.py +0 -0
  113. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/completion.py +0 -0
  114. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/config.py +0 -0
  115. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/context.py +0 -0
  116. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/cross/__init__.py +0 -0
  117. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/cross/service.py +0 -0
  118. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/detect.py +0 -0
  119. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/engine.py +0 -0
  120. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/export.py +0 -0
  121. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/find.py +0 -0
  122. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/graph/__init__.py +0 -0
  123. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/graph/service.py +0 -0
  124. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/index.py +0 -0
  125. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/interactive.py +0 -0
  126. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/linkcheck.py +0 -0
  127. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/migrate.py +0 -0
  128. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/models.py +0 -0
  129. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/presets.py +0 -0
  130. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/related.py +0 -0
  131. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/reports.py +0 -0
  132. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/resurrect/__init__.py +0 -0
  133. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/resurrect/embedding.py +0 -0
  134. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/resurrect/service.py +0 -0
  135. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/resurrect/similarity.py +0 -0
  136. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/review.py +0 -0
  137. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/scan.py +0 -0
  138. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/security/__init__.py +0 -0
  139. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/security/path.py +0 -0
  140. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/__init__.py +0 -0
  141. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/routes/__init__.py +0 -0
  142. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/routes/cards.py +0 -0
  143. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/sanitize.py +0 -0
  144. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/security.py +0 -0
  145. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/static/htmx.min.js +0 -0
  146. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/static/icons/apple-touch-icon.png +0 -0
  147. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/static/icons/favicon.ico +0 -0
  148. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/static/icons/favicon.svg +0 -0
  149. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/static/icons/icon-192.png +0 -0
  150. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/server/static/icons/icon-512.png +0 -0
  151. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/services/__init__.py +0 -0
  152. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/services/archive.py +0 -0
  153. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/services/content.py +0 -0
  154. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/services/due.py +0 -0
  155. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/services/frontmatter.py +0 -0
  156. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/services/status.py +0 -0
  157. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/stale.py +0 -0
  158. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/state.py +0 -0
  159. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/states.py +0 -0
  160. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/templates_gen.py +0 -0
  161. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep/timeline.py +0 -0
  162. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep-ui.cmd +0 -0
  163. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep-ui.command +0 -0
  164. {docsweep-0.1.0 → docsweep-0.2.0}/docsweep-ui.sh +0 -0
  165. {docsweep-0.1.0 → docsweep-0.2.0}/templates/.docsweep.yaml +0 -0
  166. {docsweep-0.1.0 → docsweep-0.2.0}/templates/.githooks/docsweep-check.py +0 -0
  167. {docsweep-0.1.0 → docsweep-0.2.0}/templates/AGENTS.md +0 -0
  168. {docsweep-0.1.0 → docsweep-0.2.0}/templates/AGENT_GUIDE.md +0 -0
  169. {docsweep-0.1.0 → docsweep-0.2.0}/templates/CLAUDE.md +0 -0
  170. {docsweep-0.1.0 → docsweep-0.2.0}/templates/install-hooks.ps1 +0 -0
  171. {docsweep-0.1.0 → docsweep-0.2.0}/templates/install-hooks.sh +0 -0
  172. {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_activity.py +0 -0
  173. {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_atomic.py +0 -0
  174. {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_audit_fixes.py +0 -0
  175. {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_audit_server.py +0 -0
  176. {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_brief.py +0 -0
  177. {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_c2_commands.py +0 -0
  178. {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_c5_features.py +0 -0
  179. {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_capture.py +0 -0
  180. {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_config_due.py +0 -0
  181. {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_cross.py +0 -0
  182. {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_db_index.py +0 -0
  183. {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_detect.py +0 -0
  184. {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_engine.py +0 -0
  185. {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_export.py +0 -0
  186. {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_githooks.py +0 -0
  187. {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_index_prune.py +0 -0
  188. {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_index_stats.py +0 -0
  189. {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_index_vacuum.py +0 -0
  190. {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_index_wal.py +0 -0
  191. {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_interactive.py +0 -0
  192. {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_invariants.py +0 -0
  193. {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_mcp_tools.py +0 -0
  194. {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_mcp_write_tools.py +0 -0
  195. {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_parser.py +0 -0
  196. {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_resurrect.py +0 -0
  197. {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_server_board.py +0 -0
  198. {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_server_bulk.py +0 -0
  199. {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_server_okf.py +0 -0
  200. {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_services_archive.py +0 -0
  201. {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_services_content.py +0 -0
  202. {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_services_due.py +0 -0
  203. {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_services_frontmatter.py +0 -0
  204. {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_services_status.py +0 -0
  205. {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_state.py +0 -0
  206. {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_templates_gen.py +0 -0
  207. {docsweep-0.1.0 → docsweep-0.2.0}/tests/test_triage_schema.py +0 -0
  208. {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.1.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 # 注入済み(プロジェクト+グローバル)一覧
@@ -1,3 +1,3 @@
1
1
  """docsweep — AI 作業ドキュメント(plan/bugfix/pending)の横断スキャン・判定・archive 移送ツール。"""
2
2
 
3
- __version__ = "0.1.0"
3
+ __version__ = "0.2.0"
@@ -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(agent=args.agent, target=args.global_target, dry_run=args.dry_run)
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: