docs-drift 0.1.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 (345) hide show
  1. docs_drift-0.1.0/.gitattributes +3 -0
  2. docs_drift-0.1.0/.gitignore +45 -0
  3. docs_drift-0.1.0/.pre-commit-config.yaml +21 -0
  4. docs_drift-0.1.0/CHANGELOG.md +45 -0
  5. docs_drift-0.1.0/CONTRIBUTING.md +48 -0
  6. docs_drift-0.1.0/LICENSE +21 -0
  7. docs_drift-0.1.0/PKG-INFO +331 -0
  8. docs_drift-0.1.0/README.md +264 -0
  9. docs_drift-0.1.0/RELEASING.md +258 -0
  10. docs_drift-0.1.0/SECURITY.md +10 -0
  11. docs_drift-0.1.0/SUBMISSION.md +110 -0
  12. docs_drift-0.1.0/benchmark/PROTOCOL.md +143 -0
  13. docs_drift-0.1.0/benchmark/README.md +42 -0
  14. docs_drift-0.1.0/benchmark/RESULTS.md +19 -0
  15. docs_drift-0.1.0/benchmark/__init__.py +1 -0
  16. docs_drift-0.1.0/benchmark/acquire.py +156 -0
  17. docs_drift-0.1.0/benchmark/compute.py +330 -0
  18. docs_drift-0.1.0/benchmark/labels_todo.md +520 -0
  19. docs_drift-0.1.0/benchmark/performance-repos.json +17 -0
  20. docs_drift-0.1.0/benchmark/performance-results.json +1009 -0
  21. docs_drift-0.1.0/benchmark/performance.py +96 -0
  22. docs_drift-0.1.0/benchmark/probe.py +82 -0
  23. docs_drift-0.1.0/benchmark/repos.json +182 -0
  24. docs_drift-0.1.0/benchmark/run.py +303 -0
  25. docs_drift-0.1.0/benchmark/summarize_sweep.py +113 -0
  26. docs_drift-0.1.0/benchmark/sweep-repos.json +479 -0
  27. docs_drift-0.1.0/benchmark/upstream-drafts/README.md +16 -0
  28. docs_drift-0.1.0/benchmark/validation-results.json +51 -0
  29. docs_drift-0.1.0/docs/AWS-HANDOFF.md +75 -0
  30. docs_drift-0.1.0/docs/CHANGELOG.md +45 -0
  31. docs_drift-0.1.0/docs/CI-DIAGNOSIS.md +135 -0
  32. docs_drift-0.1.0/docs/CLI.md +155 -0
  33. docs_drift-0.1.0/docs/COMPETITIVE-PLAN.md +28 -0
  34. docs_drift-0.1.0/docs/FLOW-RECORDING.md +34 -0
  35. docs_drift-0.1.0/docs/INDEX_ACCURACY.md +30 -0
  36. docs_drift-0.1.0/docs/JUDGE-DEMO.md +71 -0
  37. docs_drift-0.1.0/docs/JUDGE-READINESS-2026-10-22.md +51 -0
  38. docs_drift-0.1.0/docs/LIMITATIONS.md +61 -0
  39. docs_drift-0.1.0/docs/MAINTAINER-PILOT-2026-10-23.md +61 -0
  40. docs_drift-0.1.0/docs/MAINTAINER-PILOT.md +78 -0
  41. docs_drift-0.1.0/docs/ORG-PILOT-2026-10-22.md +61 -0
  42. docs_drift-0.1.0/docs/ORG-VERIFICATION-2026-10-22.md +45 -0
  43. docs_drift-0.1.0/docs/ORGANIZATIONS.md +156 -0
  44. docs_drift-0.1.0/docs/PRECISION-VERIFICATION-2026-10-23.md +80 -0
  45. docs_drift-0.1.0/docs/PRODUCT.md +72 -0
  46. docs_drift-0.1.0/docs/REAL-CASE.md +100 -0
  47. docs_drift-0.1.0/docs/RELEASE-REHEARSAL-2026-10-23.md +59 -0
  48. docs_drift-0.1.0/docs/RESULTS.md +58 -0
  49. docs_drift-0.1.0/docs/SECURITY.md +220 -0
  50. docs_drift-0.1.0/docs/TEAM-VERIFICATION-2026-10-23.md +110 -0
  51. docs_drift-0.1.0/docs/TEAM-WORKFLOWS.md +139 -0
  52. docs_drift-0.1.0/docs/UI-REVIEW.md +59 -0
  53. docs_drift-0.1.0/docs/VERIFICATION.md +64 -0
  54. docs_drift-0.1.0/docs/WEB-VERIFICATION.md +107 -0
  55. docs_drift-0.1.0/docs/action-release-check.md +34 -0
  56. docs_drift-0.1.0/docs/assets/flow/dictated-release-request-2026-10-23.txt +17 -0
  57. docs_drift-0.1.0/docs/assets/flow/flow-highlights-2026-10-22.png +0 -0
  58. docs_drift-0.1.0/docs/assets/flow/provenance.json +34 -0
  59. docs_drift-0.1.0/docs/assets/flow/usage-card-supplied.png +0 -0
  60. docs_drift-0.1.0/docs/assets/graph-view.png +0 -0
  61. docs_drift-0.1.0/docs/assets/pr-comment-preview.png +0 -0
  62. docs_drift-0.1.0/docs/assets/provenance.json +6 -0
  63. docs_drift-0.1.0/docs/assets/quality/correction-verification.json +28 -0
  64. docs_drift-0.1.0/docs/assets/quality/followup.json +162 -0
  65. docs_drift-0.1.0/docs/assets/quality/maintainer-pilot-2026-10-23.json +49 -0
  66. docs_drift-0.1.0/docs/assets/quality/rich-cli-correction.patch +20 -0
  67. docs_drift-0.1.0/docs/assets/scan-demo.txt +31 -0
  68. docs_drift-0.1.0/docs/benchmark.md +63 -0
  69. docs_drift-0.1.0/docs/built-with-voice.md +46 -0
  70. docs_drift-0.1.0/docs/ci.md +22 -0
  71. docs_drift-0.1.0/docs/claims.md +19 -0
  72. docs_drift-0.1.0/docs/confidence.md +20 -0
  73. docs_drift-0.1.0/docs/configuration.md +44 -0
  74. docs_drift-0.1.0/docs/contributing.md +48 -0
  75. docs_drift-0.1.0/docs/demo-video.md +88 -0
  76. docs_drift-0.1.0/docs/deploy.md +141 -0
  77. docs_drift-0.1.0/docs/design.md +341 -0
  78. docs_drift-0.1.0/docs/faq.md +30 -0
  79. docs_drift-0.1.0/docs/getting-started.md +17 -0
  80. docs_drift-0.1.0/docs/github-action.md +56 -0
  81. docs_drift-0.1.0/docs/graph.md +28 -0
  82. docs_drift-0.1.0/docs/how-it-works.md +21 -0
  83. docs_drift-0.1.0/docs/index.md +234 -0
  84. docs_drift-0.1.0/docs/judge-assessment.md +52 -0
  85. docs_drift-0.1.0/docs/license.md +26 -0
  86. docs_drift-0.1.0/docs/llm-mode.md +17 -0
  87. docs_drift-0.1.0/docs/performance-profile.txt +42 -0
  88. docs_drift-0.1.0/docs/python-api.md +21 -0
  89. docs_drift-0.1.0/docs/release-verification.md +41 -0
  90. docs_drift-0.1.0/docs/releasing.md +258 -0
  91. docs_drift-0.1.0/docs/rules/DD001.md +3 -0
  92. docs_drift-0.1.0/docs/rules/DD002.md +3 -0
  93. docs_drift-0.1.0/docs/rules/DD003.md +3 -0
  94. docs_drift-0.1.0/docs/rules/DD004.md +3 -0
  95. docs_drift-0.1.0/docs/rules/DD005.md +3 -0
  96. docs_drift-0.1.0/docs/schema/README.md +25 -0
  97. docs_drift-0.1.0/docs/schema/SARIF-LICENSE.md +7 -0
  98. docs_drift-0.1.0/docs/schema/SARIF-NOTICES.txt +3 -0
  99. docs_drift-0.1.0/docs/schema/sarif-schema-2.1.0.json +3389 -0
  100. docs_drift-0.1.0/docs/schema/scan-result.v1.json +1024 -0
  101. docs_drift-0.1.0/docs/security-policy.md +10 -0
  102. docs_drift-0.1.0/docs/submission.md +102 -0
  103. docs_drift-0.1.0/docs/support.md +20 -0
  104. docs_drift-0.1.0/docs/vscode.md +13 -0
  105. docs_drift-0.1.0/editors/vscode/.vscode/launch.json +9 -0
  106. docs_drift-0.1.0/editors/vscode/.vscodeignore +6 -0
  107. docs_drift-0.1.0/editors/vscode/LICENSE +21 -0
  108. docs_drift-0.1.0/editors/vscode/README.md +13 -0
  109. docs_drift-0.1.0/editors/vscode/extension.js +17 -0
  110. docs_drift-0.1.0/editors/vscode/package-lock.json +96 -0
  111. docs_drift-0.1.0/editors/vscode/package.json +13 -0
  112. docs_drift-0.1.0/examples/clean-repo.html +73 -0
  113. docs_drift-0.1.0/examples/fastapi-svc.html +112 -0
  114. docs_drift-0.1.0/examples/monorepo-benchmark-before.json +22 -0
  115. docs_drift-0.1.0/examples/monorepo-benchmark.json +22 -0
  116. docs_drift-0.1.0/examples/node-tool.html +111 -0
  117. docs_drift-0.1.0/examples/py-cli.annotations.txt +4 -0
  118. docs_drift-0.1.0/examples/py-cli.html +114 -0
  119. docs_drift-0.1.0/examples/py-cli.json +1262 -0
  120. docs_drift-0.1.0/examples/py-cli.md +138 -0
  121. docs_drift-0.1.0/examples/py-cli.sarif +213 -0
  122. docs_drift-0.1.0/examples/py-cli.txt +31 -0
  123. docs_drift-0.1.0/examples/py-cli.xml +7 -0
  124. docs_drift-0.1.0/examples/web-accessibility.json +18 -0
  125. docs_drift-0.1.0/justfile +37 -0
  126. docs_drift-0.1.0/pyproject.toml +163 -0
  127. docs_drift-0.1.0/scripts/__init__.py +1 -0
  128. docs_drift-0.1.0/scripts/action_runner.py +94 -0
  129. docs_drift-0.1.0/scripts/bench_index.py +53 -0
  130. docs_drift-0.1.0/scripts/bench_scan.py +30 -0
  131. docs_drift-0.1.0/scripts/build_doc_assets.py +96 -0
  132. docs_drift-0.1.0/scripts/build_examples.py +44 -0
  133. docs_drift-0.1.0/scripts/build_judge_demo.py +76 -0
  134. docs_drift-0.1.0/scripts/build_public_docs.py +361 -0
  135. docs_drift-0.1.0/scripts/build_web_examples.py +98 -0
  136. docs_drift-0.1.0/scripts/check_coverage.py +22 -0
  137. docs_drift-0.1.0/scripts/check_html.py +49 -0
  138. docs_drift-0.1.0/scripts/check_readme_links.py +53 -0
  139. docs_drift-0.1.0/scripts/check_ui.cjs +87 -0
  140. docs_drift-0.1.0/scripts/check_web.py +58 -0
  141. docs_drift-0.1.0/scripts/demo_setup.py +133 -0
  142. docs_drift-0.1.0/scripts/dogfood.py +117 -0
  143. docs_drift-0.1.0/scripts/generate_reference.py +56 -0
  144. docs_drift-0.1.0/scripts/guard.py +83 -0
  145. docs_drift-0.1.0/scripts/maintainer_pilot.py +234 -0
  146. docs_drift-0.1.0/scripts/measure.py +288 -0
  147. docs_drift-0.1.0/scripts/monitor_web.py +61 -0
  148. docs_drift-0.1.0/scripts/record.py +94 -0
  149. docs_drift-0.1.0/scripts/record_demo.py +58 -0
  150. docs_drift-0.1.0/scripts/release.py +160 -0
  151. docs_drift-0.1.0/scripts/review_fixes.py +69 -0
  152. docs_drift-0.1.0/scripts/smoke.py +54 -0
  153. docs_drift-0.1.0/scripts/spotcheck_index.py +51 -0
  154. docs_drift-0.1.0/scripts/submission_reminders.py +32 -0
  155. docs_drift-0.1.0/scripts/verify_group_keys.py +72 -0
  156. docs_drift-0.1.0/scripts/verify_index.py +40 -0
  157. docs_drift-0.1.0/scripts/verify_install.py +95 -0
  158. docs_drift-0.1.0/scripts/verify_real_case.py +118 -0
  159. docs_drift-0.1.0/src/docs_drift/__init__.py +7 -0
  160. docs_drift-0.1.0/src/docs_drift/analysis.py +52 -0
  161. docs_drift-0.1.0/src/docs_drift/baseline.py +70 -0
  162. docs_drift-0.1.0/src/docs_drift/cli.py +871 -0
  163. docs_drift-0.1.0/src/docs_drift/collaboration.py +282 -0
  164. docs_drift-0.1.0/src/docs_drift/config.py +113 -0
  165. docs_drift-0.1.0/src/docs_drift/docs/__init__.py +1 -0
  166. docs_drift-0.1.0/src/docs_drift/docs/defaults.py +250 -0
  167. docs_drift-0.1.0/src/docs_drift/docs/discover.py +172 -0
  168. docs_drift-0.1.0/src/docs_drift/docs/extract_blocks.py +596 -0
  169. docs_drift-0.1.0/src/docs_drift/docs/extract_inline.py +561 -0
  170. docs_drift-0.1.0/src/docs_drift/docs/pipeline.py +234 -0
  171. docs_drift-0.1.0/src/docs_drift/docs/preprocess.py +71 -0
  172. docs_drift-0.1.0/src/docs_drift/docs/sections.py +247 -0
  173. docs_drift-0.1.0/src/docs_drift/errors.py +119 -0
  174. docs_drift-0.1.0/src/docs_drift/fix/__init__.py +1 -0
  175. docs_drift-0.1.0/src/docs_drift/fix/edits.py +124 -0
  176. docs_drift-0.1.0/src/docs_drift/fix/model.py +139 -0
  177. docs_drift-0.1.0/src/docs_drift/fix/rules.py +232 -0
  178. docs_drift-0.1.0/src/docs_drift/git_safety.py +35 -0
  179. docs_drift-0.1.0/src/docs_drift/graph/queries/evidence_path.cypher +6 -0
  180. docs_drift-0.1.0/src/docs_drift/history.py +412 -0
  181. docs_drift-0.1.0/src/docs_drift/history_cache.py +62 -0
  182. docs_drift-0.1.0/src/docs_drift/ids.py +50 -0
  183. docs_drift-0.1.0/src/docs_drift/index/__init__.py +211 -0
  184. docs_drift-0.1.0/src/docs_drift/index/base.py +239 -0
  185. docs_drift-0.1.0/src/docs_drift/index/config.py +185 -0
  186. docs_drift-0.1.0/src/docs_drift/index/js_cli.py +211 -0
  187. docs_drift-0.1.0/src/docs_drift/index/js_routes.py +68 -0
  188. docs_drift-0.1.0/src/docs_drift/index/js_symbols.py +219 -0
  189. docs_drift-0.1.0/src/docs_drift/index/python_cli.py +370 -0
  190. docs_drift-0.1.0/src/docs_drift/index/python_routes.py +102 -0
  191. docs_drift-0.1.0/src/docs_drift/index/python_source.py +20 -0
  192. docs_drift-0.1.0/src/docs_drift/index/python_symbols.py +335 -0
  193. docs_drift-0.1.0/src/docs_drift/index/queries/javascript.scm +4 -0
  194. docs_drift-0.1.0/src/docs_drift/index/queries/typescript.scm +4 -0
  195. docs_drift-0.1.0/src/docs_drift/index/routes_common.py +16 -0
  196. docs_drift-0.1.0/src/docs_drift/index/tasks.py +131 -0
  197. docs_drift-0.1.0/src/docs_drift/index/ts_parser.py +20 -0
  198. docs_drift-0.1.0/src/docs_drift/limits.py +18 -0
  199. docs_drift-0.1.0/src/docs_drift/llm/__init__.py +7 -0
  200. docs_drift-0.1.0/src/docs_drift/llm/candidates.py +81 -0
  201. docs_drift-0.1.0/src/docs_drift/llm/client.py +185 -0
  202. docs_drift-0.1.0/src/docs_drift/llm/pricing.py +54 -0
  203. docs_drift-0.1.0/src/docs_drift/llm/privacy.py +63 -0
  204. docs_drift-0.1.0/src/docs_drift/llm/prompts/rewrite_v1.md +9 -0
  205. docs_drift-0.1.0/src/docs_drift/llm/prompts/verify_v1.md +12 -0
  206. docs_drift-0.1.0/src/docs_drift/llm/prompts.py +28 -0
  207. docs_drift-0.1.0/src/docs_drift/llm/retrieve.py +60 -0
  208. docs_drift-0.1.0/src/docs_drift/llm/types.py +68 -0
  209. docs_drift-0.1.0/src/docs_drift/llm/verify.py +179 -0
  210. docs_drift-0.1.0/src/docs_drift/lsp.py +199 -0
  211. docs_drift-0.1.0/src/docs_drift/match/__init__.py +5 -0
  212. docs_drift-0.1.0/src/docs_drift/match/commands.py +201 -0
  213. docs_drift-0.1.0/src/docs_drift/match/defaults.py +79 -0
  214. docs_drift-0.1.0/src/docs_drift/match/engine.py +319 -0
  215. docs_drift-0.1.0/src/docs_drift/match/rename.py +69 -0
  216. docs_drift-0.1.0/src/docs_drift/models.py +249 -0
  217. docs_drift-0.1.0/src/docs_drift/ownership.py +70 -0
  218. docs_drift-0.1.0/src/docs_drift/policy.py +81 -0
  219. docs_drift-0.1.0/src/docs_drift/portfolio.py +147 -0
  220. docs_drift-0.1.0/src/docs_drift/py.typed +0 -0
  221. docs_drift-0.1.0/src/docs_drift/report/__init__.py +38 -0
  222. docs_drift-0.1.0/src/docs_drift/report/common.py +31 -0
  223. docs_drift-0.1.0/src/docs_drift/report/github.py +22 -0
  224. docs_drift-0.1.0/src/docs_drift/report/html.py +106 -0
  225. docs_drift-0.1.0/src/docs_drift/report/json.py +17 -0
  226. docs_drift-0.1.0/src/docs_drift/report/junit.py +30 -0
  227. docs_drift-0.1.0/src/docs_drift/report/markdown.py +58 -0
  228. docs_drift-0.1.0/src/docs_drift/report/partials/body.html +19 -0
  229. docs_drift-0.1.0/src/docs_drift/report/partials/report.css +12 -0
  230. docs_drift-0.1.0/src/docs_drift/report/partials/script.js +95 -0
  231. docs_drift-0.1.0/src/docs_drift/report/portfolio.html +14 -0
  232. docs_drift-0.1.0/src/docs_drift/report/report.html +8 -0
  233. docs_drift-0.1.0/src/docs_drift/report/sarif.py +68 -0
  234. docs_drift-0.1.0/src/docs_drift/report/terminal.py +90 -0
  235. docs_drift-0.1.0/src/docs_drift/report/vendor/CYTOSCAPE-LICENSE +19 -0
  236. docs_drift-0.1.0/src/docs_drift/report/vendor/cytoscape.min.js +32 -0
  237. docs_drift-0.1.0/src/docs_drift/report/workflow.html +12 -0
  238. docs_drift-0.1.0/src/docs_drift/review.py +113 -0
  239. docs_drift-0.1.0/src/docs_drift/safe_files.py +19 -0
  240. docs_drift-0.1.0/src/docs_drift/scanning.py +202 -0
  241. docs_drift-0.1.0/src/docs_drift/schemas/SARIF-LICENSE.md +7 -0
  242. docs_drift-0.1.0/src/docs_drift/schemas/SARIF-NOTICES.txt +3 -0
  243. docs_drift-0.1.0/src/docs_drift/schemas/sarif-schema-2.1.0.json +3389 -0
  244. docs_drift-0.1.0/src/docs_drift/schemas/scan-result.v1.json +1024 -0
  245. docs_drift-0.1.0/src/docs_drift/setup.py +130 -0
  246. docs_drift-0.1.0/src/docs_drift/snapshots.py +100 -0
  247. docs_drift-0.1.0/src/docs_drift/support.py +31 -0
  248. docs_drift-0.1.0/src/docs_drift/watch.py +157 -0
  249. docs_drift-0.1.0/src/docs_drift/web/__init__.py +1 -0
  250. docs_drift-0.1.0/src/docs_drift/web/__main__.py +23 -0
  251. docs_drift-0.1.0/src/docs_drift/web/app.py +289 -0
  252. docs_drift-0.1.0/src/docs_drift/web/cleanup.py +23 -0
  253. docs_drift-0.1.0/src/docs_drift/web/examples/clean-repo.json +646 -0
  254. docs_drift-0.1.0/src/docs_drift/web/examples/fastapi-svc.json +723 -0
  255. docs_drift-0.1.0/src/docs_drift/web/examples/files-to-prompt.json +3366 -0
  256. docs_drift-0.1.0/src/docs_drift/web/examples/judge-fixture.json +226 -0
  257. docs_drift-0.1.0/src/docs_drift/web/examples/manifest.json +89 -0
  258. docs_drift-0.1.0/src/docs_drift/web/examples/node-tool.json +823 -0
  259. docs_drift-0.1.0/src/docs_drift/web/examples/py-cli.json +1267 -0
  260. docs_drift-0.1.0/src/docs_drift/web/examples/rich-cli-reviewed.json +7855 -0
  261. docs_drift-0.1.0/src/docs_drift/web/examples/rich-cli.json +8010 -0
  262. docs_drift-0.1.0/src/docs_drift/web/examples/verification.json +16 -0
  263. docs_drift-0.1.0/src/docs_drift/web/git.py +274 -0
  264. docs_drift-0.1.0/src/docs_drift/web/jobs.py +352 -0
  265. docs_drift-0.1.0/src/docs_drift/web/settings.py +50 -0
  266. docs_drift-0.1.0/src/docs_drift/web/static/demo.css +37 -0
  267. docs_drift-0.1.0/src/docs_drift/web/static/demo.js +184 -0
  268. docs_drift-0.1.0/src/docs_drift/web/static/evidence/correction-verification.json +28 -0
  269. docs_drift-0.1.0/src/docs_drift/web/static/evidence/flow-highlights-2026-10-22.png +0 -0
  270. docs_drift-0.1.0/src/docs_drift/web/static/evidence/fresh-scan.json +7855 -0
  271. docs_drift-0.1.0/src/docs_drift/web/static/evidence/review.json +44 -0
  272. docs_drift-0.1.0/src/docs_drift/web/static/evidence/rich-cli-correction.patch +20 -0
  273. docs_drift-0.1.0/src/docs_drift/web/static/evidence/runtime.json +26 -0
  274. docs_drift-0.1.0/src/docs_drift/web/static/evidence/saved-scan.json +8010 -0
  275. docs_drift-0.1.0/src/docs_drift/web/static/evidence/usage-card-supplied.png +0 -0
  276. docs_drift-0.1.0/src/docs_drift/web/templates/base.html +34 -0
  277. docs_drift-0.1.0/src/docs_drift/web/templates/case.html +13 -0
  278. docs_drift-0.1.0/src/docs_drift/web/templates/landing.html +90 -0
  279. docs_drift-0.1.0/src/docs_drift/web/templates/scan.html +2 -0
  280. docs_drift-0.1.0/src/docs_drift/web/templates/voice.html +1 -0
  281. docs_drift-0.1.0/src/docs_drift/web/validation.py +47 -0
  282. docs_drift-0.1.0/src/docs_drift/web/worker.py +152 -0
  283. docs_drift-0.1.0/src/docs_drift/workflow_cli.py +96 -0
  284. docs_drift-0.1.0/src/docs_drift/workspaces.py +128 -0
  285. docs_drift-0.1.0/tests/__init__.py +1 -0
  286. docs_drift-0.1.0/tests/fixtures/ANSWER_KEY.md +73 -0
  287. docs_drift-0.1.0/tests/fixtures/__init__.py +1 -0
  288. docs_drift-0.1.0/tests/fixtures/answer_key.json +192 -0
  289. docs_drift-0.1.0/tests/fixtures/build_fixtures.py +370 -0
  290. docs_drift-0.1.0/tests/fixtures/injection/README.md +5 -0
  291. docs_drift-0.1.0/tests/fixtures/injection/service.py +4 -0
  292. docs_drift-0.1.0/tests/recordings/16e354ad96c375f75ca5776519091ad733a03398c7e5098eabcf12840745c277.json +27 -0
  293. docs_drift-0.1.0/tests/recordings/987e5ecec785ee20b98ac1fd61066f0cc96897692b35ba3caecac816c1363b5c.json +27 -0
  294. docs_drift-0.1.0/tests/recordings/README.md +16 -0
  295. docs_drift-0.1.0/tests/snapshots/clean-repo.html.structure +7 -0
  296. docs_drift-0.1.0/tests/snapshots/clean-repo.txt +5 -0
  297. docs_drift-0.1.0/tests/snapshots/fastapi-svc.html.structure +17 -0
  298. docs_drift-0.1.0/tests/snapshots/fastapi-svc.txt +35 -0
  299. docs_drift-0.1.0/tests/snapshots/node-tool.html.structure +17 -0
  300. docs_drift-0.1.0/tests/snapshots/node-tool.txt +36 -0
  301. docs_drift-0.1.0/tests/snapshots/py-cli.html.structure +17 -0
  302. docs_drift-0.1.0/tests/snapshots/py-cli.txt +37 -0
  303. docs_drift-0.1.0/tests/test_baseline.py +57 -0
  304. docs_drift-0.1.0/tests/test_benchmark.py +139 -0
  305. docs_drift-0.1.0/tests/test_ci_and_worker.py +260 -0
  306. docs_drift-0.1.0/tests/test_cli.py +211 -0
  307. docs_drift-0.1.0/tests/test_config.py +122 -0
  308. docs_drift-0.1.0/tests/test_coverage_gate.py +34 -0
  309. docs_drift-0.1.0/tests/test_defaults.py +134 -0
  310. docs_drift-0.1.0/tests/test_discover.py +118 -0
  311. docs_drift-0.1.0/tests/test_doc_artifacts.py +134 -0
  312. docs_drift-0.1.0/tests/test_extract_blocks.py +176 -0
  313. docs_drift-0.1.0/tests/test_extract_inline.py +284 -0
  314. docs_drift-0.1.0/tests/test_fixes.py +304 -0
  315. docs_drift-0.1.0/tests/test_fixtures_build.py +124 -0
  316. docs_drift-0.1.0/tests/test_git_process.py +123 -0
  317. docs_drift-0.1.0/tests/test_group_keys.py +67 -0
  318. docs_drift-0.1.0/tests/test_guard.py +113 -0
  319. docs_drift-0.1.0/tests/test_hardening.py +161 -0
  320. docs_drift-0.1.0/tests/test_history.py +89 -0
  321. docs_drift-0.1.0/tests/test_index.py +140 -0
  322. docs_drift-0.1.0/tests/test_index_surfaces.py +125 -0
  323. docs_drift-0.1.0/tests/test_judge_demo.py +101 -0
  324. docs_drift-0.1.0/tests/test_llm.py +402 -0
  325. docs_drift-0.1.0/tests/test_llm_tools.py +77 -0
  326. docs_drift-0.1.0/tests/test_lsp_protocol.py +93 -0
  327. docs_drift-0.1.0/tests/test_maintainer_pilot.py +124 -0
  328. docs_drift-0.1.0/tests/test_match_engine.py +192 -0
  329. docs_drift-0.1.0/tests/test_measure.py +47 -0
  330. docs_drift-0.1.0/tests/test_models.py +230 -0
  331. docs_drift-0.1.0/tests/test_pipeline.py +66 -0
  332. docs_drift-0.1.0/tests/test_policy.py +70 -0
  333. docs_drift-0.1.0/tests/test_portfolio.py +175 -0
  334. docs_drift-0.1.0/tests/test_public_security.py +103 -0
  335. docs_drift-0.1.0/tests/test_real_case_correction.py +89 -0
  336. docs_drift-0.1.0/tests/test_release.py +224 -0
  337. docs_drift-0.1.0/tests/test_rename.py +29 -0
  338. docs_drift-0.1.0/tests/test_reports.py +152 -0
  339. docs_drift-0.1.0/tests/test_sections.py +168 -0
  340. docs_drift-0.1.0/tests/test_team_workflows.py +315 -0
  341. docs_drift-0.1.0/tests/test_web.py +256 -0
  342. docs_drift-0.1.0/tests/test_web_boundaries.py +227 -0
  343. docs_drift-0.1.0/tests/test_web_ops.py +42 -0
  344. docs_drift-0.1.0/tests/test_workspaces_watch_lsp.py +177 -0
  345. docs_drift-0.1.0/uv.lock +3157 -0
@@ -0,0 +1,3 @@
1
+ * text=auto eol=lf
2
+ # Unified patches preserve CRLF and single-space blank context from the target document.
3
+ *.patch -text whitespace=-blank-at-eol,cr-at-eol
@@ -0,0 +1,45 @@
1
+ # Python and build output
2
+ __pycache__/
3
+ *.py[cod]
4
+ *.egg-info/
5
+ .eggs/
6
+ build/
7
+ dist/
8
+ .pytest_cache/
9
+ .mypy_cache/
10
+ .ruff_cache/
11
+ .coverage
12
+ .coverage.*
13
+ htmlcov/
14
+ coverage.xml
15
+
16
+ # uv environments and caches; keep uv.lock for reproducible development.
17
+ .venv/
18
+ venv/
19
+ .uv-cache/
20
+ .pre-commit-cache/
21
+
22
+ # Editors and operating systems
23
+ .idea/
24
+ .vscode/
25
+ *.swp
26
+ *.swo
27
+ *~
28
+ .DS_Store
29
+ Thumbs.db
30
+
31
+ # Local scanner cache
32
+ .docs-drift/
33
+
34
+ # Generated fixture repositories (including their nested Git metadata).
35
+ /tests/fixtures/repos/
36
+ .pytest-tmp*/
37
+ .npm-cache/
38
+ node_modules/
39
+ .hypothesis/
40
+ # Full raw benchmark scans stay local; committed samples, pins, measurements and source snapshots reproduce them.
41
+ benchmark/runs/*/*--*.json
42
+ benchmark/runs/*/*.log
43
+ docs-drift-bench-*/
44
+ !editors/vscode/.vscode/
45
+ !editors/vscode/.vscode/launch.json
@@ -0,0 +1,21 @@
1
+ repos:
2
+ - repo: https://github.com/astral-sh/ruff-pre-commit
3
+ rev: v0.17.1
4
+ hooks:
5
+ - id: ruff-check
6
+ - id: ruff-format
7
+ - repo: https://github.com/pre-commit/pre-commit-hooks
8
+ rev: v6.0.0
9
+ hooks:
10
+ - id: end-of-file-fixer
11
+ exclude: '\.patch$'
12
+ - id: trailing-whitespace
13
+ exclude: '\.patch$'
14
+ - repo: local
15
+ hooks:
16
+ - id: staged-file-guard
17
+ name: Guard staged files and secrets
18
+ entry: uv run python scripts/guard.py
19
+ language: system
20
+ pass_filenames: false
21
+ always_run: true
@@ -0,0 +1,45 @@
1
+ # Changelog
2
+
3
+ All notable user-facing changes are recorded here, following
4
+ [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and
5
+ [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
+
7
+ ## [Unreleased]
8
+
9
+ ## [0.1.0] - 2026-10-24
10
+
11
+ ### Added
12
+
13
+ - Static checks for commands, flags, defaults, environment variables, routes,
14
+ symbols, files, package scripts and Make targets, with partial ecosystem coverage.
15
+ - Evidence chains connecting documentation to source and the Git commit that
16
+ introduced drift, with explicit limits for shallow or truncated history.
17
+ - Terminal reports with stale-token carets; JSON, SARIF, Markdown, JUnit, GitHub
18
+ annotations and offline HTML reports with an interactive evidence graph.
19
+ - Explanations, conservative fix previews, CI checks, baselines, suppressions,
20
+ workspace scoping, change impact and repository insights.
21
+ - Optional watch mode, language server and VS Code client; optional model
22
+ verification with redaction, budgets and explicit opt-in.
23
+ - A local web demo with cached examples and bounded public-repository scanning.
24
+ - Reproducible public-repository benchmark samples for human review, plus docs
25
+ and configuration reference. Real-world precision and recall remain unmeasured.
26
+ - Package version in CLI and JSON reports, separate from JSON schema version 1.
27
+ - PR comparisons with documentation lines, source evidence, available commit
28
+ attribution, workflow annotations and reviewable documentation patches.
29
+ - Source-scoped human feedback with reasons and conservative reopening when
30
+ supporting source changes; full findings remain available for review.
31
+ - Bounded static support history, CODEOWNERS routing, documentation coverage
32
+ reports and verified local fix branches that leave final approval to a person.
33
+
34
+ ### Changed
35
+
36
+ - Static Typer checks respect default and explicitly configured help options.
37
+ - Markdown explanations are presented as review text; applicable changes use
38
+ exact-span patches rather than token-only whole-line suggestions.
39
+
40
+
41
+ Changelogs are ignored by default. Historical examples such as `--port` may stay
42
+ in this file without being treated as current usage instructions.
43
+
44
+ [Unreleased]: https://github.com/ayushagarwalhere/docs-drift/compare/v0.1.0...HEAD
45
+ [0.1.0]: https://github.com/ayushagarwalhere/docs-drift/releases/tag/v0.1.0
@@ -0,0 +1,48 @@
1
+ # Contributing
2
+
3
+ Use Python 3.11+ and uv. From the repository root:
4
+
5
+ ```console
6
+ uv sync --locked --all-extras
7
+ uv run just setup
8
+ uv run just check
9
+ ```
10
+
11
+ We use a justfile rather than duplicating recipes in a Makefile. `just` is a dev
12
+ dependency (`rust-just` on PyPI), and recipes use native PowerShell on Windows.
13
+ `setup` installs the pre-commit hook. Other recipes are `test`, `lint`, `fmt`,
14
+ `typecheck`, and `demo`. `check` verifies formatting without rewriting files;
15
+ run `fmt` explicitly to fix it. `demo` displays CLI help. Use the fixture commands
16
+ below to inspect a scan.
17
+
18
+ Without just, run `uv run ruff check`, `uv run ruff format --check`, `uv run mypy`,
19
+ `uv run pytest --cov=docs_drift --cov=scripts --cov-report=term-missing`, and
20
+ `uv run pre-commit run --all-files`. CI tests Ubuntu and Windows on Python 3.11
21
+ and 3.13, with full Git history and all extras installed. Coverage must remain
22
+ at least 85% overall and 90% for extraction and matching; report a failure instead of lowering the thresholds.
23
+
24
+ The guard reads staged Git blobs, so cleaning a working file does not hide a
25
+ staged secret. It blocks files over 1,000,000 bytes, `.env` and `.env.*` files
26
+ (including examples), and token-shaped Anthropic, GitHub, and AWS keys. Use
27
+ safe placeholders in docs and construct fake test tokens from separate parts.
28
+ Guard diagnostics identify the file and line without printing a token.
29
+
30
+ For an indexer, add a typed, pure parser under `src/docs_drift/index/`, retain
31
+ source file/line/text evidence, and test it against text-only fixtures, including
32
+ Windows paths and unsupported dynamic behavior. Never import or run scanned code.
33
+ For a claim kind, update the models, extraction, matching, design taxonomy, and
34
+ report examples together; cover confirmed, missing, and unverifiable cases.
35
+ Do not invent a match when the available index is incomplete.
36
+
37
+ Record every metric, including failures, with the exact command and revision
38
+ that produced it. Keep fixture answer keys fixed; never tune rules or thresholds
39
+ to improve a score. The optional LLM cannot override a code-based verdict.
40
+
41
+ Fixture tests build fresh Git repositories in temporary directories. For manual
42
+ inspection use `uv run python tests/fixtures/build_fixtures.py`; the default output
43
+ under the generated `tests/fixtures/repos/` directory is ignored. Never run the generated programs or
44
+ commit their `.git` folders. `uv run python scripts/measure.py` validates the
45
+ hand-written key; read `tests/fixtures/ANSWER_KEY.md` before changing any fixture.
46
+
47
+ Use `pathlib` for filesystem paths. `.gitattributes` normalizes text to LF on
48
+ every platform. Review the diff and propose a commit message; do not auto-commit.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 docs-drift contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,331 @@
1
+ Metadata-Version: 2.5
2
+ Name: docs-drift
3
+ Version: 0.1.0
4
+ Summary: Find evidence-backed drift between repository documentation and code.
5
+ Project-URL: Homepage, https://github.com/ayushagarwalhere/docs-drift
6
+ Project-URL: Documentation, https://ayushagarwalhere.github.io/docs-drift/
7
+ Project-URL: Source, https://github.com/ayushagarwalhere/docs-drift
8
+ Project-URL: Issues, https://github.com/ayushagarwalhere/docs-drift/issues
9
+ Project-URL: Changelog, https://github.com/ayushagarwalhere/docs-drift/blob/main/CHANGELOG.md
10
+ License-Expression: MIT
11
+ License-File: LICENSE
12
+ Keywords: cli,developer-tools,documentation,drift,sarif,static-analysis
13
+ Classifier: Development Status :: 3 - Alpha
14
+ Classifier: Environment :: Console
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: Operating System :: OS Independent
17
+ Classifier: Programming Language :: Python :: 3 :: Only
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Topic :: Software Development :: Documentation
22
+ Classifier: Topic :: Software Development :: Quality Assurance
23
+ Requires-Python: >=3.11
24
+ Requires-Dist: jinja2>=3.1
25
+ Requires-Dist: markdown-it-py>=3.0
26
+ Requires-Dist: pathspec>=1.0
27
+ Requires-Dist: pydantic>=2.7
28
+ Requires-Dist: pyyaml>=6.0
29
+ Requires-Dist: rapidfuzz>=3.9
30
+ Requires-Dist: rich>=13.9
31
+ Requires-Dist: tomli-w>=1.0
32
+ Requires-Dist: tree-sitter-javascript<0.26,>=0.25
33
+ Requires-Dist: tree-sitter-typescript<0.24,>=0.23.2
34
+ Requires-Dist: tree-sitter<0.27,>=0.25
35
+ Requires-Dist: typer<0.28,>=0.27.3
36
+ Provides-Extra: dev
37
+ Requires-Dist: deptry>=0.24; extra == 'dev'
38
+ Requires-Dist: httpx>=0.28; extra == 'dev'
39
+ Requires-Dist: hypothesis>=6.100; extra == 'dev'
40
+ Requires-Dist: jsonschema>=4.23; extra == 'dev'
41
+ Requires-Dist: mypy>=1.14; extra == 'dev'
42
+ Requires-Dist: pillow>=11; extra == 'dev'
43
+ Requires-Dist: pip-audit>=2.9; extra == 'dev'
44
+ Requires-Dist: playwright>=1.48; extra == 'dev'
45
+ Requires-Dist: pre-commit>=4.0; extra == 'dev'
46
+ Requires-Dist: pytest-cov>=6.0; extra == 'dev'
47
+ Requires-Dist: pytest>=8.0; extra == 'dev'
48
+ Requires-Dist: ruff>=0.17.1; extra == 'dev'
49
+ Requires-Dist: rust-just>=1.40; extra == 'dev'
50
+ Requires-Dist: types-jsonschema>=4.26; extra == 'dev'
51
+ Requires-Dist: types-pyyaml>=6; extra == 'dev'
52
+ Provides-Extra: docs
53
+ Requires-Dist: mkdocs-material>=9.6; extra == 'docs'
54
+ Provides-Extra: graph
55
+ Provides-Extra: llm
56
+ Requires-Dist: httpx>=0.28; extra == 'llm'
57
+ Provides-Extra: lsp
58
+ Requires-Dist: lsprotocol>=2025.0; extra == 'lsp'
59
+ Requires-Dist: pygls<3,>=2.0; extra == 'lsp'
60
+ Provides-Extra: watch
61
+ Requires-Dist: watchfiles<2,>=1.0; extra == 'watch'
62
+ Provides-Extra: web
63
+ Requires-Dist: fastapi>=0.115; extra == 'web'
64
+ Requires-Dist: jinja2>=3.1; extra == 'web'
65
+ Requires-Dist: uvicorn[standard]>=0.32; extra == 'web'
66
+ Description-Content-Type: text/markdown
67
+
68
+ # docs-drift
69
+
70
+ Self-hosted documentation drift checks for maintainers: scan local repositories,
71
+ review source evidence, and gate newly introduced drift in CI. Organizations can
72
+ scan multiple checkouts into one dashboard with `docs-drift portfolio`.
73
+ [PR reviews, feedback, history, ownership and fix branches](https://github.com/ayushagarwalhere/docs-drift/blob/main/docs/TEAM-WORKFLOWS.md).
74
+ [Organization adoption](https://github.com/ayushagarwalhere/docs-drift/blob/main/docs/ORGANIZATIONS.md) · [Product maturity](https://github.com/ayushagarwalhere/docs-drift/blob/main/docs/PRODUCT.md).
75
+
76
+ The product hypothesis is repeatable CI checks of exact documentation contracts
77
+ for SDK, CLI and API maintainers. Start external repositories in report-only mode:
78
+ real-world precision/recall and maintainer adoption remain unestablished.
79
+ [Run a frozen maintainer review](https://github.com/ayushagarwalhere/docs-drift/blob/main/docs/MAINTAINER-PILOT.md) with blank human labels,
80
+ source evidence and an explicit decision about keeping it in CI.
81
+
82
+ ## Judges start here
83
+
84
+ **Smallest offline demo:** [exact local run steps and one synthetic claim](https://github.com/ayushagarwalhere/docs-drift/blob/main/docs/JUDGE-DEMO.md).
85
+ Open `/scan/example-judge` in the local app to inspect the source, rename commit,
86
+ and proposed documentation fix. Fixture results are not real-world accuracy measurements.
87
+
88
+ - **Public demo:** AWS deployment deferred by owner. Run the app locally on port 8080; no public URL is claimed. [AWS handoff](https://github.com/ayushagarwalhere/docs-drift/blob/main/docs/AWS-HANDOFF.md).
89
+ - **Real case:** [reproduced rich-cli failure, source and commit](https://github.com/ayushagarwalhere/docs-drift/blob/main/docs/REAL-CASE.md).
90
+ - **Try immediately:** the local app includes a repo URL scanner and precomputed real sample, with no sign-in or API key.
91
+ - **Interface:** monochrome themes, scroll-driven 3D evidence layers, motion controls and searchable reports; [UI verification](https://github.com/ayushagarwalhere/docs-drift/blob/main/docs/UI-REVIEW.md).
92
+ - **Video:** pending owner recording and upload; target 1:50 with captions; [updated shot list](https://github.com/ayushagarwalhere/docs-drift/blob/main/docs/FLOW-RECORDING.md).
93
+ - **Source:** [GitHub repository](https://github.com/ayushagarwalhere/docs-drift).
94
+ - **Evidence:** [benchmark results](https://github.com/ayushagarwalhere/docs-drift/blob/main/benchmark/RESULTS.md),
95
+ [measured limitations](https://github.com/ayushagarwalhere/docs-drift/blob/main/docs/RESULTS.md), and [submission checklist](https://github.com/ayushagarwalhere/docs-drift/blob/main/SUBMISSION.md).
96
+
97
+ Three-command local quick start (Python 3.11+, Git and uv installed):
98
+
99
+ ```sh
100
+ git clone https://github.com/ayushagarwalhere/docs-drift.git
101
+ cd docs-drift
102
+ uv run --all-extras docs-drift scan --repo .
103
+ ```
104
+
105
+ Release preparation: [owner's publish gates](https://github.com/ayushagarwalhere/docs-drift/blob/main/RELEASING.md). Public installs and
106
+ URLs must be verified after publication; local checks do not prove a published release.
107
+
108
+ **Find documentation statements your code no longer supports, with source evidence and available Git history.**
109
+
110
+ [![CI](https://img.shields.io/badge/CI-configured-blue)](https://github.com/ayushagarwalhere/docs-drift/blob/main/.github/workflows/ci.yml)
111
+ **Package status:** PyPI unpublished (404 verified 22 October 2026); use the source quick start.
112
+ [![Licence](https://img.shields.io/badge/licence-MIT-blue)](https://github.com/ayushagarwalhere/docs-drift/blob/main/LICENSE)
113
+ [![Python](https://img.shields.io/badge/Python-3.11%2B-blue)](https://github.com/ayushagarwalhere/docs-drift/blob/main/pyproject.toml)
114
+
115
+ Alpha software: source installation works before the first package is published.
116
+ The PyPI page becomes available after authenticated publication; the hosted
117
+ demo and video remain explicitly pending above. Real-world
118
+ precision and recall are **pending human labeling**, not inferred from fixtures.
119
+
120
+ ![Actual fixture scan output, eight-second terminal replay](https://raw.githubusercontent.com/ayushagarwalhere/docs-drift/main/docs/assets/scan-demo.gif)
121
+
122
+ ![HTML evidence graph from the actual py-cli fixture](https://raw.githubusercontent.com/ayushagarwalhere/docs-drift/main/docs/assets/graph-view.png)
123
+
124
+ ## A real failure, reproduced during this build
125
+
126
+ To render rich-cli's README with line numbers, we followed its documented
127
+ `--line-number` option. It exited 2: "No such option." Source declares
128
+ `--line-numbers`, which exited 0. docs-drift locates README:61; manual Git
129
+ inspection identifies documentation commit `567f6c84`. The scanner does not
130
+ attribute a breaking commit for this finding. This is an agent-assisted build
131
+ investigation, not an invented account of the owner's earlier work.
132
+ [Exact snapshot, commands, source and review](https://github.com/ayushagarwalhere/docs-drift/blob/main/docs/REAL-CASE.md).
133
+
134
+ The four-finding saved sample includes **two confirmed defects and two false
135
+ positives**. A fresh scan flags only the defective options. This selected,
136
+ agent-assisted review is not an independent human accuracy measurement.
137
+
138
+ The `--port` / `--listen` images above are synthetic fixtures, excluded from the
139
+ real case and review sample.
140
+
141
+ For beginners contributing to documentation, an evidence-backed finding can be a
142
+ concrete first contribution. Maintainers can use the same checks to keep docs
143
+ aligned with a changing codebase; the suggested patches still need review.
144
+
145
+ ## Quick start
146
+
147
+ From this source checkout, with Python 3.11+ and Git:
148
+
149
+ ```sh
150
+ uv sync --locked --all-extras
151
+ uv run docs-drift scan
152
+ ```
153
+
154
+ After the first PyPI release, these are the intended package entry points:
155
+
156
+ ```sh
157
+ pipx install docs-drift
158
+ docs-drift scan
159
+ # Alternative after publication:
160
+ uvx docs-drift scan
161
+ ```
162
+
163
+ Or build the CLI container locally (Docker must be running):
164
+
165
+ ```sh
166
+ docker build -t docs-drift:local . && docker run --rm -v "$PWD:/repo" docs-drift:local scan --repo /repo
167
+ ```
168
+
169
+ Try it in your browser: AWS hosting is deferred by the owner. Locally,
170
+ start `uv run python -m docs_drift.web` and open `http://127.0.0.1:8080`; set
171
+ `DOCS_DRIFT_ALLOWED_ORIGIN` to that exact origin before submitting a scan.
172
+
173
+ Useful commands, exercised against a trusted fixture in CI:
174
+
175
+ ```sh
176
+ docs-drift scan --no-color
177
+ docs-drift scan --format html --output scan.html
178
+ docs-drift insights --format json
179
+ docs-drift impact --base HEAD~1 --format json
180
+ docs-drift fix
181
+ docs-drift check # documented exit: 1 on the stale py-cli fixture
182
+ ```
183
+
184
+ `scan` reports findings and exits 0. `check` exits 1 for findings meeting its
185
+ threshold, or 2 for usage/configuration errors. `fix` previews a patch; applying
186
+ it requires an explicit write option and confirmation. No target code is run.
187
+
188
+ ## What it checks (illustrative fixtures)
189
+
190
+ | Claim kind | Example documentation | Static evidence |
191
+ | --- | --- | --- |
192
+ | CLI flag / command | A synthetic README mentions `--port` | argparse/Click/Typer or Commander declarations |
193
+ | Environment variable | A synthetic README mentions `APP_LOG_LEVEL` | literal environment reads or safe config templates |
194
+ | Endpoint | A synthetic guide requests `GET /status` | literal FastAPI/Flask/Express routes |
195
+ | Setting / default | A synthetic guide says `workers` defaults to 4 | a recognized literal declaration/default |
196
+ | Code symbol | A synthetic guide calls `Client.connect()` | a parsed function/class/method declaration |
197
+ | File path | A synthetic guide links `config/settings.toml` | a contained repository-relative path |
198
+ | Package script / task | A synthetic guide invokes `npm run build` | package manifests and Make/just task declarations |
199
+ | Project command | A synthetic guide runs `tool serve --port 8000` | independently identified executable/command/flags |
200
+
201
+ Arbitrary behavioural prose is not proved by name matching. Optional model
202
+ assessment is separately labeled and constrained by source citations.
203
+
204
+ ## Supported ecosystems
205
+
206
+ <!-- support-table:start -->
207
+ | Language | Framework / surface | Support |
208
+ | --- | --- | --- |
209
+ | Python | AST declarations | partial |
210
+ | Python | argparse | partial |
211
+ | Python | Click | partial |
212
+ | Python | Typer | partial |
213
+ | Python | FastAPI | partial |
214
+ | Python | Flask | partial |
215
+ | Python | Django / DRF | none |
216
+ | JavaScript / TypeScript | AST declarations | partial |
217
+ | JavaScript / TypeScript | Commander | partial |
218
+ | JavaScript / TypeScript | yargs | none |
219
+ | JavaScript / TypeScript | Express | partial |
220
+ | JavaScript / TypeScript | Next.js / NestJS routes | none |
221
+ | JSON / YAML / TOML / INI | literal settings | partial |
222
+ | Go / Rust | language-specific configuration | none |
223
+ <!-- support-table:end -->
224
+
225
+ Partial means recognized literal/static patterns, not complete framework support.
226
+ No framework is advertised as fully supported. Dynamic registration, signatures,
227
+ router composition and generated source may remain unverifiable.
228
+
229
+ ## CI
230
+
231
+ This ten-line example uses the development Action from this repository:
232
+
233
+ ```yaml
234
+ name: Documentation
235
+ on: [push, pull_request]
236
+ permissions: {contents: read}
237
+ jobs:
238
+ docs:
239
+ runs-on: ubuntu-latest
240
+ steps:
241
+ - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803
242
+ - uses: ./
243
+ with: {repo: '.', fail-on-drift: 'true'}
244
+ ```
245
+
246
+ Other projects must replace the local action path with the real repository pinned
247
+ to a reviewed commit after publication. Reports include JSON, HTML, SARIF and
248
+ escaped Markdown. The Action needs no write token, accepts no model key, and never
249
+ posts a PR comment automatically. [Action guide](https://github.com/ayushagarwalhere/docs-drift/blob/main/docs/github-action.md).
250
+
251
+ ![Preview of generated PR Markdown, not a submitted comment](https://raw.githubusercontent.com/ayushagarwalhere/docs-drift/main/docs/assets/pr-comment-preview.png)
252
+
253
+ ## Editor
254
+
255
+ The development VS Code extension supplies diagnostics, definitions and safe
256
+ quick fixes via the stdio LSP. **Actual squiggle GIF pending a verified editor
257
+ capture**; protocol tests are not presented as a native-editor recording.
258
+ [Extension guide](https://github.com/ayushagarwalhere/docs-drift/blob/main/docs/vscode.md).
259
+
260
+ ## How it works
261
+
262
+ ```mermaid
263
+ flowchart LR
264
+ D[Docs] --> C[Located claims]
265
+ S[Source text / AST] --> I[Static index]
266
+ C --> M[Scoped matching]
267
+ I --> M
268
+ M --> H[Bounded Git history]
269
+ H --> R[Evidence, reports and reviewable fixes]
270
+ ```
271
+
272
+ ```mermaid
273
+ flowchart LR
274
+ Section --> Claim
275
+ Claim --> Symbol
276
+ Symbol --> SourceFile
277
+ SourceFile --> Commit
278
+ ```
279
+
280
+ Rules decide literal claims first. Optional model assessment handles selected
281
+ anchored prose, cannot override code-decided findings, and must cite supplied
282
+ source that passes validation.
283
+
284
+ ## Accuracy and limitations
285
+
286
+ <!-- accuracy:start -->
287
+ Real-world accuracy is **not yet established**. The 12-repository protocol and
288
+ blank human labeling sheet are in [the benchmark](https://github.com/ayushagarwalhere/docs-drift/blob/main/benchmark/PROTOCOL.md); its
289
+ [dated results](https://github.com/ayushagarwalhere/docs-drift/blob/main/benchmark/RESULTS.md) keep precision/recall pending until the owner
290
+ labels them. Fixture scores establish plumbing, not product accuracy. Missing
291
+ findings can be intentional examples, third-party tools or indexing limitations;
292
+ review every report. [Known limitations](https://github.com/ayushagarwalhere/docs-drift/blob/main/docs/LIMITATIONS.md).
293
+ <!-- accuracy:end -->
294
+
295
+ ## Configuration
296
+
297
+ ```toml
298
+ # .docs-drift.toml
299
+ min_confidence = 0.6
300
+ [history]
301
+ max_commits = 2000
302
+ ```
303
+
304
+ The [full configuration reference](https://github.com/ayushagarwalhere/docs-drift/blob/main/docs/configuration.md) is generated from the
305
+ Pydantic model and checked for freshness in CI. Common CLI options work before
306
+ or after subcommands. [CLI reference](https://github.com/ayushagarwalhere/docs-drift/blob/main/docs/CLI.md).
307
+
308
+ ## Privacy and security
309
+
310
+ Rule-only scans parse local text/AST and call Git for evidence. They never import
311
+ or execute target modules or fenced commands. Optional model mode sends selected
312
+ redacted documentation/source excerpts through OpenRouter to the chosen provider;
313
+ replay mode sends nothing. The public demo and composite Action are rule-only.
314
+ [Security policy](https://github.com/ayushagarwalhere/docs-drift/blob/main/SECURITY.md) ? [Threat model](https://github.com/ayushagarwalhere/docs-drift/blob/main/docs/SECURITY.md).
315
+
316
+ ## Built with voice
317
+
318
+ The owner supplied original Flow usage cards, including **31,351 total words**,
319
+ **276 words/minute**, **11 apps**, and a **1-day streak**, plus a separate card
320
+ showing **26,412 total words**. These are account-level figures, not docs-drift
321
+ word counts. [Actual cards and provenance](https://github.com/ayushagarwalhere/docs-drift/blob/main/docs/built-with-voice.md).
322
+
323
+ The specific dictated prompts, build revisions and Flow-use recording still need
324
+ owner evidence. [Concrete 1:50 recording plan](https://github.com/ayushagarwalhere/docs-drift/blob/main/docs/FLOW-RECORDING.md). No personal
325
+ workflow or recording has been invented.
326
+
327
+ ## Contributing and licence
328
+
329
+ See [CONTRIBUTING.md](https://github.com/ayushagarwalhere/docs-drift/blob/main/CONTRIBUTING.md). Run tests, lint and type checks before
330
+ opening a change; do not change a frozen benchmark's rules or prefill human labels.
331
+ The code is [MIT licensed](https://github.com/ayushagarwalhere/docs-drift/blob/main/LICENSE). [Changelog](https://github.com/ayushagarwalhere/docs-drift/blob/main/CHANGELOG.md).