@otto-assistant/bridge 0.4.92
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.
- package/bin.js +2 -0
- package/dist/agent-model.e2e.test.js +755 -0
- package/dist/ai-tool-to-genai.js +233 -0
- package/dist/ai-tool-to-genai.test.js +267 -0
- package/dist/ai-tool.js +6 -0
- package/dist/anthropic-auth-plugin.js +728 -0
- package/dist/anthropic-auth-plugin.test.js +125 -0
- package/dist/anthropic-auth-state.js +231 -0
- package/dist/bin.js +90 -0
- package/dist/channel-management.js +227 -0
- package/dist/cli-parsing.test.js +137 -0
- package/dist/cli-send-thread.e2e.test.js +356 -0
- package/dist/cli.js +3276 -0
- package/dist/commands/abort.js +65 -0
- package/dist/commands/action-buttons.js +245 -0
- package/dist/commands/add-project.js +113 -0
- package/dist/commands/agent.js +335 -0
- package/dist/commands/ask-question.js +274 -0
- package/dist/commands/btw.js +116 -0
- package/dist/commands/compact.js +120 -0
- package/dist/commands/context-usage.js +140 -0
- package/dist/commands/create-new-project.js +130 -0
- package/dist/commands/diff.js +63 -0
- package/dist/commands/file-upload.js +275 -0
- package/dist/commands/fork.js +220 -0
- package/dist/commands/gemini-apikey.js +70 -0
- package/dist/commands/login.js +885 -0
- package/dist/commands/mcp.js +239 -0
- package/dist/commands/memory-snapshot.js +24 -0
- package/dist/commands/mention-mode.js +44 -0
- package/dist/commands/merge-worktree.js +159 -0
- package/dist/commands/model-variant.js +364 -0
- package/dist/commands/model.js +776 -0
- package/dist/commands/new-worktree.js +366 -0
- package/dist/commands/paginated-select.js +57 -0
- package/dist/commands/permissions.js +274 -0
- package/dist/commands/queue.js +206 -0
- package/dist/commands/remove-project.js +115 -0
- package/dist/commands/restart-opencode-server.js +127 -0
- package/dist/commands/resume.js +149 -0
- package/dist/commands/run-command.js +79 -0
- package/dist/commands/screenshare.js +303 -0
- package/dist/commands/screenshare.test.js +20 -0
- package/dist/commands/session-id.js +78 -0
- package/dist/commands/session.js +176 -0
- package/dist/commands/share.js +80 -0
- package/dist/commands/tasks.js +205 -0
- package/dist/commands/types.js +2 -0
- package/dist/commands/undo-redo.js +305 -0
- package/dist/commands/unset-model.js +138 -0
- package/dist/commands/upgrade.js +42 -0
- package/dist/commands/user-command.js +155 -0
- package/dist/commands/verbosity.js +125 -0
- package/dist/commands/worktree-settings.js +43 -0
- package/dist/commands/worktrees.js +410 -0
- package/dist/condense-memory.js +33 -0
- package/dist/config.js +94 -0
- package/dist/context-awareness-plugin.js +363 -0
- package/dist/context-awareness-plugin.test.js +124 -0
- package/dist/critique-utils.js +95 -0
- package/dist/database.js +1310 -0
- package/dist/db.js +251 -0
- package/dist/db.test.js +138 -0
- package/dist/debounce-timeout.js +28 -0
- package/dist/debounced-process-flush.js +77 -0
- package/dist/discord-bot.js +1008 -0
- package/dist/discord-command-registration.js +524 -0
- package/dist/discord-urls.js +81 -0
- package/dist/discord-utils.js +591 -0
- package/dist/discord-utils.test.js +134 -0
- package/dist/errors.js +157 -0
- package/dist/escape-backticks.test.js +429 -0
- package/dist/event-stream-real-capture.e2e.test.js +533 -0
- package/dist/eventsource-parser.test.js +327 -0
- package/dist/exec-async.js +26 -0
- package/dist/external-opencode-sync.js +480 -0
- package/dist/format-tables.js +302 -0
- package/dist/format-tables.test.js +308 -0
- package/dist/forum-sync/config.js +79 -0
- package/dist/forum-sync/discord-operations.js +154 -0
- package/dist/forum-sync/index.js +5 -0
- package/dist/forum-sync/markdown.js +113 -0
- package/dist/forum-sync/sync-to-discord.js +417 -0
- package/dist/forum-sync/sync-to-files.js +190 -0
- package/dist/forum-sync/types.js +53 -0
- package/dist/forum-sync/watchers.js +307 -0
- package/dist/gateway-proxy-reconnect.e2e.test.js +394 -0
- package/dist/gateway-proxy.e2e.test.js +483 -0
- package/dist/genai-worker-wrapper.js +111 -0
- package/dist/genai-worker.js +311 -0
- package/dist/genai.js +232 -0
- package/dist/generated/browser.js +17 -0
- package/dist/generated/client.js +37 -0
- package/dist/generated/commonInputTypes.js +10 -0
- package/dist/generated/enums.js +52 -0
- package/dist/generated/internal/class.js +49 -0
- package/dist/generated/internal/prismaNamespace.js +253 -0
- package/dist/generated/internal/prismaNamespaceBrowser.js +223 -0
- package/dist/generated/models/bot_api_keys.js +1 -0
- package/dist/generated/models/bot_tokens.js +1 -0
- package/dist/generated/models/channel_agents.js +1 -0
- package/dist/generated/models/channel_directories.js +1 -0
- package/dist/generated/models/channel_mention_mode.js +1 -0
- package/dist/generated/models/channel_models.js +1 -0
- package/dist/generated/models/channel_verbosity.js +1 -0
- package/dist/generated/models/channel_worktrees.js +1 -0
- package/dist/generated/models/forum_sync_configs.js +1 -0
- package/dist/generated/models/global_models.js +1 -0
- package/dist/generated/models/ipc_requests.js +1 -0
- package/dist/generated/models/part_messages.js +1 -0
- package/dist/generated/models/scheduled_tasks.js +1 -0
- package/dist/generated/models/session_agents.js +1 -0
- package/dist/generated/models/session_events.js +1 -0
- package/dist/generated/models/session_models.js +1 -0
- package/dist/generated/models/session_start_sources.js +1 -0
- package/dist/generated/models/thread_sessions.js +1 -0
- package/dist/generated/models/thread_worktrees.js +1 -0
- package/dist/generated/models.js +1 -0
- package/dist/heap-monitor.js +122 -0
- package/dist/hrana-server.js +263 -0
- package/dist/hrana-server.test.js +370 -0
- package/dist/html-actions.js +123 -0
- package/dist/html-actions.test.js +70 -0
- package/dist/html-components.js +117 -0
- package/dist/html-components.test.js +34 -0
- package/dist/image-optimizer-plugin.js +153 -0
- package/dist/image-utils.js +112 -0
- package/dist/interaction-handler.js +397 -0
- package/dist/ipc-polling.js +252 -0
- package/dist/ipc-tools-plugin.js +193 -0
- package/dist/kimaki-digital-twin.e2e.test.js +161 -0
- package/dist/kimaki-opencode-plugin-loading.e2e.test.js +87 -0
- package/dist/kimaki-opencode-plugin.js +17 -0
- package/dist/kimaki-opencode-plugin.test.js +98 -0
- package/dist/limit-heading-depth.js +25 -0
- package/dist/limit-heading-depth.test.js +105 -0
- package/dist/logger.js +165 -0
- package/dist/markdown.js +342 -0
- package/dist/markdown.test.js +257 -0
- package/dist/message-finish-field.e2e.test.js +165 -0
- package/dist/message-formatting.js +413 -0
- package/dist/message-formatting.test.js +73 -0
- package/dist/message-preprocessing.js +330 -0
- package/dist/onboarding-tutorial.js +172 -0
- package/dist/onboarding-welcome.js +37 -0
- package/dist/openai-realtime.js +224 -0
- package/dist/opencode-command-detection.js +65 -0
- package/dist/opencode-command-detection.test.js +240 -0
- package/dist/opencode-command.js +129 -0
- package/dist/opencode-command.test.js +48 -0
- package/dist/opencode-interrupt-plugin.js +361 -0
- package/dist/opencode-interrupt-plugin.test.js +458 -0
- package/dist/opencode.js +861 -0
- package/dist/otto/branding.js +22 -0
- package/dist/otto/index.js +21 -0
- package/dist/parse-permission-rules.test.js +117 -0
- package/dist/patch-text-parser.js +97 -0
- package/dist/plugin-logger.js +59 -0
- package/dist/privacy-sanitizer.js +105 -0
- package/dist/queue-advanced-abort.e2e.test.js +293 -0
- package/dist/queue-advanced-action-buttons.e2e.test.js +206 -0
- package/dist/queue-advanced-e2e-setup.js +786 -0
- package/dist/queue-advanced-footer.e2e.test.js +472 -0
- package/dist/queue-advanced-model-switch.e2e.test.js +299 -0
- package/dist/queue-advanced-permissions-typing.e2e.test.js +180 -0
- package/dist/queue-advanced-question.e2e.test.js +261 -0
- package/dist/queue-advanced-typing-interrupt.e2e.test.js +114 -0
- package/dist/queue-advanced-typing.e2e.test.js +153 -0
- package/dist/queue-drain-after-interactive-ui.e2e.test.js +119 -0
- package/dist/queue-interrupt-drain.e2e.test.js +135 -0
- package/dist/queue-question-select-drain.e2e.test.js +120 -0
- package/dist/runtime-idle-sweeper.js +52 -0
- package/dist/runtime-lifecycle.e2e.test.js +508 -0
- package/dist/sentry.js +23 -0
- package/dist/session-handler/agent-utils.js +67 -0
- package/dist/session-handler/event-stream-state.js +420 -0
- package/dist/session-handler/event-stream-state.test.js +563 -0
- package/dist/session-handler/model-utils.js +124 -0
- package/dist/session-handler/opencode-session-event-log.js +94 -0
- package/dist/session-handler/thread-runtime-state.js +104 -0
- package/dist/session-handler/thread-session-runtime.js +3258 -0
- package/dist/session-handler.js +9 -0
- package/dist/session-search.js +100 -0
- package/dist/session-search.test.js +40 -0
- package/dist/session-title-rename.test.js +80 -0
- package/dist/startup-service.js +153 -0
- package/dist/startup-time.e2e.test.js +296 -0
- package/dist/store.js +17 -0
- package/dist/system-message.js +613 -0
- package/dist/system-message.test.js +602 -0
- package/dist/task-runner.js +295 -0
- package/dist/task-schedule.js +209 -0
- package/dist/task-schedule.test.js +71 -0
- package/dist/test-utils.js +299 -0
- package/dist/thinking-utils.js +35 -0
- package/dist/thread-message-queue.e2e.test.js +999 -0
- package/dist/tools.js +357 -0
- package/dist/undo-redo.e2e.test.js +161 -0
- package/dist/unnest-code-blocks.js +146 -0
- package/dist/unnest-code-blocks.test.js +673 -0
- package/dist/upgrade.js +114 -0
- package/dist/utils.js +144 -0
- package/dist/voice-attachment.js +34 -0
- package/dist/voice-handler.js +646 -0
- package/dist/voice-message.e2e.test.js +1021 -0
- package/dist/voice.js +447 -0
- package/dist/voice.test.js +235 -0
- package/dist/wait-session.js +94 -0
- package/dist/websockify.js +69 -0
- package/dist/worker-types.js +4 -0
- package/dist/worktree-lifecycle.e2e.test.js +308 -0
- package/dist/worktree-utils.js +3 -0
- package/dist/worktrees.js +929 -0
- package/dist/worktrees.test.js +189 -0
- package/dist/xml.js +92 -0
- package/dist/xml.test.js +32 -0
- package/package.json +98 -0
- package/schema.prisma +295 -0
- package/skills/batch/SKILL.md +87 -0
- package/skills/critique/SKILL.md +112 -0
- package/skills/egaki/SKILL.md +100 -0
- package/skills/errore/SKILL.md +647 -0
- package/skills/event-sourcing-state/SKILL.md +252 -0
- package/skills/gitchamber/SKILL.md +93 -0
- package/skills/goke/SKILL.md +644 -0
- package/skills/jitter/EDITOR.md +219 -0
- package/skills/jitter/EXPORT-INTERNALS.md +309 -0
- package/skills/jitter/SKILL.md +158 -0
- package/skills/jitter/jitter-clipboard.json +1042 -0
- package/skills/jitter/package.json +14 -0
- package/skills/jitter/tsconfig.json +15 -0
- package/skills/jitter/utils/actions.ts +212 -0
- package/skills/jitter/utils/export.ts +114 -0
- package/skills/jitter/utils/index.ts +141 -0
- package/skills/jitter/utils/snapshot.ts +154 -0
- package/skills/jitter/utils/traverse.ts +246 -0
- package/skills/jitter/utils/types.ts +279 -0
- package/skills/jitter/utils/wait.ts +133 -0
- package/skills/lintcn/SKILL.md +873 -0
- package/skills/new-skill/SKILL.md +211 -0
- package/skills/npm-package/SKILL.md +239 -0
- package/skills/playwriter/SKILL.md +35 -0
- package/skills/proxyman/SKILL.md +215 -0
- package/skills/security-review/SKILL.md +208 -0
- package/skills/simplify/SKILL.md +58 -0
- package/skills/spiceflow/SKILL.md +14 -0
- package/skills/termcast/SKILL.md +945 -0
- package/skills/tuistory/SKILL.md +250 -0
- package/skills/usecomputer/SKILL.md +264 -0
- package/skills/x-articles/SKILL.md +554 -0
- package/skills/zele/SKILL.md +112 -0
- package/skills/zustand-centralized-state/SKILL.md +1004 -0
- package/src/agent-model.e2e.test.ts +976 -0
- package/src/ai-tool-to-genai.test.ts +296 -0
- package/src/ai-tool-to-genai.ts +283 -0
- package/src/ai-tool.ts +39 -0
- package/src/anthropic-auth-plugin.test.ts +159 -0
- package/src/anthropic-auth-plugin.ts +861 -0
- package/src/anthropic-auth-state.ts +282 -0
- package/src/bin.ts +111 -0
- package/src/channel-management.ts +334 -0
- package/src/cli-parsing.test.ts +195 -0
- package/src/cli-send-thread.e2e.test.ts +464 -0
- package/src/cli.ts +4581 -0
- package/src/commands/abort.ts +89 -0
- package/src/commands/action-buttons.ts +364 -0
- package/src/commands/add-project.ts +149 -0
- package/src/commands/agent.ts +473 -0
- package/src/commands/ask-question.ts +390 -0
- package/src/commands/btw.ts +164 -0
- package/src/commands/compact.ts +157 -0
- package/src/commands/context-usage.ts +199 -0
- package/src/commands/create-new-project.ts +190 -0
- package/src/commands/diff.ts +91 -0
- package/src/commands/file-upload.ts +389 -0
- package/src/commands/fork.ts +321 -0
- package/src/commands/gemini-apikey.ts +104 -0
- package/src/commands/login.ts +1173 -0
- package/src/commands/mcp.ts +307 -0
- package/src/commands/memory-snapshot.ts +30 -0
- package/src/commands/mention-mode.ts +68 -0
- package/src/commands/merge-worktree.ts +223 -0
- package/src/commands/model-variant.ts +483 -0
- package/src/commands/model.ts +1053 -0
- package/src/commands/new-worktree.ts +510 -0
- package/src/commands/paginated-select.ts +81 -0
- package/src/commands/permissions.ts +397 -0
- package/src/commands/queue.ts +271 -0
- package/src/commands/remove-project.ts +155 -0
- package/src/commands/restart-opencode-server.ts +162 -0
- package/src/commands/resume.ts +230 -0
- package/src/commands/run-command.ts +123 -0
- package/src/commands/screenshare.test.ts +30 -0
- package/src/commands/screenshare.ts +366 -0
- package/src/commands/session-id.ts +109 -0
- package/src/commands/session.ts +227 -0
- package/src/commands/share.ts +106 -0
- package/src/commands/tasks.ts +293 -0
- package/src/commands/types.ts +25 -0
- package/src/commands/undo-redo.ts +386 -0
- package/src/commands/unset-model.ts +173 -0
- package/src/commands/upgrade.ts +52 -0
- package/src/commands/user-command.ts +198 -0
- package/src/commands/verbosity.ts +173 -0
- package/src/commands/worktree-settings.ts +70 -0
- package/src/commands/worktrees.ts +552 -0
- package/src/condense-memory.ts +36 -0
- package/src/config.ts +111 -0
- package/src/context-awareness-plugin.test.ts +142 -0
- package/src/context-awareness-plugin.ts +510 -0
- package/src/critique-utils.ts +139 -0
- package/src/database.ts +1876 -0
- package/src/db.test.ts +162 -0
- package/src/db.ts +286 -0
- package/src/debounce-timeout.ts +43 -0
- package/src/debounced-process-flush.ts +104 -0
- package/src/discord-bot.ts +1330 -0
- package/src/discord-command-registration.ts +693 -0
- package/src/discord-urls.ts +88 -0
- package/src/discord-utils.test.ts +153 -0
- package/src/discord-utils.ts +800 -0
- package/src/errors.ts +201 -0
- package/src/escape-backticks.test.ts +469 -0
- package/src/event-stream-real-capture.e2e.test.ts +692 -0
- package/src/eventsource-parser.test.ts +351 -0
- package/src/exec-async.ts +35 -0
- package/src/external-opencode-sync.ts +685 -0
- package/src/format-tables.test.ts +335 -0
- package/src/format-tables.ts +445 -0
- package/src/forum-sync/config.ts +92 -0
- package/src/forum-sync/discord-operations.ts +241 -0
- package/src/forum-sync/index.ts +9 -0
- package/src/forum-sync/markdown.ts +172 -0
- package/src/forum-sync/sync-to-discord.ts +595 -0
- package/src/forum-sync/sync-to-files.ts +294 -0
- package/src/forum-sync/types.ts +175 -0
- package/src/forum-sync/watchers.ts +454 -0
- package/src/gateway-proxy-reconnect.e2e.test.ts +523 -0
- package/src/gateway-proxy.e2e.test.ts +640 -0
- package/src/genai-worker-wrapper.ts +164 -0
- package/src/genai-worker.ts +386 -0
- package/src/genai.ts +321 -0
- package/src/generated/browser.ts +114 -0
- package/src/generated/client.ts +138 -0
- package/src/generated/commonInputTypes.ts +736 -0
- package/src/generated/enums.ts +88 -0
- package/src/generated/internal/class.ts +384 -0
- package/src/generated/internal/prismaNamespace.ts +2386 -0
- package/src/generated/internal/prismaNamespaceBrowser.ts +326 -0
- package/src/generated/models/bot_api_keys.ts +1288 -0
- package/src/generated/models/bot_tokens.ts +1656 -0
- package/src/generated/models/channel_agents.ts +1256 -0
- package/src/generated/models/channel_directories.ts +1859 -0
- package/src/generated/models/channel_mention_mode.ts +1300 -0
- package/src/generated/models/channel_models.ts +1288 -0
- package/src/generated/models/channel_verbosity.ts +1228 -0
- package/src/generated/models/channel_worktrees.ts +1300 -0
- package/src/generated/models/forum_sync_configs.ts +1452 -0
- package/src/generated/models/global_models.ts +1288 -0
- package/src/generated/models/ipc_requests.ts +1485 -0
- package/src/generated/models/part_messages.ts +1302 -0
- package/src/generated/models/scheduled_tasks.ts +2320 -0
- package/src/generated/models/session_agents.ts +1086 -0
- package/src/generated/models/session_events.ts +1439 -0
- package/src/generated/models/session_models.ts +1114 -0
- package/src/generated/models/session_start_sources.ts +1408 -0
- package/src/generated/models/thread_sessions.ts +1781 -0
- package/src/generated/models/thread_worktrees.ts +1356 -0
- package/src/generated/models.ts +30 -0
- package/src/heap-monitor.ts +152 -0
- package/src/hrana-server.test.ts +434 -0
- package/src/hrana-server.ts +314 -0
- package/src/html-actions.test.ts +87 -0
- package/src/html-actions.ts +174 -0
- package/src/html-components.test.ts +38 -0
- package/src/html-components.ts +181 -0
- package/src/image-optimizer-plugin.ts +194 -0
- package/src/image-utils.ts +149 -0
- package/src/interaction-handler.ts +576 -0
- package/src/ipc-polling.ts +326 -0
- package/src/ipc-tools-plugin.ts +236 -0
- package/src/kimaki-digital-twin.e2e.test.ts +199 -0
- package/src/kimaki-opencode-plugin-loading.e2e.test.ts +109 -0
- package/src/kimaki-opencode-plugin.test.ts +108 -0
- package/src/kimaki-opencode-plugin.ts +18 -0
- package/src/limit-heading-depth.test.ts +116 -0
- package/src/limit-heading-depth.ts +26 -0
- package/src/logger.ts +208 -0
- package/src/markdown.test.ts +308 -0
- package/src/markdown.ts +410 -0
- package/src/message-finish-field.e2e.test.ts +192 -0
- package/src/message-formatting.test.ts +81 -0
- package/src/message-formatting.ts +533 -0
- package/src/message-preprocessing.ts +455 -0
- package/src/onboarding-tutorial.ts +176 -0
- package/src/onboarding-welcome.ts +49 -0
- package/src/openai-realtime.ts +358 -0
- package/src/opencode-command-detection.test.ts +307 -0
- package/src/opencode-command-detection.ts +76 -0
- package/src/opencode-command.test.ts +70 -0
- package/src/opencode-command.ts +188 -0
- package/src/opencode-interrupt-plugin.test.ts +677 -0
- package/src/opencode-interrupt-plugin.ts +477 -0
- package/src/opencode.ts +1110 -0
- package/src/otto/branding.ts +23 -0
- package/src/otto/index.ts +22 -0
- package/src/parse-permission-rules.test.ts +127 -0
- package/src/patch-text-parser.ts +107 -0
- package/src/plugin-logger.ts +68 -0
- package/src/privacy-sanitizer.ts +142 -0
- package/src/queue-advanced-abort.e2e.test.ts +382 -0
- package/src/queue-advanced-action-buttons.e2e.test.ts +268 -0
- package/src/queue-advanced-e2e-setup.ts +873 -0
- package/src/queue-advanced-footer.e2e.test.ts +576 -0
- package/src/queue-advanced-model-switch.e2e.test.ts +383 -0
- package/src/queue-advanced-permissions-typing.e2e.test.ts +245 -0
- package/src/queue-advanced-question.e2e.test.ts +316 -0
- package/src/queue-advanced-typing-interrupt.e2e.test.ts +146 -0
- package/src/queue-advanced-typing.e2e.test.ts +199 -0
- package/src/queue-drain-after-interactive-ui.e2e.test.ts +151 -0
- package/src/queue-interrupt-drain.e2e.test.ts +166 -0
- package/src/queue-question-select-drain.e2e.test.ts +152 -0
- package/src/runtime-idle-sweeper.ts +76 -0
- package/src/runtime-lifecycle.e2e.test.ts +641 -0
- package/src/schema.sql +173 -0
- package/src/sentry.ts +26 -0
- package/src/session-handler/agent-utils.ts +97 -0
- package/src/session-handler/event-stream-fixtures/real-session-action-buttons.jsonl +45 -0
- package/src/session-handler/event-stream-fixtures/real-session-footer-suppressed-on-pre-idle-interrupt.jsonl +40 -0
- package/src/session-handler/event-stream-fixtures/real-session-permission-external-file.jsonl +23 -0
- package/src/session-handler/event-stream-fixtures/real-session-task-normal.jsonl +22 -0
- package/src/session-handler/event-stream-fixtures/real-session-task-three-parallel-sleeps.jsonl +277 -0
- package/src/session-handler/event-stream-fixtures/real-session-task-user-interruption.jsonl +46 -0
- package/src/session-handler/event-stream-fixtures/session-abort-after-idle-race.jsonl +21 -0
- package/src/session-handler/event-stream-fixtures/session-concurrent-messages-serialized.jsonl +56 -0
- package/src/session-handler/event-stream-fixtures/session-explicit-abort.jsonl +44 -0
- package/src/session-handler/event-stream-fixtures/session-normal-completion.jsonl +29 -0
- package/src/session-handler/event-stream-fixtures/session-tool-call-noisy-stream.jsonl +29 -0
- package/src/session-handler/event-stream-fixtures/session-two-completions-same-session.jsonl +50 -0
- package/src/session-handler/event-stream-fixtures/session-user-interruption.jsonl +59 -0
- package/src/session-handler/event-stream-fixtures/session-voice-queued-followup.jsonl +52 -0
- package/src/session-handler/event-stream-state.test.ts +645 -0
- package/src/session-handler/event-stream-state.ts +608 -0
- package/src/session-handler/model-utils.ts +183 -0
- package/src/session-handler/opencode-session-event-log.ts +130 -0
- package/src/session-handler/thread-runtime-state.ts +212 -0
- package/src/session-handler/thread-session-runtime.ts +4281 -0
- package/src/session-handler.ts +15 -0
- package/src/session-search.test.ts +50 -0
- package/src/session-search.ts +148 -0
- package/src/session-title-rename.test.ts +112 -0
- package/src/startup-service.ts +200 -0
- package/src/startup-time.e2e.test.ts +373 -0
- package/src/store.ts +122 -0
- package/src/system-message.test.ts +612 -0
- package/src/system-message.ts +723 -0
- package/src/task-runner.ts +421 -0
- package/src/task-schedule.test.ts +84 -0
- package/src/task-schedule.ts +311 -0
- package/src/test-utils.ts +435 -0
- package/src/thinking-utils.ts +61 -0
- package/src/thread-message-queue.e2e.test.ts +1219 -0
- package/src/tools.ts +430 -0
- package/src/undici.d.ts +12 -0
- package/src/undo-redo.e2e.test.ts +209 -0
- package/src/unnest-code-blocks.test.ts +713 -0
- package/src/unnest-code-blocks.ts +185 -0
- package/src/upgrade.ts +127 -0
- package/src/utils.ts +212 -0
- package/src/voice-attachment.ts +51 -0
- package/src/voice-handler.ts +908 -0
- package/src/voice-message.e2e.test.ts +1255 -0
- package/src/voice.test.ts +281 -0
- package/src/voice.ts +627 -0
- package/src/wait-session.ts +147 -0
- package/src/websockify.ts +101 -0
- package/src/worker-types.ts +64 -0
- package/src/worktree-lifecycle.e2e.test.ts +391 -0
- package/src/worktree-utils.ts +4 -0
- package/src/worktrees.test.ts +223 -0
- package/src/worktrees.ts +1294 -0
- package/src/xml.test.ts +38 -0
- package/src/xml.ts +121 -0
package/schema.prisma
ADDED
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
// schema.prisma for the kimaki local db
|
|
2
|
+
// prefer using enum for strings with few known options so it is type safe in typescript code. sqlite does not have enum. this is a prisma only concept
|
|
3
|
+
// these enums will be also exported as types by prisma and we can reuse them in our code
|
|
4
|
+
|
|
5
|
+
generator client {
|
|
6
|
+
provider = "prisma-client"
|
|
7
|
+
output = "./src/generated"
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
datasource db {
|
|
11
|
+
provider = "sqlite"
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
model thread_sessions {
|
|
15
|
+
thread_id String @id
|
|
16
|
+
session_id String
|
|
17
|
+
source ThreadSessionSource @default(kimaki)
|
|
18
|
+
created_at DateTime? @default(now())
|
|
19
|
+
|
|
20
|
+
part_messages part_messages[]
|
|
21
|
+
session_events session_events[]
|
|
22
|
+
scheduled_tasks scheduled_tasks[]
|
|
23
|
+
thread_worktree thread_worktrees?
|
|
24
|
+
ipc_requests ipc_requests[]
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
enum ThreadSessionSource {
|
|
28
|
+
kimaki
|
|
29
|
+
external_poll
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
model session_events {
|
|
33
|
+
id Int @id @default(autoincrement())
|
|
34
|
+
session_id String
|
|
35
|
+
thread_id String
|
|
36
|
+
timestamp BigInt // milliseconds since Unix epoch
|
|
37
|
+
event_index Int // stable in-memory insertion order within a session
|
|
38
|
+
event_json String
|
|
39
|
+
|
|
40
|
+
thread thread_sessions @relation(fields: [thread_id], references: [thread_id], onDelete: Cascade, onUpdate: Cascade)
|
|
41
|
+
|
|
42
|
+
@@index([session_id, timestamp, event_index, id])
|
|
43
|
+
@@index([thread_id, timestamp, event_index, id])
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
model part_messages {
|
|
47
|
+
part_id String @id
|
|
48
|
+
message_id String
|
|
49
|
+
thread_id String
|
|
50
|
+
created_at DateTime? @default(now())
|
|
51
|
+
|
|
52
|
+
thread thread_sessions @relation(fields: [thread_id], references: [thread_id])
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
model bot_tokens {
|
|
56
|
+
app_id String @id
|
|
57
|
+
token String
|
|
58
|
+
bot_mode BotMode @default(self_hosted)
|
|
59
|
+
client_id String?
|
|
60
|
+
client_secret String?
|
|
61
|
+
proxy_url String?
|
|
62
|
+
created_at DateTime? @default(now())
|
|
63
|
+
last_used_at DateTime?
|
|
64
|
+
|
|
65
|
+
api_keys bot_api_keys?
|
|
66
|
+
forum_sync_configs forum_sync_configs[]
|
|
67
|
+
global_model global_models?
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
enum BotMode {
|
|
71
|
+
self_hosted
|
|
72
|
+
gateway
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
model channel_directories {
|
|
76
|
+
channel_id String @id
|
|
77
|
+
directory String
|
|
78
|
+
channel_type ChannelType
|
|
79
|
+
// app_id String? // no longer used: channel ownership is no longer scoped per bot app
|
|
80
|
+
created_at DateTime? @default(now())
|
|
81
|
+
|
|
82
|
+
channel_model channel_models?
|
|
83
|
+
channel_agent channel_agents?
|
|
84
|
+
channel_worktree channel_worktrees?
|
|
85
|
+
channel_verbosity channel_verbosity?
|
|
86
|
+
channel_mention_mode channel_mention_mode?
|
|
87
|
+
scheduled_tasks scheduled_tasks[]
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
enum ChannelType {
|
|
91
|
+
text
|
|
92
|
+
voice
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
model bot_api_keys {
|
|
96
|
+
app_id String @id
|
|
97
|
+
gemini_api_key String?
|
|
98
|
+
openai_api_key String?
|
|
99
|
+
xai_api_key String?
|
|
100
|
+
created_at DateTime? @default(now())
|
|
101
|
+
|
|
102
|
+
bot bot_tokens @relation(fields: [app_id], references: [app_id])
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
model thread_worktrees {
|
|
106
|
+
thread_id String @id
|
|
107
|
+
worktree_name String
|
|
108
|
+
worktree_directory String?
|
|
109
|
+
project_directory String
|
|
110
|
+
status WorktreeStatus @default(pending)
|
|
111
|
+
error_message String?
|
|
112
|
+
created_at DateTime? @default(now())
|
|
113
|
+
|
|
114
|
+
thread thread_sessions @relation(fields: [thread_id], references: [thread_id])
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
enum WorktreeStatus {
|
|
118
|
+
pending
|
|
119
|
+
ready
|
|
120
|
+
error
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
model channel_models {
|
|
124
|
+
channel_id String @id
|
|
125
|
+
model_id String
|
|
126
|
+
variant String?
|
|
127
|
+
created_at DateTime? @default(now())
|
|
128
|
+
updated_at DateTime? @default(now()) @updatedAt
|
|
129
|
+
|
|
130
|
+
channel channel_directories @relation(fields: [channel_id], references: [channel_id])
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
model session_models {
|
|
134
|
+
session_id String @id
|
|
135
|
+
model_id String
|
|
136
|
+
variant String?
|
|
137
|
+
created_at DateTime? @default(now())
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
model channel_agents {
|
|
141
|
+
channel_id String @id
|
|
142
|
+
agent_name String
|
|
143
|
+
created_at DateTime? @default(now())
|
|
144
|
+
updated_at DateTime? @default(now()) @updatedAt
|
|
145
|
+
|
|
146
|
+
channel channel_directories @relation(fields: [channel_id], references: [channel_id])
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
model session_agents {
|
|
150
|
+
session_id String @id
|
|
151
|
+
agent_name String
|
|
152
|
+
created_at DateTime? @default(now())
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
model channel_worktrees {
|
|
156
|
+
channel_id String @id
|
|
157
|
+
enabled Int @default(0)
|
|
158
|
+
created_at DateTime? @default(now())
|
|
159
|
+
updated_at DateTime? @default(now()) @updatedAt
|
|
160
|
+
|
|
161
|
+
channel channel_directories @relation(fields: [channel_id], references: [channel_id])
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
model channel_verbosity {
|
|
165
|
+
channel_id String @id
|
|
166
|
+
verbosity VerbosityLevel @default(tools_and_text)
|
|
167
|
+
updated_at DateTime? @default(now()) @updatedAt
|
|
168
|
+
|
|
169
|
+
channel channel_directories @relation(fields: [channel_id], references: [channel_id])
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
enum VerbosityLevel {
|
|
173
|
+
tools_and_text
|
|
174
|
+
text_and_essential_tools
|
|
175
|
+
text_only
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
model channel_mention_mode {
|
|
179
|
+
channel_id String @id
|
|
180
|
+
enabled Int @default(0)
|
|
181
|
+
created_at DateTime? @default(now())
|
|
182
|
+
updated_at DateTime? @default(now()) @updatedAt
|
|
183
|
+
|
|
184
|
+
channel channel_directories @relation(fields: [channel_id], references: [channel_id])
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
model global_models {
|
|
188
|
+
app_id String @id
|
|
189
|
+
model_id String
|
|
190
|
+
variant String?
|
|
191
|
+
created_at DateTime? @default(now())
|
|
192
|
+
updated_at DateTime? @default(now()) @updatedAt
|
|
193
|
+
|
|
194
|
+
bot bot_tokens @relation(fields: [app_id], references: [app_id])
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
enum task_status {
|
|
198
|
+
planned
|
|
199
|
+
running
|
|
200
|
+
completed
|
|
201
|
+
cancelled
|
|
202
|
+
failed
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
enum task_schedule_kind {
|
|
206
|
+
at
|
|
207
|
+
cron
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
model scheduled_tasks {
|
|
211
|
+
id Int @id @default(autoincrement())
|
|
212
|
+
status task_status @default(planned)
|
|
213
|
+
schedule_kind task_schedule_kind
|
|
214
|
+
run_at DateTime?
|
|
215
|
+
cron_expr String?
|
|
216
|
+
timezone String?
|
|
217
|
+
next_run_at DateTime
|
|
218
|
+
running_started_at DateTime?
|
|
219
|
+
last_run_at DateTime?
|
|
220
|
+
last_error String?
|
|
221
|
+
attempts Int @default(0)
|
|
222
|
+
payload_json String
|
|
223
|
+
prompt_preview String
|
|
224
|
+
channel_id String?
|
|
225
|
+
thread_id String?
|
|
226
|
+
session_id String?
|
|
227
|
+
project_directory String?
|
|
228
|
+
created_at DateTime? @default(now())
|
|
229
|
+
updated_at DateTime? @default(now()) @updatedAt
|
|
230
|
+
|
|
231
|
+
channel channel_directories? @relation(fields: [channel_id], references: [channel_id], onDelete: SetNull, onUpdate: Cascade)
|
|
232
|
+
thread thread_sessions? @relation(fields: [thread_id], references: [thread_id], onDelete: SetNull, onUpdate: Cascade)
|
|
233
|
+
session_start_sources session_start_sources[]
|
|
234
|
+
|
|
235
|
+
@@index([status, next_run_at])
|
|
236
|
+
@@index([channel_id, status])
|
|
237
|
+
@@index([thread_id, status])
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
model session_start_sources {
|
|
241
|
+
session_id String @id
|
|
242
|
+
schedule_kind task_schedule_kind
|
|
243
|
+
scheduled_task_id Int?
|
|
244
|
+
created_at DateTime? @default(now())
|
|
245
|
+
updated_at DateTime? @default(now()) @updatedAt
|
|
246
|
+
|
|
247
|
+
scheduled_task scheduled_tasks? @relation(fields: [scheduled_task_id], references: [id], onDelete: SetNull, onUpdate: Cascade)
|
|
248
|
+
|
|
249
|
+
@@index([scheduled_task_id])
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
model forum_sync_configs {
|
|
253
|
+
id Int @id @default(autoincrement())
|
|
254
|
+
app_id String
|
|
255
|
+
forum_channel_id String
|
|
256
|
+
output_dir String
|
|
257
|
+
direction String @default("bidirectional")
|
|
258
|
+
created_at DateTime? @default(now())
|
|
259
|
+
updated_at DateTime? @default(now()) @updatedAt
|
|
260
|
+
|
|
261
|
+
bot bot_tokens @relation(fields: [app_id], references: [app_id], onDelete: Cascade, onUpdate: Cascade)
|
|
262
|
+
|
|
263
|
+
@@unique([app_id, forum_channel_id])
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
enum ipc_request_type {
|
|
267
|
+
file_upload
|
|
268
|
+
action_buttons
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
enum ipc_request_status {
|
|
272
|
+
pending
|
|
273
|
+
processing
|
|
274
|
+
completed
|
|
275
|
+
cancelled
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// IPC bridge between the opencode plugin process and the Discord bot process.
|
|
279
|
+
// Replaces the old HTTP lock server for file-upload and action-buttons requests.
|
|
280
|
+
// Plugin inserts a pending row, bot polls and dispatches, then writes the response.
|
|
281
|
+
model ipc_requests {
|
|
282
|
+
id String @id @default(uuid())
|
|
283
|
+
type ipc_request_type
|
|
284
|
+
session_id String
|
|
285
|
+
thread_id String
|
|
286
|
+
payload String // JSON-encoded request data
|
|
287
|
+
response String? // JSON-encoded response, null while pending
|
|
288
|
+
status ipc_request_status @default(pending)
|
|
289
|
+
created_at DateTime @default(now())
|
|
290
|
+
updated_at DateTime @default(now()) @updatedAt
|
|
291
|
+
|
|
292
|
+
thread thread_sessions @relation(fields: [thread_id], references: [thread_id])
|
|
293
|
+
|
|
294
|
+
@@index([status, created_at])
|
|
295
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: batch
|
|
3
|
+
description: >
|
|
4
|
+
Research and plan a large-scale change, then execute it in parallel across
|
|
5
|
+
5-30 isolated worktree agents that each open a PR. Use when the user wants
|
|
6
|
+
to make a sweeping, mechanical change across many files (migrations,
|
|
7
|
+
refactors, bulk renames) that can be decomposed into independent parallel
|
|
8
|
+
units.
|
|
9
|
+
argument-hint: "<instruction>"
|
|
10
|
+
source-path: cli.js (line 7359, function mGz)
|
|
11
|
+
source-package: "@anthropic-ai/claude-code@2.1.63"
|
|
12
|
+
source-date: 2026-02-28
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Batch: Parallel Work Orchestration
|
|
16
|
+
|
|
17
|
+
You are orchestrating a large, parallelizable change across this codebase.
|
|
18
|
+
|
|
19
|
+
## User Instruction
|
|
20
|
+
|
|
21
|
+
$instruction
|
|
22
|
+
|
|
23
|
+
## Phase 1: Research and Plan (Plan Mode)
|
|
24
|
+
|
|
25
|
+
Enter plan mode, then:
|
|
26
|
+
|
|
27
|
+
1. **Understand the scope.** Launch one or more Explore agents (in the foreground — you need their results) to deeply research what this instruction touches. Find all the files, patterns, and call sites that need to change. Understand the existing conventions so the migration is consistent.
|
|
28
|
+
|
|
29
|
+
2. **Decompose into independent units.** Break the work into 5–30 self-contained units. Each unit must:
|
|
30
|
+
- Be independently implementable in an isolated git worktree (no shared state with sibling units)
|
|
31
|
+
- Be mergeable on its own without depending on another unit's PR landing first
|
|
32
|
+
- Be roughly uniform in size (split large units, merge trivial ones)
|
|
33
|
+
|
|
34
|
+
Scale the count to the actual work: few files → closer to 5; hundreds of files → closer to 30. Prefer per-directory or per-module slicing over arbitrary file lists.
|
|
35
|
+
|
|
36
|
+
3. **Determine the e2e test recipe.** Figure out how a worker can verify its change actually works end-to-end — not just that unit tests pass. Look for:
|
|
37
|
+
- A browser-automation tool (for UI changes: click through the affected flow, screenshot the result)
|
|
38
|
+
- A tmux or CLI-verifier skill (for CLI changes: launch the app interactively, exercise the changed behavior)
|
|
39
|
+
- A dev-server + curl pattern (for API changes: start the server, hit the affected endpoints)
|
|
40
|
+
- An existing e2e/integration test suite the worker can run
|
|
41
|
+
|
|
42
|
+
If you cannot find a concrete e2e path, ask the user how to verify this change end-to-end. Offer 2–3 specific options based on what you found (e.g., "Screenshot via chrome extension", "Run `bun run dev` and curl the endpoint", "No e2e — unit tests are sufficient"). Do not skip this — the workers cannot ask the user themselves.
|
|
43
|
+
|
|
44
|
+
Write the recipe as a short, concrete set of steps that a worker can execute autonomously. Include any setup (start a dev server, build first) and the exact command/interaction to verify.
|
|
45
|
+
|
|
46
|
+
4. **Write the plan.** In your plan file, include:
|
|
47
|
+
- A summary of what you found during research
|
|
48
|
+
- A numbered list of work units — for each: a short title, the list of files/directories it covers, and a one-line description of the change
|
|
49
|
+
- The e2e test recipe (or "skip e2e because …" if the user chose that)
|
|
50
|
+
- The exact worker instructions you will give each agent (the shared template)
|
|
51
|
+
|
|
52
|
+
5. Present the plan for approval.
|
|
53
|
+
|
|
54
|
+
## Phase 2: Spawn Workers (After Plan Approval)
|
|
55
|
+
|
|
56
|
+
Once the plan is approved, spawn one background agent per work unit using the Task tool. **All agents must use `isolation: "worktree"` and `run_in_background: true`.** Launch them all in a single message block so they run in parallel.
|
|
57
|
+
|
|
58
|
+
For each agent, the prompt must be fully self-contained. Include:
|
|
59
|
+
- The overall goal (the user's instruction)
|
|
60
|
+
- This unit's specific task (title, file list, change description — copied verbatim from your plan)
|
|
61
|
+
- Any codebase conventions you discovered that the worker needs to follow
|
|
62
|
+
- The e2e test recipe from your plan (or "skip e2e because …")
|
|
63
|
+
- The worker instructions below, copied verbatim:
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
After you finish implementing the change:
|
|
67
|
+
1. **Simplify** — Invoke the simplify skill to review and clean up your changes.
|
|
68
|
+
2. **Run unit tests** — Run the project's test suite (check for package.json scripts, Makefile targets, or common commands like `npm test`, `bun test`, `pytest`, `go test`). If tests fail, fix them.
|
|
69
|
+
3. **Test end-to-end** — Follow the e2e test recipe from the coordinator's prompt (below). If the recipe says to skip e2e for this unit, skip it.
|
|
70
|
+
4. **Commit and push** — Commit all changes with a clear message, push the branch, and create a PR with `gh pr create`. Use a descriptive title. If `gh` is not available or the push fails, note it in your final message.
|
|
71
|
+
5. **Report** — End with a single line: `PR: <url>` so the coordinator can track it. If no PR was created, end with `PR: none — <reason>`.
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Use `subagent_type: "general-purpose"` unless a more specific agent type fits.
|
|
75
|
+
|
|
76
|
+
## Phase 3: Track Progress
|
|
77
|
+
|
|
78
|
+
After launching all workers, render an initial status table:
|
|
79
|
+
|
|
80
|
+
| # | Unit | Status | PR |
|
|
81
|
+
|---|------|--------|----|
|
|
82
|
+
| 1 | <title> | running | — |
|
|
83
|
+
| 2 | <title> | running | — |
|
|
84
|
+
|
|
85
|
+
As background-agent completion notifications arrive, parse the `PR: <url>` line from each agent's result and re-render the table with updated status (`done` / `failed`) and PR links. Keep a brief failure note for any agent that did not produce a PR.
|
|
86
|
+
|
|
87
|
+
When all agents have reported, render the final table and a one-line summary (e.g., "22/24 units landed as PRs").
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: critique
|
|
3
|
+
description: >
|
|
4
|
+
Git diff viewer. Renders diffs as web pages, images, and PDFs
|
|
5
|
+
with syntax highlighting. Use this skill when working with critique for showing
|
|
6
|
+
diffs, generating diff URLs, or selective hunk staging.
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# critique
|
|
10
|
+
|
|
11
|
+
Git diff viewer that renders diffs as **web pages**, **images**, and **PDFs** with syntax highlighting.
|
|
12
|
+
|
|
13
|
+
Agents running in headless environments (kimaki on Discord, openclaw on Slack/Telegram) have no terminal to show diffs. critique uploads diffs to critique.work and returns a shareable URL you can paste into chat. Users click the link and see a syntax-highlighted split-view diff with mobile support and dark/light mode — no install needed.
|
|
14
|
+
|
|
15
|
+
**Always run `critique --help` first** to see the latest flags and commands. The help output is the source of truth.
|
|
16
|
+
|
|
17
|
+
## Web — shareable diff URLs
|
|
18
|
+
|
|
19
|
+
Always pass a title to describe what the diff contains.
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
# Working tree changes
|
|
23
|
+
critique --web "Add retry logic to database connections"
|
|
24
|
+
|
|
25
|
+
# Staged changes
|
|
26
|
+
critique --staged --web "Refactor auth middleware"
|
|
27
|
+
|
|
28
|
+
# Branch diff (three-dot: changes since diverging from base)
|
|
29
|
+
critique main...HEAD --web "Feature branch changes"
|
|
30
|
+
critique main...feature-branch --web "Compare branches"
|
|
31
|
+
|
|
32
|
+
# Last N commits
|
|
33
|
+
critique HEAD~3 --web "Recent changes"
|
|
34
|
+
|
|
35
|
+
# Specific commit
|
|
36
|
+
critique --commit HEAD --web "Latest commit"
|
|
37
|
+
critique --commit abc1234 --web "Fix race condition"
|
|
38
|
+
|
|
39
|
+
# Filter to specific files
|
|
40
|
+
critique --web "API changes" --filter "src/api.ts" --filter "src/utils.ts"
|
|
41
|
+
|
|
42
|
+
# JSON output for programmatic use (returns {url, id, files})
|
|
43
|
+
critique --web "Deploy changes" --json
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Share the returned URL with the user so they can see the diff.
|
|
47
|
+
|
|
48
|
+
## PDF
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
critique --pdf # working tree to PDF
|
|
52
|
+
critique --staged --pdf # staged changes
|
|
53
|
+
critique main...HEAD --pdf # branch diff
|
|
54
|
+
critique --commit HEAD --pdf # single commit
|
|
55
|
+
critique --pdf output.pdf # custom filename
|
|
56
|
+
critique --pdf --pdf-page-size a4-portrait # page size options
|
|
57
|
+
critique main...HEAD --pdf --open # open in viewer
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Image
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
critique --image # renders to /tmp as WebP
|
|
64
|
+
critique main...HEAD --image # branch diff as images
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Selective hunk staging
|
|
68
|
+
|
|
69
|
+
When multiple agents work on the same repo, each agent should only commit its own changes. `critique hunks` lets you stage individual hunks instead of whole files — like a scriptable `git add -p`.
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
# List hunks with stable IDs
|
|
73
|
+
critique hunks list
|
|
74
|
+
critique hunks list --filter "src/**/*.ts"
|
|
75
|
+
|
|
76
|
+
# Stage specific hunks by ID
|
|
77
|
+
critique hunks add 'src/main.ts:@-10,6+10,7'
|
|
78
|
+
critique hunks add 'src/main.ts:@-10,6+10,7' 'src/utils.ts:@-5,3+5,4'
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Hunk ID format: `file:@-oldStart,oldLines+newStart,newLines` — derived from the `@@` diff header, stable across runs.
|
|
82
|
+
|
|
83
|
+
**Typical workflow:**
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
critique hunks list # see all unstaged hunks
|
|
87
|
+
critique hunks add 'file:@-10,6+10,7' # stage only your hunks
|
|
88
|
+
git commit -m "your changes" # commit separately
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Raw patch access
|
|
92
|
+
|
|
93
|
+
Every `--web` upload also stores the raw unified diff. Append `.patch` to any critique URL to get it:
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
# View the raw patch
|
|
97
|
+
curl https://critique.work/v/<id>.patch
|
|
98
|
+
|
|
99
|
+
# Apply the patch to current repo
|
|
100
|
+
curl -s https://critique.work/v/<id>.patch | git apply
|
|
101
|
+
|
|
102
|
+
# Reverse the patch (undo the changes)
|
|
103
|
+
curl -s https://critique.work/v/<id>.patch | git apply --reverse
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Useful when an agent shares a critique URL and you want to programmatically apply or revert those changes.
|
|
107
|
+
|
|
108
|
+
## Notes
|
|
109
|
+
|
|
110
|
+
- Requires **Bun** — use `bunx critique` or global `critique`
|
|
111
|
+
- Lock files and diffs >6000 lines are auto-hidden
|
|
112
|
+
- `--web` URLs expire after 7 days (content-hashed, same diff = same URL)
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: egaki
|
|
3
|
+
description: >
|
|
4
|
+
AI image and video generation CLI. Use this skill to install egaki, configure
|
|
5
|
+
auth, run help commands, and generate images or videos with provider keys or
|
|
6
|
+
an Egaki subscription.
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# egaki
|
|
10
|
+
|
|
11
|
+
Generate AI images and videos from the terminal.
|
|
12
|
+
Use this for text-to-image, image editing, mask-based edits, text-to-video,
|
|
13
|
+
image-to-video, and model discovery.
|
|
14
|
+
|
|
15
|
+
## Install
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
pnpm add -g egaki
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Always check help first
|
|
22
|
+
|
|
23
|
+
Run the full help output before using commands:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
egaki --help
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Do not truncate help output with `head`.
|
|
30
|
+
|
|
31
|
+
For subcommand details: `egaki <command> --help` (e.g. `egaki image --help`, `egaki video --help`, `egaki login --help`)
|
|
32
|
+
|
|
33
|
+
## Auth options
|
|
34
|
+
|
|
35
|
+
You can authenticate in two ways:
|
|
36
|
+
|
|
37
|
+
1. Egaki subscription key (recommended — all models, one key)
|
|
38
|
+
2. Provider API keys (Google, OpenAI, Fal, Replicate) via `egaki login`
|
|
39
|
+
|
|
40
|
+
If using Egaki subscription, set it up first with `egaki subscribe`, then store
|
|
41
|
+
the key with `egaki login --provider egaki --key egaki_...`.
|
|
42
|
+
|
|
43
|
+
## Login behavior for remote agents
|
|
44
|
+
|
|
45
|
+
When login requires a URL flow, run login in the background and send the login URL
|
|
46
|
+
to the user so they can complete auth interactively.
|
|
47
|
+
|
|
48
|
+
## Example commands
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
# configure key interactively
|
|
52
|
+
egaki login
|
|
53
|
+
|
|
54
|
+
# show login status
|
|
55
|
+
egaki login --show
|
|
56
|
+
|
|
57
|
+
# subscribe to Egaki for all supported models
|
|
58
|
+
egaki subscribe
|
|
59
|
+
|
|
60
|
+
# check subscription usage
|
|
61
|
+
egaki usage
|
|
62
|
+
|
|
63
|
+
# generate an image
|
|
64
|
+
egaki image "a watercolor fox reading a map" -o fox.png
|
|
65
|
+
|
|
66
|
+
# select a model explicitly
|
|
67
|
+
egaki image "isometric floating city, soft colors" -m imagen-4.0-generate-001 -o city.png
|
|
68
|
+
|
|
69
|
+
# edit an existing image (local file or URL)
|
|
70
|
+
egaki image "add a red scarf and make it winter" --input portrait.jpg -o portrait-winter.png
|
|
71
|
+
egaki image "turn this into a manga panel" --input https://example.com/photo.jpg -o manga.png
|
|
72
|
+
|
|
73
|
+
# inpainting with a mask
|
|
74
|
+
egaki image "replace the sky with a dramatic sunset" --input scene.png --mask mask.png -o scene-sunset.png
|
|
75
|
+
|
|
76
|
+
# generate a video — use a 5 minute timeout, video generation is slow
|
|
77
|
+
egaki video "a paper boat drifting on a calm lake at sunrise" -o boat.mp4
|
|
78
|
+
|
|
79
|
+
# generate a video with a specific model
|
|
80
|
+
egaki video "timelapse of a stormy sea, cinematic" -m google/veo-3.1-fast-generate-001 --duration 6 -o storm.mp4
|
|
81
|
+
|
|
82
|
+
# cheap video model
|
|
83
|
+
egaki video "a cat walking on a rooftop at night" -m klingai/kling-v2.5-turbo-t2v --duration 5 -o cat.mp4
|
|
84
|
+
|
|
85
|
+
# image-to-video (model must support i2v)
|
|
86
|
+
egaki video "slowly animate the clouds" --input photo.jpg -m klingai/kling-v2.6-i2v -o animated.mp4
|
|
87
|
+
|
|
88
|
+
# discover all models (image + video)
|
|
89
|
+
egaki models
|
|
90
|
+
|
|
91
|
+
# filter by type
|
|
92
|
+
egaki models --type video
|
|
93
|
+
egaki models --type image
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## Video generation note for agents
|
|
97
|
+
|
|
98
|
+
Video generation can be very slow — some models take 1–3 minutes per request.
|
|
99
|
+
Always use a command timeout of **at least 5 minutes** when invoking `egaki video`
|
|
100
|
+
from automation or agent workflows.
|