@otto-assistant/otto 0.1.1 → 0.7.15
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-account-identity.js +62 -0
- package/dist/anthropic-account-identity.test.js +38 -0
- package/dist/anthropic-auth-plugin.js +917 -0
- package/dist/anthropic-auth-state.js +303 -0
- package/dist/anthropic-auth-state.test.js +150 -0
- package/dist/bin.js +152 -0
- package/dist/btw-prefix-detection.js +17 -0
- package/dist/btw-prefix-detection.test.js +63 -0
- package/dist/channel-management.js +259 -0
- package/dist/cli-parsing.test.js +142 -0
- package/dist/cli-send-thread.e2e.test.js +353 -0
- package/dist/cli-telegram-options.test.js +99 -0
- package/dist/cli.js +4210 -568
- package/dist/commands/abort.js +65 -0
- package/dist/commands/action-buttons.js +245 -0
- package/dist/commands/add-dir.js +124 -0
- package/dist/commands/add-dir.test.js +126 -0
- package/dist/commands/add-project.js +113 -0
- package/dist/commands/agent.js +355 -0
- package/dist/commands/ask-question.js +320 -0
- package/dist/commands/ask-question.test.js +92 -0
- package/dist/commands/btw.js +121 -0
- package/dist/commands/cli-commands-group-a.test.js +728 -0
- package/dist/commands/cli-commands-group-b.test.js +695 -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/discord-commands-group-a.test.js +621 -0
- package/dist/commands/discord-commands-group-b.test.js +595 -0
- package/dist/commands/discord-commands-group-c.test.js +739 -0
- package/dist/commands/file-upload.js +275 -0
- package/dist/commands/fork-subagent.js +177 -0
- package/dist/commands/fork.js +262 -0
- package/dist/commands/gemini-apikey.js +70 -0
- package/dist/commands/login.js +887 -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 +162 -0
- package/dist/commands/model-variant.js +366 -0
- package/dist/commands/model.js +794 -0
- package/dist/commands/new-worktree.js +465 -0
- package/dist/commands/paginated-select.js +57 -0
- package/dist/commands/permissions.js +274 -0
- package/dist/commands/queue.js +223 -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/thread-deletion-sync.js +50 -0
- package/dist/commands/types.js +2 -0
- package/dist/commands/undo-redo.js +305 -0
- package/dist/commands/unset-model.js +139 -0
- package/dist/commands/upgrade.js +48 -0
- package/dist/commands/user-command.js +155 -0
- package/dist/commands/verbosity.js +125 -0
- package/dist/commands/vscode.js +269 -0
- package/dist/commands/worktree-settings.js +43 -0
- package/dist/commands/worktrees.js +468 -0
- package/dist/condense-memory.js +33 -0
- package/dist/config.js +100 -255
- package/dist/context-awareness-plugin.js +340 -0
- package/dist/context-awareness-plugin.test.js +126 -0
- package/dist/critique-utils.js +95 -0
- package/dist/database.js +1355 -0
- package/dist/db.js +260 -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 +1124 -0
- package/dist/discord-command-registration.js +567 -0
- package/dist/discord-urls.js +82 -0
- package/dist/discord-utils.js +616 -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 +491 -0
- package/dist/format-tables.test.js +478 -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 +485 -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 +58 -0
- package/dist/generated/internal/class.js +49 -0
- package/dist/generated/internal/prismaNamespace.js +254 -0
- package/dist/generated/internal/prismaNamespaceBrowser.js +224 -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 +251 -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 +420 -0
- package/dist/ipc-polling.js +327 -0
- package/dist/ipc-tools-plugin.js +193 -0
- package/dist/ipc-utils.js +18 -0
- package/dist/limit-heading-depth.js +25 -0
- package/dist/limit-heading-depth.test.js +105 -0
- package/dist/logger.js +171 -0
- package/dist/markdown.js +342 -0
- package/dist/markdown.test.js +264 -0
- package/dist/memory-overview-plugin.js +128 -0
- package/dist/message-finish-field.e2e.test.js +168 -0
- package/dist/message-formatting.js +415 -0
- package/dist/message-formatting.test.js +115 -0
- package/dist/message-preprocessing.js +359 -0
- package/dist/onboarding-tutorial.js +163 -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 +131 -0
- package/dist/opencode-command.test.js +48 -0
- package/dist/opencode-interrupt-plugin.js +388 -0
- package/dist/opencode-interrupt-plugin.test.js +463 -0
- package/dist/opencode.js +1117 -0
- package/dist/otto/branding.js +22 -0
- package/dist/otto/index.js +21 -0
- package/dist/otto-digital-twin.e2e.test.js +161 -0
- package/dist/otto-opencode-plugin-loading.e2e.test.js +94 -0
- package/dist/otto-opencode-plugin.js +21 -0
- package/dist/otto-opencode-plugin.test.js +98 -0
- package/dist/parse-permission-rules.test.js +117 -0
- package/dist/patch-text-parser.js +97 -0
- package/dist/plugin-logger.js +68 -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 +790 -0
- package/dist/queue-advanced-footer.e2e.test.js +481 -0
- package/dist/queue-advanced-model-switch.e2e.test.js +299 -0
- package/dist/queue-advanced-permissions-typing.e2e.test.js +179 -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 +256 -0
- package/dist/runtime-idle-sweeper.js +52 -0
- package/dist/runtime-lifecycle.e2e.test.js +514 -0
- package/dist/sentry.js +23 -0
- package/dist/session-handler/agent-utils.js +67 -0
- package/dist/session-handler/event-stream-state.js +475 -0
- package/dist/session-handler/event-stream-state.test.js +632 -0
- package/dist/session-handler/model-utils.js +147 -0
- package/dist/session-handler/opencode-session-event-log.js +94 -0
- package/dist/session-handler/thread-runtime-state.js +131 -0
- package/dist/session-handler/thread-session-runtime.js +3390 -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 +92 -0
- package/dist/skill-filter.js +31 -0
- package/dist/skill-filter.test.js +65 -0
- package/dist/startup-service.js +153 -0
- package/dist/startup-time.e2e.test.js +296 -0
- package/dist/store.js +19 -0
- package/dist/subagent-rate-limit-plugin.js +175 -0
- package/dist/system-message.js +702 -0
- package/dist/system-message.test.js +697 -0
- package/dist/task-runner.js +530 -0
- package/dist/task-schedule.js +213 -0
- package/dist/task-schedule.test.js +71 -0
- package/dist/test-utils.js +313 -0
- package/dist/thinking-utils.js +35 -0
- package/dist/thread-message-queue.e2e.test.js +1111 -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 +156 -0
- package/dist/utils.js +172 -0
- package/dist/utils.test.js +130 -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 +456 -0
- package/dist/voice.test.js +235 -0
- package/dist/wait-session.js +171 -0
- package/dist/websockify.js +69 -0
- package/dist/worker-types.js +4 -0
- package/dist/worktree-lifecycle.e2e.test.js +311 -0
- package/dist/worktree-utils.js +3 -0
- package/dist/worktrees.js +991 -0
- package/dist/worktrees.test.js +415 -0
- package/dist/xml.js +92 -0
- package/dist/xml.test.js +32 -0
- package/package.json +90 -38
- package/schema.prisma +303 -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/goke/SKILL.md +38 -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/manual-kimaki-upstream-adapt/SKILL.md +114 -0
- package/skills/new-skill/SKILL.md +237 -0
- package/skills/npm-package/SKILL.md +617 -0
- package/skills/opensrc/SKILL.md +78 -0
- package/skills/otto-publish/SKILL.md +61 -0
- package/skills/playwriter/SKILL.md +35 -0
- package/skills/profano/SKILL.md +16 -0
- package/skills/proxyman/SKILL.md +215 -0
- package/skills/security-review/SKILL.md +208 -0
- package/skills/sigillo/SKILL.md +101 -0
- package/skills/simplify/SKILL.md +58 -0
- package/skills/spiceflow/SKILL.md +28 -0
- package/skills/termcast/SKILL.md +945 -0
- package/skills/tuistory/SKILL.md +98 -0
- package/skills/usecomputer/SKILL.md +264 -0
- package/skills/x-articles/SKILL.md +554 -0
- package/skills/zele/SKILL.md +49 -0
- package/skills/zustand-centralized-state/SKILL.md +1004 -0
- package/src/agent-model.e2e.test.ts +979 -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-account-identity.test.ts +52 -0
- package/src/anthropic-account-identity.ts +77 -0
- package/src/anthropic-auth-plugin.ts +1139 -0
- package/src/anthropic-auth-state.test.ts +187 -0
- package/src/anthropic-auth-state.ts +386 -0
- package/src/bin.ts +182 -0
- package/src/btw-prefix-detection.test.ts +73 -0
- package/src/btw-prefix-detection.ts +23 -0
- package/src/channel-management.ts +376 -0
- package/src/cli-parsing.test.ts +197 -0
- package/src/cli-send-thread.e2e.test.ts +463 -0
- package/src/cli-telegram-options.test.ts +114 -0
- package/src/cli.ts +5718 -580
- package/src/commands/abort.ts +89 -0
- package/src/commands/action-buttons.ts +364 -0
- package/src/commands/add-dir.test.ts +154 -0
- package/src/commands/add-dir.ts +175 -0
- package/src/commands/add-project.ts +149 -0
- package/src/commands/agent.ts +496 -0
- package/src/commands/ask-question.test.ts +111 -0
- package/src/commands/ask-question.ts +455 -0
- package/src/commands/btw.ts +184 -0
- package/src/commands/cli-commands-group-a.test.ts +837 -0
- package/src/commands/cli-commands-group-b.test.ts +800 -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/discord-commands-group-a.test.ts +751 -0
- package/src/commands/discord-commands-group-b.test.ts +648 -0
- package/src/commands/discord-commands-group-c.test.ts +882 -0
- package/src/commands/file-upload.ts +389 -0
- package/src/commands/fork-subagent.ts +263 -0
- package/src/commands/fork.ts +386 -0
- package/src/commands/gemini-apikey.ts +104 -0
- package/src/commands/login.ts +1175 -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 +226 -0
- package/src/commands/model-variant.ts +485 -0
- package/src/commands/model.ts +1078 -0
- package/src/commands/new-worktree.ts +645 -0
- package/src/commands/paginated-select.ts +81 -0
- package/src/commands/permissions.ts +397 -0
- package/src/commands/queue.ts +293 -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/thread-deletion-sync.ts +80 -0
- package/src/commands/types.ts +25 -0
- package/src/commands/undo-redo.ts +386 -0
- package/src/commands/unset-model.ts +174 -0
- package/src/commands/upgrade.ts +59 -0
- package/src/commands/user-command.ts +198 -0
- package/src/commands/verbosity.ts +173 -0
- package/src/commands/vscode.ts +342 -0
- package/src/commands/worktree-settings.ts +70 -0
- package/src/commands/worktrees.ts +645 -0
- package/src/condense-memory.ts +36 -0
- package/src/config.ts +103 -339
- package/src/context-awareness-plugin.test.ts +144 -0
- package/src/context-awareness-plugin.ts +469 -0
- package/src/critique-utils.ts +139 -0
- package/src/database.ts +1949 -0
- package/src/db.test.ts +162 -0
- package/src/db.ts +295 -0
- package/src/debounce-timeout.ts +43 -0
- package/src/debounced-process-flush.ts +104 -0
- package/src/discord-bot.ts +1505 -0
- package/src/discord-command-registration.ts +752 -0
- package/src/discord-urls.ts +89 -0
- package/src/discord-utils.test.ts +153 -0
- package/src/discord-utils.ts +846 -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 +515 -0
- package/src/format-tables.ts +718 -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 +644 -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 +770 -0
- package/src/generated/enums.ts +98 -0
- package/src/generated/internal/class.ts +384 -0
- package/src/generated/internal/prismaNamespace.ts +2394 -0
- package/src/generated/internal/prismaNamespaceBrowser.ts +327 -0
- package/src/generated/models/bot_api_keys.ts +1288 -0
- package/src/generated/models/bot_tokens.ts +1700 -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 +299 -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 +610 -0
- package/src/ipc-polling.ts +427 -0
- package/src/ipc-tools-plugin.ts +236 -0
- package/src/ipc-utils.ts +29 -0
- package/src/limit-heading-depth.test.ts +116 -0
- package/src/limit-heading-depth.ts +26 -0
- package/src/logger.ts +215 -0
- package/src/markdown.test.ts +315 -0
- package/src/markdown.ts +410 -0
- package/src/memory-overview-plugin.ts +163 -0
- package/src/message-finish-field.e2e.test.ts +195 -0
- package/src/message-formatting.test.ts +126 -0
- package/src/message-formatting.ts +535 -0
- package/src/message-preprocessing.ts +488 -0
- package/src/onboarding-tutorial.ts +167 -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 +191 -0
- package/src/opencode-interrupt-plugin.test.ts +682 -0
- package/src/opencode-interrupt-plugin.ts +507 -0
- package/src/opencode.ts +1453 -0
- package/src/otto/branding.ts +23 -0
- package/src/otto/index.ts +22 -0
- package/src/otto-digital-twin.e2e.test.ts +199 -0
- package/src/otto-opencode-plugin-loading.e2e.test.ts +117 -0
- package/src/otto-opencode-plugin.test.ts +108 -0
- package/src/otto-opencode-plugin.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 +84 -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 +877 -0
- package/src/queue-advanced-footer.e2e.test.ts +591 -0
- package/src/queue-advanced-model-switch.e2e.test.ts +383 -0
- package/src/queue-advanced-permissions-typing.e2e.test.ts +246 -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 +327 -0
- package/src/runtime-idle-sweeper.ts +76 -0
- package/src/runtime-lifecycle.e2e.test.ts +651 -0
- package/src/schema.sql +174 -0
- package/src/sentry.ts +26 -0
- package/src/session-handler/agent-utils.ts +99 -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 +717 -0
- package/src/session-handler/event-stream-state.ts +706 -0
- package/src/session-handler/model-utils.ts +217 -0
- package/src/session-handler/opencode-session-event-log.ts +130 -0
- package/src/session-handler/thread-runtime-state.ts +247 -0
- package/src/session-handler/thread-session-runtime.ts +4440 -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 +130 -0
- package/src/skill-filter.test.ts +83 -0
- package/src/skill-filter.ts +42 -0
- package/src/startup-service.ts +200 -0
- package/src/startup-time.e2e.test.ts +373 -0
- package/src/store.ts +139 -0
- package/src/subagent-rate-limit-plugin.ts +218 -0
- package/src/system-message.test.ts +710 -0
- package/src/system-message.ts +814 -0
- package/src/task-runner.ts +725 -0
- package/src/task-schedule.test.ts +84 -0
- package/src/task-schedule.ts +317 -0
- package/src/test-utils.ts +451 -0
- package/src/thinking-utils.ts +61 -0
- package/src/thread-message-queue.e2e.test.ts +1350 -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 +185 -0
- package/src/utils.test.ts +155 -0
- package/src/utils.ts +265 -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 +638 -0
- package/src/wait-session.ts +273 -0
- package/src/websockify.ts +101 -0
- package/src/worker-types.ts +64 -0
- package/src/worktree-lifecycle.e2e.test.ts +396 -0
- package/src/worktree-utils.ts +4 -0
- package/src/worktrees.test.ts +489 -0
- package/src/worktrees.ts +1370 -0
- package/src/xml.test.ts +38 -0
- package/src/xml.ts +121 -0
- package/dist/cli.d.ts +0 -3
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/config.d.ts +0 -39
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js.map +0 -1
- package/dist/config.test.d.ts +0 -2
- package/dist/config.test.d.ts.map +0 -1
- package/dist/config.test.js +0 -202
- package/dist/config.test.js.map +0 -1
- package/dist/detect.d.ts +0 -9
- package/dist/detect.d.ts.map +0 -1
- package/dist/detect.js +0 -40
- package/dist/detect.js.map +0 -1
- package/dist/detect.test.d.ts +0 -2
- package/dist/detect.test.d.ts.map +0 -1
- package/dist/detect.test.js +0 -26
- package/dist/detect.test.js.map +0 -1
- package/dist/docker.d.ts +0 -7
- package/dist/docker.d.ts.map +0 -1
- package/dist/docker.js +0 -17
- package/dist/docker.js.map +0 -1
- package/dist/docker.test.d.ts +0 -2
- package/dist/docker.test.d.ts.map +0 -1
- package/dist/docker.test.js +0 -12
- package/dist/docker.test.js.map +0 -1
- package/dist/health.d.ts +0 -31
- package/dist/health.d.ts.map +0 -1
- package/dist/health.js +0 -117
- package/dist/health.js.map +0 -1
- package/dist/health.test.d.ts +0 -2
- package/dist/health.test.d.ts.map +0 -1
- package/dist/health.test.js +0 -52
- package/dist/health.test.js.map +0 -1
- package/dist/index.d.ts +0 -20
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -15
- package/dist/index.js.map +0 -1
- package/dist/index.test.d.ts +0 -2
- package/dist/index.test.d.ts.map +0 -1
- package/dist/index.test.js +0 -8
- package/dist/index.test.js.map +0 -1
- package/dist/installer.d.ts +0 -10
- package/dist/installer.d.ts.map +0 -1
- package/dist/installer.js +0 -50
- package/dist/installer.js.map +0 -1
- package/dist/installer.test.d.ts +0 -2
- package/dist/installer.test.d.ts.map +0 -1
- package/dist/installer.test.js +0 -43
- package/dist/installer.test.js.map +0 -1
- package/dist/lifecycle.d.ts +0 -10
- package/dist/lifecycle.d.ts.map +0 -1
- package/dist/lifecycle.js +0 -45
- package/dist/lifecycle.js.map +0 -1
- package/dist/lifecycle.test.d.ts +0 -2
- package/dist/lifecycle.test.d.ts.map +0 -1
- package/dist/lifecycle.test.js +0 -20
- package/dist/lifecycle.test.js.map +0 -1
- package/dist/manifest.d.ts +0 -18
- package/dist/manifest.d.ts.map +0 -1
- package/dist/manifest.js +0 -30
- package/dist/manifest.js.map +0 -1
- package/dist/skills-baseline.d.ts +0 -7
- package/dist/skills-baseline.d.ts.map +0 -1
- package/dist/skills-baseline.js +0 -9
- package/dist/skills-baseline.js.map +0 -1
- package/dist/skills.d.ts +0 -110
- package/dist/skills.d.ts.map +0 -1
- package/dist/skills.js +0 -429
- package/dist/skills.js.map +0 -1
- package/dist/skills.test.d.ts +0 -2
- package/dist/skills.test.d.ts.map +0 -1
- package/dist/skills.test.js +0 -416
- package/dist/skills.test.js.map +0 -1
- package/dist/sync.d.ts +0 -10
- package/dist/sync.d.ts.map +0 -1
- package/dist/sync.js +0 -39
- package/dist/sync.js.map +0 -1
- package/dist/tenant.d.ts +0 -13
- package/dist/tenant.d.ts.map +0 -1
- package/dist/tenant.js +0 -105
- package/dist/tenant.js.map +0 -1
- package/dist/tenant.test.d.ts +0 -2
- package/dist/tenant.test.d.ts.map +0 -1
- package/dist/tenant.test.js +0 -37
- package/dist/tenant.test.js.map +0 -1
- package/src/config.test.ts +0 -237
- package/src/detect.test.ts +0 -29
- package/src/detect.ts +0 -52
- package/src/docker.test.ts +0 -12
- package/src/docker.ts +0 -23
- package/src/health.test.ts +0 -61
- package/src/health.ts +0 -158
- package/src/index.test.ts +0 -8
- package/src/index.ts +0 -62
- package/src/installer.test.ts +0 -52
- package/src/installer.ts +0 -62
- package/src/lifecycle.test.ts +0 -23
- package/src/lifecycle.ts +0 -49
- package/src/manifest.ts +0 -42
- package/src/skills-baseline.ts +0 -14
- package/src/skills.test.ts +0 -503
- package/src/skills.ts +0 -512
- package/src/sync.ts +0 -53
- package/src/tenant.test.ts +0 -49
- package/src/tenant.ts +0 -120
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: otto-publish
|
|
3
|
+
description: >
|
|
4
|
+
End-to-end Otto release workflow for @otto-assistant/otto: commit, push,
|
|
5
|
+
verify GitHub Actions npm publish, fix failures, then upgrade on host and
|
|
6
|
+
restart dependent processes. Use when user says "publish".
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Otto Publish Workflow
|
|
10
|
+
|
|
11
|
+
Run this workflow whenever the user asks to publish Otto.
|
|
12
|
+
|
|
13
|
+
## Required behavior
|
|
14
|
+
|
|
15
|
+
1. Commit and push requested changes.
|
|
16
|
+
2. Verify the GitHub workflow that builds and publishes `@otto-assistant/otto` (and the `@otto-assistant/bridge` deprecation shim).
|
|
17
|
+
3. If workflow fails, fix issues and repeat until green.
|
|
18
|
+
4. Upgrade npm package on the current host.
|
|
19
|
+
5. Restart processes/services that depend on the updated package.
|
|
20
|
+
6. Report final published version and verification evidence.
|
|
21
|
+
|
|
22
|
+
## Release commands
|
|
23
|
+
|
|
24
|
+
Use repository root unless noted.
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
git status --short --branch
|
|
28
|
+
git diff
|
|
29
|
+
git log -8 --oneline
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
# stage only requested files
|
|
34
|
+
git add <files>
|
|
35
|
+
|
|
36
|
+
git commit -m "$(cat <<'EOF'
|
|
37
|
+
<message>
|
|
38
|
+
EOF
|
|
39
|
+
)"
|
|
40
|
+
|
|
41
|
+
git push origin HEAD
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
# monitor publish workflow
|
|
46
|
+
gh run list --workflow "publish-npm.yml" --limit 10
|
|
47
|
+
gh run view <run-id> --log
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
# update package on host
|
|
52
|
+
pnpm add -g @otto-assistant/otto@latest
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Validation after host upgrade
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
otto --version
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
If bot process is running, restart it with SIGUSR2 so it reloads new code.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: playwriter
|
|
3
|
+
description: Control the user own Chrome browser via Playwriter extension with Playwright code snippets in a stateful local js sandbox via playwriter cli. Use this over other Playwright MCPs to automate the browser — it connects to the user's existing Chrome instead of launching a new one. Use this for JS-heavy websites (Instagram, Twitter, cookie/login walls, lazy-loaded UIs) instead of webfetch/curl. Run `playwriter skill` command to read the complete up to date skill
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## REQUIRED: Read Full Documentation First
|
|
7
|
+
|
|
8
|
+
**Before using playwriter, you MUST run this command:**
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
playwriter skill # IMPORTANT! do not use | head here. read in full!
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
This outputs the complete documentation including:
|
|
15
|
+
|
|
16
|
+
- Session management and timeout configuration
|
|
17
|
+
- Selector strategies (and which ones to AVOID)
|
|
18
|
+
- Rules to prevent timeouts and failures
|
|
19
|
+
- Best practices for slow pages and SPAs
|
|
20
|
+
- Context variables, utility functions, and more
|
|
21
|
+
|
|
22
|
+
**Do NOT skip this step.** The quick examples below will fail without understanding timeouts, selector rules, and common pitfalls from the full docs.
|
|
23
|
+
|
|
24
|
+
**Read the ENTIRE output.** Do NOT pipe through `head`, `tail`, or any truncation command. The skill output must be read in its entirety — critical rules about timeouts, selectors, and common pitfalls are spread throughout the document, not just at the top.
|
|
25
|
+
|
|
26
|
+
## Minimal Example (after reading full docs)
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
playwriter session new
|
|
30
|
+
playwriter -s 1 -e 'await page.goto("https://example.com")'
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
**Always use single quotes** for the `-e` argument. Single quotes prevent bash from interpreting `$`, backticks, and backslashes inside your JS code. Use double quotes or backtick template literals for strings inside the JS.
|
|
34
|
+
|
|
35
|
+
If `playwriter` is not found, use `npx playwriter@latest` or `bunx playwriter@latest`.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: profano
|
|
3
|
+
description: CLI tool to analyze V8 .cpuprofile files and print top functions by self-time or total-time in the terminal. ALWAYS load this skill when CPU profiling JavaScript or TypeScript programs (Node, Vitest, Bun, Chrome DevTools exports) — it shows how to generate .cpuprofile files and how to inspect them from the terminal without opening Chrome DevTools.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# profano
|
|
7
|
+
|
|
8
|
+
`profano` reads V8 `.cpuprofile` files and prints the heaviest functions as a table sorted by self-time or total (inclusive) time.
|
|
9
|
+
|
|
10
|
+
Every time you use profano, you MUST fetch the latest README and read it in full:
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
curl -s https://raw.githubusercontent.com/remorses/profano/main/README.md # NEVER pipe to head/tail, read in full
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
The README covers generating `.cpuprofile` files (Node, Vitest, Bun, Chrome DevTools, browser pages via playwriter, React component profiling), all CLI options, and how to read the output columns.
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: proxyman
|
|
3
|
+
description: >
|
|
4
|
+
Reverse-engineer HTTP APIs using Proxyman for macOS. Intercept, record, and export
|
|
5
|
+
network traffic from CLI tools and apps (Node.js, Python, Ruby, Go, curl).
|
|
6
|
+
Export as HAR (JSON) and analyze with jq. Use this skill when the user wants
|
|
7
|
+
to capture, inspect, or reverse-engineer HTTP traffic from macOS applications.
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# proxyman — HTTP traffic capture and reverse-engineering
|
|
11
|
+
|
|
12
|
+
Proxyman is a macOS proxy that intercepts HTTP/HTTPS traffic. Use it to
|
|
13
|
+
reverse-engineer APIs: capture what an app sends, inspect headers and bodies,
|
|
14
|
+
and build SDKs or integrations from the captured data.
|
|
15
|
+
|
|
16
|
+
## Important
|
|
17
|
+
|
|
18
|
+
**Always run `proxyman-cli --help` and `proxyman-cli <subcommand> --help`
|
|
19
|
+
before using.** The help output is the source of truth for all commands and
|
|
20
|
+
options. The CLI binary lives inside the app bundle:
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
/Applications/Proxyman.app/Contents/MacOS/proxyman-cli
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**Proxyman GUI must be running** for the CLI to work. The CLI talks to the
|
|
27
|
+
running app — it does not work standalone or headless.
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
open -a Proxyman
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Node.js, Python, Ruby, Go, curl do NOT use macOS system proxy
|
|
34
|
+
|
|
35
|
+
This is critical. Even though Proxyman auto-configures macOS system proxy
|
|
36
|
+
settings, **CLI tools and runtimes ignore them**. You must set env vars so
|
|
37
|
+
traffic routes through Proxyman (default port 9090):
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
HTTPS_PROXY=http://127.0.0.1:9090 \
|
|
41
|
+
HTTP_PROXY=http://127.0.0.1:9090 \
|
|
42
|
+
NODE_TLS_REJECT_UNAUTHORIZED=0 \
|
|
43
|
+
<your-command-here>
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
- `HTTPS_PROXY` / `HTTP_PROXY`: route traffic through Proxyman
|
|
47
|
+
- `NODE_TLS_REJECT_UNAUTHORIZED=0`: accept Proxyman's SSL cert for Node.js apps
|
|
48
|
+
- For Python: `REQUESTS_CA_BUNDLE` or `SSL_CERT_FILE` may be needed instead
|
|
49
|
+
- For curl: use `--proxy http://127.0.0.1:9090 -k` or set the env vars
|
|
50
|
+
|
|
51
|
+
Proxyman also has an "Automatic Setup" feature (Setup menu > Automatic Setup)
|
|
52
|
+
that opens a pre-configured terminal with all env vars set. But for scripting
|
|
53
|
+
and agent use, set the env vars explicitly as shown above.
|
|
54
|
+
|
|
55
|
+
## CLI reference
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
proxyman-cli clear-session Clear current captured traffic
|
|
59
|
+
proxyman-cli export-log [options] Export captured traffic to file
|
|
60
|
+
proxyman-cli export [options] Export debug tool rules (Map Local, etc)
|
|
61
|
+
proxyman-cli import --input <file> Import debug tool rules
|
|
62
|
+
proxyman-cli proxy on|off Toggle macOS system HTTP proxy
|
|
63
|
+
proxyman-cli breakpoint enable|disable Toggle Breakpoint tool
|
|
64
|
+
proxyman-cli maplocal enable|disable Toggle Map Local tool
|
|
65
|
+
proxyman-cli scripting enable|disable Toggle Scripting tool
|
|
66
|
+
proxyman-cli install-root-cert <file> Install custom root cert (requires sudo)
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### export-log options
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
-m, --mode <mode> all | domains (default: all)
|
|
73
|
+
-o, --output <path> Output file path (required)
|
|
74
|
+
-d, --domains <domain> Filter by domain (repeatable, only with -m domains)
|
|
75
|
+
-f, --format <format> proxymansession | har | raw (default: proxymansession)
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
**Always use `-f har`** for agent workflows. HAR is JSON and works with jq.
|
|
79
|
+
|
|
80
|
+
### export-log timing bug
|
|
81
|
+
|
|
82
|
+
The CLI can report "Exported Completed!" before the file is actually written.
|
|
83
|
+
Add `sleep 3` after export-log before reading the file:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
proxyman-cli export-log -m all -o capture.har -f har
|
|
87
|
+
sleep 3
|
|
88
|
+
jq '.log.entries | length' capture.har
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Reverse-engineering workflow
|
|
92
|
+
|
|
93
|
+
This is the primary use case. Example: figuring out how Claude Code talks to
|
|
94
|
+
the Anthropic API.
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
# 1. Make sure Proxyman is running
|
|
98
|
+
open -a Proxyman
|
|
99
|
+
|
|
100
|
+
# 2. Clear previous traffic
|
|
101
|
+
proxyman-cli clear-session
|
|
102
|
+
|
|
103
|
+
# 3. Run the target app through the proxy
|
|
104
|
+
HTTPS_PROXY=http://127.0.0.1:9090 \
|
|
105
|
+
HTTP_PROXY=http://127.0.0.1:9090 \
|
|
106
|
+
NODE_TLS_REJECT_UNAUTHORIZED=0 \
|
|
107
|
+
claude -p "say hi" --max-turns 1
|
|
108
|
+
|
|
109
|
+
# 4. Export captured traffic as HAR
|
|
110
|
+
proxyman-cli export-log -m all -o capture.har -f har
|
|
111
|
+
sleep 3
|
|
112
|
+
|
|
113
|
+
# 5. Filter for the domain you care about
|
|
114
|
+
jq '[.log.entries[] | select(.request.url | test("anthropic"))]' capture.har
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## Analyzing HAR files with jq
|
|
118
|
+
|
|
119
|
+
### List all domains and request counts
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
jq '[.log.entries[].request.url] | map(split("/")[2])
|
|
123
|
+
| group_by(.) | map({domain: .[0], count: length})
|
|
124
|
+
| sort_by(-.count)' capture.har
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### Filter by domain
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
jq '.log.entries[] | select(.request.url | test("api.example.com"))' capture.har
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### Request summary (method, url, status)
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
jq '[.log.entries[] | select(.request.url | test("api.example.com")) | {
|
|
137
|
+
method: .request.method,
|
|
138
|
+
url: .request.url,
|
|
139
|
+
status: .response.status
|
|
140
|
+
}]' capture.har
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### Full request details (headers + body)
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
jq '.log.entries[] | select(.request.url | test("v1/messages")) | {
|
|
147
|
+
url: .request.url,
|
|
148
|
+
method: .request.method,
|
|
149
|
+
status: .response.status,
|
|
150
|
+
request_headers: [.request.headers[] | {(.name): .value}] | add,
|
|
151
|
+
request_body: (.request.postData.text | fromjson? // .request.postData.text),
|
|
152
|
+
response_body: (.response.content.text | fromjson? // .response.content.text)
|
|
153
|
+
}' capture.har
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### Request body structure (without full content)
|
|
157
|
+
|
|
158
|
+
Useful for large payloads — see the shape without the bulk:
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
jq '.log.entries[] | select(.request.url | test("v1/messages"))
|
|
162
|
+
| .request.postData.text | fromjson
|
|
163
|
+
| {model, max_tokens, stream,
|
|
164
|
+
system_count: (.system | length),
|
|
165
|
+
messages_count: (.messages | length),
|
|
166
|
+
tools_count: (.tools | length),
|
|
167
|
+
messages: [.messages[] | {role, content_type: (.content | type)}]
|
|
168
|
+
}' capture.har
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### Extract specific headers
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
jq '.log.entries[] | select(.request.url | test("api.example.com"))
|
|
175
|
+
| {url: .request.url, auth: (.request.headers[] | select(.name == "authorization") | .value)}' capture.har
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### Only failed requests
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
jq '[.log.entries[] | select(.response.status >= 400) | {
|
|
182
|
+
url: .request.url,
|
|
183
|
+
status: .response.status,
|
|
184
|
+
error: .response.content.text
|
|
185
|
+
}]' capture.har
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
## Domain-filtered export
|
|
189
|
+
|
|
190
|
+
If you only care about one domain, filter at export time to get a smaller file:
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
proxyman-cli export-log -m domains --domains 'api.anthropic.com' -o anthropic.har -f har
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
Multiple domains:
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
proxyman-cli export-log -m domains \
|
|
200
|
+
--domains 'api.anthropic.com' \
|
|
201
|
+
--domains 'mcp-proxy.anthropic.com' \
|
|
202
|
+
-o anthropic.har -f har
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
## SSL proxying
|
|
206
|
+
|
|
207
|
+
Proxyman needs to decrypt HTTPS to see request/response bodies. For Node.js
|
|
208
|
+
apps, `NODE_TLS_REJECT_UNAUTHORIZED=0` handles this. For system apps and
|
|
209
|
+
browsers, install and trust the Proxyman root certificate:
|
|
210
|
+
|
|
211
|
+
- Proxyman menu > Certificate > Install Certificate on this Mac
|
|
212
|
+
- Or via CLI: `proxyman-cli install-root-cert <path-to-cert>`
|
|
213
|
+
|
|
214
|
+
Without SSL proxying enabled for a domain, you'll see the connection but not
|
|
215
|
+
the decrypted body content.
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: security-review
|
|
3
|
+
description: >
|
|
4
|
+
Complete a security review of the pending changes on the current branch.
|
|
5
|
+
Performs a focused, high-confidence security audit with detailed false-positive
|
|
6
|
+
filtering. Use when the user wants a security review of their PR or branch changes.
|
|
7
|
+
allowed-tools:
|
|
8
|
+
- Bash(git diff:*)
|
|
9
|
+
- Bash(git status:*)
|
|
10
|
+
- Bash(git log:*)
|
|
11
|
+
- Bash(git show:*)
|
|
12
|
+
- Bash(git remote show:*)
|
|
13
|
+
- Read
|
|
14
|
+
- Glob
|
|
15
|
+
- Grep
|
|
16
|
+
- LS
|
|
17
|
+
- Task
|
|
18
|
+
source-path: cli.js (line 4337, embedded SKILL.md in variable Azz)
|
|
19
|
+
source-package: "@anthropic-ai/claude-code@2.1.63"
|
|
20
|
+
source-date: 2026-02-28
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
You are a senior security engineer conducting a focused security review of the changes on this branch.
|
|
24
|
+
|
|
25
|
+
GIT STATUS:
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
!`git status`
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
FILES MODIFIED:
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
!`git diff --name-only origin/HEAD...`
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
COMMITS:
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
!`git log --no-decorate origin/HEAD...`
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
DIFF CONTENT:
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
!`git diff --merge-base origin/HEAD`
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Review the complete diff above. This contains all code changes in the PR.
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
OBJECTIVE:
|
|
53
|
+
Perform a security-focused code review to identify HIGH-CONFIDENCE security vulnerabilities that could have real exploitation potential. This is not a general code review - focus ONLY on security implications newly added by this PR. Do not comment on existing security concerns.
|
|
54
|
+
|
|
55
|
+
CRITICAL INSTRUCTIONS:
|
|
56
|
+
1. MINIMIZE FALSE POSITIVES: Only flag issues where you're >80% confident of actual exploitability
|
|
57
|
+
2. AVOID NOISE: Skip theoretical issues, style concerns, or low-impact findings
|
|
58
|
+
3. FOCUS ON IMPACT: Prioritize vulnerabilities that could lead to unauthorized access, data breaches, or system compromise
|
|
59
|
+
4. EXCLUSIONS: Do NOT report the following issue types:
|
|
60
|
+
- Denial of Service (DOS) vulnerabilities, even if they allow service disruption
|
|
61
|
+
- Secrets or sensitive data stored on disk (these are handled by other processes)
|
|
62
|
+
- Rate limiting or resource exhaustion issues
|
|
63
|
+
|
|
64
|
+
SECURITY CATEGORIES TO EXAMINE:
|
|
65
|
+
|
|
66
|
+
**Input Validation Vulnerabilities:**
|
|
67
|
+
- SQL injection via unsanitized user input
|
|
68
|
+
- Command injection in system calls or subprocesses
|
|
69
|
+
- XXE injection in XML parsing
|
|
70
|
+
- Template injection in templating engines
|
|
71
|
+
- NoSQL injection in database queries
|
|
72
|
+
- Path traversal in file operations
|
|
73
|
+
|
|
74
|
+
**Authentication & Authorization Issues:**
|
|
75
|
+
- Authentication bypass logic
|
|
76
|
+
- Privilege escalation paths
|
|
77
|
+
- Session management flaws
|
|
78
|
+
- JWT token vulnerabilities
|
|
79
|
+
- Authorization logic bypasses
|
|
80
|
+
|
|
81
|
+
**Crypto & Secrets Management:**
|
|
82
|
+
- Hardcoded API keys, passwords, or tokens
|
|
83
|
+
- Weak cryptographic algorithms or implementations
|
|
84
|
+
- Improper key storage or management
|
|
85
|
+
- Cryptographic randomness issues
|
|
86
|
+
- Certificate validation bypasses
|
|
87
|
+
|
|
88
|
+
**Injection & Code Execution:**
|
|
89
|
+
- Remote code execution via deseralization
|
|
90
|
+
- Pickle injection in Python
|
|
91
|
+
- YAML deserialization vulnerabilities
|
|
92
|
+
- Eval injection in dynamic code execution
|
|
93
|
+
- XSS vulnerabilities in web applications (reflected, stored, DOM-based)
|
|
94
|
+
|
|
95
|
+
**Data Exposure:**
|
|
96
|
+
- Sensitive data logging or storage
|
|
97
|
+
- PII handling violations
|
|
98
|
+
- API endpoint data leakage
|
|
99
|
+
- Debug information exposure
|
|
100
|
+
|
|
101
|
+
Additional notes:
|
|
102
|
+
- Even if something is only exploitable from the local network, it can still be a HIGH severity issue
|
|
103
|
+
|
|
104
|
+
ANALYSIS METHODOLOGY:
|
|
105
|
+
|
|
106
|
+
Phase 1 - Repository Context Research (Use file search tools):
|
|
107
|
+
- Identify existing security frameworks and libraries in use
|
|
108
|
+
- Look for established secure coding patterns in the codebase
|
|
109
|
+
- Examine existing sanitization and validation patterns
|
|
110
|
+
- Understand the project's security model and threat model
|
|
111
|
+
|
|
112
|
+
Phase 2 - Comparative Analysis:
|
|
113
|
+
- Compare new code changes against existing security patterns
|
|
114
|
+
- Identify deviations from established secure practices
|
|
115
|
+
- Look for inconsistent security implementations
|
|
116
|
+
- Flag code that introduces new attack surfaces
|
|
117
|
+
|
|
118
|
+
Phase 3 - Vulnerability Assessment:
|
|
119
|
+
- Examine each modified file for security implications
|
|
120
|
+
- Trace data flow from user inputs to sensitive operations
|
|
121
|
+
- Look for privilege boundaries being crossed unsafely
|
|
122
|
+
- Identify injection points and unsafe deserialization
|
|
123
|
+
|
|
124
|
+
REQUIRED OUTPUT FORMAT:
|
|
125
|
+
|
|
126
|
+
You MUST output your findings in markdown. The markdown output should contain the file, line number, severity, category (e.g. `sql_injection` or `xss`), description, exploit scenario, and fix recommendation.
|
|
127
|
+
|
|
128
|
+
For example:
|
|
129
|
+
|
|
130
|
+
# Vuln 1: XSS: `foo.py:42`
|
|
131
|
+
|
|
132
|
+
* Severity: High
|
|
133
|
+
* Description: User input from `username` parameter is directly interpolated into HTML without escaping, allowing reflected XSS attacks
|
|
134
|
+
* Exploit Scenario: Attacker crafts URL like /bar?q=<script>alert(document.cookie)</script> to execute JavaScript in victim's browser, enabling session hijacking or data theft
|
|
135
|
+
* Recommendation: Use Flask's escape() function or Jinja2 templates with auto-escaping enabled for all user inputs rendered in HTML
|
|
136
|
+
|
|
137
|
+
SEVERITY GUIDELINES:
|
|
138
|
+
- **HIGH**: Directly exploitable vulnerabilities leading to RCE, data breach, or authentication bypass
|
|
139
|
+
- **MEDIUM**: Vulnerabilities requiring specific conditions but with significant impact
|
|
140
|
+
- **LOW**: Defense-in-depth issues or lower-impact vulnerabilities
|
|
141
|
+
|
|
142
|
+
CONFIDENCE SCORING:
|
|
143
|
+
- 0.9-1.0: Certain exploit path identified, tested if possible
|
|
144
|
+
- 0.8-0.9: Clear vulnerability pattern with known exploitation methods
|
|
145
|
+
- 0.7-0.8: Suspicious pattern requiring specific conditions to exploit
|
|
146
|
+
- Below 0.7: Don't report (too speculative)
|
|
147
|
+
|
|
148
|
+
FINAL REMINDER:
|
|
149
|
+
Focus on HIGH and MEDIUM findings only. Better to miss some theoretical issues than flood the report with false positives. Each finding should be something a security engineer would confidently raise in a PR review.
|
|
150
|
+
|
|
151
|
+
FALSE POSITIVE FILTERING:
|
|
152
|
+
|
|
153
|
+
> You do not need to run commands to reproduce the vulnerability, just read the code to determine if it is a real vulnerability. Do not use the bash tool or write to any files.
|
|
154
|
+
>
|
|
155
|
+
> HARD EXCLUSIONS - Automatically exclude findings matching these patterns:
|
|
156
|
+
> 1. Denial of Service (DOS) vulnerabilities or resource exhaustion attacks.
|
|
157
|
+
> 2. Secrets or credentials stored on disk if they are otherwise secured.
|
|
158
|
+
> 3. Rate limiting concerns or service overload scenarios.
|
|
159
|
+
> 4. Memory consumption or CPU exhaustion issues.
|
|
160
|
+
> 5. Lack of input validation on non-security-critical fields without proven security impact.
|
|
161
|
+
> 6. Input sanitization concerns for GitHub Action workflows unless they are clearly triggerable via untrusted input.
|
|
162
|
+
> 7. A lack of hardening measures. Code is not expected to implement all security best practices, only flag concrete vulnerabilities.
|
|
163
|
+
> 8. Race conditions or timing attacks that are theoretical rather than practical issues. Only report a race condition if it is concretely problematic.
|
|
164
|
+
> 9. Vulnerabilities related to outdated third-party libraries. These are managed separately and should not be reported here.
|
|
165
|
+
> 10. Memory safety issues such as buffer overflows or use-after-free-vulnerabilities are impossible in rust. Do not report memory safety issues in rust or any other memory safe languages.
|
|
166
|
+
> 11. Files that are only unit tests or only used as part of running tests.
|
|
167
|
+
> 12. Log spoofing concerns. Outputting un-sanitized user input to logs is not a vulnerability.
|
|
168
|
+
> 13. SSRF vulnerabilities that only control the path. SSRF is only a concern if it can control the host or protocol.
|
|
169
|
+
> 14. Including user-controlled content in AI system prompts is not a vulnerability.
|
|
170
|
+
> 15. Regex injection. Injecting untrusted content into a regex is not a vulnerability.
|
|
171
|
+
> 16. Regex DOS concerns.
|
|
172
|
+
> 16. Insecure documentation. Do not report any findings in documentation files such as markdown files.
|
|
173
|
+
> 17. A lack of audit logs is not a vulnerability.
|
|
174
|
+
>
|
|
175
|
+
> PRECEDENTS -
|
|
176
|
+
> 1. Logging high value secrets in plaintext is a vulnerability. Logging URLs is assumed to be safe.
|
|
177
|
+
> 2. UUIDs can be assumed to be unguessable and do not need to be validated.
|
|
178
|
+
> 3. Environment variables and CLI flags are trusted values. Attackers are generally not able to modify them in a secure environment. Any attack that relies on controlling an environment variable is invalid.
|
|
179
|
+
> 4. Resource management issues such as memory or file descriptor leaks are not valid.
|
|
180
|
+
> 5. Subtle or low impact web vulnerabilities such as tabnabbing, XS-Leaks, prototype pollution, and open redirects should not be reported unless they are extremely high confidence.
|
|
181
|
+
> 6. React and Angular are generally secure against XSS. These frameworks do not need to sanitize or escape user input unless it is using dangerouslySetInnerHTML, bypassSecurityTrustHtml, or similar methods. Do not report XSS vulnerabilities in React or Angular components or tsx files unless they are using unsafe methods.
|
|
182
|
+
> 7. Most vulnerabilities in github action workflows are not exploitable in practice. Before validating a github action workflow vulnerability ensure it is concrete and has a very specific attack path.
|
|
183
|
+
> 8. A lack of permission checking or authentication in client-side JS/TS code is not a vulnerability. Client-side code is not trusted and does not need to implement these checks, they are handled on the server-side. The same applies to all flows that send untrusted data to the backend, the backend is responsible for validating and sanitizing all inputs.
|
|
184
|
+
> 9. Only include MEDIUM findings if they are obvious and concrete issues.
|
|
185
|
+
> 10. Most vulnerabilities in ipython notebooks (*.ipynb files) are not exploitable in practice. Before validating a notebook vulnerability ensure it is concrete and has a very specific attack path where untrusted input can trigger the vulnerability.
|
|
186
|
+
> 11. Logging non-PII data is not a vulnerability even if the data may be sensitive. Only report logging vulnerabilities if they expose sensitive information such as secrets, passwords, or personally identifiable information (PII).
|
|
187
|
+
> 12. Command injection vulnerabilities in shell scripts are generally not exploitable in practice since shell scripts generally do not run with untrusted user input. Only report command injection vulnerabilities in shell scripts if they are concrete and have a very specific attack path for untrusted input.
|
|
188
|
+
>
|
|
189
|
+
> SIGNAL QUALITY CRITERIA - For remaining findings, assess:
|
|
190
|
+
> 1. Is there a concrete, exploitable vulnerability with a clear attack path?
|
|
191
|
+
> 2. Does this represent a real security risk vs theoretical best practice?
|
|
192
|
+
> 3. Are there specific code locations and reproduction steps?
|
|
193
|
+
> 4. Would this finding be actionable for a security team?
|
|
194
|
+
>
|
|
195
|
+
> For each finding, assign a confidence score from 1-10:
|
|
196
|
+
> - 1-3: Low confidence, likely false positive or noise
|
|
197
|
+
> - 4-6: Medium confidence, needs investigation
|
|
198
|
+
> - 7-10: High confidence, likely true vulnerability
|
|
199
|
+
|
|
200
|
+
START ANALYSIS:
|
|
201
|
+
|
|
202
|
+
Begin your analysis now. Do this in 3 steps:
|
|
203
|
+
|
|
204
|
+
1. Use a sub-task to identify vulnerabilities. Use the repository exploration tools to understand the codebase context, then analyze the PR changes for security implications. In the prompt for this sub-task, include all of the above.
|
|
205
|
+
2. Then for each vulnerability identified by the above sub-task, create a new sub-task to filter out false-positives. Launch these sub-tasks as parallel sub-tasks. In the prompt for these sub-tasks, include everything in the "FALSE POSITIVE FILTERING" instructions.
|
|
206
|
+
3. Filter out any vulnerabilities where the sub-task reported a confidence less than 8.
|
|
207
|
+
|
|
208
|
+
Your final reply must contain the markdown report and nothing else.
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sigillo
|
|
3
|
+
description: >
|
|
4
|
+
Sigillo is a self-hostable open-source alternative to Doppler. Use when
|
|
5
|
+
working with sigillo run, sigillo setup, sigillo login, managing secrets,
|
|
6
|
+
projects, or environments. Also load when integrating Sigillo into CI,
|
|
7
|
+
Cloudflare Workers, Docker, Vercel, or any other deployment target.
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# sigillo
|
|
11
|
+
|
|
12
|
+
Every time you work with sigillo, you MUST fetch the latest README:
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
curl -s https://raw.githubusercontent.com/remorses/sigillo/main/README.md
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
**Never pipe through `head`, `tail`, `sed -n`, or any truncating command.** Read the full output.
|
|
19
|
+
|
|
20
|
+
## Rules for agents
|
|
21
|
+
|
|
22
|
+
### Never read `.env` files directly
|
|
23
|
+
|
|
24
|
+
If a `.env` file exists, **do not source it or read its contents**. Use `sigillo run` instead so secrets are injected without being read by the agent:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
# BAD — exposes secrets to the agent context window
|
|
28
|
+
source .env && next dev
|
|
29
|
+
cat .env
|
|
30
|
+
|
|
31
|
+
# GOOD — secrets injected, never visible
|
|
32
|
+
sigillo run -- next dev
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### Non-interactive auth
|
|
36
|
+
|
|
37
|
+
`sigillo login` opens a browser. In agent sessions, use a token instead:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
# Option A: env var (preferred in CI / agent sessions)
|
|
41
|
+
export SIGILLO_TOKEN="sig_xxx"
|
|
42
|
+
|
|
43
|
+
# Option B: save token scoped to the current directory
|
|
44
|
+
sigillo login --token sig_xxx --scope .
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Token is stored in `~/.sigillo/config.json`. Subsequent commands in that directory pick it up without `--token`.
|
|
48
|
+
|
|
49
|
+
### Directory scoping
|
|
50
|
+
|
|
51
|
+
`sigillo setup` binds the current directory to a project and environment. The CLI resolves config by **longest matching scope**.
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
# Non-interactive — use in agent sessions
|
|
55
|
+
sigillo setup --project proj_abc --env production
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
After this, `sigillo run` in any subdirectory uses that project + environment automatically.
|
|
59
|
+
|
|
60
|
+
### Verify what is injected
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
# List injected variable names (values are redacted)
|
|
64
|
+
sigillo run -- printenv
|
|
65
|
+
|
|
66
|
+
# Get a single value
|
|
67
|
+
sigillo secrets get DATABASE_URL
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Redaction details
|
|
71
|
+
|
|
72
|
+
`sigillo run` replaces secret values in stdout/stderr with `*`. Threshold: **Shannon entropy ≥ 3.5 bits/char AND length ≥ 16 chars** — short or low-entropy values like `true`, `1`, `development` are not redacted. Use `--disable-redaction` only when explicitly verifying values.
|
|
73
|
+
|
|
74
|
+
### Mount secrets to a file for tools that require it
|
|
75
|
+
|
|
76
|
+
Some tools (wrangler, docker) read from files, not env vars:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
# Write secrets to a temp file, deleted after the process exits
|
|
80
|
+
sigillo run --mount .env.prod --mount-format env -- wrangler secret bulk .env.prod
|
|
81
|
+
|
|
82
|
+
# Mount as JSON for config loaders
|
|
83
|
+
sigillo run --mount config/secrets.json --mount-format json -- node server.js
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
The mounted file is **deleted** once the child process exits.
|
|
87
|
+
|
|
88
|
+
### CI environment variables
|
|
89
|
+
|
|
90
|
+
```yaml
|
|
91
|
+
- name: Run with secrets
|
|
92
|
+
env:
|
|
93
|
+
SIGILLO_TOKEN: ${{ secrets.SIGILLO_TOKEN }}
|
|
94
|
+
SIGILLO_PROJECT: ${{ vars.SIGILLO_PROJECT }}
|
|
95
|
+
SIGILLO_ENVIRONMENT: production
|
|
96
|
+
run: npx sigillo run -- pnpm build
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Prefer `sigillo run` over downloading secrets
|
|
100
|
+
|
|
101
|
+
Avoid `sigillo secrets download` unless a specific tool requires a file format. Prefer injecting directly via `sigillo run --` so values never touch the filesystem.
|