interlatch 0.27.2__tar.gz → 0.27.4__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 (467) hide show
  1. interlatch-0.27.4/.github/windows-ja-qa/driver.ps1 +51 -0
  2. interlatch-0.27.4/.github/windows-ja-qa/ja_check.py +152 -0
  3. interlatch-0.27.4/.github/windows-ja-qa/report.py +28 -0
  4. interlatch-0.27.4/.github/windows-ja-qa/shots.py +84 -0
  5. interlatch-0.27.4/.github/windows-ja-qa/user.ps1 +48 -0
  6. {interlatch-0.27.2 → interlatch-0.27.4}/.github/workflows/ci.yml +6 -6
  7. {interlatch-0.27.2 → interlatch-0.27.4}/.github/workflows/docs.yml +1 -1
  8. {interlatch-0.27.2 → interlatch-0.27.4}/.github/workflows/release.yml +6 -6
  9. interlatch-0.27.4/.github/workflows/windows-ja-qa.yml +108 -0
  10. {interlatch-0.27.2 → interlatch-0.27.4}/CHANGELOG.md +24 -0
  11. {interlatch-0.27.2 → interlatch-0.27.4}/PKG-INFO +1 -1
  12. {interlatch-0.27.2 → interlatch-0.27.4}/ROADMAP.ja.md +5 -0
  13. {interlatch-0.27.2 → interlatch-0.27.4}/ROADMAP.md +5 -0
  14. interlatch-0.27.4/changelog.d/analysis-queue-dialog.md +3 -0
  15. {interlatch-0.27.2 → interlatch-0.27.4}/docker/Dockerfile +1 -1
  16. interlatch-0.27.4/docs/design/innerlatch.md +166 -0
  17. interlatch-0.27.4/docs/design/ja/innerlatch.md +162 -0
  18. {interlatch-0.27.2 → interlatch-0.27.4}/docs/development.md +8 -0
  19. {interlatch-0.27.2 → interlatch-0.27.4}/docs/install.md +9 -2
  20. {interlatch-0.27.2 → interlatch-0.27.4}/docs/ja/install.md +10 -2
  21. {interlatch-0.27.2 → interlatch-0.27.4}/docs/ja/party.md +38 -12
  22. {interlatch-0.27.2 → interlatch-0.27.4}/docs/party.md +41 -14
  23. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/analysis/queue.py +70 -1
  24. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/analysis/runners/api.py +3 -2
  25. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/analysis/runners/claude.py +25 -5
  26. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/analysis/runners/process.py +5 -3
  27. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/core/i18n/ja.py +3 -0
  28. interlatch-0.27.4/src/interlatch/core/process.py +62 -0
  29. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/core/util.py +15 -1
  30. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/cli/main.py +39 -0
  31. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/party.py +49 -0
  32. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/status.py +7 -0
  33. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/assets.py +15 -3
  34. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/handler.py +4 -8
  35. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/routes.py +4 -2
  36. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/knowledge/party.py +28 -5
  37. interlatch-0.27.4/src/interlatch/knowledge/study.py +277 -0
  38. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/runtime/connectors.py +6 -7
  39. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/runtime/install.py +6 -4
  40. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/runtime/notify.py +2 -1
  41. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/runtime/platforms/windows.py +56 -5
  42. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/runtime/statusline.py +15 -1
  43. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sharing/access.py +1 -1
  44. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sources/codex/cloud.py +3 -3
  45. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/adventure.js +25 -194
  46. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/app.css +20 -0
  47. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/app.js +73 -3
  48. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/battle.js +272 -36
  49. interlatch-0.27.4/src/interlatch/web/field.js +983 -0
  50. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/i18n.js +7 -2
  51. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/index.html +1 -1
  52. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/innerlatch.css +71 -1
  53. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/innerlatch.js +138 -13
  54. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/ja.js +48 -1
  55. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_battle_web.py +101 -0
  56. interlatch-0.27.4/tests/test_field_web.py +147 -0
  57. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_i18n_web.py +2 -2
  58. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_party_map.py +5 -3
  59. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_queue.py +45 -0
  60. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_route_matrix.py +4 -0
  61. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_statusline.py +14 -0
  62. interlatch-0.27.4/tests/test_study.py +228 -0
  63. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_windows.py +145 -0
  64. interlatch-0.27.2/changelog.d/hub-browser-sessions.md +0 -4
  65. interlatch-0.27.2/src/interlatch/core/process.py +0 -20
  66. {interlatch-0.27.2 → interlatch-0.27.4}/.github/dependabot.yml +0 -0
  67. {interlatch-0.27.2 → interlatch-0.27.4}/.github/workflows/changelog.yml +0 -0
  68. {interlatch-0.27.2 → interlatch-0.27.4}/.gitignore +0 -0
  69. {interlatch-0.27.2 → interlatch-0.27.4}/.pre-commit-config.yaml +0 -0
  70. {interlatch-0.27.2 → interlatch-0.27.4}/.python-version +0 -0
  71. {interlatch-0.27.2 → interlatch-0.27.4}/CONTRIBUTING.md +0 -0
  72. {interlatch-0.27.2 → interlatch-0.27.4}/LICENSE +0 -0
  73. {interlatch-0.27.2 → interlatch-0.27.4}/README.ja.md +0 -0
  74. {interlatch-0.27.2 → interlatch-0.27.4}/README.md +0 -0
  75. {interlatch-0.27.2 → interlatch-0.27.4}/SECURITY.md +0 -0
  76. {interlatch-0.27.2 → interlatch-0.27.4}/careers/README.md +0 -0
  77. {interlatch-0.27.2 → interlatch-0.27.4}/careers/boards.json +0 -0
  78. {interlatch-0.27.2 → interlatch-0.27.4}/careers/pipeline.py +0 -0
  79. {interlatch-0.27.2 → interlatch-0.27.4}/changelog.d/README.md +0 -0
  80. {interlatch-0.27.2 → interlatch-0.27.4}/dev.sh +0 -0
  81. {interlatch-0.27.2 → interlatch-0.27.4}/docker/.dockerignore +0 -0
  82. {interlatch-0.27.2 → interlatch-0.27.4}/docker/.env.example +0 -0
  83. {interlatch-0.27.2 → interlatch-0.27.4}/docker/Caddyfile +0 -0
  84. {interlatch-0.27.2 → interlatch-0.27.4}/docker/compose.yaml +0 -0
  85. {interlatch-0.27.2 → interlatch-0.27.4}/docker/wheels/.gitignore +0 -0
  86. {interlatch-0.27.2 → interlatch-0.27.4}/docs/README.md +0 -0
  87. {interlatch-0.27.2 → interlatch-0.27.4}/docs/_site/hooks.py +0 -0
  88. {interlatch-0.27.2 → interlatch-0.27.4}/docs/analysis.md +0 -0
  89. {interlatch-0.27.2 → interlatch-0.27.4}/docs/cli.md +0 -0
  90. {interlatch-0.27.2 → interlatch-0.27.4}/docs/configuration.md +0 -0
  91. {interlatch-0.27.2 → interlatch-0.27.4}/docs/dashboard.md +0 -0
  92. {interlatch-0.27.2 → interlatch-0.27.4}/docs/demo/make_demo.py +0 -0
  93. {interlatch-0.27.2 → interlatch-0.27.4}/docs/demo/record_demo.py +0 -0
  94. {interlatch-0.27.2 → interlatch-0.27.4}/docs/design/ja/learning.md +0 -0
  95. {interlatch-0.27.2 → interlatch-0.27.4}/docs/design/learning.md +0 -0
  96. {interlatch-0.27.2 → interlatch-0.27.4}/docs/devices.md +0 -0
  97. {interlatch-0.27.2 → interlatch-0.27.4}/docs/diagrams/analysis.excalidraw.svg +0 -0
  98. {interlatch-0.27.2 → interlatch-0.27.4}/docs/diagrams/architecture.excalidraw.svg +0 -0
  99. {interlatch-0.27.2 → interlatch-0.27.4}/docs/docker.md +0 -0
  100. {interlatch-0.27.2 → interlatch-0.27.4}/docs/faq.md +0 -0
  101. {interlatch-0.27.2 → interlatch-0.27.4}/docs/images/demo.gif +0 -0
  102. {interlatch-0.27.2 → interlatch-0.27.4}/docs/images/home.png +0 -0
  103. {interlatch-0.27.2 → interlatch-0.27.4}/docs/images/map.png +0 -0
  104. {interlatch-0.27.2 → interlatch-0.27.4}/docs/images/palette.png +0 -0
  105. {interlatch-0.27.2 → interlatch-0.27.4}/docs/images/session.png +0 -0
  106. {interlatch-0.27.2 → interlatch-0.27.4}/docs/ja/README.md +0 -0
  107. {interlatch-0.27.2 → interlatch-0.27.4}/docs/ja/analysis.md +0 -0
  108. {interlatch-0.27.2 → interlatch-0.27.4}/docs/ja/cli.md +0 -0
  109. {interlatch-0.27.2 → interlatch-0.27.4}/docs/ja/configuration.md +0 -0
  110. {interlatch-0.27.2 → interlatch-0.27.4}/docs/ja/dashboard.md +0 -0
  111. {interlatch-0.27.2 → interlatch-0.27.4}/docs/ja/development.md +0 -0
  112. {interlatch-0.27.2 → interlatch-0.27.4}/docs/ja/devices.md +0 -0
  113. {interlatch-0.27.2 → interlatch-0.27.4}/docs/ja/docker.md +0 -0
  114. {interlatch-0.27.2 → interlatch-0.27.4}/docs/ja/faq.md +0 -0
  115. {interlatch-0.27.2 → interlatch-0.27.4}/docs/ja/join-a-hub.md +0 -0
  116. {interlatch-0.27.2 → interlatch-0.27.4}/docs/ja/mcp.md +0 -0
  117. {interlatch-0.27.2 → interlatch-0.27.4}/docs/ja/moving-from-chronicle.md +0 -0
  118. {interlatch-0.27.2 → interlatch-0.27.4}/docs/ja/postgres.md +0 -0
  119. {interlatch-0.27.2 → interlatch-0.27.4}/docs/ja/privacy.md +0 -0
  120. {interlatch-0.27.2 → interlatch-0.27.4}/docs/ja/sources.md +0 -0
  121. {interlatch-0.27.2 → interlatch-0.27.4}/docs/ja/suggestions.md +0 -0
  122. {interlatch-0.27.2 → interlatch-0.27.4}/docs/ja/troubleshooting.md +0 -0
  123. {interlatch-0.27.2 → interlatch-0.27.4}/docs/ja/vscode.md +0 -0
  124. {interlatch-0.27.2 → interlatch-0.27.4}/docs/join-a-hub.md +0 -0
  125. {interlatch-0.27.2 → interlatch-0.27.4}/docs/mcp.md +0 -0
  126. {interlatch-0.27.2 → interlatch-0.27.4}/docs/moving-from-chronicle.md +0 -0
  127. {interlatch-0.27.2 → interlatch-0.27.4}/docs/postgres.md +0 -0
  128. {interlatch-0.27.2 → interlatch-0.27.4}/docs/privacy.md +0 -0
  129. {interlatch-0.27.2 → interlatch-0.27.4}/docs/sources.md +0 -0
  130. {interlatch-0.27.2 → interlatch-0.27.4}/docs/suggestions.md +0 -0
  131. {interlatch-0.27.2 → interlatch-0.27.4}/docs/troubleshooting.md +0 -0
  132. {interlatch-0.27.2 → interlatch-0.27.4}/docs/vscode.md +0 -0
  133. {interlatch-0.27.2 → interlatch-0.27.4}/leaderboard/.firebaserc +0 -0
  134. {interlatch-0.27.2 → interlatch-0.27.4}/leaderboard/.gitignore +0 -0
  135. {interlatch-0.27.2 → interlatch-0.27.4}/leaderboard/README.md +0 -0
  136. {interlatch-0.27.2 → interlatch-0.27.4}/leaderboard/firebase.json +0 -0
  137. {interlatch-0.27.2 → interlatch-0.27.4}/leaderboard/firestore.indexes.json +0 -0
  138. {interlatch-0.27.2 → interlatch-0.27.4}/leaderboard/firestore.rules +0 -0
  139. {interlatch-0.27.2 → interlatch-0.27.4}/mkdocs.yml +0 -0
  140. {interlatch-0.27.2 → interlatch-0.27.4}/packaging/icons3d/README.md +0 -0
  141. {interlatch-0.27.2 → interlatch-0.27.4}/packaging/icons3d/art.json +0 -0
  142. {interlatch-0.27.2 → interlatch-0.27.4}/packaging/icons3d/filing.html +0 -0
  143. {interlatch-0.27.2 → interlatch-0.27.4}/packaging/icons3d/loops.json +0 -0
  144. {interlatch-0.27.2 → interlatch-0.27.4}/packaging/icons3d/loops.py +0 -0
  145. {interlatch-0.27.2 → interlatch-0.27.4}/packaging/icons3d/members.js +0 -0
  146. {interlatch-0.27.2 → interlatch-0.27.4}/packaging/icons3d/render.html +0 -0
  147. {interlatch-0.27.2 → interlatch-0.27.4}/packaging/icons3d/render.py +0 -0
  148. {interlatch-0.27.2 → interlatch-0.27.4}/packaging/icons3d/scenes-more.js +0 -0
  149. {interlatch-0.27.2 → interlatch-0.27.4}/packaging/icons3d/scenes.html +0 -0
  150. {interlatch-0.27.2 → interlatch-0.27.4}/packaging/macos/Chronicle.icns +0 -0
  151. {interlatch-0.27.2 → interlatch-0.27.4}/packaging/macos/Interlatch.spec +0 -0
  152. {interlatch-0.27.2 → interlatch-0.27.4}/packaging/macos/build.sh +0 -0
  153. {interlatch-0.27.2 → interlatch-0.27.4}/packaging/macos/entitlements.plist +0 -0
  154. {interlatch-0.27.2 → interlatch-0.27.4}/packaging/macos/icon-3d.webp +0 -0
  155. {interlatch-0.27.2 → interlatch-0.27.4}/packaging/macos/icon-blueprint-prompt.md +0 -0
  156. {interlatch-0.27.2 → interlatch-0.27.4}/packaging/macos/icon-blueprint.webp +0 -0
  157. {interlatch-0.27.2 → interlatch-0.27.4}/packaging/macos/icon.png +0 -0
  158. {interlatch-0.27.2 → interlatch-0.27.4}/packaging/macos/interlatch_app.py +0 -0
  159. {interlatch-0.27.2 → interlatch-0.27.4}/packaging/macos/make_icon.py +0 -0
  160. {interlatch-0.27.2 → interlatch-0.27.4}/packaging/release.py +0 -0
  161. {interlatch-0.27.2 → interlatch-0.27.4}/pyproject.toml +0 -0
  162. {interlatch-0.27.2 → interlatch-0.27.4}/src/chronicle/__init__.py +0 -0
  163. {interlatch-0.27.2 → interlatch-0.27.4}/src/chronicle/__main__.py +0 -0
  164. {interlatch-0.27.2 → interlatch-0.27.4}/src/chronicle/windows.py +0 -0
  165. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/__init__.py +0 -0
  166. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/__main__.py +0 -0
  167. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/analysis/__init__.py +0 -0
  168. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/analysis/digest.py +0 -0
  169. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/analysis/language.py +0 -0
  170. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/analysis/runners/__init__.py +0 -0
  171. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/analysis/runners/base.py +0 -0
  172. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/analysis/runners/bob.py +0 -0
  173. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/analysis/runners/codex.py +0 -0
  174. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/analysis/runners/factory.py +0 -0
  175. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/analysis/runners/replies.py +0 -0
  176. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/analysis/runners/settings.py +0 -0
  177. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/analysis/screen.py +0 -0
  178. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/analysis/session.py +0 -0
  179. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/analysis/worker.py +0 -0
  180. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/application/__init__.py +0 -0
  181. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/application/records.py +0 -0
  182. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/application/search.py +0 -0
  183. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/application/workflows.py +0 -0
  184. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/artifacts/__init__.py +0 -0
  185. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/artifacts/files.py +0 -0
  186. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/artifacts/queries.py +0 -0
  187. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/cli.py +0 -0
  188. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/core/__init__.py +0 -0
  189. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/core/agents.py +0 -0
  190. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/core/artifact_records.py +0 -0
  191. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/core/config.py +0 -0
  192. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/core/diagrams.py +0 -0
  193. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/core/i18n/__init__.py +0 -0
  194. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/core/machine.py +0 -0
  195. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/core/paths.py +0 -0
  196. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/core/pricing.py +0 -0
  197. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/core/redact.py +0 -0
  198. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/core/sessions.py +0 -0
  199. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/ingestion/__init__.py +0 -0
  200. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/ingestion/analyses.py +0 -0
  201. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/ingestion/archive.py +0 -0
  202. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/ingestion/chat_import.py +0 -0
  203. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/ingestion/deletion.py +0 -0
  204. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/ingestion/history.py +0 -0
  205. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/ingestion/memory.py +0 -0
  206. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/ingestion/persistence.py +0 -0
  207. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/ingestion/report.py +0 -0
  208. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/ingestion/service.py +0 -0
  209. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/__init__.py +0 -0
  210. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/cli/__init__.py +0 -0
  211. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/cli/commands/__init__.py +0 -0
  212. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/cli/commands/archive.py +0 -0
  213. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/cli/commands/knowledge.py +0 -0
  214. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/cli/commands/operations.py +0 -0
  215. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/cli/commands/recording.py +0 -0
  216. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/cli/commands/setup.py +0 -0
  217. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/cli/commands/sharing.py +0 -0
  218. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/cli/common.py +0 -0
  219. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/cli/parser.py +0 -0
  220. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/exports/__init__.py +0 -0
  221. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/exports/diagrams.py +0 -0
  222. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/exports/markdown.py +0 -0
  223. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/exports/sessions.py +0 -0
  224. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/exports/vault.py +0 -0
  225. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/mcp.py +0 -0
  226. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/__init__.py +0 -0
  227. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/__init__.py +0 -0
  228. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/artifacts.py +0 -0
  229. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/common.py +0 -0
  230. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/devices.py +0 -0
  231. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/hub_admin.py +0 -0
  232. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/knowledge.py +0 -0
  233. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/leaderboard.py +0 -0
  234. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/projects.py +0 -0
  235. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/sessions.py +0 -0
  236. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/settings.py +0 -0
  237. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/sources.py +0 -0
  238. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/storage.py +0 -0
  239. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/team.py +0 -0
  240. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/app.py +0 -0
  241. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/context.py +0 -0
  242. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/jobs.py +0 -0
  243. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/server.py +0 -0
  244. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/knowledge/__init__.py +0 -0
  245. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/knowledge/arena.py +0 -0
  246. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/knowledge/bag.py +0 -0
  247. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/knowledge/cases.py +0 -0
  248. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/knowledge/formation.py +0 -0
  249. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/knowledge/friction.py +0 -0
  250. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/knowledge/glossary.py +0 -0
  251. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/knowledge/instructions.py +0 -0
  252. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/knowledge/ladder.py +0 -0
  253. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/knowledge/learning.py +0 -0
  254. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/knowledge/market.json +0 -0
  255. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/knowledge/reviews.py +0 -0
  256. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/knowledge/roadmap.json +0 -0
  257. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/knowledge/suggest.py +0 -0
  258. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/knowledge/synthesize.py +0 -0
  259. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/projects/__init__.py +0 -0
  260. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/projects/groups.py +0 -0
  261. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/projects/labels.py +0 -0
  262. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/projects/progress.py +0 -0
  263. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/projects/routing.py +0 -0
  264. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/projects/systems.py +0 -0
  265. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/runtime/__init__.py +0 -0
  266. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/runtime/container.py +0 -0
  267. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/runtime/hooks.py +0 -0
  268. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/runtime/migrate.py +0 -0
  269. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/runtime/platforms/__init__.py +0 -0
  270. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/runtime/platforms/desktop.py +0 -0
  271. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/runtime/platforms/menubar.py +0 -0
  272. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/runtime/tailnet.py +0 -0
  273. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/runtime/update.py +0 -0
  274. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sharing/__init__.py +0 -0
  275. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sharing/arena.py +0 -0
  276. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sharing/client.py +0 -0
  277. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sharing/identity.py +0 -0
  278. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sharing/leaderboard.py +0 -0
  279. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sharing/market.py +0 -0
  280. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sharing/news.py +0 -0
  281. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sharing/people.py +0 -0
  282. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sharing/projects.py +0 -0
  283. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sharing/protocol.py +0 -0
  284. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sharing/pull.py +0 -0
  285. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sharing/push.py +0 -0
  286. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sharing/receiver.py +0 -0
  287. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sources/__init__.py +0 -0
  288. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sources/antigravity.py +0 -0
  289. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sources/bob.py +0 -0
  290. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sources/builder.py +0 -0
  291. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sources/chatgpt.py +0 -0
  292. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sources/chats.py +0 -0
  293. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sources/claude/__init__.py +0 -0
  294. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sources/claude/export.py +0 -0
  295. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sources/claude/files.py +0 -0
  296. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sources/claude/parser.py +0 -0
  297. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sources/codex/__init__.py +0 -0
  298. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sources/codex/parser.py +0 -0
  299. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sources/copilot.py +0 -0
  300. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sources/discovery.py +0 -0
  301. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sources/opencode.py +0 -0
  302. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sources/prompts.py +0 -0
  303. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/storage/__init__.py +0 -0
  304. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/storage/fts.py +0 -0
  305. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/storage/kv.py +0 -0
  306. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/storage/migrations.py +0 -0
  307. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/storage/mirror.py +0 -0
  308. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/storage/postgres.py +0 -0
  309. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/storage/schema.py +0 -0
  310. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/storage/sqlite.py +0 -0
  311. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/storage/team.py +0 -0
  312. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/AGENT-ICONS.txt +0 -0
  313. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/PLEX-OFL.txt +0 -0
  314. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/agent-antigravity.svg +0 -0
  315. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/agent-bob.svg +0 -0
  316. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/agent-chatgpt.svg +0 -0
  317. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/agent-claude-ai.svg +0 -0
  318. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/agent-claude.svg +0 -0
  319. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/agent-codex.svg +0 -0
  320. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/agent-copilot.svg +0 -0
  321. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/agent-opencode.svg +0 -0
  322. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-book.webp +0 -0
  323. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-camera.webp +0 -0
  324. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-chip.webp +0 -0
  325. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-clock.webp +0 -0
  326. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-cloud.webp +0 -0
  327. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-coins.webp +0 -0
  328. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-container.webp +0 -0
  329. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-dashboard.webp +0 -0
  330. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-dex.webp +0 -0
  331. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-document.webp +0 -0
  332. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-flag.webp +0 -0
  333. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-folder.webp +0 -0
  334. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-gateway.webp +0 -0
  335. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-gears.webp +0 -0
  336. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-glitch.webp +0 -0
  337. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-globe.webp +0 -0
  338. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-laptop.webp +0 -0
  339. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-log.webp +0 -0
  340. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-lumi.webp +0 -0
  341. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-magnifier.webp +0 -0
  342. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-pip.webp +0 -0
  343. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-plug.webp +0 -0
  344. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-rack.webp +0 -0
  345. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-tink.webp +0 -0
  346. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/boot.js +0 -0
  347. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/favicon.png +0 -0
  348. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/icon-180.png +0 -0
  349. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/icon-192.png +0 -0
  350. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/icon-512.png +0 -0
  351. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/icon.png +0 -0
  352. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/learning.js +0 -0
  353. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/manifest.webmanifest +0 -0
  354. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/panel.css +0 -0
  355. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/panel.html +0 -0
  356. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/panel.js +0 -0
  357. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/plex-mono-400.woff2 +0 -0
  358. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/plex-mono-500.woff2 +0 -0
  359. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/plex-mono-600.woff2 +0 -0
  360. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/plex-sans-400.woff2 +0 -0
  361. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/plex-sans-500.woff2 +0 -0
  362. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/plex-sans-600.woff2 +0 -0
  363. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/plex-sans-700.woff2 +0 -0
  364. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/rough.js +0 -0
  365. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/scene.js +0 -0
  366. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/sprites.js +0 -0
  367. {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/windows.py +0 -0
  368. {interlatch-0.27.2 → interlatch-0.27.4}/tests/antigravity_fixture.py +0 -0
  369. {interlatch-0.27.2 → interlatch-0.27.4}/tests/codex_fixture.py +0 -0
  370. {interlatch-0.27.2 → interlatch-0.27.4}/tests/conftest.py +0 -0
  371. {interlatch-0.27.2 → interlatch-0.27.4}/tests/copilot_fixture.py +0 -0
  372. {interlatch-0.27.2 → interlatch-0.27.4}/tests/friction_fixture.py +0 -0
  373. {interlatch-0.27.2 → interlatch-0.27.4}/tests/golden.py +0 -0
  374. {interlatch-0.27.2 → interlatch-0.27.4}/tests/goldens/cli.json +0 -0
  375. {interlatch-0.27.2 → interlatch-0.27.4}/tests/goldens/diagram.json +0 -0
  376. {interlatch-0.27.2 → interlatch-0.27.4}/tests/goldens/parsers/antigravity.json +0 -0
  377. {interlatch-0.27.2 → interlatch-0.27.4}/tests/goldens/parsers/bob.json +0 -0
  378. {interlatch-0.27.2 → interlatch-0.27.4}/tests/goldens/parsers/claude_code.json +0 -0
  379. {interlatch-0.27.2 → interlatch-0.27.4}/tests/goldens/parsers/codex.json +0 -0
  380. {interlatch-0.27.2 → interlatch-0.27.4}/tests/goldens/parsers/copilot.json +0 -0
  381. {interlatch-0.27.2 → interlatch-0.27.4}/tests/goldens/parsers/opencode.json +0 -0
  382. {interlatch-0.27.2 → interlatch-0.27.4}/tests/goldens/systems.json +0 -0
  383. {interlatch-0.27.2 → interlatch-0.27.4}/tests/opencode_fixture.py +0 -0
  384. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_adventure_web.py +0 -0
  385. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_analysis.py +0 -0
  386. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_antigravity.py +0 -0
  387. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_architecture.py +0 -0
  388. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_arena.py +0 -0
  389. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_artifacts.py +0 -0
  390. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_bag.py +0 -0
  391. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_bob_analysis.py +0 -0
  392. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_boot_web.py +0 -0
  393. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_careers.py +0 -0
  394. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_case_files.py +0 -0
  395. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_cases.py +0 -0
  396. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_chat_import.py +0 -0
  397. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_cli_pins.py +0 -0
  398. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_codex.py +0 -0
  399. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_codex_analysis.py +0 -0
  400. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_codex_cloud.py +0 -0
  401. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_container.py +0 -0
  402. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_copilot_bob.py +0 -0
  403. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_dedicated_hub.py +0 -0
  404. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_dedupe.py +0 -0
  405. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_desktop.py +0 -0
  406. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_diagram.py +0 -0
  407. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_ee_boundary.py +0 -0
  408. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_formation.py +0 -0
  409. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_friction.py +0 -0
  410. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_glossary.py +0 -0
  411. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_group_sharing.py +0 -0
  412. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_home_agents.py +0 -0
  413. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_hub.py +0 -0
  414. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_hub_accept.py +0 -0
  415. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_hub_news.py +0 -0
  416. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_hub_projects.py +0 -0
  417. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_hub_projects_listed.py +0 -0
  418. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_hub_purge.py +0 -0
  419. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_hub_sharing_race.py +0 -0
  420. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_ingest.py +0 -0
  421. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_instructions.py +0 -0
  422. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_integration.py +0 -0
  423. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_ladder.py +0 -0
  424. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_language.py +0 -0
  425. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_leaderboard.py +0 -0
  426. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_learning_glance.py +0 -0
  427. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_learning_interests.py +0 -0
  428. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_learning_web.py +0 -0
  429. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_leave_project.py +0 -0
  430. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_legacy_package.py +0 -0
  431. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_map_goldens.py +0 -0
  432. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_market.py +0 -0
  433. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_menubar.py +0 -0
  434. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_migrate.py +0 -0
  435. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_mirror.py +0 -0
  436. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_notify.py +0 -0
  437. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_opencode.py +0 -0
  438. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_parser.py +0 -0
  439. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_parser_goldens.py +0 -0
  440. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_party.py +0 -0
  441. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_people.py +0 -0
  442. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_people_hub.py +0 -0
  443. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_people_web.py +0 -0
  444. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_project_groups.py +0 -0
  445. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_project_progress.py +0 -0
  446. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_providers.py +0 -0
  447. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_regressions.py +0 -0
  448. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_release.py +0 -0
  449. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_roadmap_catalog.py +0 -0
  450. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_screen.py +0 -0
  451. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_security.py +0 -0
  452. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_setup.py +0 -0
  453. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_suggest.py +0 -0
  454. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_suggest_cli.py +0 -0
  455. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_systems.py +0 -0
  456. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_team.py +0 -0
  457. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_team_home.py +0 -0
  458. {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_update.py +0 -0
  459. {interlatch-0.27.2 → interlatch-0.27.4}/tests/windows_smoke.py +0 -0
  460. {interlatch-0.27.2 → interlatch-0.27.4}/uv.lock +0 -0
  461. {interlatch-0.27.2 → interlatch-0.27.4}/vscode-extension/.vscodeignore +0 -0
  462. {interlatch-0.27.2 → interlatch-0.27.4}/vscode-extension/LICENSE +0 -0
  463. {interlatch-0.27.2 → interlatch-0.27.4}/vscode-extension/README.md +0 -0
  464. {interlatch-0.27.2 → interlatch-0.27.4}/vscode-extension/extension.js +0 -0
  465. {interlatch-0.27.2 → interlatch-0.27.4}/vscode-extension/media/icon.png +0 -0
  466. {interlatch-0.27.2 → interlatch-0.27.4}/vscode-extension/media/interlatch.svg +0 -0
  467. {interlatch-0.27.2 → interlatch-0.27.4}/vscode-extension/package.json +0 -0
@@ -0,0 +1,51 @@
1
+ # Runs user.ps1 as a new standard (non-admin) local user named in Japanese, through a scheduled task with its password
2
+ # (CI has no interactive sign-in to run it in), and waits for it. ASCII only, as user.ps1.
3
+ param([string]$Source = 'interlatch', [string]$Phase = 'install')
4
+ $ErrorActionPreference = 'Stop'
5
+ $name = -join ([char]0x5C71, [char]0x7530, [char]0x592A, [char]0x90CE) # Yamada Taro
6
+ $qa = 'C:\qa'
7
+ $pwFile = Join-Path $env:RUNNER_TEMP 'qa-user-pw.txt'
8
+ if ($Phase -eq 'install') {
9
+ New-Item -ItemType Directory -Force $qa | Out-Null
10
+ $pw = 'Qa-' + [guid]::NewGuid().ToString('N').Substring(0, 16) + '!a1'
11
+ Set-Content -LiteralPath $pwFile -Value $pw
12
+ New-LocalUser -Name $name -Password (ConvertTo-SecureString $pw -AsPlainText -Force) -PasswordNeverExpires | Out-Null
13
+ Add-LocalGroupMember -Group (Get-LocalGroup -SID 'S-1-5-32-545') -Member $name # Users, not Administrators
14
+ icacls.exe $qa /reset /T /Q | Out-Null # Git Bash gives the files it writes permissions of their own
15
+ icacls.exe $qa /grant "${name}:(OI)(CI)F" /T /Q | Out-Null
16
+ # a task with a stored password signs in as a batch job, which a new standard user may not
17
+ $sid = (New-Object System.Security.Principal.NTAccount($name)).Translate([System.Security.Principal.SecurityIdentifier]).Value
18
+ $inf = Join-Path $env:RUNNER_TEMP 'rights.inf'
19
+ secedit.exe /export /cfg $inf /areas USER_RIGHTS | Out-Null
20
+ $lines = Get-Content -LiteralPath $inf
21
+ if ($lines -match '^SeBatchLogonRight') {
22
+ $lines = $lines -replace '^(SeBatchLogonRight = .*)$', "`$1,*$sid"
23
+ } else {
24
+ $lines = $lines -replace '^\[Privilege Rights\]$', "[Privilege Rights]`r`nSeBatchLogonRight = *$sid"
25
+ }
26
+ Set-Content -LiteralPath $inf -Value $lines -Encoding Unicode
27
+ secedit.exe /configure /db (Join-Path $env:RUNNER_TEMP 'rights.sdb') /cfg $inf /areas USER_RIGHTS | Out-Null
28
+ wevtutil.exe sl Microsoft-Windows-TaskScheduler/Operational /e:true
29
+ } else {
30
+ $pw = Get-Content -LiteralPath $pwFile
31
+ }
32
+ $task = "qa-ja-$Phase"
33
+ $arg = "-NoProfile -ExecutionPolicy Bypass -File C:\qa\user.ps1 -Phase $Phase -Source `"$Source`""
34
+ $action = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument $arg
35
+ $settings = New-ScheduledTaskSettingsSet -ExecutionTimeLimit (New-TimeSpan -Minutes 30)
36
+ Register-ScheduledTask -TaskName $task -Action $action -Settings $settings -User $name -Password $pw -RunLevel Limited | Out-Null
37
+ Start-ScheduledTask -TaskName $task
38
+ $started = Get-Date
39
+ # 267011: has not run yet; 267009: running
40
+ do {
41
+ Start-Sleep -Seconds 5
42
+ $state = (Get-ScheduledTask -TaskName $task).State
43
+ $info = Get-ScheduledTaskInfo -TaskName $task
44
+ $waiting = $state -in 'Running', 'Queued' -or $info.LastTaskResult -in 267011, 267009
45
+ $minutes = ((Get-Date) - $started).TotalMinutes
46
+ } while ($waiting -and $minutes -lt 30 -and -not ($info.LastTaskResult -eq 267011 -and $state -eq 'Ready' -and $minutes -gt 3))
47
+ Write-Host ("task {0}: state {1}, last result {2}, last run {3}" -f $task, $state, $info.LastTaskResult, $info.LastRunTime)
48
+ if ($info.LastTaskResult -eq 267011) {
49
+ Get-WinEvent -LogName Microsoft-Windows-TaskScheduler/Operational -MaxEvents 30 -ErrorAction SilentlyContinue |
50
+ Where-Object { $_.Message -match 'qa-ja' } | ForEach-Object { Write-Host ("{0} {1}: {2}" -f $_.TimeCreated, $_.Id, $_.Message) }
51
+ }
@@ -0,0 +1,152 @@
1
+ """Checks run as the Japanese-named user after the documented install (user.ps1). Standard library only, ASCII source.
2
+
3
+ python ja_check.py prepare # a Claude Code session in a Japanese-named folder, before `interlatch install`
4
+ python ja_check.py check # what install did: the session, the hooks through Git Bash and PowerShell, the tasks
5
+
6
+ Prints one line per check and writes C:\\qa\\ja_check.json.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import ctypes
12
+ import json
13
+ import locale
14
+ import os
15
+ import shutil
16
+ import sqlite3
17
+ import subprocess
18
+ import sys
19
+ import time
20
+ import uuid
21
+ from pathlib import Path
22
+
23
+ HOME = Path.home()
24
+ CLAUDE = HOME / ".claude"
25
+ DATA = HOME / ".interlatch"
26
+ CWD = "C:\\\u4f5c\u696d\\\u30a2\u30d7\u30ea" # C:\<sagyou>\<apuri>
27
+ PROMPT = "\u30ed\u30b0\u30a4\u30f3\u306e\u30c6\u30b9\u30c8\u3092\u76f4\u3057\u3066" # "fix the login test"
28
+ PROJECT_DIR = "".join(c if c.isascii() and c.isalnum() else "-" for c in CWD) # as Claude Code names it
29
+ RESULTS: list[dict] = []
30
+
31
+
32
+ def check(ok: bool, what: str, detail: str = "") -> bool:
33
+ RESULTS.append({"ok": bool(ok), "what": what, "detail": detail})
34
+ print(f"{'ok ' if ok else 'FAIL'} {what}" + (f"\n {detail}" if detail else ""), flush=True)
35
+ return ok
36
+
37
+
38
+ def transcript(text: str) -> tuple[str, Path]:
39
+ sid = str(uuid.uuid4())
40
+ base = {"isSidechain": False, "userType": "external", "entrypoint": "cli", "cwd": CWD, "sessionId": sid,
41
+ "version": "2.1.300", "gitBranch": "main"}
42
+ lines = [
43
+ {**base, "type": "user", "uuid": "u1", "parentUuid": None, "timestamp": "2026-10-16T10:00:00.000Z",
44
+ "message": {"role": "user", "content": [{"type": "text", "text": text}]}},
45
+ {**base, "type": "assistant", "uuid": "a1", "parentUuid": "u1", "timestamp": "2026-10-16T10:00:05.000Z",
46
+ "requestId": "req1", "message": {"id": "msg_1", "model": "claude-opus-5-5", "role": "assistant",
47
+ "content": [{"type": "text", "text": "\u76f4\u3057\u307e\u3057\u305f\u3002"}],
48
+ "usage": {"input_tokens": 10, "output_tokens": 5}}},
49
+ ]
50
+ path = CLAUDE / "projects" / PROJECT_DIR / f"{sid}.jsonl"
51
+ path.parent.mkdir(parents=True, exist_ok=True)
52
+ path.write_text("".join(json.dumps(line, ensure_ascii=False) + "\n" for line in lines), encoding="utf-8")
53
+ return sid, path
54
+
55
+
56
+ def session(sid: str) -> dict | None:
57
+ db = DATA / "chronicle.db"
58
+ if not db.exists():
59
+ return None
60
+ conn = sqlite3.connect(db)
61
+ conn.row_factory = sqlite3.Row
62
+ try:
63
+ row = conn.execute("SELECT first_prompt, project_name, project_path FROM sessions WHERE id = ?", (sid,)).fetchone()
64
+ except sqlite3.Error:
65
+ return None
66
+ finally:
67
+ conn.close()
68
+ return dict(row) if row else None
69
+
70
+
71
+ def wait_for(fn, seconds: float):
72
+ deadline = time.monotonic() + seconds
73
+ while time.monotonic() < deadline:
74
+ if found := fn():
75
+ return found
76
+ time.sleep(2)
77
+ return fn()
78
+
79
+
80
+ def raw(argv: list[str], **kw) -> subprocess.CompletedProcess:
81
+ return subprocess.run(argv, capture_output=True, **kw)
82
+
83
+
84
+ def describe(data: bytes) -> str:
85
+ """How these bytes read: as UTF-8 if they are, else as cp932, with the first non-ASCII bytes."""
86
+ try:
87
+ return "utf-8: " + data.decode("utf-8")[:400]
88
+ except UnicodeDecodeError:
89
+ odd = bytes(b for b in data if b > 0x7F)[:24].hex(" ")
90
+ return f"NOT utf-8 (bytes {odd}); as cp932: " + data.decode("cp932", "replace")[:400]
91
+
92
+
93
+ def main() -> int:
94
+ sys.stdout.reconfigure(encoding="utf-8")
95
+ phase = sys.argv[1]
96
+ if phase == "prepare":
97
+ sid, path = transcript(PROMPT)
98
+ (Path("C:/qa") / "first_session.txt").write_text(sid, encoding="ascii")
99
+ print(f"wrote {path}")
100
+ return 0
101
+
102
+ k32 = ctypes.windll.kernel32
103
+ print(f"python {sys.version.split()[0]} utf8_mode={sys.flags.utf8_mode} locale={locale.getpreferredencoding(False)} "
104
+ f"acp={k32.GetACP()} oemcp={k32.GetOEMCP()} console_out_cp={k32.GetConsoleOutputCP()} home={HOME}")
105
+ exe = shutil.which("interlatch")
106
+ check(bool(exe), "interlatch is on PATH", str(exe))
107
+
108
+ first = (Path("C:/qa") / "first_session.txt").read_text(encoding="ascii").strip()
109
+ s = session(first)
110
+ check(bool(s), "install imported the session in the Japanese-named folder", repr(s))
111
+ if s:
112
+ check(s["first_prompt"] == PROMPT, "its Japanese prompt is intact", repr(s["first_prompt"]))
113
+ check(s["project_path"] == CWD, "its project path is the Japanese folder", repr(s["project_path"]))
114
+
115
+ settings_file = CLAUDE / "settings.json"
116
+ settings = json.loads(settings_file.read_text(encoding="utf-8")) if settings_file.exists() else {}
117
+ try:
118
+ command = settings["hooks"]["SessionEnd"][0]["hooks"][0]["command"]
119
+ except (KeyError, IndexError, TypeError):
120
+ command = ""
121
+ check(bool(command), "install added the SessionEnd hook", repr(command) or json.dumps(settings)[:300])
122
+
123
+ git_bash = Path(os.environ.get("ProgramFiles", "C:\\Program Files")) / "Git" / "bin" / "bash.exe"
124
+ for shell, argv in (("Git Bash", [str(git_bash), "-c", command]),
125
+ ("PowerShell", ["powershell", "-NoProfile", "-Command", command])):
126
+ if not command:
127
+ break
128
+ sid, path = transcript(f"{PROMPT} ({shell})")
129
+ payload = json.dumps({"session_id": sid, "transcript_path": str(path), "cwd": CWD,
130
+ "hook_event_name": "SessionEnd", "reason": "exit"}, ensure_ascii=False).encode("utf-8")
131
+ proc = raw(argv, input=payload)
132
+ check(proc.returncode == 0, f"the hook runs in {shell}",
133
+ f"exit {proc.returncode}; stdout {describe(proc.stdout)}; stderr {describe(proc.stderr)}")
134
+ got = wait_for(lambda sid=sid: session(sid), 90)
135
+ check(bool(got) and got["first_prompt"].startswith(PROMPT), f"the session the hook ({shell}) named was recorded",
136
+ repr(got))
137
+
138
+ for task in ("\\Interlatch\\Sync", "\\Interlatch\\Dashboard"):
139
+ proc = raw(["schtasks", "/Query", "/TN", task, "/V", "/FO", "CSV", "/NH"])
140
+ check(proc.returncode == 0, f"task {task} was registered by a standard user",
141
+ f"stdout {describe(proc.stdout)}; stderr {describe(proc.stderr)}")
142
+ proc = raw(["schtasks", "/Query", "/TN", "\\Interlatch\\NoSuchTask"])
143
+ print("schtasks error bytes:", describe(proc.stderr))
144
+
145
+ (Path("C:/qa") / "ja_check.json").write_text(json.dumps(RESULTS, ensure_ascii=False, indent=1), encoding="utf-8")
146
+ failed = [r["what"] for r in RESULTS if not r["ok"]]
147
+ print(f"\n{len(failed)} failed" + (": " + "; ".join(failed) if failed else ""))
148
+ return 1 if failed else 0
149
+
150
+
151
+ if __name__ == "__main__":
152
+ raise SystemExit(main())
@@ -0,0 +1,28 @@
1
+ """Print what user.ps1 left in C:\\qa: its log, then every step's stdout and stderr, saying when bytes are not UTF-8."""
2
+
3
+ import sys
4
+ from pathlib import Path
5
+
6
+ QA = Path("C:/qa")
7
+
8
+
9
+ def show(path: Path) -> None:
10
+ data = path.read_bytes()
11
+ if not data.strip():
12
+ return
13
+ try:
14
+ text, note = data.decode("utf-8-sig"), ""
15
+ except UnicodeDecodeError:
16
+ odd = bytes(b for b in data if b > 0x7F)[:32].hex(" ")
17
+ text, note = data.decode("cp932", "replace"), f" [NOT UTF-8: bytes {odd} ...; shown as cp932]"
18
+ print(f"----- {path.name}{note}\n{text.rstrip()[-6000:]}")
19
+
20
+
21
+ sys.stdout.reconfigure(encoding="utf-8")
22
+ log = QA / "user.log"
23
+ print(log.read_text(encoding="utf-8-sig") if log.exists() else "(no user.log)")
24
+ for p in sorted(QA.glob("*.out")) + sorted(QA.glob("*.err")):
25
+ show(p)
26
+ logs = Path("C:/Users").glob("*/.interlatch/logs/*.log")
27
+ for p in logs:
28
+ show(p)
@@ -0,0 +1,84 @@
1
+ """Screenshots of the dashboard in Microsoft Edge on Windows, in Japanese (ja-JP), with what went wrong on each page.
2
+
3
+ python shots.py <base url> <out dir> <tag>
4
+
5
+ Each page at 100% and 150% display scaling (a common Windows laptop setting). Console errors, failed requests and the
6
+ Content-Type of every script and stylesheet go to <out dir>/<tag>-report.txt.
7
+ """
8
+
9
+ import sys
10
+ import time
11
+ import urllib.request
12
+ from pathlib import Path
13
+
14
+ from playwright.sync_api import sync_playwright
15
+
16
+ BASE, OUT, TAG = sys.argv[1].rstrip("/"), Path(sys.argv[2]), sys.argv[3]
17
+ PAGES = ["#/", "#/sessions", "#/knowledge/all", "#/projects", "#/learn", "#/glossary", "#/map", "#/status",
18
+ "#/sources", "#/reviews", "#/appearance", "#/storage"]
19
+ REALM = ["#/innerlatch", "#/innerlatch/quests", "#/innerlatch/journey", "#/innerlatch/agent/claude",
20
+ "#/innerlatch/adventure", "#/innerlatch/adventure?view=list", "#/innerlatch/adventure/bag",
21
+ "#/innerlatch/leaderboard", "#/innerlatch/arena"]
22
+ OUT.mkdir(parents=True, exist_ok=True)
23
+ lines: list[str] = []
24
+
25
+
26
+ def settle(page) -> None:
27
+ try:
28
+ page.locator("#app:not([aria-busy='true'])").wait_for(timeout=20000) # a selector: the page's CSP has no eval
29
+ except Exception as exc: # noqa: BLE001
30
+ lines.append(f" still busy: {exc}")
31
+ page.wait_for_timeout(1500)
32
+
33
+
34
+ def slug(route: str) -> str:
35
+ return route.strip("#/").replace("/", "_").replace("?", "_").replace("=", "-") or "home"
36
+
37
+
38
+ sys.stdout.reconfigure(encoding="utf-8")
39
+ deadline = time.monotonic() + 180
40
+ while True:
41
+ try:
42
+ urllib.request.urlopen(BASE + "/", timeout=5).close()
43
+ break
44
+ except OSError as exc:
45
+ if time.monotonic() > deadline:
46
+ sys.exit(f"{BASE} never answered: {exc}")
47
+ time.sleep(3)
48
+ with sync_playwright() as pw:
49
+ browser = pw.chromium.launch(channel="msedge")
50
+ for scale in (1, 1.5):
51
+ ctx = browser.new_context(locale="ja-JP", timezone_id="Asia/Tokyo", viewport={"width": 1366, "height": 860},
52
+ device_scale_factor=scale)
53
+ page = ctx.new_page()
54
+ page.on("console", lambda m: m.type in ("error", "warning") and lines.append(f" console {m.type}: {m.text}"))
55
+ page.on("pageerror", lambda e: lines.append(f" page error: {e}"))
56
+ page.on("requestfailed", lambda r: lines.append(f" request failed: {r.url} {r.failure}"))
57
+
58
+ def response(r):
59
+ url = r.url.split("?")[0]
60
+ if url.endswith((".js", ".css", ".woff2", ".svg", ".webp", ".png", ".html")) or url.rstrip("/") == BASE:
61
+ lines.append(f" {r.status} {r.headers.get('content-type')} {url}")
62
+ elif r.status >= 400:
63
+ lines.append(f" HTTP {r.status} {url}")
64
+ page.on("response", response)
65
+ for i, route in enumerate(PAGES + REALM):
66
+ lines.append(f"[{scale}x] {route}")
67
+ if i == 0:
68
+ page.goto(f"{BASE}/{route}")
69
+ elif route in REALM and route == REALM[0]:
70
+ door = page.locator("a.rail-door")
71
+ if door.count():
72
+ door.first.click()
73
+ page.wait_for_timeout(4000)
74
+ else:
75
+ lines.append(" no Innerlatch door on the rail")
76
+ page.evaluate("r => { location.hash = r; }", route)
77
+ else:
78
+ page.evaluate("r => { location.hash = r; }", route)
79
+ settle(page)
80
+ page.screenshot(path=str(OUT / f"{TAG}-{scale}x-{i:02d}-{slug(route)}.png"), full_page=False)
81
+ ctx.close()
82
+ browser.close()
83
+ (OUT / f"{TAG}-report.txt").write_text("\n".join(lines), encoding="utf-8")
84
+ print("\n".join(line for line in lines if not line.startswith(" 200 ")))
@@ -0,0 +1,48 @@
1
+ # The documented Windows install (docs/install.md#windows), run as a standard user named in Japanese (profile
2
+ # C:\Users\<name>) with the console in code page 932, as on Japanese Windows. Each step's stdout and stderr are kept
3
+ # byte for byte in C:\qa\<step>.out / .err. ASCII only: Windows PowerShell reads a BOM-less script in the ANSI code page.
4
+ param([string]$Source = 'interlatch', [string]$Phase = 'install')
5
+ $ErrorActionPreference = 'Continue'
6
+ $qa = 'C:\qa'
7
+ $log = Join-Path $qa 'user.log'
8
+ $noInput = Join-Path $qa 'no-input.txt' # no terminal to answer from: install takes its defaults
9
+ Set-Content -LiteralPath $noInput -Value '' -Encoding ASCII
10
+ function Log([string]$s) { Add-Content -LiteralPath $log -Value $s -Encoding UTF8 }
11
+ function Step([string]$name, [string]$exe, [string]$arguments) {
12
+ $o = Join-Path $qa "$name.out"; $e = Join-Path $qa "$name.err"
13
+ try {
14
+ $p = Start-Process -FilePath $exe -ArgumentList $arguments -NoNewWindow -Wait -PassThru `
15
+ -RedirectStandardInput $noInput -RedirectStandardOutput $o -RedirectStandardError $e
16
+ Log ("=== {0}: {1} {2} -> exit {3}" -f $name, $exe, $arguments, $p.ExitCode)
17
+ } catch {
18
+ Log ("=== {0}: {1} {2} -> could not start: {3}" -f $name, $exe, $arguments, $_)
19
+ }
20
+ }
21
+
22
+ chcp.com 932 | Out-Null
23
+ $py = "--python 3.13"
24
+
25
+ if ($Phase -eq 'install') {
26
+ Log ("user={0} profile={1} console_cp={2} culture={3} ui={4}" -f $env:USERNAME, $env:USERPROFILE,
27
+ [Console]::OutputEncoding.CodePage, (Get-Culture).Name, (Get-UICulture).Name)
28
+ # the docs' lines exactly as written, one after the other in one PowerShell window, as a user types them
29
+ $docs = Get-Content -LiteralPath (Join-Path $qa 'docs-lines.txt') | ForEach-Object { $_ -replace '\{SOURCE\}', $Source }
30
+ Set-Content -LiteralPath (Join-Path $qa 'docs.ps1') -Value $docs -Encoding ASCII
31
+ Step '00-docs-verbatim' 'powershell.exe' '-NoProfile -ExecutionPolicy Bypass -File C:\qa\docs.ps1'
32
+ $env:Path = (Join-Path $env:USERPROFILE '.local\bin') + ';' + $env:Path # as a new window would have it
33
+ Step '02-uv-tool-install' 'uv.exe' "tool install $py $Source"
34
+ Step '03-version' 'interlatch.exe' '--version'
35
+ Step '04-prepare' 'uv.exe' "run --no-project $py python C:\qa\ja_check.py prepare"
36
+ Step '05-install' 'interlatch.exe' 'install'
37
+ Step '06-status' 'interlatch.exe' 'status'
38
+ Step '07-check' 'uv.exe' "run --no-project $py python C:\qa\ja_check.py check"
39
+ # a dashboard for the screenshots (the Dashboard task needs an interactive sign-in, which CI has not got)
40
+ Start-Process -FilePath 'interlatch.exe' -ArgumentList 'ui --port 11530' -WindowStyle Hidden `
41
+ -RedirectStandardOutput (Join-Path $qa 'ui.out') -RedirectStandardError (Join-Path $qa 'ui.err')
42
+ Start-Sleep -Seconds 8
43
+ Log 'dashboard started on :11530'
44
+ } else {
45
+ Step '20-uninstall' 'interlatch.exe' 'uninstall'
46
+ Step '21-tasks-after' 'schtasks.exe' '/Query /TN \Interlatch\Sync'
47
+ }
48
+ Log "done $Phase"
@@ -25,7 +25,7 @@ jobs:
25
25
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
26
26
  with:
27
27
  persist-credentials: false
28
- - uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
28
+ - uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
29
29
  - run: uv run --locked pytest -q
30
30
 
31
31
  windows:
@@ -40,7 +40,7 @@ jobs:
40
40
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
41
41
  with:
42
42
  persist-credentials: false
43
- - uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
43
+ - uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
44
44
  - run: uv run --locked pytest -q tests/test_windows.py
45
45
  - name: Install the wheel as a uv tool, as a user would
46
46
  # where uv's installer and uv tool put things on a user's PC, which the Task Scheduler tasks find too
@@ -77,7 +77,7 @@ jobs:
77
77
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
78
78
  with:
79
79
  persist-credentials: false
80
- - uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
80
+ - uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
81
81
  - name: The Postgres tests, none of them skipped
82
82
  run: |
83
83
  printf 'PGHOST=127.0.0.1\nPGPORT=5432\nPGDATABASE=chronicle\nPGUSER=chronicle\nPGPASSWORD=chronicle\nPGSSLMODE=disable\n' > "$RUNNER_TEMP/pg.env"
@@ -95,7 +95,7 @@ jobs:
95
95
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
96
96
  with:
97
97
  persist-credentials: false
98
- - uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
98
+ - uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
99
99
  - run: uvx pre-commit run --all-files --show-diff-on-failure
100
100
 
101
101
  audit:
@@ -104,7 +104,7 @@ jobs:
104
104
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
105
105
  with:
106
106
  persist-credentials: false
107
- - uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
107
+ - uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
108
108
  - name: pip-audit on uv.lock
109
109
  run: |
110
110
  uv export --frozen --all-groups --no-emit-project --format requirements.txt -o "$RUNNER_TEMP/requirements.txt"
@@ -116,7 +116,7 @@ jobs:
116
116
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
117
117
  with:
118
118
  persist-credentials: false
119
- - uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
119
+ - uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
120
120
  - name: Build the hub's image from this checkout
121
121
  run: |
122
122
  uv build --wheel -o docker/wheels
@@ -27,7 +27,7 @@ jobs:
27
27
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
28
28
  with:
29
29
  persist-credentials: false
30
- - uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
30
+ - uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
31
31
  - run: uv run --locked --only-group docs mkdocs build --strict
32
32
  env:
33
33
  NO_MKDOCS_2_WARNING: "1"
@@ -76,7 +76,7 @@ jobs:
76
76
 
77
77
  test:
78
78
  needs: plan
79
- runs-on: macos-14
79
+ runs-on: macos-15
80
80
  permissions:
81
81
  contents: read
82
82
  steps:
@@ -84,7 +84,7 @@ jobs:
84
84
  with:
85
85
  fetch-depth: 0 # the version comes from the tags
86
86
  persist-credentials: false
87
- - uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
87
+ - uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
88
88
  with:
89
89
  enable-cache: false # a release never restores a cache another run could have written
90
90
  - run: uv run --locked pytest -q
@@ -126,7 +126,7 @@ jobs:
126
126
  ref: v${{ needs.plan.outputs.version }}
127
127
  fetch-depth: 0 # the version comes from the tag
128
128
  persist-credentials: false
129
- - uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
129
+ - uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
130
130
  with:
131
131
  enable-cache: false # a release never restores a cache another run could have written
132
132
  - run: uv build
@@ -238,7 +238,7 @@ jobs:
238
238
  if: >-
239
239
  !cancelled() && needs.test.result == 'success'
240
240
  && contains(fromJSON('["success", "skipped"]'), needs.release.result)
241
- runs-on: macos-14 # Apple silicon; PyInstaller cannot cross-build, so an Intel build needs an Intel runner
241
+ runs-on: macos-15 # Apple silicon; PyInstaller cannot cross-build, so an Intel build needs an Intel runner
242
242
  permissions:
243
243
  contents: write # upload the DMG to the release
244
244
  env:
@@ -250,7 +250,7 @@ jobs:
250
250
  ref: ${{ needs.plan.outputs.version != '' && format('v{0}', needs.plan.outputs.version) || github.sha }}
251
251
  fetch-depth: 0 # the version comes from the tags
252
252
  persist-credentials: false
253
- - uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
253
+ - uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
254
254
  with:
255
255
  enable-cache: false # a release never restores a cache another run could have written
256
256
 
@@ -287,7 +287,7 @@ jobs:
287
287
 
288
288
  - name: Keep DMG as a workflow artifact
289
289
  if: env.VERSION == ''
290
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
290
+ uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
291
291
  with:
292
292
  name: Interlatch-dmg
293
293
  path: dist/Interlatch-*.dmg
@@ -0,0 +1,108 @@
1
+ name: Windows (Japanese) QA
2
+
3
+ # The documented Windows install as a standard user named in Japanese, with the console in code page 932, then the
4
+ # dashboard in Edge in Japanese (docs/development.md, Continuous integration). Runs on demand; `source` is what
5
+ # `uv tool install` installs.
6
+
7
+ on:
8
+ workflow_dispatch:
9
+ inputs:
10
+ source:
11
+ description: "pypi (the released interlatch) or wheel (built from this branch)"
12
+ default: wheel
13
+
14
+ permissions:
15
+ contents: read
16
+
17
+ jobs:
18
+ demo:
19
+ runs-on: ubuntu-latest
20
+ steps:
21
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
22
+ with:
23
+ persist-credentials: false
24
+ - uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
25
+ - run: |
26
+ uv run --locked python docs/demo/make_demo.py "$RUNNER_TEMP/demo"
27
+ tar -C "$RUNNER_TEMP/demo" -czf "$RUNNER_TEMP/demo-home.tgz" home
28
+ - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
29
+ with:
30
+ name: demo-home
31
+ path: ${{ runner.temp }}/demo-home.tgz
32
+
33
+ japanese:
34
+ needs: demo
35
+ strategy:
36
+ fail-fast: false
37
+ matrix:
38
+ os: [windows-2022, windows-2025]
39
+ runs-on: ${{ matrix.os }}
40
+ env:
41
+ SOURCE: ${{ inputs.source || 'wheel' }}
42
+ steps:
43
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
44
+ with:
45
+ persist-credentials: false
46
+ fetch-depth: 0 # the tags: the wheel's version
47
+ - uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
48
+ - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
49
+ with:
50
+ name: demo-home
51
+ path: ${{ runner.temp }}
52
+ - name: The QA scripts (and the wheel) in C:\qa
53
+ shell: bash
54
+ run: |
55
+ mkdir -p /c/qa
56
+ cp .github/windows-ja-qa/* /c/qa/
57
+ # the PowerShell lines docs/install.md#windows gives, with the package to install as {SOURCE}
58
+ awk '/^## Windows/{w=1} w && /^```powershell/{f=1; next} f && /^```/{exit} f' docs/install.md |
59
+ sed -E 's/(uv tool install --python 3\.13) interlatch/\1 {SOURCE}/' > /c/qa/docs-lines.txt
60
+ cat /c/qa/docs-lines.txt
61
+ if [ "$SOURCE" = wheel ]; then
62
+ uv build --wheel -o /c/qa/dist
63
+ echo "INSTALL_FROM=$(cygpath -w "$(ls /c/qa/dist/*.whl)")" >> "$GITHUB_ENV"
64
+ else
65
+ echo "INSTALL_FROM=interlatch" >> "$GITHUB_ENV"
66
+ fi
67
+ - name: Install as the Japanese-named user, as the docs say
68
+ shell: powershell
69
+ run: C:\qa\driver.ps1 -Phase install -Source "$env:INSTALL_FROM"
70
+ - name: What it printed
71
+ if: always()
72
+ shell: bash
73
+ run: uv run --no-project python /c/qa/report.py
74
+ - name: Screenshots in Edge, Japanese (the user's dashboard, then the demo's, run here)
75
+ if: always()
76
+ shell: bash
77
+ run: |
78
+ uv run --no-project --with playwright==1.52.0 python /c/qa/shots.py http://127.0.0.1:11530 /c/qa/shots ja-user || true
79
+ mkdir -p /c/demo && tar --force-local -xzf "$(cygpath -u "$RUNNER_TEMP")/demo-home.tgz" -C /c/demo
80
+ # in this step: a process a step starts in the background ends with the step
81
+ INTERLATCH_HOME='C:\demo\home' uvx --from "$INSTALL_FROM" interlatch ui --port 8898 > /c/demo/ui.out 2> /c/demo/ui.err &
82
+ uv run --no-project --with playwright==1.52.0 python /c/qa/shots.py http://127.0.0.1:8898 /c/qa/shots demo || true
83
+ - name: The dashboards' own logs
84
+ if: always()
85
+ shell: powershell
86
+ run: |
87
+ Get-NetTCPConnection -State Listen -ErrorAction SilentlyContinue | Where-Object LocalPort -in 8898, 11530, 11524 |
88
+ Format-Table LocalAddress, LocalPort, OwningProcess
89
+ Get-CimInstance Win32_Process | Where-Object { $_.CommandLine -match 'interlatch' } |
90
+ Format-Table ProcessId, ParentProcessId, CommandLine -Wrap
91
+ foreach ($f in 'C:\demo\ui.out', 'C:\demo\ui.err', 'C:\qa\ui.out', 'C:\qa\ui.err') {
92
+ if (Test-Path $f) { Write-Host "----- $f"; Get-Content -LiteralPath $f -Encoding UTF8 -Tail 40 }
93
+ }
94
+ Get-ChildItem C:\demo\home\logs -ErrorAction SilentlyContinue | ForEach-Object {
95
+ Write-Host "----- $($_.FullName)"; Get-Content -LiteralPath $_.FullName -Encoding UTF8 -Tail 40 }
96
+ - name: Uninstall as the same user
97
+ if: always()
98
+ shell: powershell
99
+ run: C:\qa\driver.ps1 -Phase uninstall -Source "$env:INSTALL_FROM"
100
+ - name: What uninstall printed
101
+ if: always()
102
+ shell: bash
103
+ run: uv run --no-project python /c/qa/report.py | sed -n '/20-uninstall/,$p'
104
+ - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
105
+ if: always()
106
+ with:
107
+ name: windows-ja-${{ matrix.os }}
108
+ path: C:\qa
@@ -3,6 +3,30 @@
3
3
  <!-- Don't add lines here: a pull request puts its line in a new file in changelog.d/ (see changelog.d/README.md),
4
4
  and each release moves the files it took into a dated section below. -->
5
5
 
6
+ ## 0.27.3 (2026-10-18)
7
+
8
+ - **Windows in Japanese (and other languages):** Task Scheduler's and PowerShell's own messages now read in Windows'
9
+ language instead of coming out garbled, and a `claude.cmd` (npm) or another tool that reports an error in the console's
10
+ code page no longer ends `interlatch install` in a traceback. The tasks name your account by its SID, so a PC joined to
11
+ Microsoft Entra ID registers them too; a folder name with a full-width space works in hooks; an npm-installed Claude
12
+ Code gets the whole analysis prompt; the shared log no longer prints "Logging error" when another process holds it;
13
+ and the dashboard's scripts keep their type where Windows' registry calls .js plain text, which left the page blank.
14
+ The old console window prints `+` and `>` for ✓ and ›, the dashboard says Ctrl for ⌘ off a Mac, and the install steps
15
+ set PATH in the same window, where uv's installer left "uv is not recognized" ([Windows](docs/install.md#windows)).
16
+ - **Adventure, rebuilt for learning:** the Adventure opens on a field to walk around in, one region at a time, its
17
+ roadmap modules as zones and your lessons worth studying as monsters (main quest first, your agents' own setup traps
18
+ left out). A battle is now a question from your own sessions: four answers written for the lesson, choose one and
19
+ Answer. Right beats the monster and fills your readiness for that module; wrong shows why, the answer and the
20
+ principle, and the lesson comes back tomorrow. Lessons you got right come back as you'd forget them (3, 10, 30, 90
21
+ days). Your answers stay on your own computer ([Adventure](docs/party.md#adventure)).
22
+
23
+ ## 0.27.2 (2026-10-16)
24
+
25
+ - **One row per browser on Team › People:** opening the hub from your own dashboard again no longer leaves the
26
+ browser's previous session behind, so the same browser stops piling up as more and more rows. Older sessions already
27
+ there fold into one line under the browser, with one **Revoke them**, and the People table stacks each person on a
28
+ narrow window instead of cutting off its buttons.
29
+
6
30
  ## 0.27.1 (2026-10-16)
7
31
 
8
32
  - **IBM Bob as the analyzer:** a key that is only in your shell (`BOB_API_KEY`, or a provider's `*_API_KEY`) used to
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: interlatch
3
- Version: 0.27.2
3
+ Version: 0.27.4
4
4
  Summary: Shared memory for your coding agents: records every session (Claude Code, Codex, Copilot, Bob, Antigravity, OpenCode) locally and keeps what they learned, each lesson linked to the session it came from.
5
5
  Project-URL: Homepage, https://interlatch.com
6
6
  Project-URL: Documentation, https://interlatch.com/docs/
@@ -56,6 +56,11 @@ Interlatch にこれから入るものを、おおよそ取り組む順に並べ
56
56
  作りません)。エージェントには今までどおりすべての教訓を渡します。効果は、尋ねるのではなく、思い出せたかと、同じ gotcha が
57
57
  あなたのセッションでまた起きるかで測り、一人ひとりの指標はすべてあなたのコンピューターに残します
58
58
  ([設計](docs/design/ja/learning.md))。
59
+ - **モジュールでのあなた自身のレベルを、実際の仕事から。** Innerlatch の冒険では、学びの戦闘で正解した教訓が、すでに
60
+ 各ロードマップのモジュールの準備度として数えられ、あなたのコンピューターに残っています。これから: 5 つ理解すると
61
+ そのモジュールのゲートが開き、あなた自身のプルリクエストかコミットを結びつけて、それがモジュールの確認にどう合うかを
62
+ 2〜3 文で書きます。分析モデルが判定し、合格するとそのモジュールに「あなたが示した」と印がつきます。エージェントの
63
+ レベルとは別です([設計](docs/design/ja/innerlatch.md#6-次-ゲートのボス))。
59
64
  - **人の名前で、並べて見るチームメイトの教訓。** チームメイトの教訓は、プロジェクトのページと **All knowledge** に、
60
65
  どのコンピューターから来たかを示して表示されます。これから: コンピューター名ではなく人の名前で示すこと、週次レビューに
61
66
  チームメイトの教訓を入れること、2 人が述べた教訓を両方の事件として見せること([設計](docs/design/ja/learning.md#4-チーム))。