Setup Interview logo

Setup Interview

OrganizationPopular
marmelab
setup-interview

Domain-by-domain interview to produce $CLAUDE_PROJECT_DIR/docs/project-context.json. Invoked once by the orchestrator; the orchestrator then conducts all turns directly using Read/Write/Edit — no agent dispatching.

Overview

Publishermarmelab
Repositoryatomic-crm
Skill namesetup-interview
Stars
1.4K
Forks
860
Bundled files
Instructions only
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by marmelab on GitHub. Read the source before you install it.

Installation

Install the Setup Interview AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/marmelab/atomic-crm/tree/main/.claude/skills/setup-interview
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/marmelab/atomic-crm.git /tmp/atomic-crm
mkdir -p .claude/skills
cp -r /tmp/atomic-crm/.claude/skills/setup-interview .claude/skills/setup-interview
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Setup Interview in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Setup Interview on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Setup Interview is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Overview

A domain-by-domain interview that produces $CLAUDE_PROJECT_DIR/docs/project-context.json. You drive it one user turn at a time, persisting after each domain, until the user confirms — exit criterion: a validated: true JSON committed and the VALIDATED token emitted.

Scope constraint: during SETUP-INTERVIEW, your Write / Edit tools are restricted to $CLAUDE_PROJECT_DIR/docs/project-context.json only. Never touch $CLAUDE_PROJECT_DIR/src/ or any other path.

When to Use

  • Invoked once by the orchestrator at the start of project setup; the orchestrator then conducts every turn directly.
  • Resuming an interrupted interview (validated: false) or updating an existing config (validated: true).

FIRST ACTION — startup detection

Read("$CLAUDE_PROJECT_DIR/docs/project-context.json"):

StateAction
File missingStart a FRESH interview from domain 1.
File exists, validated: trueSummarize existing config (template below) and ask: (a) update specific domains, or (b) restart from scratch.
File exists, validated: falseResume from the last pending entry in interview_progress.

Existing-config summary template (validated == true)

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)?
  • Update intent → UPDATE flow: for each domain, ask "Current value: <…>. Keep as-is, or change it?"
  • Restart intent → delete the file, start FRESH.

Per-turn loop (FRESH and UPDATE flows)

Each user turn during SETUP-INTERVIEW:

  1. Read("$CLAUDE_PROJECT_DIR/docs/project-context.json") — load current state.
  2. Apply the user's latest answer to the relevant domain section.
  3. Update interview_progress.domain_N to "done", keep validated: false.
  4. Write("$CLAUDE_PROJECT_DIR/docs/project-context.json", <full updated JSON>).
  5. Move to the next pending domain.
  6. Output exactly one of:
    • The next question as a plain text message to the user (no prefix, no wrapper).
    • 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.


Domain questions

Domain 1 — Business context

  • Industry, team size, client type (B2B / B2C / mixed), main objective (prospecting, follow-up, support, other).

Domain 2 — Entities

  • What objects are managed? Relationships between them?
  • ⚠️ If an entity resembles contact, company, deal, tag, task, or note (already in Atomic CRM) → propose extending it ("type": "extend") rather than recreating it.

Domain 3 — Custom fields

  • Specific fields per entity beyond standard fields.
  • Type of each field (text / number / date / boolean / list / file).
  • Required vs optional.

Domain 4 — Pipeline

  • Sales or follow-up cycle stages, transition conditions, final stages (won / lost / archived).

Domain 5 — User roles

  • Who uses the CRM (sales / manager / admin / support).
  • Rights per role: read-only / write / delete / admin.
  • Multi-tenant needed (data isolated per team)?

Domain 6 — Integrations

  • Email (read / send / tracking)? Slack or other messaging?
  • CSV import/export? Inbound or outbound webhooks? External API?

Domain 7 — UI/UX

  • Interface language, theme (light / dark / auto), desired dashboards (KPIs / charts / lists), information density preferences.

Domain 8 — Deployment (skip entirely when MODE=demo)

  • GitHub username, Supabase project name, deployment platform (Vercel recommended, or GitHub Pages), custom domain.

Cleanup derivation (run after all domains, before consistency checks)

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):

ElementRemove when…
company entityUser manages individuals only (no B2B account layer)
deal entityNo sales pipeline — user tracks contacts/support only
task entityUser did not mention task management
tag entityUser did not mention categorisation / labelling
Pipeline / kanban viewdeal entity is removed, or no stage-based flow requested
Analytics dashboardUser did not mention KPIs, charts, or reporting
CSV import/exportUser did not mention data migration or bulk operations
Multi-tenant / teamsDomain 5 answered "no" to data isolation per team

Steps:

  1. Compare domain answers against the table above. Derive a candidate removal list.

  2. 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):

    InternalSay to user
    company entitythe "Companies" section
    deal entitythe "Deals" or "Sales pipeline" section
    task entitythe "Tasks" section
    tag entitythe label / tag feature
    Pipeline / kanbanthe pipeline / kanban board view
    Analytics dashboardthe analytics and reporting section
    CSV import/exportthe data import and export feature
    Multi-tenantteam-based data isolation
  3. On user confirmation (or "all good"): populate cleanup in the JSON and Write.

  4. 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:

json
"cleanup": {
  "entities_to_remove": ["company", "tag"],
  "features_to_disable": ["pipeline", "analytics_dashboard", "csv_import_export"]
}

Consistency checks (run before final validation)

  • No duplicate field names within the same entity.
  • Every entity referenced in pipeline_stages exists in entities.
  • Every role in user_roles has at least one permission defined.
  • Existing Atomic CRM entities marked "type": "extend", not "type": "create".
  • No service-role key or secret in client-side variables.

If a check fails: output one targeted INTERVIEW: question to fix it before proceeding to validation.


Final validation

When all 8 applicable domains are "done":

  1. Read the JSON. Produce a compact plain-language summary in the user's language.
  2. Output a plain-text message asking for confirmation (translate at runtime):

    ". All good? I'll lock the project spec. (yes / no)"

  3. On any affirmative (yes / ok / valid / go / looks good, in any language): a. Set validated: true. Write the file. b. Bash("cd \"$CLAUDE_PROJECT_DIR\" && 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.
  4. On negative: ask which domain to revisit; re-enter that domain's questions.

Output format (strict)

Every orchestrator turn during SETUP-INTERVIEW ends with exactly one of:

OutputMeaning
Plain text questionAsk the user the next domain question directly; re-enter this skill on the next user turn. No wrapper, no prefix.
VALIDATEDJSON committed. Move to STATE SETUP-PLAN.
FAILED: <reason>Unrecoverable error; surface to user, abort setup.

JSON schema

json
{
  "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.


Red Flags

  • Asking more than one domain in a single turn, or skipping the per-domain confirmation.
  • Writing or editing any path other than docs/project-context.json.
  • Setting validated: true before the consistency checks pass.
  • Mentioning entities, tables, components, or other technical terms to the user (use plain-language feature names).
  • An entity resembling a built-in (contact/company/deal/tag/task/note) marked "type": "create" instead of "extend".
  • A service-role key or secret stored in a client-side variable.
  • Emitting anything other than exactly one output contract (plain-text question / VALIDATED / FAILED:) per turn.

Verification

Before emitting VALIDATED:

  • All 8 applicable domains are "done" (domain 8 skipped when MODE=demo).
  • All consistency checks pass (no duplicate fields, pipeline entities exist, every role has a permission, built-ins use "extend", no client-side secrets).
  • The cleanup derivation was presented in plain language and confirmed (or skipped silently when nothing qualified).
  • The user gave an affirmative final confirmation.
  • validated: true written, JSON committed, and VALIDATED is the only output (no trailing text).

Frequently asked questions

What does the Setup Interview AI skill do?

Domain-by-domain interview to produce $CLAUDE_PROJECT_DIR/docs/project-context.json. Invoked once by the orchestrator; the orchestrator then conducts all turns directly using Read/Write/Edit — no agent dispatching.

Why use Setup Interview on TypingMind?

Because you install it once and use it with any model. Setup Interview is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Setup Interview in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/marmelab/atomic-crm/tree/main/.claude/skills/setup-interview. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Setup Interview?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Setup Interview?

As many as you like. As long as a model supports skills, you can use Setup Interview with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Setup Interview AI skill free?

Yes. It is published on GitHub by marmelab under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇