بنقرة واحدة
setup-interview
// Domain-by-domain interview to produce /app/docs/project-context.json. Invoked once by the orchestrator; the orchestrator then conducts all turns directly using Read/Write/Edit — no agent dispatching.
// Domain-by-domain interview to produce /app/docs/project-context.json. Invoked once by the orchestrator; the orchestrator then conducts all turns directly using Read/Write/Edit — no agent dispatching.
Multi-agent team workflow for implementing tickets with peer-to-peer communication inside a single shared team. Used by chat-orchestrator for COMPLEX requests only (planner → wave → teardown). Single source of truth for cross-agent messaging.
How and when to write a post-implementation reflection. Used by DEVELOPER after reviews are complete.
Shadcn/ui theming and component customization — CSS variables, OKLCH colors, dark mode, variants, wrappers. Load for any ticket involving colors, theme, UI layout, or component styling.
Playwright E2E testing patterns — web-first assertions, user-visible locators, network interception, fixtures, authentication, and parallel execution. Use when building or reviewing E2E tests with Playwright, when setting up browser testing for a web app, or when migrating from Cypress or Selenium.
When to write e2e tests, where to put them, and how to verify them. Apply to any task touching UI, filters, forms, or interactions.
How to find a Git worktree by task number without hardcoding paths. Use in hooks or scripts that need to locate a specific task's worktree.
| name | setup-interview |
| description | Domain-by-domain interview to produce /app/docs/project-context.json. Invoked once by the orchestrator; the orchestrator then conducts all turns directly using Read/Write/Edit — no agent dispatching. |
Scope constraint: during SETUP-INTERVIEW, your Write / Edit tools are
restricted to /app/docs/project-context.json only. Never touch /app/src/ or
any other path.
Read("/app/docs/project-context.json"):
| State | Action |
|---|---|
| File missing | Start a FRESH interview from domain 1. |
File exists, validated: true | Summarize existing config (template below) and ask: (a) update specific domains, or (b) restart from scratch. |
File exists, validated: false | Resume from the last pending entry in interview_progress. |
Output a plain-text message to the user (translate into the user's language at runtime):
Here's what I already know about your project:
- Industry: <industry>
- Team size: <team_size>
- Client type: <client_type>
- Main objective: <objective>
- <N> entities defined: <comma-separated names>
- Pipeline: <pipeline_stages joined>
- <N> user roles
Would you like to:
(a) update part of this config (I'll go domain by domain),
(b) start from scratch (I'll wipe everything and redo the full interview)?
<…>. Keep as-is, or change it?"Each user turn during SETUP-INTERVIEW:
Read("/app/docs/project-context.json") — load current state.interview_progress.domain_N to "done", keep validated: false.Write("/app/docs/project-context.json", <full updated JSON>).VALIDATED — when final confirmation is received (see Final validation).FAILED: <reason> — unrecoverable error.Summarize what you understood after each domain and wait for confirmation before moving to the next. Never ask multiple domains in one turn.
contact, company, deal, tag, task, or
note (already in Atomic CRM) → propose extending it ("type": "extend")
rather than recreating it.Atomic CRM ships with default entities and features the user may not need. Before final validation, derive what should be removed to keep the CRM clean.
Default Atomic CRM elements (candidates for removal):
| Element | Remove when… |
|---|---|
company entity | User manages individuals only (no B2B account layer) |
deal entity | No sales pipeline — user tracks contacts/support only |
task entity | User did not mention task management |
tag entity | User did not mention categorisation / labelling |
| Pipeline / kanban view | deal entity is removed, or no stage-based flow requested |
| Analytics dashboard | User did not mention KPIs, charts, or reporting |
| CSV import/export | User did not mention data migration or bulk operations |
| Multi-tenant / teams | Domain 5 answered "no" to data isolation per team |
Steps:
Compare domain answers against the table above. Derive a candidate removal list.
Present it to the user as a plain text message, translated to their language.
Language rule (strict): describe only what the user sees in the interface — sections, screens, buttons. Never mention entities, tables, components, types, or any technical term. The user interprets the business meaning; you handle the technical implications internally.
Example (translate at runtime):
Based on what you told me, it looks like you won't need these sections
in your CRM — I can remove them to keep things clean:
- <plain-language feature name>: <one-sentence business reason>
- …
Does that sound right? Anything you'd like to keep?
Plain-language names to use (never the internal names):
| Internal | Say to user |
|---|---|
company entity | the "Companies" section |
deal entity | the "Deals" or "Sales pipeline" section |
task entity | the "Tasks" section |
tag entity | the label / tag feature |
| Pipeline / kanban | the pipeline / kanban board view |
| Analytics dashboard | the analytics and reporting section |
| CSV import/export | the data import and export feature |
| Multi-tenant | team-based data isolation |
On user confirmation (or "all good"): populate cleanup in the JSON and Write.
On user adjustment ("keep X"): remove X from the list, update JSON.
If no element qualifies for removal: skip this step silently (no question asked).
Store the result in the JSON under "cleanup" before writing:
"cleanup": {
"entities_to_remove": ["company", "tag"],
"features_to_disable": ["pipeline", "analytics_dashboard", "csv_import_export"]
}
pipeline_stages exists in entities.user_roles has at least one permission defined."type": "extend", not "type": "create".If a check fails: output one targeted INTERVIEW: question to fix it before
proceeding to validation.
When all 8 applicable domains are "done":
"
. All good? I'll lock the project spec. (yes / no)"
validated: true. Write the file.
b. Bash("cd /app && git add docs/project-context.json && git commit -m \"chore(setup): <fresh|update> project context\"")
c. Output VALIDATED — the orchestrator moves to SETUP-PLAN. No additional
text after this token.Every orchestrator turn during SETUP-INTERVIEW ends with exactly one of:
| Output | Meaning |
|---|---|
| Plain text question | Ask the user the next domain question directly; re-enter this skill on the next user turn. No wrapper, no prefix. |
VALIDATED | JSON committed. Move to STATE SETUP-PLAN. |
FAILED: <reason> | Unrecoverable error; surface to user, abort setup. |
{
"validated": false,
"bootstrapped": false,
"project_name": "...",
"github_username": "...",
"supabase_project_name": "...",
"deploy_platform": "vercel|github-pages",
"mode": "demo|full",
"business_context": {
"industry": "...",
"team_size": 0,
"client_type": "B2B|B2C|mixed",
"objective": "..."
},
"entities": [
{
"name": "ticket",
"type": "create|extend",
"base_entity": null,
"fields": [
{ "name": "subject", "type": "text", "required": true }
]
}
],
"pipeline_stages": ["open", "in_progress", "resolved"],
"user_roles": [
{ "name": "admin", "permissions": ["read", "write", "delete"] }
],
"integrations": [],
"ui": { "language": "en", "theme": "light|dark|auto" },
"cleanup": {
"entities_to_remove": [],
"features_to_disable": []
},
"interview_progress": {
"domain_1": "done",
"domain_2": "pending",
"domain_3": "pending",
"domain_4": "pending",
"domain_5": "pending",
"domain_6": "pending",
"domain_7": "pending",
"domain_8": "pending"
},
"phase_status": {
"spec": { "status": "pending" },
"fork": { "status": "pending" },
"supabase": { "status": "pending" },
"env": { "status": "pending" },
"deploy": { "status": "pending" }
},
"tickets": []
}
The tickets array is populated later by planner in SETUP_MODE — leave it
empty here.