Competitive Analysis is a local-first Tutti workspace app for product research. It is chat-first: you ask a local agent to research a product, and it runs an evidence-backed teardown that stays attached to the workspace.
- A monorepo aligned with the
group-chat-style Tutti app architecture:apps/web: React + Vite chat UIapps/server: Fastify local runtimepackages/shared: shared domain contracts
- The vendored
product-swipefileresearch skill underapps/server/skills/, injected into every agent run. - Tutti packaging metadata:
tutti.app.json,tutti.cli.json,bootstrap.sh,scripts/package-tutti-app.mjs - Local-first persistence and Tutti references:
- sessions, messages, and artifacts stored under
TUTTI_APP_DATA_DIR/sessions - captured research artifacts exposed through
/tutti/references/listand searchable via/tutti/references/search
- sessions, messages, and artifacts stored under
- Ecosystem integration so other Tutti apps and agents can drive it:
- a
competitionCLI scope (status,sessions,reports,report,research) declared intutti.cli.json— seeCOMMANDS.md - graceful
TUTTI_CLIconsumption for calling sibling apps / the daemon
- a
- Internationalization (English + 简体中文) with light/dark theming via
prefers-color-scheme
Other apps and agents call this app through the bundled Tutti CLI:
"$TUTTI_CLI" --json competition status
"$TUTTI_CLI" --json competition reports --query notion
"$TUTTI_CLI" --json competition research --product "Linear"See COMMANDS.md for the full command and HTTP surface.
- Pick an available Agent Target from the current Tutti agent catalog.
- Type a research request, e.g.
调研一下 Notionorresearch Cursor. - The agent runs the product-swipefile staged pipeline (evidence collection → inventory → gap checks → writing → validation) inside a per-run working directory, streaming its progress into the chat thread.
- When it finishes, the produced
report.md(plusinventory.md,meta.json, and theraw/evidence cache) is captured into the session's artifact list and the unified research library, and surfaced back into Tutti as references.
ResearchRunService (orchestrator)
-> LocalAgentResearchProvider (@tutti-os/agent-acp-kit -> selected Agent Target)
-> skillManifest materializes product-swipefile into the run cwd
-> scanRunArtifacts captures report.md / inventory.md / meta.json
A compatible local Agent Target must be available and authenticated; there is no
offline fallback. Discover current targets with tutti agent list --json.
pnpm install
pnpm devThe web app runs on Vite and proxies API calls to the local Fastify server.
pnpm package:tuttiThis writes a self-contained app package under build/tutti-app/package,
including the bundled server, web assets, and the vendored skill.