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.
- interlatch-0.27.4/.github/windows-ja-qa/driver.ps1 +51 -0
- interlatch-0.27.4/.github/windows-ja-qa/ja_check.py +152 -0
- interlatch-0.27.4/.github/windows-ja-qa/report.py +28 -0
- interlatch-0.27.4/.github/windows-ja-qa/shots.py +84 -0
- interlatch-0.27.4/.github/windows-ja-qa/user.ps1 +48 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/.github/workflows/ci.yml +6 -6
- {interlatch-0.27.2 → interlatch-0.27.4}/.github/workflows/docs.yml +1 -1
- {interlatch-0.27.2 → interlatch-0.27.4}/.github/workflows/release.yml +6 -6
- interlatch-0.27.4/.github/workflows/windows-ja-qa.yml +108 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/CHANGELOG.md +24 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/PKG-INFO +1 -1
- {interlatch-0.27.2 → interlatch-0.27.4}/ROADMAP.ja.md +5 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/ROADMAP.md +5 -0
- interlatch-0.27.4/changelog.d/analysis-queue-dialog.md +3 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docker/Dockerfile +1 -1
- interlatch-0.27.4/docs/design/innerlatch.md +166 -0
- interlatch-0.27.4/docs/design/ja/innerlatch.md +162 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/development.md +8 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/install.md +9 -2
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/ja/install.md +10 -2
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/ja/party.md +38 -12
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/party.md +41 -14
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/analysis/queue.py +70 -1
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/analysis/runners/api.py +3 -2
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/analysis/runners/claude.py +25 -5
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/analysis/runners/process.py +5 -3
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/core/i18n/ja.py +3 -0
- interlatch-0.27.4/src/interlatch/core/process.py +62 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/core/util.py +15 -1
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/cli/main.py +39 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/party.py +49 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/status.py +7 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/assets.py +15 -3
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/handler.py +4 -8
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/routes.py +4 -2
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/knowledge/party.py +28 -5
- interlatch-0.27.4/src/interlatch/knowledge/study.py +277 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/runtime/connectors.py +6 -7
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/runtime/install.py +6 -4
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/runtime/notify.py +2 -1
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/runtime/platforms/windows.py +56 -5
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/runtime/statusline.py +15 -1
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sharing/access.py +1 -1
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sources/codex/cloud.py +3 -3
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/adventure.js +25 -194
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/app.css +20 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/app.js +73 -3
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/battle.js +272 -36
- interlatch-0.27.4/src/interlatch/web/field.js +983 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/i18n.js +7 -2
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/index.html +1 -1
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/innerlatch.css +71 -1
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/innerlatch.js +138 -13
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/ja.js +48 -1
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_battle_web.py +101 -0
- interlatch-0.27.4/tests/test_field_web.py +147 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_i18n_web.py +2 -2
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_party_map.py +5 -3
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_queue.py +45 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_route_matrix.py +4 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_statusline.py +14 -0
- interlatch-0.27.4/tests/test_study.py +228 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_windows.py +145 -0
- interlatch-0.27.2/changelog.d/hub-browser-sessions.md +0 -4
- interlatch-0.27.2/src/interlatch/core/process.py +0 -20
- {interlatch-0.27.2 → interlatch-0.27.4}/.github/dependabot.yml +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/.github/workflows/changelog.yml +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/.gitignore +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/.pre-commit-config.yaml +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/.python-version +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/CONTRIBUTING.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/LICENSE +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/README.ja.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/README.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/SECURITY.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/careers/README.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/careers/boards.json +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/careers/pipeline.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/changelog.d/README.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/dev.sh +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docker/.dockerignore +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docker/.env.example +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docker/Caddyfile +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docker/compose.yaml +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docker/wheels/.gitignore +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/README.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/_site/hooks.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/analysis.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/cli.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/configuration.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/dashboard.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/demo/make_demo.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/demo/record_demo.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/design/ja/learning.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/design/learning.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/devices.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/diagrams/analysis.excalidraw.svg +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/diagrams/architecture.excalidraw.svg +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/docker.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/faq.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/images/demo.gif +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/images/home.png +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/images/map.png +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/images/palette.png +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/images/session.png +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/ja/README.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/ja/analysis.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/ja/cli.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/ja/configuration.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/ja/dashboard.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/ja/development.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/ja/devices.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/ja/docker.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/ja/faq.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/ja/join-a-hub.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/ja/mcp.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/ja/moving-from-chronicle.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/ja/postgres.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/ja/privacy.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/ja/sources.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/ja/suggestions.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/ja/troubleshooting.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/ja/vscode.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/join-a-hub.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/mcp.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/moving-from-chronicle.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/postgres.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/privacy.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/sources.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/suggestions.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/troubleshooting.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/docs/vscode.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/leaderboard/.firebaserc +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/leaderboard/.gitignore +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/leaderboard/README.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/leaderboard/firebase.json +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/leaderboard/firestore.indexes.json +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/leaderboard/firestore.rules +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/mkdocs.yml +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/packaging/icons3d/README.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/packaging/icons3d/art.json +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/packaging/icons3d/filing.html +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/packaging/icons3d/loops.json +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/packaging/icons3d/loops.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/packaging/icons3d/members.js +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/packaging/icons3d/render.html +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/packaging/icons3d/render.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/packaging/icons3d/scenes-more.js +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/packaging/icons3d/scenes.html +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/packaging/macos/Chronicle.icns +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/packaging/macos/Interlatch.spec +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/packaging/macos/build.sh +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/packaging/macos/entitlements.plist +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/packaging/macos/icon-3d.webp +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/packaging/macos/icon-blueprint-prompt.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/packaging/macos/icon-blueprint.webp +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/packaging/macos/icon.png +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/packaging/macos/interlatch_app.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/packaging/macos/make_icon.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/packaging/release.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/pyproject.toml +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/chronicle/__init__.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/chronicle/__main__.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/chronicle/windows.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/__init__.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/__main__.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/analysis/__init__.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/analysis/digest.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/analysis/language.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/analysis/runners/__init__.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/analysis/runners/base.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/analysis/runners/bob.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/analysis/runners/codex.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/analysis/runners/factory.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/analysis/runners/replies.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/analysis/runners/settings.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/analysis/screen.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/analysis/session.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/analysis/worker.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/application/__init__.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/application/records.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/application/search.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/application/workflows.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/artifacts/__init__.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/artifacts/files.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/artifacts/queries.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/cli.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/core/__init__.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/core/agents.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/core/artifact_records.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/core/config.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/core/diagrams.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/core/i18n/__init__.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/core/machine.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/core/paths.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/core/pricing.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/core/redact.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/core/sessions.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/ingestion/__init__.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/ingestion/analyses.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/ingestion/archive.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/ingestion/chat_import.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/ingestion/deletion.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/ingestion/history.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/ingestion/memory.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/ingestion/persistence.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/ingestion/report.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/ingestion/service.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/__init__.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/cli/__init__.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/cli/commands/__init__.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/cli/commands/archive.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/cli/commands/knowledge.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/cli/commands/operations.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/cli/commands/recording.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/cli/commands/setup.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/cli/commands/sharing.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/cli/common.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/cli/parser.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/exports/__init__.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/exports/diagrams.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/exports/markdown.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/exports/sessions.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/exports/vault.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/mcp.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/__init__.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/__init__.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/artifacts.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/common.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/devices.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/hub_admin.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/knowledge.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/leaderboard.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/projects.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/sessions.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/settings.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/sources.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/storage.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/team.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/app.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/context.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/jobs.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/interfaces/web/server.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/knowledge/__init__.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/knowledge/arena.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/knowledge/bag.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/knowledge/cases.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/knowledge/formation.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/knowledge/friction.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/knowledge/glossary.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/knowledge/instructions.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/knowledge/ladder.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/knowledge/learning.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/knowledge/market.json +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/knowledge/reviews.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/knowledge/roadmap.json +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/knowledge/suggest.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/knowledge/synthesize.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/projects/__init__.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/projects/groups.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/projects/labels.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/projects/progress.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/projects/routing.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/projects/systems.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/runtime/__init__.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/runtime/container.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/runtime/hooks.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/runtime/migrate.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/runtime/platforms/__init__.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/runtime/platforms/desktop.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/runtime/platforms/menubar.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/runtime/tailnet.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/runtime/update.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sharing/__init__.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sharing/arena.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sharing/client.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sharing/identity.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sharing/leaderboard.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sharing/market.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sharing/news.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sharing/people.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sharing/projects.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sharing/protocol.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sharing/pull.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sharing/push.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sharing/receiver.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sources/__init__.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sources/antigravity.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sources/bob.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sources/builder.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sources/chatgpt.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sources/chats.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sources/claude/__init__.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sources/claude/export.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sources/claude/files.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sources/claude/parser.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sources/codex/__init__.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sources/codex/parser.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sources/copilot.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sources/discovery.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sources/opencode.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/sources/prompts.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/storage/__init__.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/storage/fts.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/storage/kv.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/storage/migrations.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/storage/mirror.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/storage/postgres.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/storage/schema.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/storage/sqlite.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/storage/team.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/AGENT-ICONS.txt +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/PLEX-OFL.txt +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/agent-antigravity.svg +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/agent-bob.svg +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/agent-chatgpt.svg +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/agent-claude-ai.svg +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/agent-claude.svg +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/agent-codex.svg +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/agent-copilot.svg +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/agent-opencode.svg +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-book.webp +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-camera.webp +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-chip.webp +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-clock.webp +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-cloud.webp +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-coins.webp +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-container.webp +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-dashboard.webp +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-dex.webp +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-document.webp +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-flag.webp +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-folder.webp +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-gateway.webp +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-gears.webp +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-glitch.webp +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-globe.webp +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-laptop.webp +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-log.webp +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-lumi.webp +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-magnifier.webp +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-pip.webp +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-plug.webp +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-rack.webp +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/art-tink.webp +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/boot.js +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/favicon.png +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/icon-180.png +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/icon-192.png +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/icon-512.png +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/icon.png +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/learning.js +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/manifest.webmanifest +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/panel.css +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/panel.html +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/panel.js +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/plex-mono-400.woff2 +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/plex-mono-500.woff2 +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/plex-mono-600.woff2 +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/plex-sans-400.woff2 +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/plex-sans-500.woff2 +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/plex-sans-600.woff2 +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/plex-sans-700.woff2 +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/rough.js +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/scene.js +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/web/sprites.js +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/src/interlatch/windows.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/antigravity_fixture.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/codex_fixture.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/conftest.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/copilot_fixture.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/friction_fixture.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/golden.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/goldens/cli.json +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/goldens/diagram.json +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/goldens/parsers/antigravity.json +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/goldens/parsers/bob.json +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/goldens/parsers/claude_code.json +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/goldens/parsers/codex.json +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/goldens/parsers/copilot.json +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/goldens/parsers/opencode.json +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/goldens/systems.json +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/opencode_fixture.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_adventure_web.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_analysis.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_antigravity.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_architecture.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_arena.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_artifacts.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_bag.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_bob_analysis.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_boot_web.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_careers.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_case_files.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_cases.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_chat_import.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_cli_pins.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_codex.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_codex_analysis.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_codex_cloud.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_container.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_copilot_bob.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_dedicated_hub.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_dedupe.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_desktop.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_diagram.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_ee_boundary.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_formation.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_friction.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_glossary.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_group_sharing.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_home_agents.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_hub.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_hub_accept.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_hub_news.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_hub_projects.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_hub_projects_listed.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_hub_purge.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_hub_sharing_race.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_ingest.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_instructions.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_integration.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_ladder.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_language.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_leaderboard.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_learning_glance.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_learning_interests.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_learning_web.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_leave_project.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_legacy_package.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_map_goldens.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_market.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_menubar.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_migrate.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_mirror.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_notify.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_opencode.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_parser.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_parser_goldens.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_party.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_people.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_people_hub.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_people_web.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_project_groups.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_project_progress.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_providers.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_regressions.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_release.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_roadmap_catalog.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_screen.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_security.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_setup.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_suggest.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_suggest_cli.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_systems.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_team.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_team_home.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/test_update.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/tests/windows_smoke.py +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/uv.lock +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/vscode-extension/.vscodeignore +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/vscode-extension/LICENSE +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/vscode-extension/README.md +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/vscode-extension/extension.js +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/vscode-extension/media/icon.png +0 -0
- {interlatch-0.27.2 → interlatch-0.27.4}/vscode-extension/media/interlatch.svg +0 -0
- {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@
|
|
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@
|
|
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@
|
|
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@
|
|
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@
|
|
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@
|
|
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@
|
|
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-
|
|
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@
|
|
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@
|
|
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-
|
|
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@
|
|
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@
|
|
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.
|
|
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-チーム))。
|