analyzthis_design 2.3.0 → 2.3.1

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/README.md CHANGED
@@ -4,6 +4,22 @@ 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.3.1 — independently callable personas (31 Aug 2026)
8
+
9
+ After install, type `/noor`, `/anuj`, `/arjun`, `/meera`, `/priya`, `/zara`, `/raj`, `/kavi` even if Claude’s slash menu only lists Getting Started.
10
+
11
+ - `npx analyzthis_design --target claude` is the same as `install --target claude` (leading `--target` used to print “Unknown command”).
12
+ - Install writes project slash commands into `.claude/commands/` and `.cursor/commands/`.
13
+ - `mcp --configure claude` writes Claude Desktop, Claude Code (`~/.claude.json`), and this repo’s `.mcp.json` when you are in a project.
14
+ - Do not `npm install` this package inside a pnpm/Yarn `workspace:*` repo — use `npx … --target` instead.
15
+ - Slash and MCP still use the model already in your chat. CLI `run` still picks a strong planner and cheap chunks.
16
+
17
+ Website changelog: [analyzthis-lab.vercel.app/design#whats-new](https://analyzthis-lab.vercel.app/design#whats-new)
18
+
19
+ ## v2.3.0 — MCP for any IDE
20
+
21
+ 19 MCP tools (`analyzthis_noor`, not `/noor`). Slash commands and MCP are different pipes. MCP never creates a slash menu entry.
22
+
7
23
  ## v2.2 — project-scoped knowledge bank
8
24
 
9
25
  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.
@@ -21,17 +37,21 @@ Pass `--global` to opt into the legacy merged behavior (read `config.sources` an
21
37
 
22
38
  Use `npx analyzthis_design run-unchunked` for the legacy single-pass orchestrator.
23
39
 
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)
40
+ **npm:** [analyzthis_design](https://www.npmjs.com/package/analyzthis_design) · **Current version:** 2.3.1 · **Step-by-step guide:** [HOW-TO-USE.md](./HOW-TO-USE.md)
25
41
 
26
42
  ---
27
43
 
28
44
  ## Quick start
29
45
 
30
46
  ```bash
31
- # 1. Install the npm package (no auto-install, no obfuscation)
47
+ # 1. Install the CLI globally (optional). Do not run npm install inside a
48
+ # pnpm/Yarn workspace repo — npm cannot read workspace:* and will fail.
49
+ # Prefer npx from any folder:
32
50
  npm install -g analyzthis_design
33
51
 
34
- # 2. Install slash commands into your IDE (explicit, consent-based)
52
+ # 2. Copy skills + slash commands into your IDE (consent-based)
53
+ npx analyzthis_design install --target all
54
+ # Same thing: a leading --target means install
35
55
  npx analyzthis_design --target all
36
56
 
37
57
  # 3. Run a task in v2.0 chunked mode (free/cheap models)
@@ -41,13 +61,14 @@ npx analyzthis_design run --task "Review invoice approval screen"
41
61
  npx analyzthis_design run-unchunked --task "Review invoice approval screen" --provider host
42
62
  ```
43
63
 
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.
64
+ > **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 install --target <ide>` (or `npx analyzthis_design --target <ide>`).
45
65
  >
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.
66
+ > **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, **Claude Code**, and Windsurf during install. For Lovable, v0, Bolt, Replit, ChatGPT: run `npx analyzthis_design mcp --configure <tool>` for a config snippet.
47
67
 
48
68
  ### Install by target IDE
49
69
 
50
70
  ```bash
71
+ npx analyzthis_design install --target claude
51
72
  npx analyzthis_design --target claude
52
73
  npx analyzthis_design --target codex
53
74
  npx analyzthis_design --target grok
@@ -55,7 +76,7 @@ npx analyzthis_design --target windsurf
55
76
  npx analyzthis_design --target all --force
56
77
  ```
57
78
 
58
- **After install:** type `/getting-started` in Cursor or Claude Code (or `@getting-started` in Windsurf). For a complete walkthrough, see [HOW-TO-USE.md](./HOW-TO-USE.md). Re-print CLI help anytime with `npx analyzthis_design welcome`.
79
+ **After install:** type `/noor`, `/arjun`, `/ux-ideator` (or `@` in Windsurf). Claude’s menu may only show Getting Started — type the name anyway. Also `/getting-started`. Walkthrough: [HOW-TO-USE.md](./HOW-TO-USE.md). Re-print help: `npx analyzthis_design welcome`.
59
80
 
60
81
  | Tool | Skills installed to | Invoke |
61
82
  |---|---|---|
package/dist/README.md CHANGED
@@ -4,6 +4,22 @@ 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.3.1 — independently callable personas (31 Aug 2026)
8
+
9
+ After install, type `/noor`, `/anuj`, `/arjun`, `/meera`, `/priya`, `/zara`, `/raj`, `/kavi` even if Claude’s slash menu only lists Getting Started.
10
+
11
+ - `npx analyzthis_design --target claude` is the same as `install --target claude` (leading `--target` used to print “Unknown command”).
12
+ - Install writes project slash commands into `.claude/commands/` and `.cursor/commands/`.
13
+ - `mcp --configure claude` writes Claude Desktop, Claude Code (`~/.claude.json`), and this repo’s `.mcp.json` when you are in a project.
14
+ - Do not `npm install` this package inside a pnpm/Yarn `workspace:*` repo — use `npx … --target` instead.
15
+ - Slash and MCP still use the model already in your chat. CLI `run` still picks a strong planner and cheap chunks.
16
+
17
+ Website changelog: [analyzthis-lab.vercel.app/design#whats-new](https://analyzthis-lab.vercel.app/design#whats-new)
18
+
19
+ ## v2.3.0 — MCP for any IDE
20
+
21
+ 19 MCP tools (`analyzthis_noor`, not `/noor`). Slash commands and MCP are different pipes. MCP never creates a slash menu entry.
22
+
7
23
  ## v2.2 — project-scoped knowledge bank
8
24
 
9
25
  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.
@@ -21,17 +37,21 @@ Pass `--global` to opt into the legacy merged behavior (read `config.sources` an
21
37
 
22
38
  Use `npx analyzthis_design run-unchunked` for the legacy single-pass orchestrator.
23
39
 
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)
40
+ **npm:** [analyzthis_design](https://www.npmjs.com/package/analyzthis_design) · **Current version:** 2.3.1 · **Step-by-step guide:** [HOW-TO-USE.md](./HOW-TO-USE.md)
25
41
 
26
42
  ---
27
43
 
28
44
  ## Quick start
29
45
 
30
46
  ```bash
31
- # 1. Install the npm package (no auto-install, no obfuscation)
47
+ # 1. Install the CLI globally (optional). Do not run npm install inside a
48
+ # pnpm/Yarn workspace repo — npm cannot read workspace:* and will fail.
49
+ # Prefer npx from any folder:
32
50
  npm install -g analyzthis_design
33
51
 
34
- # 2. Install slash commands into your IDE (explicit, consent-based)
52
+ # 2. Copy skills + slash commands into your IDE (consent-based)
53
+ npx analyzthis_design install --target all
54
+ # Same thing: a leading --target means install
35
55
  npx analyzthis_design --target all
36
56
 
37
57
  # 3. Run a task in v2.0 chunked mode (free/cheap models)
@@ -41,13 +61,14 @@ npx analyzthis_design run --task "Review invoice approval screen"
41
61
  npx analyzthis_design run-unchunked --task "Review invoice approval screen" --provider host
42
62
  ```
43
63
 
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.
64
+ > **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 install --target <ide>` (or `npx analyzthis_design --target <ide>`).
45
65
  >
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.
66
+ > **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, **Claude Code**, and Windsurf during install. For Lovable, v0, Bolt, Replit, ChatGPT: run `npx analyzthis_design mcp --configure <tool>` for a config snippet.
47
67
 
48
68
  ### Install by target IDE
49
69
 
50
70
  ```bash
71
+ npx analyzthis_design install --target claude
51
72
  npx analyzthis_design --target claude
52
73
  npx analyzthis_design --target codex
53
74
  npx analyzthis_design --target grok
@@ -55,7 +76,7 @@ npx analyzthis_design --target windsurf
55
76
  npx analyzthis_design --target all --force
56
77
  ```
57
78
 
58
- **After install:** type `/getting-started` in Cursor or Claude Code (or `@getting-started` in Windsurf). For a complete walkthrough, see [HOW-TO-USE.md](./HOW-TO-USE.md). Re-print CLI help anytime with `npx analyzthis_design welcome`.
79
+ **After install:** type `/noor`, `/arjun`, `/ux-ideator` (or `@` in Windsurf). Claude’s menu may only show Getting Started — type the name anyway. Also `/getting-started`. Walkthrough: [HOW-TO-USE.md](./HOW-TO-USE.md). Re-print help: `npx analyzthis_design welcome`.
59
80
 
60
81
  | Tool | Skills installed to | Invoke |
61
82
  |---|---|---|
package/dist/bin/cli.js CHANGED
@@ -248,7 +248,13 @@ Docs: https://github.com/rishikeshjoshi/analyzthis_design
248
248
 
249
249
  // ─── Parse args ──────────────────────────────────────────────────────────────
250
250
 
251
- const [,, cmd, ...flags] = process.argv;
251
+ let [, , cmd, ...flags] = process.argv;
252
+ // Leading flags mean install: `npx analyzthis_design --target claude`
253
+ // Keep --help / -h as help, not install.
254
+ if (cmd && cmd.startsWith('-') && cmd !== '--help' && cmd !== '-h') {
255
+ flags = [cmd, ...flags];
256
+ cmd = 'install';
257
+ }
252
258
 
253
259
  function getFlag(name) {
254
260
  // Supports both --flag=value and --flag value
@@ -17,6 +17,24 @@ const PACKAGE_ROOT = resolvePackageRoot(__dirname);
17
17
  const PACKAGE_SKILLS_DIR = path.join(PACKAGE_ROOT, 'skills');
18
18
  const WELCOME_MARKER = path.join(os.homedir(), '.analyzthis_design', '.welcome-shown');
19
19
 
20
+ // Slash items written into the current project so /noor shows in the menu.
21
+ const PROJECT_COMMANDS = [
22
+ 'noor',
23
+ 'anuj',
24
+ 'arjun',
25
+ 'meera',
26
+ 'priya',
27
+ 'zara',
28
+ 'raj',
29
+ 'kavi',
30
+ 'ux-ideator',
31
+ 'design-director',
32
+ 'persona-orchestrator',
33
+ 'design-critic',
34
+ 'getting-started',
35
+ 'devi',
36
+ ];
37
+
20
38
  const SKILLS = [
21
39
  'getting-started',
22
40
  'arjun',
@@ -88,6 +106,13 @@ function printWelcomeBanner(targetId, log = console.log) {
88
106
  log(` ${gs} ← read this first`);
89
107
  }
90
108
 
109
+ log('');
110
+ log(' Independent personas — type the name (even if the menu only shows Getting Started):');
111
+ log(` ${p}noor ${p}anuj ${p}arjun ${p}meera ${p}priya ${p}zara ${p}raj ${p}kavi`);
112
+ if (targetId === 'claude') {
113
+ log(' Claude may only list Getting Started. Type /noor anyway.');
114
+ }
115
+
91
116
  log('');
92
117
  log(' Design — wireframes (new screens):');
93
118
  log(` ${p}ux-ideator two competing text wireframes + deliberation`);
@@ -180,6 +205,29 @@ function installMissing(skill, destinations, force) {
180
205
  return status;
181
206
  }
182
207
 
208
+ function installProjectCommands({ force = false, log = console.log } = {}) {
209
+ const cwd = process.cwd();
210
+ const roots = [
211
+ path.join(cwd, '.claude', 'commands'),
212
+ path.join(cwd, '.cursor', 'commands'),
213
+ ];
214
+ const installed = [];
215
+ const skipped = [];
216
+ for (const root of roots) {
217
+ for (const skill of PROJECT_COMMANDS) {
218
+ const result = installFlat(skill, root, force);
219
+ if (result === 'installed') installed.push(`${path.relative(cwd, root)}/${skill}.md`);
220
+ else if (result === 'skipped') skipped.push(skill);
221
+ }
222
+ }
223
+ if (installed.length > 0) {
224
+ log(`\n✅ Project slash commands → ${path.join(cwd, '.claude/commands')} and .cursor/commands`);
225
+ log(' Type /noor /arjun /ux-ideator in this repo. Restart the IDE if the menu is stale.');
226
+ } else if (skipped.length > 0) {
227
+ log(`\n⏭ Project slash commands already present (use --force to overwrite).`);
228
+ }
229
+ }
230
+
183
231
  function install({ silent = false, force = false, target = 'cursor', showBanner = true } = {}) {
184
232
  const log = silent ? () => {} : console.log;
185
233
  const warn = silent ? () => {} : console.warn;
@@ -239,6 +287,8 @@ function install({ silent = false, force = false, target = 'cursor', showBanner
239
287
  }
240
288
  }
241
289
  }
290
+
291
+ installProjectCommands({ force, log });
242
292
  }
243
293
 
244
294
  function remove({ silent = false, target = 'cursor' } = {}) {
@@ -287,6 +337,7 @@ module.exports = {
287
337
  install,
288
338
  remove,
289
339
  SKILLS,
340
+ PROJECT_COMMANDS,
290
341
  TARGET_DIRS,
291
342
  TARGETS,
292
343
  ALL_TARGET_IDS,
@@ -520,70 +520,68 @@ function readSkill(id) {
520
520
 
521
521
  // ── MCP config writer ──
522
522
 
523
+ function mergeMcpServer(configPath) {
524
+ var dir = path.dirname(configPath);
525
+ if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
526
+ var config = {};
527
+ if (fs.existsSync(configPath)) {
528
+ try { config = JSON.parse(fs.readFileSync(configPath, 'utf8')); } catch (e) {}
529
+ }
530
+ if (typeof config !== 'object' || config === null || Array.isArray(config)) config = {};
531
+ config.mcpServers = config.mcpServers || {};
532
+ config.mcpServers['analyzthis_design'] = {
533
+ command: 'npx',
534
+ args: ['analyzthis_design', 'mcp'],
535
+ };
536
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
537
+ return configPath;
538
+ }
539
+
540
+ function looksLikeProjectCwd() {
541
+ var cwd = process.cwd();
542
+ return fs.existsSync(path.join(cwd, 'package.json')) || fs.existsSync(path.join(cwd, '.git'));
543
+ }
544
+
523
545
  function writeMcpConfig(target) {
524
- var serverCmd = 'npx';
525
- var serverArgs = ['analyzthis_design', 'mcp'];
526
546
  var home = os.homedir();
527
547
 
528
548
  if (target === 'cursor') {
529
549
  var cursorConfigPath = path.join(home, '.cursor', 'mcp.json');
530
- var cursorDir = path.dirname(cursorConfigPath);
531
- if (!fs.existsSync(cursorDir)) fs.mkdirSync(cursorDir, { recursive: true });
532
- var cursorConfig = {};
533
- if (fs.existsSync(cursorConfigPath)) {
534
- try { cursorConfig = JSON.parse(fs.readFileSync(cursorConfigPath, 'utf8')); } catch (e) {}
535
- }
536
- cursorConfig.mcpServers = cursorConfig.mcpServers || {};
537
- cursorConfig.mcpServers['analyzthis_design'] = {
538
- command: serverCmd,
539
- args: serverArgs,
540
- };
541
- fs.writeFileSync(cursorConfigPath, JSON.stringify(cursorConfig, null, 2));
550
+ mergeMcpServer(cursorConfigPath);
542
551
  console.log('Cursor MCP config written to ' + cursorConfigPath);
543
552
  console.log('Restart Cursor to activate.\n');
544
553
  return true;
545
554
  }
546
555
 
547
556
  if (target === 'claude') {
548
- var claudeConfigPath;
557
+ var claudeDesktopPath;
549
558
  if (process.platform === 'darwin') {
550
- claudeConfigPath = path.join(home, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json');
559
+ claudeDesktopPath = path.join(home, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json');
551
560
  } else if (process.platform === 'win32') {
552
- claudeConfigPath = path.join(home, 'AppData', 'Roaming', 'Claude', 'claude_desktop_config.json');
561
+ claudeDesktopPath = path.join(home, 'AppData', 'Roaming', 'Claude', 'claude_desktop_config.json');
553
562
  } else {
554
- claudeConfigPath = path.join(home, '.config', 'Claude', 'claude_desktop_config.json');
563
+ claudeDesktopPath = path.join(home, '.config', 'Claude', 'claude_desktop_config.json');
555
564
  }
556
- var claudeDir = path.dirname(claudeConfigPath);
557
- if (!fs.existsSync(claudeDir)) fs.mkdirSync(claudeDir, { recursive: true });
558
- var claudeConfig = {};
559
- if (fs.existsSync(claudeConfigPath)) {
560
- try { claudeConfig = JSON.parse(fs.readFileSync(claudeConfigPath, 'utf8')); } catch (e) {}
565
+ mergeMcpServer(claudeDesktopPath);
566
+ console.log('Claude Desktop MCP config written to ' + claudeDesktopPath);
567
+
568
+ var claudeCodePath = path.join(home, '.claude.json');
569
+ mergeMcpServer(claudeCodePath);
570
+ console.log('Claude Code MCP config written to ' + claudeCodePath);
571
+
572
+ if (looksLikeProjectCwd()) {
573
+ var projectMcp = path.join(process.cwd(), '.mcp.json');
574
+ mergeMcpServer(projectMcp);
575
+ console.log('Project MCP config written to ' + projectMcp);
561
576
  }
562
- claudeConfig.mcpServers = claudeConfig.mcpServers || {};
563
- claudeConfig.mcpServers['analyzthis_design'] = {
564
- command: serverCmd,
565
- args: serverArgs,
566
- };
567
- fs.writeFileSync(claudeConfigPath, JSON.stringify(claudeConfig, null, 2));
568
- console.log('Claude Desktop MCP config written to ' + claudeConfigPath);
569
- console.log('Restart Claude Desktop to activate.\n');
577
+
578
+ console.log('Restart Claude Code and Claude Desktop to activate.\n');
570
579
  return true;
571
580
  }
572
581
 
573
582
  if (target === 'windsurf') {
574
583
  var windsurfConfigPath = path.join(home, '.codeium', 'windsurf', 'mcp_config.json');
575
- var windsurfDir = path.dirname(windsurfConfigPath);
576
- if (!fs.existsSync(windsurfDir)) fs.mkdirSync(windsurfDir, { recursive: true });
577
- var windsurfConfig = {};
578
- if (fs.existsSync(windsurfConfigPath)) {
579
- try { windsurfConfig = JSON.parse(fs.readFileSync(windsurfConfigPath, 'utf8')); } catch (e) {}
580
- }
581
- windsurfConfig.mcpServers = windsurfConfig.mcpServers || {};
582
- windsurfConfig.mcpServers['analyzthis_design'] = {
583
- command: serverCmd,
584
- args: serverArgs,
585
- };
586
- fs.writeFileSync(windsurfConfigPath, JSON.stringify(windsurfConfig, null, 2));
584
+ mergeMcpServer(windsurfConfigPath);
587
585
  console.log('Windsurf MCP config written to ' + windsurfConfigPath);
588
586
  console.log('Restart Windsurf to activate.\n');
589
587
  return true;
@@ -593,8 +591,8 @@ function writeMcpConfig(target) {
593
591
  console.log(JSON.stringify({
594
592
  mcpServers: {
595
593
  'analyzthis_design': {
596
- command: serverCmd,
597
- args: serverArgs,
594
+ command: 'npx',
595
+ args: ['analyzthis_design', 'mcp'],
598
596
  }
599
597
  }
600
598
  }, null, 2));