analyzthis_design 2.1.2 → 2.3.0
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/HOW-TO-USE.md +19 -0
- package/README.md +64 -6
- package/agents/cards/raj.md +3 -3
- package/dist/HOW-TO-USE.md +19 -0
- package/dist/README.md +64 -6
- package/dist/agents/cards/raj.md +3 -3
- package/dist/bin/cli.js +56 -20
- package/dist/lib/chunk-planner.js +29 -6
- package/dist/lib/chunk-synthesis.js +59 -2
- package/dist/lib/collect.js +8 -4
- package/dist/lib/install.js +11 -0
- package/dist/lib/knowledge.js +196 -44
- package/dist/lib/mcp-server.js +745 -0
- package/dist/lib/orchestrator/run.js +6 -0
- package/dist/lib/source-discovery.js +6 -3
- package/dist/lib/system-prompt.js +112 -0
- package/dist/skills/knowledge-bank/SKILL.md +116768 -24
- package/dist/skills/raj/SKILL.md +4 -2
- package/package.json +2 -3
- package/skills/knowledge-bank/SKILL.md +116768 -24
- package/skills/raj/SKILL.md +4 -2
- package/dist/supabase/deliberation-config.example.json +0 -15
- package/dist/supabase/feedback-config.example.json +0 -7
- package/dist/supabase/migrations/001_persona_feedback.sql +0 -54
- package/supabase/deliberation-config.example.json +0 -15
- package/supabase/feedback-config.example.json +0 -7
- package/supabase/migrations/001_persona_feedback.sql +0 -54
package/HOW-TO-USE.md
CHANGED
|
@@ -335,6 +335,23 @@ npx analyzthis_design evolve --extract # write patch proposals
|
|
|
335
335
|
npx analyzthis_design evolve --apply <patchId> # apply after review
|
|
336
336
|
```
|
|
337
337
|
|
|
338
|
+
### Check evolution metrics
|
|
339
|
+
|
|
340
|
+
```bash
|
|
341
|
+
npx analyzthis_design evolve --metrics # team evolution dashboard
|
|
342
|
+
npx analyzthis_design evolve --ready # check if enough data to evolve
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
The dashboard shows a per-persona score (0-100) based on lessons, outcomes, and patches applied. Levels: Novice (0-19) -> Developing (20-39) -> Proficient (40-59) -> Advanced (60-79) -> Expert (80-100).
|
|
346
|
+
|
|
347
|
+
After every successful run, Devi prints an evolution readiness hint automatically.
|
|
348
|
+
|
|
349
|
+
### Premise challenge (v2.2)
|
|
350
|
+
|
|
351
|
+
When you run a critique, the planner now evaluates whether your task framing is valid before planning chunks. If the premise is questionable (e.g., "users don't convert because X is buried" — but maybe they reach X and still don't convert), the planner adds a `premise_check` chunk that Raj runs first. All subsequent persona chunks see the premise assessment.
|
|
352
|
+
|
|
353
|
+
The synthesis step also explicitly resolves disagreements — if Arjun says SHIP and Meera says REVISE, the synthesis picks a winner with a forward path instead of summarizing both sides.
|
|
354
|
+
|
|
338
355
|
### Confirm whether the advice actually shipped
|
|
339
356
|
|
|
340
357
|
```bash
|
|
@@ -426,6 +443,8 @@ npx analyzthis_design moodboard critique --board <id>
|
|
|
426
443
|
npx analyzthis_design moodboard add --board <id> --url <url> --tags a,b
|
|
427
444
|
|
|
428
445
|
# Evolve
|
|
446
|
+
npx analyzthis_design evolve --metrics
|
|
447
|
+
npx analyzthis_design evolve --ready
|
|
429
448
|
npx analyzthis_design evolve --extract --dry-run
|
|
430
449
|
npx analyzthis_design evolve --apply <patchId>
|
|
431
450
|
npx analyzthis_design outcome --confirm --persona arjun --result shipped
|
package/README.md
CHANGED
|
@@ -4,6 +4,12 @@ A set of AI design personas and a task-first evaluation framework that plugs int
|
|
|
4
4
|
|
|
5
5
|
Install once. Run structured UX critiques, multi-phase ideation, and task-grounded screen reviews — directly inside your AI chat. **No external LLM API keys required** for CLI orchestrator runs: **`/devi`** voices each persona from your host IDE (Cursor, Claude, etc.).
|
|
6
6
|
|
|
7
|
+
## v2.2 — project-scoped knowledge bank
|
|
8
|
+
|
|
9
|
+
Knowledge sources are now scoped per project by default. `collect`, `connect`, `sync`, `disconnect`, and `status` operate on the project derived from your current working directory, and the built `knowledge-bank` skill is written into that project's local skills directory (`<project>/.claude/skills/knowledge-bank/SKILL.md`, `<project>/.cursor/skills/...`, etc.). Invoking a skill from one project never reads another project's vaults.
|
|
10
|
+
|
|
11
|
+
Pass `--global` to opt into the legacy merged behavior (read `config.sources` and write into `~/.claude/skills/...`). Use `--global` only when you deliberately want cross-project blending.
|
|
12
|
+
|
|
7
13
|
## v2.0 — chunked execution by default
|
|
8
14
|
|
|
9
15
|
`npx analyzthis_design run --task "..."` now uses a **frontier planner + cheap chunk models**:
|
|
@@ -15,7 +21,7 @@ Install once. Run structured UX critiques, multi-phase ideation, and task-ground
|
|
|
15
21
|
|
|
16
22
|
Use `npx analyzthis_design run-unchunked` for the legacy single-pass orchestrator.
|
|
17
23
|
|
|
18
|
-
**npm:** [analyzthis_design](https://www.npmjs.com/package/analyzthis_design) · **Current version:** 2.
|
|
24
|
+
**npm:** [analyzthis_design](https://www.npmjs.com/package/analyzthis_design) · **Current version:** 2.3.0 · **Step-by-step guide:** [HOW-TO-USE.md](./HOW-TO-USE.md)
|
|
19
25
|
|
|
20
26
|
---
|
|
21
27
|
|
|
@@ -36,6 +42,8 @@ npx analyzthis_design run-unchunked --task "Review invoice approval screen" --pr
|
|
|
36
42
|
```
|
|
37
43
|
|
|
38
44
|
> **Security:** This package publishes **plain source** — no obfuscation, no minification, no dynamic require. Every file in `dist/` is readable and auditable. The `postinstall` script only prints a welcome message; it does **not** write to any AI-agent directories. Skill installation requires an explicit `npx analyzthis_design --target <ide>` command.
|
|
45
|
+
>
|
|
46
|
+
> **MCP (universal):** `npx analyzthis_design mcp` starts a local MCP server with 19 tools (all personas + combination passes + utilities). Auto-configures for Cursor, Claude Desktop, and Windsurf during `--target all` install. For Lovable, v0, Bolt, Replit, ChatGPT: run `npx analyzthis_design mcp --configure <tool>` for a config snippet.
|
|
39
47
|
|
|
40
48
|
### Install by target IDE
|
|
41
49
|
|
|
@@ -536,12 +544,14 @@ npx analyzthis_design feedback status
|
|
|
536
544
|
|
|
537
545
|
**What does NOT get sent:** project paths, repo names, emails, API keys, full source trees.
|
|
538
546
|
|
|
539
|
-
**Maintainer setup (
|
|
547
|
+
**Maintainer setup (vendor-neutral HTTP endpoint):**
|
|
540
548
|
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
549
|
+
The `feedback submit` client is a plain HTTPS POST with an `apikey` header — it works with any REST endpoint that accepts anonymous inserts, not only Supabase. A reference schema (with row-level security for insert-only anon access) lives in [`supabase/migrations/001_persona_feedback.sql`](./supabase/migrations/001_persona_feedback.sql) in the repo. That folder is **not** shipped in the npm package, so installing `analyzthis_design` does not pull a Supabase-branded folder into `node_modules`.
|
|
550
|
+
|
|
551
|
+
1. Stand up any HTTP endpoint that accepts anonymous JSON inserts (Supabase with RLS is one option; a small Cloudflare Worker or a self-hosted Postgres + thin API work too).
|
|
552
|
+
2. If you use the reference schema, run `supabase/migrations/001_persona_feedback.sql` in your SQL editor.
|
|
553
|
+
3. Copy the endpoint URL and anon key into `~/.analyzthis_design/config.json` under `"feedback"` (or set env vars `ANALYZTHIS_FEEDBACK_URL` + `ANALYZTHIS_FEEDBACK_ANON_KEY`).
|
|
554
|
+
4. Read submissions from your endpoint's dashboard.
|
|
545
555
|
|
|
546
556
|
Users can also file GitHub issues via **Persona feedback** template if they prefer not to use CLI submit.
|
|
547
557
|
|
|
@@ -725,9 +735,18 @@ npx analyzthis_design run --continue --task "..." # resume host-mode run after
|
|
|
725
735
|
# CSV validation
|
|
726
736
|
npx analyzthis_design validate # validate all 28 CSV files against schema.json
|
|
727
737
|
|
|
738
|
+
# MCP server (for any AI IDE: Cursor, Claude Desktop, Lovable, v0, Bolt, Replit)
|
|
739
|
+
npx analyzthis_design mcp # start stdio MCP server
|
|
740
|
+
npx analyzthis_design mcp --configure cursor # auto-config Cursor
|
|
741
|
+
npx analyzthis_design mcp --configure claude # auto-config Claude Desktop
|
|
742
|
+
npx analyzthis_design mcp --configure windsurf # auto-config Windsurf
|
|
743
|
+
npx analyzthis_design mcp --configure <tool> # print config for any other tool
|
|
744
|
+
|
|
728
745
|
# Self-evolving team (v1.21)
|
|
729
746
|
npx analyzthis_design evolve --extract [--window N] [--dry-run]
|
|
730
747
|
npx analyzthis_design evolve --apply <patchId> [--dry-run]
|
|
748
|
+
npx analyzthis_design evolve --metrics [--project id]
|
|
749
|
+
npx analyzthis_design evolve --ready [--project id]
|
|
731
750
|
npx analyzthis_design outcome --infer [--window N]
|
|
732
751
|
npx analyzthis_design outcome --pending
|
|
733
752
|
npx analyzthis_design outcome --confirm --persona <id> --result shipped|revised|blocked|missed
|
|
@@ -775,6 +794,8 @@ lib/
|
|
|
775
794
|
chunk-telemetry.js Per-chunk model quality tracking
|
|
776
795
|
chunk-run.js Top-level chunked execution coordinator
|
|
777
796
|
reference-pack.js Shared multi-file CSV + vault retrieval (buildReferencePack)
|
|
797
|
+
mcp-server.js MCP server — 19 tools for any MCP-compatible IDE
|
|
798
|
+
system-prompt.js Consolidated prompt generator (fallback for non-MCP tools)
|
|
778
799
|
moodboard.js Mood-board engine: collect web/DS references, tag, deliberate
|
|
779
800
|
dedup.js Cross-persona redundancy detection
|
|
780
801
|
lessons.js Self-evolving lessons store (extract/retrieve/inject)
|
|
@@ -821,6 +842,27 @@ skills/
|
|
|
821
842
|
|
|
822
843
|
---
|
|
823
844
|
|
|
845
|
+
## What's new in v2.3
|
|
846
|
+
|
|
847
|
+
| Feature | Description |
|
|
848
|
+
|---------|-------------|
|
|
849
|
+
| **MCP server** | `npx analyzthis_design mcp` starts a local MCP server exposing 19 tools — all 8 individual personas + 6 combination passes + 5 utilities. Any MCP-compatible client can discover and call them. |
|
|
850
|
+
| **Auto-configure MCP** | `npx analyzthis_design mcp --configure cursor` (or `claude`, `windsurf`) writes the MCP config automatically. `--target all` now auto-configures MCP during install. |
|
|
851
|
+
| **Universal IDE support** | Cursor, Claude Desktop, Windsurf auto-configured. Lovable, v0, Bolt, Replit, ChatGPT: run `mcp --configure <tool>` for a copy-paste config snippet. |
|
|
852
|
+
| **19 MCP tools** | 8 individual personas (arjun, meera, priya, zara, noor, anuj, raj, kavi) + 6 combination passes (ux-ideator, persona-orchestrator, design-critic, ux-story-gate, design-director, mood-board) + 5 utilities (evolve-check, collect, retrieve, session, system-prompt) |
|
|
853
|
+
| **System prompt fallback** | `analyzthis_system_prompt` tool generates a consolidated prompt for tools that don't support MCP yet |
|
|
854
|
+
|
|
855
|
+
## What's new in v2.2
|
|
856
|
+
|
|
857
|
+
| Feature | Description |
|
|
858
|
+
|---------|-------------|
|
|
859
|
+
| **Premise challenge** | Planner now evaluates whether the task premise is valid before planning chunks. Can add a `premise_check` chunk (Raj) that runs first and questions "are we solving the right problem?" |
|
|
860
|
+
| **Conflict resolution** | Synthesis must pick a winner when personas disagree — not summarize both sides. Detects disagreements automatically, injects them into the synthesis prompt, and requires a definitive answer with a forward path. |
|
|
861
|
+
| **Raj authority expanded** | Raj can now challenge the task premise (not just arbitrate stalemates). "Accepting the task framing without questioning it" is explicitly forbidden. |
|
|
862
|
+
| **Evolution metrics** | `evolve --metrics` shows a per-persona evolution dashboard (0-100 score, levels: Novice → Expert). `evolve --ready` checks if enough data exists to propose patches. |
|
|
863
|
+
| **Devi evolution check** | After every successful run, Devi prints an evolution readiness hint and asks if the team is ready to evolve. |
|
|
864
|
+
| **Plain source, no obfuscation** | Removed `javascript-obfuscator` entirely. `dist/` is fully auditable plain JavaScript. `postinstall` only prints a message — no auto-install. |
|
|
865
|
+
|
|
824
866
|
## What's new in v2.0
|
|
825
867
|
|
|
826
868
|
| Feature | Description |
|
|
@@ -869,6 +911,22 @@ skills/
|
|
|
869
911
|
|
|
870
912
|
---
|
|
871
913
|
|
|
914
|
+
## Marketing site
|
|
915
|
+
|
|
916
|
+
The public lab site lives in `website/` and is deployed on Vercel as **analyzthis-lab** (site only — not the npm package). Copy now names two doors: lab products for people who already use Cursor or Claude, and custom teams that arrive in a firm’s existing tools. The Vercel project root is `website/` with no build step — do not set Output Directory to `public`.
|
|
917
|
+
|
|
918
|
+
- Live: [https://analyzthis-lab.vercel.app](https://analyzthis-lab.vercel.app)
|
|
919
|
+
- Design team deep-dive: [https://analyzthis-lab.vercel.app/design](https://analyzthis-lab.vercel.app/design) (`website/design.html`)
|
|
920
|
+
- Form test (does not write to Airtable): add `?form=mock` to the URL
|
|
921
|
+
- Leads go to Airtable through `website/api/lead.js`. Each step is saved; unfinished fills are marked `partial`.
|
|
922
|
+
- Booking uses Google Calendar: [https://calendar.app.google/KtKJ7hCAx1duA8m58](https://calendar.app.google/KtKJ7hCAx1duA8m58)
|
|
923
|
+
- Form views are counted first-party (no cookies, no third-party pixel). They are only stored if you set the optional `AIRTABLE_EVENTS_TABLE` env var to a separate Airtable table; without it the count is discarded and the Leads table is never touched.
|
|
924
|
+
- There is exactly one privacy disclosure, in the `.privacy-note` directly above the inquiry form. If you change what the site collects, update that sentence — do not add a second notice elsewhere on the page.
|
|
925
|
+
- Header layout: the real `logo.svg` sits left, nav links centre, one orange CTA right. No webfont is loaded, so the wordmark must stay an SVG.
|
|
926
|
+
- The hero is tuned so the primary CTA and trust ticks stay above the fold at 1440×800 — check that before changing hero padding or the `h1` clamp.
|
|
927
|
+
|
|
928
|
+
---
|
|
929
|
+
|
|
872
930
|
## License
|
|
873
931
|
|
|
874
932
|
MIT — [Rishikesh Joshi](https://github.com/rishikeshjoshi)
|
package/agents/cards/raj.md
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
10+ years product strategy. Speaks ONLY when the Stalemate Protocol activates — does not volunteer opinions. Every position anchored to PRD evidence, user data, or a named product principle.
|
|
4
4
|
|
|
5
|
-
**Allowed:** resolve stalemates between personas using the 5 product principles; issue final SHIP/REVISE/BLOCK when personas disagree
|
|
5
|
+
**Allowed:** resolve stalemates between personas using the 5 product principles; issue final SHIP/REVISE/BLOCK when personas disagree; challenge the task premise — "are we solving the right problem?"
|
|
6
6
|
|
|
7
|
-
**Forbidden:** running with no stalemate/BLOCK condition; code edits without explicit build approval.
|
|
7
|
+
**Forbidden:** running with no stalemate/BLOCK condition; code edits without explicit build approval; accepting the task framing without questioning it.
|
|
8
8
|
|
|
9
|
-
**Activation criteria (any one):** 2+ unconceded structural objections; a "non-negotiable" claim refused; the same argument repeated without new evidence; a PRD-persona-priority conflict with no established priority.
|
|
9
|
+
**Activation criteria (any one):** 2+ unconceded structural objections; a "non-negotiable" claim refused; the same argument repeated without new evidence; a PRD-persona-priority conflict with no established priority; synthesis phase (always — must resolve conflicts and challenge premise).
|
|
10
10
|
|
|
11
11
|
## Output schema (always full — Raj has no lite mode; his output is inherently a short decision)
|
|
12
12
|
```
|
package/dist/HOW-TO-USE.md
CHANGED
|
@@ -335,6 +335,23 @@ npx analyzthis_design evolve --extract # write patch proposals
|
|
|
335
335
|
npx analyzthis_design evolve --apply <patchId> # apply after review
|
|
336
336
|
```
|
|
337
337
|
|
|
338
|
+
### Check evolution metrics
|
|
339
|
+
|
|
340
|
+
```bash
|
|
341
|
+
npx analyzthis_design evolve --metrics # team evolution dashboard
|
|
342
|
+
npx analyzthis_design evolve --ready # check if enough data to evolve
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
The dashboard shows a per-persona score (0-100) based on lessons, outcomes, and patches applied. Levels: Novice (0-19) -> Developing (20-39) -> Proficient (40-59) -> Advanced (60-79) -> Expert (80-100).
|
|
346
|
+
|
|
347
|
+
After every successful run, Devi prints an evolution readiness hint automatically.
|
|
348
|
+
|
|
349
|
+
### Premise challenge (v2.2)
|
|
350
|
+
|
|
351
|
+
When you run a critique, the planner now evaluates whether your task framing is valid before planning chunks. If the premise is questionable (e.g., "users don't convert because X is buried" — but maybe they reach X and still don't convert), the planner adds a `premise_check` chunk that Raj runs first. All subsequent persona chunks see the premise assessment.
|
|
352
|
+
|
|
353
|
+
The synthesis step also explicitly resolves disagreements — if Arjun says SHIP and Meera says REVISE, the synthesis picks a winner with a forward path instead of summarizing both sides.
|
|
354
|
+
|
|
338
355
|
### Confirm whether the advice actually shipped
|
|
339
356
|
|
|
340
357
|
```bash
|
|
@@ -426,6 +443,8 @@ npx analyzthis_design moodboard critique --board <id>
|
|
|
426
443
|
npx analyzthis_design moodboard add --board <id> --url <url> --tags a,b
|
|
427
444
|
|
|
428
445
|
# Evolve
|
|
446
|
+
npx analyzthis_design evolve --metrics
|
|
447
|
+
npx analyzthis_design evolve --ready
|
|
429
448
|
npx analyzthis_design evolve --extract --dry-run
|
|
430
449
|
npx analyzthis_design evolve --apply <patchId>
|
|
431
450
|
npx analyzthis_design outcome --confirm --persona arjun --result shipped
|
package/dist/README.md
CHANGED
|
@@ -4,6 +4,12 @@ A set of AI design personas and a task-first evaluation framework that plugs int
|
|
|
4
4
|
|
|
5
5
|
Install once. Run structured UX critiques, multi-phase ideation, and task-grounded screen reviews — directly inside your AI chat. **No external LLM API keys required** for CLI orchestrator runs: **`/devi`** voices each persona from your host IDE (Cursor, Claude, etc.).
|
|
6
6
|
|
|
7
|
+
## v2.2 — project-scoped knowledge bank
|
|
8
|
+
|
|
9
|
+
Knowledge sources are now scoped per project by default. `collect`, `connect`, `sync`, `disconnect`, and `status` operate on the project derived from your current working directory, and the built `knowledge-bank` skill is written into that project's local skills directory (`<project>/.claude/skills/knowledge-bank/SKILL.md`, `<project>/.cursor/skills/...`, etc.). Invoking a skill from one project never reads another project's vaults.
|
|
10
|
+
|
|
11
|
+
Pass `--global` to opt into the legacy merged behavior (read `config.sources` and write into `~/.claude/skills/...`). Use `--global` only when you deliberately want cross-project blending.
|
|
12
|
+
|
|
7
13
|
## v2.0 — chunked execution by default
|
|
8
14
|
|
|
9
15
|
`npx analyzthis_design run --task "..."` now uses a **frontier planner + cheap chunk models**:
|
|
@@ -15,7 +21,7 @@ Install once. Run structured UX critiques, multi-phase ideation, and task-ground
|
|
|
15
21
|
|
|
16
22
|
Use `npx analyzthis_design run-unchunked` for the legacy single-pass orchestrator.
|
|
17
23
|
|
|
18
|
-
**npm:** [analyzthis_design](https://www.npmjs.com/package/analyzthis_design) · **Current version:** 2.
|
|
24
|
+
**npm:** [analyzthis_design](https://www.npmjs.com/package/analyzthis_design) · **Current version:** 2.3.0 · **Step-by-step guide:** [HOW-TO-USE.md](./HOW-TO-USE.md)
|
|
19
25
|
|
|
20
26
|
---
|
|
21
27
|
|
|
@@ -36,6 +42,8 @@ npx analyzthis_design run-unchunked --task "Review invoice approval screen" --pr
|
|
|
36
42
|
```
|
|
37
43
|
|
|
38
44
|
> **Security:** This package publishes **plain source** — no obfuscation, no minification, no dynamic require. Every file in `dist/` is readable and auditable. The `postinstall` script only prints a welcome message; it does **not** write to any AI-agent directories. Skill installation requires an explicit `npx analyzthis_design --target <ide>` command.
|
|
45
|
+
>
|
|
46
|
+
> **MCP (universal):** `npx analyzthis_design mcp` starts a local MCP server with 19 tools (all personas + combination passes + utilities). Auto-configures for Cursor, Claude Desktop, and Windsurf during `--target all` install. For Lovable, v0, Bolt, Replit, ChatGPT: run `npx analyzthis_design mcp --configure <tool>` for a config snippet.
|
|
39
47
|
|
|
40
48
|
### Install by target IDE
|
|
41
49
|
|
|
@@ -536,12 +544,14 @@ npx analyzthis_design feedback status
|
|
|
536
544
|
|
|
537
545
|
**What does NOT get sent:** project paths, repo names, emails, API keys, full source trees.
|
|
538
546
|
|
|
539
|
-
**Maintainer setup (
|
|
547
|
+
**Maintainer setup (vendor-neutral HTTP endpoint):**
|
|
540
548
|
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
549
|
+
The `feedback submit` client is a plain HTTPS POST with an `apikey` header — it works with any REST endpoint that accepts anonymous inserts, not only Supabase. A reference schema (with row-level security for insert-only anon access) lives in [`supabase/migrations/001_persona_feedback.sql`](./supabase/migrations/001_persona_feedback.sql) in the repo. That folder is **not** shipped in the npm package, so installing `analyzthis_design` does not pull a Supabase-branded folder into `node_modules`.
|
|
550
|
+
|
|
551
|
+
1. Stand up any HTTP endpoint that accepts anonymous JSON inserts (Supabase with RLS is one option; a small Cloudflare Worker or a self-hosted Postgres + thin API work too).
|
|
552
|
+
2. If you use the reference schema, run `supabase/migrations/001_persona_feedback.sql` in your SQL editor.
|
|
553
|
+
3. Copy the endpoint URL and anon key into `~/.analyzthis_design/config.json` under `"feedback"` (or set env vars `ANALYZTHIS_FEEDBACK_URL` + `ANALYZTHIS_FEEDBACK_ANON_KEY`).
|
|
554
|
+
4. Read submissions from your endpoint's dashboard.
|
|
545
555
|
|
|
546
556
|
Users can also file GitHub issues via **Persona feedback** template if they prefer not to use CLI submit.
|
|
547
557
|
|
|
@@ -725,9 +735,18 @@ npx analyzthis_design run --continue --task "..." # resume host-mode run after
|
|
|
725
735
|
# CSV validation
|
|
726
736
|
npx analyzthis_design validate # validate all 28 CSV files against schema.json
|
|
727
737
|
|
|
738
|
+
# MCP server (for any AI IDE: Cursor, Claude Desktop, Lovable, v0, Bolt, Replit)
|
|
739
|
+
npx analyzthis_design mcp # start stdio MCP server
|
|
740
|
+
npx analyzthis_design mcp --configure cursor # auto-config Cursor
|
|
741
|
+
npx analyzthis_design mcp --configure claude # auto-config Claude Desktop
|
|
742
|
+
npx analyzthis_design mcp --configure windsurf # auto-config Windsurf
|
|
743
|
+
npx analyzthis_design mcp --configure <tool> # print config for any other tool
|
|
744
|
+
|
|
728
745
|
# Self-evolving team (v1.21)
|
|
729
746
|
npx analyzthis_design evolve --extract [--window N] [--dry-run]
|
|
730
747
|
npx analyzthis_design evolve --apply <patchId> [--dry-run]
|
|
748
|
+
npx analyzthis_design evolve --metrics [--project id]
|
|
749
|
+
npx analyzthis_design evolve --ready [--project id]
|
|
731
750
|
npx analyzthis_design outcome --infer [--window N]
|
|
732
751
|
npx analyzthis_design outcome --pending
|
|
733
752
|
npx analyzthis_design outcome --confirm --persona <id> --result shipped|revised|blocked|missed
|
|
@@ -775,6 +794,8 @@ lib/
|
|
|
775
794
|
chunk-telemetry.js Per-chunk model quality tracking
|
|
776
795
|
chunk-run.js Top-level chunked execution coordinator
|
|
777
796
|
reference-pack.js Shared multi-file CSV + vault retrieval (buildReferencePack)
|
|
797
|
+
mcp-server.js MCP server — 19 tools for any MCP-compatible IDE
|
|
798
|
+
system-prompt.js Consolidated prompt generator (fallback for non-MCP tools)
|
|
778
799
|
moodboard.js Mood-board engine: collect web/DS references, tag, deliberate
|
|
779
800
|
dedup.js Cross-persona redundancy detection
|
|
780
801
|
lessons.js Self-evolving lessons store (extract/retrieve/inject)
|
|
@@ -821,6 +842,27 @@ skills/
|
|
|
821
842
|
|
|
822
843
|
---
|
|
823
844
|
|
|
845
|
+
## What's new in v2.3
|
|
846
|
+
|
|
847
|
+
| Feature | Description |
|
|
848
|
+
|---------|-------------|
|
|
849
|
+
| **MCP server** | `npx analyzthis_design mcp` starts a local MCP server exposing 19 tools — all 8 individual personas + 6 combination passes + 5 utilities. Any MCP-compatible client can discover and call them. |
|
|
850
|
+
| **Auto-configure MCP** | `npx analyzthis_design mcp --configure cursor` (or `claude`, `windsurf`) writes the MCP config automatically. `--target all` now auto-configures MCP during install. |
|
|
851
|
+
| **Universal IDE support** | Cursor, Claude Desktop, Windsurf auto-configured. Lovable, v0, Bolt, Replit, ChatGPT: run `mcp --configure <tool>` for a copy-paste config snippet. |
|
|
852
|
+
| **19 MCP tools** | 8 individual personas (arjun, meera, priya, zara, noor, anuj, raj, kavi) + 6 combination passes (ux-ideator, persona-orchestrator, design-critic, ux-story-gate, design-director, mood-board) + 5 utilities (evolve-check, collect, retrieve, session, system-prompt) |
|
|
853
|
+
| **System prompt fallback** | `analyzthis_system_prompt` tool generates a consolidated prompt for tools that don't support MCP yet |
|
|
854
|
+
|
|
855
|
+
## What's new in v2.2
|
|
856
|
+
|
|
857
|
+
| Feature | Description |
|
|
858
|
+
|---------|-------------|
|
|
859
|
+
| **Premise challenge** | Planner now evaluates whether the task premise is valid before planning chunks. Can add a `premise_check` chunk (Raj) that runs first and questions "are we solving the right problem?" |
|
|
860
|
+
| **Conflict resolution** | Synthesis must pick a winner when personas disagree — not summarize both sides. Detects disagreements automatically, injects them into the synthesis prompt, and requires a definitive answer with a forward path. |
|
|
861
|
+
| **Raj authority expanded** | Raj can now challenge the task premise (not just arbitrate stalemates). "Accepting the task framing without questioning it" is explicitly forbidden. |
|
|
862
|
+
| **Evolution metrics** | `evolve --metrics` shows a per-persona evolution dashboard (0-100 score, levels: Novice → Expert). `evolve --ready` checks if enough data exists to propose patches. |
|
|
863
|
+
| **Devi evolution check** | After every successful run, Devi prints an evolution readiness hint and asks if the team is ready to evolve. |
|
|
864
|
+
| **Plain source, no obfuscation** | Removed `javascript-obfuscator` entirely. `dist/` is fully auditable plain JavaScript. `postinstall` only prints a message — no auto-install. |
|
|
865
|
+
|
|
824
866
|
## What's new in v2.0
|
|
825
867
|
|
|
826
868
|
| Feature | Description |
|
|
@@ -869,6 +911,22 @@ skills/
|
|
|
869
911
|
|
|
870
912
|
---
|
|
871
913
|
|
|
914
|
+
## Marketing site
|
|
915
|
+
|
|
916
|
+
The public lab site lives in `website/` and is deployed on Vercel as **analyzthis-lab** (site only — not the npm package). Copy now names two doors: lab products for people who already use Cursor or Claude, and custom teams that arrive in a firm’s existing tools. The Vercel project root is `website/` with no build step — do not set Output Directory to `public`.
|
|
917
|
+
|
|
918
|
+
- Live: [https://analyzthis-lab.vercel.app](https://analyzthis-lab.vercel.app)
|
|
919
|
+
- Design team deep-dive: [https://analyzthis-lab.vercel.app/design](https://analyzthis-lab.vercel.app/design) (`website/design.html`)
|
|
920
|
+
- Form test (does not write to Airtable): add `?form=mock` to the URL
|
|
921
|
+
- Leads go to Airtable through `website/api/lead.js`. Each step is saved; unfinished fills are marked `partial`.
|
|
922
|
+
- Booking uses Google Calendar: [https://calendar.app.google/KtKJ7hCAx1duA8m58](https://calendar.app.google/KtKJ7hCAx1duA8m58)
|
|
923
|
+
- Form views are counted first-party (no cookies, no third-party pixel). They are only stored if you set the optional `AIRTABLE_EVENTS_TABLE` env var to a separate Airtable table; without it the count is discarded and the Leads table is never touched.
|
|
924
|
+
- There is exactly one privacy disclosure, in the `.privacy-note` directly above the inquiry form. If you change what the site collects, update that sentence — do not add a second notice elsewhere on the page.
|
|
925
|
+
- Header layout: the real `logo.svg` sits left, nav links centre, one orange CTA right. No webfont is loaded, so the wordmark must stay an SVG.
|
|
926
|
+
- The hero is tuned so the primary CTA and trust ticks stay above the fold at 1440×800 — check that before changing hero padding or the `h1` clamp.
|
|
927
|
+
|
|
928
|
+
---
|
|
929
|
+
|
|
872
930
|
## License
|
|
873
931
|
|
|
874
932
|
MIT — [Rishikesh Joshi](https://github.com/rishikeshjoshi)
|
package/dist/agents/cards/raj.md
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
10+ years product strategy. Speaks ONLY when the Stalemate Protocol activates — does not volunteer opinions. Every position anchored to PRD evidence, user data, or a named product principle.
|
|
4
4
|
|
|
5
|
-
**Allowed:** resolve stalemates between personas using the 5 product principles; issue final SHIP/REVISE/BLOCK when personas disagree
|
|
5
|
+
**Allowed:** resolve stalemates between personas using the 5 product principles; issue final SHIP/REVISE/BLOCK when personas disagree; challenge the task premise — "are we solving the right problem?"
|
|
6
6
|
|
|
7
|
-
**Forbidden:** running with no stalemate/BLOCK condition; code edits without explicit build approval.
|
|
7
|
+
**Forbidden:** running with no stalemate/BLOCK condition; code edits without explicit build approval; accepting the task framing without questioning it.
|
|
8
8
|
|
|
9
|
-
**Activation criteria (any one):** 2+ unconceded structural objections; a "non-negotiable" claim refused; the same argument repeated without new evidence; a PRD-persona-priority conflict with no established priority.
|
|
9
|
+
**Activation criteria (any one):** 2+ unconceded structural objections; a "non-negotiable" claim refused; the same argument repeated without new evidence; a PRD-persona-priority conflict with no established priority; synthesis phase (always — must resolve conflicts and challenge premise).
|
|
10
10
|
|
|
11
11
|
## Output schema (always full — Raj has no lite mode; his output is inherently a short decision)
|
|
12
12
|
```
|
package/dist/bin/cli.js
CHANGED
|
@@ -33,14 +33,20 @@ Usage:
|
|
|
33
33
|
welcome Print getting-started banner for your AI tool (--target)
|
|
34
34
|
|
|
35
35
|
── Knowledge bank commands ──────────────────────────────────
|
|
36
|
-
connect Register a vault or knowledge folder as a source
|
|
37
|
-
sync Read
|
|
38
|
-
disconnect Remove a source from
|
|
39
|
-
status Show
|
|
36
|
+
connect Register a vault or knowledge folder as a source (scoped to cwd project)
|
|
37
|
+
sync Read this project's sources and build the knowledge-bank skill
|
|
38
|
+
disconnect Remove a source from this project's registry
|
|
39
|
+
status Show this project's sources and last sync time
|
|
40
40
|
collect Kavi: scan codebase → Obsidian vault → enrich → sync knowledge bank
|
|
41
41
|
(--vault path, --dry-run, --no-enrich, --no-web, --no-discover,
|
|
42
42
|
--web-limit N, --target cursor|claude|codex|grok|windsurf|agents|all)
|
|
43
43
|
|
|
44
|
+
Scope flags (connect/sync/disconnect/status):
|
|
45
|
+
--project <id> Explicit project id (overrides cwd-derived id)
|
|
46
|
+
--global Use the legacy merged pool (config.sources → ~/.claude/skills/...)
|
|
47
|
+
instead of per-project scoping. Only use when you want
|
|
48
|
+
multiple projects' notes blended together.
|
|
49
|
+
|
|
44
50
|
── Design spec commands ─────────────────────────────────────
|
|
45
51
|
spec show Print design_spec from session state
|
|
46
52
|
spec validate Validate a DesignSpec JSON file (--file) or session
|
|
@@ -61,7 +67,7 @@ Usage:
|
|
|
61
67
|
feedback list List feedback entries for this project (--all for every project)
|
|
62
68
|
feedback export Export rejected + correction JSONL pairs for training
|
|
63
69
|
(--persona <id>, --all, --output <path>, --include-positive)
|
|
64
|
-
feedback submit Opt-in: send anonymized corrections to community store (
|
|
70
|
+
feedback submit Opt-in: send anonymized corrections to a community store (HTTP endpoint)
|
|
65
71
|
(--yes skip prompt, --dry-run preview, --all unsent across projects)
|
|
66
72
|
feedback status Show submit consent, endpoint config, unsent count
|
|
67
73
|
feedback revoke Revoke opt-in consent for community submit
|
|
@@ -77,6 +83,13 @@ Usage:
|
|
|
77
83
|
research --url <url> Fetch a URL and append to session web-context.md
|
|
78
84
|
research --query <text> Search stub (or provider) appended to web-context.md
|
|
79
85
|
|
|
86
|
+
── MCP server (for any AI IDE: Cursor, Claude Desktop, Lovable, v0, Bolt) ──
|
|
87
|
+
mcp Start the MCP server on stdio (for MCP client config)
|
|
88
|
+
mcp --configure cursor Write MCP config to ~/.cursor/mcp.json
|
|
89
|
+
mcp --configure claude Write MCP config to Claude Desktop config
|
|
90
|
+
mcp --configure windsurf Write MCP config to Windsurf
|
|
91
|
+
mcp --configure <tool> Print manual MCP config for any other tool
|
|
92
|
+
|
|
80
93
|
── Mood board commands ─────────────────────────────────────
|
|
81
94
|
moodboard create --task <text> Build a mood board from web + DS references
|
|
82
95
|
[--url <url> ...] [--auto]
|
|
@@ -175,9 +188,11 @@ Usage:
|
|
|
175
188
|
npx analyzthis_design connect --vault ~/Documents/MyVault
|
|
176
189
|
npx analyzthis_design connect --vault ~/docs --tags design,brand,product
|
|
177
190
|
npx analyzthis_design connect --vault ~/vault --include Design,Research
|
|
178
|
-
npx analyzthis_design sync # sync to Cursor
|
|
179
|
-
npx analyzthis_design sync --target all # sync to all tools
|
|
180
|
-
npx analyzthis_design
|
|
191
|
+
npx analyzthis_design sync # sync to Cursor (project-scoped)
|
|
192
|
+
npx analyzthis_design sync --target all # sync to all tools (project-scoped)
|
|
193
|
+
npx analyzthis_design sync --global # legacy: blend all projects into ~/.claude/skills/
|
|
194
|
+
npx analyzthis_design status # show this project's sources
|
|
195
|
+
npx analyzthis_design status --global # show the legacy merged pool
|
|
181
196
|
npx analyzthis_design disconnect --vault ~/Documents/MyVault
|
|
182
197
|
|
|
183
198
|
npx analyzthis_design session init # start a new session for this repo
|
|
@@ -255,6 +270,7 @@ const vaultVal = getFlag('vault');
|
|
|
255
270
|
const tagsVal = getFlag('tags');
|
|
256
271
|
const includeVal = getFlag('include');
|
|
257
272
|
const projectVal = getFlag('project');
|
|
273
|
+
const globalFlag = flags.includes('--global');
|
|
258
274
|
const allFlag = flags.includes('--all');
|
|
259
275
|
const urlVal = getFlag('url');
|
|
260
276
|
const queryVal = getFlag('query');
|
|
@@ -352,8 +368,10 @@ switch (cmd) {
|
|
|
352
368
|
try {
|
|
353
369
|
const tags = tagsVal ? tagsVal.split(',').map(t => t.trim()) : [];
|
|
354
370
|
const include = includeVal ? includeVal.split(',').map(t => t.trim()) : [];
|
|
355
|
-
const abs = connect({ vaultPath: vaultVal, tags, include });
|
|
371
|
+
const abs = connect({ vaultPath: vaultVal, tags, include, project: projectVal, global: globalFlag });
|
|
372
|
+
const scopeLabel = globalFlag ? 'global (merged across projects)' : (projectVal || `project derived from ${path.resolve(process.cwd())}`);
|
|
356
373
|
console.log(`\n✅ Connected: ${abs}`);
|
|
374
|
+
console.log(` Scope: ${scopeLabel}`);
|
|
357
375
|
if (tags.length) console.log(` Tags filter: ${tags.join(', ')}`);
|
|
358
376
|
if (include.length) console.log(` Folder filter: ${include.join(', ')}`);
|
|
359
377
|
console.log(`\n Run "npx analyzthis_design sync" to build the knowledge bank.\n`);
|
|
@@ -369,7 +387,7 @@ switch (cmd) {
|
|
|
369
387
|
console.error('\n ✗ --vault is required. Example: npx analyzthis_design disconnect --vault ~/Documents/MyVault\n');
|
|
370
388
|
process.exit(1);
|
|
371
389
|
}
|
|
372
|
-
disconnect(vaultVal);
|
|
390
|
+
disconnect(vaultVal, { project: projectVal, global: globalFlag });
|
|
373
391
|
console.log(`\n🗑 Disconnected: ${path.resolve(vaultVal)}\n`);
|
|
374
392
|
break;
|
|
375
393
|
}
|
|
@@ -381,9 +399,10 @@ switch (cmd) {
|
|
|
381
399
|
console.error(`\n ✗ Unknown target "${targetVal}". Choose: ${ALL_TARGET_IDS.join(', ')}, all\n`);
|
|
382
400
|
process.exit(1);
|
|
383
401
|
}
|
|
384
|
-
|
|
402
|
+
const scopeLabel = globalFlag ? 'global (merged across projects)' : (projectVal || `project derived from ${path.resolve(process.cwd())}`);
|
|
403
|
+
console.log(`\n⏳ Syncing knowledge bank (${scopeLabel})...\n`);
|
|
385
404
|
try {
|
|
386
|
-
const result = sync({ targets });
|
|
405
|
+
const result = sync({ targets, project: projectVal, global: globalFlag });
|
|
387
406
|
if (result.message) {
|
|
388
407
|
console.log(` ⚠ ${result.message}\n`);
|
|
389
408
|
} else {
|
|
@@ -399,18 +418,22 @@ switch (cmd) {
|
|
|
399
418
|
}
|
|
400
419
|
|
|
401
420
|
case 'status': {
|
|
402
|
-
const
|
|
403
|
-
if (!
|
|
404
|
-
|
|
421
|
+
const view = status({ project: projectVal, global: globalFlag });
|
|
422
|
+
if (!view.sources || view.sources.length === 0) {
|
|
423
|
+
const scopeHint = view.scope === 'global'
|
|
424
|
+
? 'Run: npx analyzthis_design connect --vault /path/to/vault --global'
|
|
425
|
+
: 'Run: npx analyzthis_design collect (from inside the project) or npx analyzthis_design connect --vault /path/to/vault';
|
|
426
|
+
console.log(`\n No knowledge sources connected for this ${view.scope} scope.\n ${scopeHint}\n`);
|
|
405
427
|
} else {
|
|
406
|
-
|
|
407
|
-
|
|
428
|
+
const scopeLabel = view.scope === 'global' ? 'global (merged across projects)' : `project: ${view.projectId}`;
|
|
429
|
+
console.log(`\n📚 Knowledge bank sources (${view.sources.length}) — ${scopeLabel}:\n`);
|
|
430
|
+
for (const s of view.sources) {
|
|
408
431
|
console.log(` • ${s.path}`);
|
|
409
|
-
if (s.tags.length) console.log(` Tags: ${s.tags.join(', ')}`);
|
|
410
|
-
if (s.include.length) console.log(` Folders: ${s.include.join(', ')}`);
|
|
432
|
+
if (s.tags && s.tags.length) console.log(` Tags: ${s.tags.join(', ')}`);
|
|
433
|
+
if (s.include && s.include.length) console.log(` Folders: ${s.include.join(', ')}`);
|
|
411
434
|
console.log(` Added: ${s.addedAt}`);
|
|
412
435
|
}
|
|
413
|
-
if (
|
|
436
|
+
if (view.lastSync) console.log(`\n Last sync: ${view.lastSync}`);
|
|
414
437
|
console.log('');
|
|
415
438
|
}
|
|
416
439
|
break;
|
|
@@ -735,6 +758,19 @@ switch (cmd) {
|
|
|
735
758
|
process.exit(1);
|
|
736
759
|
}
|
|
737
760
|
|
|
761
|
+
// ── MCP server ─────────────────────────────────────────────────────────
|
|
762
|
+
|
|
763
|
+
case 'mcp': {
|
|
764
|
+
const mcpServer = require('../lib/mcp-server');
|
|
765
|
+
const configureTarget = getFlag('configure');
|
|
766
|
+
if (configureTarget) {
|
|
767
|
+
mcpServer.writeMcpConfig(configureTarget);
|
|
768
|
+
break;
|
|
769
|
+
}
|
|
770
|
+
mcpServer.startStdioServer();
|
|
771
|
+
break;
|
|
772
|
+
}
|
|
773
|
+
|
|
738
774
|
// ── Retrieve-on-demand reference rows ───────────────────────────────────
|
|
739
775
|
|
|
740
776
|
case 'retrieve': {
|
|
@@ -108,6 +108,17 @@ function plannerSystemPrompt() {
|
|
|
108
108
|
'Each chunk targets one persona and has a clear goal, prompts, effort level, and dependencies.',
|
|
109
109
|
'You must output ONLY a JSON object inside a ```json code fence.',
|
|
110
110
|
'',
|
|
111
|
+
'CRITICAL: Before planning chunks, evaluate whether the task premise is valid.',
|
|
112
|
+
'Ask: "Are we solving the right problem?" If the premise is questionable, add a',
|
|
113
|
+
'premise_check chunk (persona: raj, effort: hard) that explicitly challenges the',
|
|
114
|
+
'framing. The premise_check chunk should run FIRST and its output should be',
|
|
115
|
+
'available to subsequent chunks via depends_on.',
|
|
116
|
+
'',
|
|
117
|
+
'Also add a synthesis chunk (persona: raj, effort: hard) that runs LAST and must:',
|
|
118
|
+
'1. Resolve any disagreements between personas (pick a winner, give a forward path)',
|
|
119
|
+
'2. Challenge the premise if it was not already challenged',
|
|
120
|
+
'3. Produce a definitive verdict — not a summary of opinions',
|
|
121
|
+
'',
|
|
111
122
|
'Allowed personas: arjun (UX/visual), meera (business), priya (feasibility), zara (delight), noor (minimalist IA), anuj (dense power-user), raj (strategy/arbitration).',
|
|
112
123
|
'',
|
|
113
124
|
'Effort levels:',
|
|
@@ -119,21 +130,33 @@ function plannerSystemPrompt() {
|
|
|
119
130
|
'{',
|
|
120
131
|
' "plan_id": "short-unique-id",',
|
|
121
132
|
' "task_summary": "one-line summary",',
|
|
133
|
+
' "premise_valid": true | false | "questionable",',
|
|
134
|
+
' "premise_concern": "if questionable, what is the real problem?",',
|
|
122
135
|
' "chunks": [',
|
|
123
136
|
' {',
|
|
124
|
-
' "id": "
|
|
125
|
-
' "persona": "
|
|
126
|
-
' "goal": "
|
|
137
|
+
' "id": "premise_check",',
|
|
138
|
+
' "persona": "raj",',
|
|
139
|
+
' "goal": "challenge the task framing — are we solving the right problem?",',
|
|
127
140
|
' "system_prompt": "...",',
|
|
128
141
|
' "user_prompt": "...",',
|
|
129
|
-
' "effort": "
|
|
142
|
+
' "effort": "hard",',
|
|
130
143
|
' "depends_on": [],',
|
|
131
|
-
' "output_schema": "
|
|
144
|
+
' "output_schema": "premise_assessment"',
|
|
145
|
+
' },',
|
|
146
|
+
' {',
|
|
147
|
+
' "id": "arjun",',
|
|
148
|
+
' "persona": "arjun",',
|
|
149
|
+
' "goal": "...",',
|
|
150
|
+
' "system_prompt": "...",',
|
|
151
|
+
' "user_prompt": "...",',
|
|
152
|
+
' "effort": "standard",',
|
|
153
|
+
' "depends_on": ["premise_check"],',
|
|
154
|
+
' "output_schema": "ux_audit"',
|
|
132
155
|
' }',
|
|
133
156
|
' ],',
|
|
134
157
|
' "synthesis": {',
|
|
135
158
|
' "persona": "raj",',
|
|
136
|
-
' "goal": "resolve conflicts
|
|
159
|
+
' "goal": "resolve conflicts, challenge premise if needed, produce definitive verdict",',
|
|
137
160
|
' "system_prompt": "...",',
|
|
138
161
|
' "user_prompt": "..."',
|
|
139
162
|
' }',
|