一键导入
zulip
Fetch messages from FUTO Zulip channels. Use when the user asks about Zulip messages, feedback, bug reports, or wants to check what's been discussed on Zulip.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Fetch messages from FUTO Zulip channels. Use when the user asks about Zulip messages, feedback, bug reports, or wants to check what's been discussed on Zulip.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Rebuild tangled or AI-generated-looking code — one function up to an entire subsystem — from its observable behavioral contract while preserving external functionality and discarding accidental architecture. Optionally prunes the contract itself first (keep/simplify/drop triage of spec behaviors, human-gated) when the requester has said features may be dropped. Use when asked to identify the next "AI slop" area, deslop or radically simplify a codebase, rewrite a subsystem from scratch, start from tests, replace a giant orchestrator/controller/component, contract-rewrite something, "do this like the sync rewrite", preserve outside behavior without retaining internals, prune or triage a feature surface ("features I'd be OK dropping"), or turn legacy tests into a new implementation and MR. Not for bug fixes (/bugfix), small cleanups (/simplify), or changes that keep the existing structure.
Run the behavioral spec in docs/spec/ against the real apps — a parallel, story-driven QA sweep across desktop, iOS, and Android plus cross-client sync. Use when the user says "verify specs", "run the specs", "spec pass", "QA the specs", "check the app against the spec", or "/verify-specs [scope]". A bare run does the full spec (all surfaces × all platforms + sync mesh); "since the last tagged release" (or any scope phrase) narrows to the surfaces/platforms the diff touched. Fans out Sonnet low-effort app-qa legs, escalates FAILs to high effort, and is built to survive session-limit deaths without losing work.
Parallel QA of one or more merge requests across desktop/iOS/Android, including cross-client sync. Use when the user wants MRs tested — "test MR !123", "QA these five MRs in parallel", "spin up QA for my open MRs", "test this branch on mobile" — or wants a full spec pass. Creates a worktree per MR, pre-builds, fans out app-qa agents concurrently, and aggregates verdicts.
Diagnose and fix GitLab CI/pipeline failures, and harden .gitlab-ci.yml against this repo's recurring failure classes. Use when the user says "pipeline failed", "CI is red", "the tag build failed", "publish:android/publish:ios failed", "check the pipeline", "why didn't the release go out", "harden CI", or before tagging a release ("pre-tag check"). Also load this BEFORE editing .gitlab-ci.yml for any reason — it encodes the hard rules that past pipeline breakage taught.
Drive the factory/ judge harness that compares our CM6 live-preview editor against Obsidian scenario-by-scenario, triage divergences, and turn confirmed ones into fixes locked by markdown-spec cases. Use when the user says "run the factory", "compare to Obsidian", "editor parity", "review the visual report", "why does Obsidian render this differently", or after editor changes (liveMarkdownTransform, markdown.css, cursor movement) that should be checked against the oracle.
Keep docs/spec/ (the behavioral source of truth for all three apps) in lockstep with reality. Use when the user says "update the spec", "record a gap", "close that gap", "spec pass", "is the spec up to date", after landing any behavior change, when a spec-gaps-check closure probe fires, or when QA findings need to be turned into spec lines. Owns the full gap lifecycle - hidden-affordance verification, gap wording, GAPS.md regeneration, and closure probes.
| name | zulip |
| description | Fetch messages from FUTO Zulip channels. Use when the user asks about Zulip messages, feedback, bug reports, or wants to check what's been discussed on Zulip. |
| argument-hint | ["channel-name"] |
| allowed-tools | Bash |
Fetch messages from the FUTO self-hosted Zulip instance and present them to the user.
$ZULIP_API_KEY environment variable (run source ~/.zshrc first)source ~/.zshrcnotes-app if no argument given)$ARGUMENTS if provided, otherwise default to notes-appFetch command:
source ~/.zshrc && curl -sSX GET -G "https://zulip.futo.org/api/v1/messages" \
-u "justin@futo.org:$ZULIP_API_KEY" \
--data-urlencode 'anchor=oldest' \
--data-urlencode 'num_before=0' \
--data-urlencode 'num_after=5000' \
--data-urlencode 'narrow=[{"operator": "channel", "operand": "CHANNEL_NAME"}]'
Replace CHANNEL_NAME with the target channel.
If the response has found_newest: false, paginate by using the last message ID as the next anchor with num_before=0, num_after=5000 until all messages are fetched.
email:api_keyGET /api/v1/messages[{"operator": "channel", "operand": "channel-name"}]oldest, newest, or a message ID