@design-ai/cli 4.55.0 → 4.56.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.
Files changed (52) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/CHANGELOG.md +39 -0
  3. package/README.ko.md +7 -7
  4. package/README.md +9 -9
  5. package/cli/lib/mcp-server.mjs +208 -10
  6. package/cli/lib/site-analysis.mjs +297 -0
  7. package/cli/lib/site-args.mjs +433 -0
  8. package/cli/lib/site-bundle-build.mjs +127 -0
  9. package/cli/lib/site-bundle-check.mjs +454 -0
  10. package/cli/lib/site-bundle-commands.mjs +95 -0
  11. package/cli/lib/site-bundle-compare.mjs +157 -0
  12. package/cli/lib/site-bundle-contract.mjs +79 -0
  13. package/cli/lib/site-bundle-files.mjs +87 -0
  14. package/cli/lib/site-bundle-handoff-runbook-actions.mjs +113 -0
  15. package/cli/lib/site-bundle-handoff-runbook-evidence-fields.mjs +164 -0
  16. package/cli/lib/site-bundle-handoff-runbook-evidence.mjs +334 -0
  17. package/cli/lib/site-bundle-handoff-runbook-format.mjs +31 -0
  18. package/cli/lib/site-bundle-handoff-runbook-stage-metadata.mjs +84 -0
  19. package/cli/lib/site-bundle-handoff-runbook.mjs +1331 -0
  20. package/cli/lib/site-bundle-handoff-summary.mjs +183 -0
  21. package/cli/lib/site-bundle-handoff.mjs +271 -0
  22. package/cli/lib/site-bundle-readme.mjs +98 -0
  23. package/cli/lib/site-bundle-repair-report.mjs +143 -0
  24. package/cli/lib/site-bundle-repair.mjs +68 -0
  25. package/cli/lib/site-content.mjs +399 -0
  26. package/cli/lib/site-evidence.mjs +35 -0
  27. package/cli/lib/site-mcp-commands.mjs +28 -0
  28. package/cli/lib/site-mcp-probes.mjs +159 -0
  29. package/cli/lib/site-mcp-readiness.mjs +157 -0
  30. package/cli/lib/site-mcp-report.mjs +324 -0
  31. package/cli/lib/site-next-actions.mjs +333 -0
  32. package/cli/lib/site-options.mjs +104 -0
  33. package/cli/lib/site-prompts.mjs +332 -0
  34. package/cli/lib/site-starter.mjs +153 -0
  35. package/cli/lib/site-strings.mjs +23 -0
  36. package/cli/lib/site-tasks.mjs +93 -0
  37. package/cli/lib/site-workflow-graph.mjs +309 -0
  38. package/cli/lib/site-workspace.mjs +492 -0
  39. package/cli/lib/site.mjs +108 -6617
  40. package/docs/DISTRIBUTION.ko.md +35 -6
  41. package/docs/DISTRIBUTION.md +35 -8
  42. package/docs/RELEASE-CHECKLIST.md +20 -3
  43. package/docs/ROADMAP.md +2179 -0
  44. package/docs/external-status.md +22 -7
  45. package/docs/integrations/design-ai-mcp-server.md +32 -0
  46. package/docs/integrations/vscode-walkthrough.ko.md +3 -3
  47. package/docs/integrations/vscode-walkthrough.md +3 -3
  48. package/docs/site-overrides/main.html +1 -1
  49. package/package.json +1 -1
  50. package/tools/audit/package-smoke.py +106 -0
  51. package/tools/audit/registry-smoke.py +378 -10
  52. package/tools/audit/smoke_assertions.py +83 -22
@@ -1,32 +1,47 @@
1
1
  # External Publication Status
2
2
 
3
- > Checked: 2026-06-23
4
- > Scope: npm registry, GitHub Pages, VS Code Marketplace
3
+ > Checked: 2026-07-02
4
+ > Scope: npm registry, GitHub Pages, Homebrew tap, VS Code Marketplace, Claude/Codex MCP
5
5
 
6
6
  ## Summary
7
7
 
8
- Local release readiness is verified and GitHub Pages docs are publicly reachable. The npm package name in `package.json` and the VS Code Marketplace extension id still returned no public listing at the time of this check.
8
+ Local release readiness is verified, GitHub Pages docs are publicly reachable, GitHub Release `v4.56.0` is published, and the Homebrew tap formula points at the `v4.56.0` release source tarball with a verified SHA-256. npm is still publicly published at `@design-ai/cli@4.55.0`; the latest `v4.56.0` npm publish attempt authenticated as `sungjin9288`, passed package smoke, signed provenance, then failed on registry `E403` because npm requires either two-factor authentication during publish or a granular access token with Bypass 2FA enabled. Replace `NPM_TOKEN` with a publish-capable granular token for `@design-ai/cli` that has Bypass 2FA enabled, or migrate the workflow to npm Trusted Publishing, before rerunning. The VS Code extension `sungjin.design-ai-vscode` is published to the VS Code Marketplace at version `0.4.1`; the Gallery API is reachable. The public npm MCP entrypoint and the local Claude Code / Codex MCP client registrations were rechecked on 2026-07-02.
9
9
 
10
10
  ## Results
11
11
 
12
12
  | Surface | Checked target | Result | Evidence |
13
13
  |---|---|---|---|
14
- | npm registry | `@design-ai/cli` | Not published or not publicly accessible: npm returned `E404` | `evidence/cli-logs/npm-registry-status.log` |
14
+ | npm registry | `@design-ai/cli` | Published latest remains `4.55.0`; public registry smoke passed for `@design-ai/cli@4.55.0`. Latest `v4.56.0` publish run `28568106904` authenticated `NPM_TOKEN`, passed package smoke, signed provenance, then failed with `E403` because npm requires 2FA during publish or a granular access token with Bypass 2FA enabled. | `evidence/cli-logs/npm-registry-status.log`, `evidence/cli-logs/npm-registry-smoke.log`, `evidence/cli-logs/npm-publish-v4.56.0-failed.log`, `evidence/cli-logs/npm-publish-v4.56.0-preflight-failed.log`, `evidence/cli-logs/npm-publish-v4.56.0-bypass-2fa-required-20260702.log` |
15
15
  | GitHub Pages | `https://sungjin9288.github.io/design-ai/` | Published and reachable: HTTP `200`, design-ai MkDocs page rendered | `evidence/cli-logs/github-pages-status.log` |
16
- | VS Code Marketplace | `sungjin.design-ai-vscode` | No public Marketplace listing found for the publisher/extension id | `evidence/cli-logs/vscode-marketplace-status.log` |
16
+ | Homebrew tap | `Formula/design-ai.rb` | Formula pinned to `v4.56.0` release source tarball with SHA-256 `507d2519296497defcd486c0ffc2b5164967a0bc540ddc31bc89502350688212`; Ruby syntax and `brew style` passed | `evidence/cli-logs/homebrew-formula-status.log` |
17
+ | VS Code Marketplace | `sungjin.design-ai-vscode` | Published: run `28431571256` published `v0.4.1`, and the Marketplace Gallery API returned visible version `0.4.1` on 2026-07-02. | `evidence/cli-logs/vscode-marketplace-status.log`, `evidence/cli-logs/vscode-marketplace-secret-status.log`, `evidence/cli-logs/vscode-extension-vsce-package.log`, `evidence/cli-logs/vscode-publish-workflow-status.log` |
18
+ | GitHub Release | `v4.56.0` | Published with release tarball asset `design-ai-cli-4.56.0.tgz` | `evidence/cli-logs/github-release-v4.56.0.log` |
19
+ | MCP server | `@design-ai/cli@4.55.0` / local clone | Public npm `design-ai-mcp` responds to initialize and tools/list with 10 tools; local Codex and Claude Code both report `design-ai` MCP as configured and connected. | `evidence/cli-logs/design-ai-mcp-public-registry-smoke.log`, `evidence/cli-logs/design-ai-mcp-client-status.log` |
17
20
 
18
21
  ## Interpretation
19
22
 
20
23
  - The repository is locally release-ready based on `npm run release:check`.
21
24
  - GitHub Pages docs can now be described as publicly deployed.
22
- - Public npm install and Marketplace install claims should not be used in portfolio or README copy until those surfaces are published and rechecked.
23
- - For portfolio wording, describe npm/package/Marketplace as "prepared for" or "local/package smoke verified", not "publicly shipped".
25
+ - Public npm install can be described as published and smoke-tested at `4.55.0`; `4.56.0` must not be described as npm-published until `NPM_TOKEN` is replaced with a Bypass 2FA-enabled granular token, or the workflow is migrated to npm Trusted Publishing, and the publish workflow succeeds.
26
+ - Homebrew tap install can now be described as pinned to the `v4.56.0` release tarball; full tap audit/install/test remains a maintainer-side verification step because this Homebrew version rejects path-based `brew audit Formula/...` calls.
27
+ - VS Code Marketplace can now be described as published and publicly reachable at version `0.4.1`.
28
+ - Claude Code and Codex can now be described as locally connected to the clone-backed `design-ai` MCP server, while public npm users can verify the published `design-ai-mcp` entrypoint from a clean working directory.
24
29
 
25
30
  ## Recheck Commands
26
31
 
27
32
  ```bash
28
33
  npm view @design-ai/cli version name time.modified dist-tags --json
29
34
  curl -sS -L -o /tmp/design-ai-pages.html -w 'http_code=%{http_code}\nurl_effective=%{url_effective}\n' https://sungjin9288.github.io/design-ai/
35
+ curl -sL https://github.com/sungjin9288/design-ai/archive/refs/tags/v4.56.0.tar.gz | shasum -a 256
36
+ ruby -c Formula/design-ai.rb
37
+ brew style Formula/design-ai.rb
38
+ gh release view v4.56.0 --repo sungjin9288/design-ai --json tagName,isDraft,isPrerelease,publishedAt,name,url,assets
39
+ gh run view 28561753737 --repo sungjin9288/design-ai --log-failed
40
+ gh run view 28562868536 --repo sungjin9288/design-ai --log-failed
41
+ gh run view 28568106904 --repo sungjin9288/design-ai --log-failed
42
+ npm exec --yes --package=@design-ai/cli@4.55.0 -- design-ai-mcp
43
+ codex mcp get design-ai
44
+ claude mcp list
30
45
  curl -sS -H 'Content-Type: application/json' \
31
46
  -H 'Accept: application/json;api-version=7.2-preview.1' \
32
47
  -X POST https://marketplace.visualstudio.com/_apis/public/gallery/extensionquery \
@@ -35,6 +35,19 @@ design-ai mcp
35
35
  design-ai-mcp
36
36
  ```
37
37
 
38
+ To verify the public npm package without installing it globally, run the one-shot command from a clean directory outside a `@design-ai/cli` source checkout:
39
+
40
+ ```bash
41
+ tmp="$(mktemp -d)"
42
+ cd "$tmp"
43
+ printf '%s\n' \
44
+ '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25"}}' \
45
+ '{"jsonrpc":"2.0","id":2,"method":"tools/list"}' \
46
+ | npm exec --yes --package=@design-ai/cli@4.55.0 -- design-ai-mcp
47
+ ```
48
+
49
+ Running that one-shot command from the package source root can make npm prefer the local checkout context, which may hide the temporary package bin shim.
50
+
38
51
  Do not run the server as a normal terminal command unless an MCP client is connected. It waits for newline-delimited JSON-RPC messages on stdin and writes MCP responses to stdout.
39
52
 
40
53
  ## Connect Claude Code
@@ -145,6 +158,12 @@ Run the unit and subprocess smoke tests:
145
158
  node --test cli/lib/mcp-server.test.mjs
146
159
  ```
147
160
 
161
+ Run the package smoke self-test when changing the packaged MCP entrypoint:
162
+
163
+ ```bash
164
+ npm run package:smoke:self-test
165
+ ```
166
+
148
167
  Run a protocol smoke manually:
149
168
 
150
169
  ```bash
@@ -156,6 +175,19 @@ printf '%s\n' \
156
175
 
157
176
  The output must contain valid one-line JSON-RPC responses and a `tools` list.
158
177
 
178
+ The packed-tarball release smoke also checks `design-ai-mcp` after install and through one-shot `npm exec`, so package releases catch missing bin shims or broken stdio startup before publish.
179
+
180
+ After publish, the public registry smoke also runs `npm exec --package @design-ai/cli@<version> -- design-ai-mcp` with the same JSON-RPC protocol checks, so npm propagation verification covers the Claude/Codex MCP entrypoint as installed by users.
181
+
182
+ ## Troubleshooting
183
+
184
+ | Symptom | What to check |
185
+ |---|---|
186
+ | `/mcp` does not show `design-ai` | Confirm the command in Claude/Codex points at either `design-ai mcp` or `node /path/to/design-ai/cli/bin/design-ai-mcp.mjs`. |
187
+ | Tool calls return `Unknown argument` | Remove unsupported fields from the MCP tool input. The server validates tool arguments before running the CLI. |
188
+ | Tool calls return `must be an integer` or `must be a boolean` | Send JSON values with the right type, for example `{"limit": 3}` instead of `{"limit": "3"}`. |
189
+ | Tool calls are marked `isError: true` with `[stderr]` | The MCP protocol is working; inspect the CLI error text and rerun the equivalent `design-ai ...` command locally. |
190
+
159
191
  ## References
160
192
 
161
193
  - [Model Context Protocol specification](https://modelcontextprotocol.io/specification/2025-11-25)
@@ -10,9 +10,9 @@ git clone https://github.com/sungjin9288/design-ai.git ~/dev/design-ai && cd ~/d
10
10
 
11
11
  # public publish 이후에는 npm/Homebrew 설치 경로로 local clone을 대체할 수 있어요.
12
12
 
13
- # VS Code 확장 설치 (Marketplace publish 이후)
14
- # code --install-extension sungjin.design-ai-vscode
15
- # 또는 개발 중에는 .vsix 사이드로드
13
+ # 공개 VS Code 확장 설치
14
+ code --install-extension sungjin.design-ai-vscode
15
+ # 또는 로컬 확장 개발 중에는 .vsix 사이드로드
16
16
  ```
17
17
 
18
18
  ## 설치 (60초)
@@ -10,9 +10,9 @@ git clone https://github.com/sungjin9288/design-ai.git ~/dev/design-ai && cd ~/d
10
10
 
11
11
  # After public publish, npm/Homebrew install paths can replace the local clone.
12
12
 
13
- # Install VS Code extension (after Marketplace publish)
14
- # code --install-extension sungjin.design-ai-vscode
15
- # Or sideload from .vsix during development
13
+ # Install the public VS Code extension
14
+ code --install-extension sungjin.design-ai-vscode
15
+ # Or sideload from .vsix during local extension development
16
16
  ```
17
17
 
18
18
  ## Setup (60 seconds)
@@ -10,7 +10,7 @@
10
10
  {{ super() }}
11
11
  <meta name="description" content="A model-agnostic design knowledge base + skill system. Senior product designer for any AI coding agent. 92 knowledge files covering UI/UX, website improvement, design systems, motion, illustration, print, video, game UI, conversational, and spatial design. Korean market depth.">
12
12
  <meta property="og:title" content="design-ai — Senior product designer for any AI coding agent">
13
- <meta property="og:description" content="92 knowledge files, 223 worked examples, 20 skills, 17 commands. Korean market depth across all domains. Open-source MIT.">
13
+ <meta property="og:description" content="92 knowledge files, 221 worked examples, 20 skills, 17 commands. Korean market depth across all domains. Open-source MIT.">
14
14
  <meta property="og:type" content="website">
15
15
  <meta name="twitter:card" content="summary">
16
16
  <meta name="twitter:title" content="design-ai">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@design-ai/cli",
3
- "version": "4.55.0",
3
+ "version": "4.56.0",
4
4
  "description": "Senior product designer for any AI coding agent. Installs design-ai (20 skills, 17 commands, 4 agents) into Claude Code globally. Korean market depth plus website improvement control tower.",
5
5
  "bin": {
6
6
  "design-ai": "cli/bin/design-ai.mjs",
@@ -50,6 +50,7 @@ from smoke_assertions import (
50
50
  assert_check_examples_json_component_spec,
51
51
  assert_check_stdin_json_component_spec,
52
52
  assert_command_alias_output,
53
+ assert_design_ai_mcp_protocol_responses,
53
54
  assert_doctor_json_clean,
54
55
  assert_doctor_strict_output,
55
56
  assert_examples_human_output,
@@ -135,6 +136,7 @@ from smoke_assertions import (
135
136
  format_cmd,
136
137
  help_alias_script,
137
138
  help_topic_script,
139
+ mcp_smoke_input,
138
140
  passing_doctor_report_json,
139
141
  passing_check_artifact_content,
140
142
  passing_site_mcp_check_probes_human,
@@ -379,6 +381,18 @@ def npm_exec_cmd(tarball: Path, *args: str) -> list[str]:
379
381
  ]
380
382
 
381
383
 
384
+ def npm_exec_mcp_cmd(tarball: Path) -> list[str]:
385
+ return [
386
+ "npm",
387
+ "exec",
388
+ "--yes",
389
+ "--package",
390
+ str(tarball),
391
+ "--",
392
+ "design-ai-mcp",
393
+ ]
394
+
395
+
382
396
  def npm_exec_shell_cmd(tarball: Path, script: str) -> list[str]:
383
397
  return [
384
398
  "npm",
@@ -533,6 +547,52 @@ def require_package_smoke(condition: bool, *, context: str, cmd: list[str], mess
533
547
  fail_package_smoke(context, cmd, message)
534
548
 
535
549
 
550
+ def assert_design_ai_mcp_protocol_smoke(
551
+ cmd: list[str],
552
+ *,
553
+ env: dict[str, str],
554
+ cwd: Path | None,
555
+ context: str,
556
+ ) -> None:
557
+ print(f"$ {format_cmd(cmd)} < MCP smoke", flush=True)
558
+ result = subprocess.run(
559
+ cmd,
560
+ cwd=cwd,
561
+ env=env,
562
+ input=mcp_smoke_input(),
563
+ text=True,
564
+ capture_output=True,
565
+ timeout=15,
566
+ )
567
+ if result.stdout:
568
+ print(result.stdout, end="")
569
+ if result.stderr:
570
+ print(result.stderr, end="", file=sys.stderr)
571
+
572
+ if is_npm_exec_cache_enoent(cmd, result):
573
+ result = retry_npm_exec_once(cmd, cwd=cwd, env=env, input_text=mcp_smoke_input())
574
+ if result.stdout:
575
+ print(result.stdout, end="")
576
+ if result.stderr:
577
+ print(result.stderr, end="", file=sys.stderr)
578
+
579
+ if result.returncode != 0:
580
+ raise SystemExit(f"command failed with exit code {result.returncode}: {format_cmd(cmd)}")
581
+
582
+ output = f"{result.stdout}\n{result.stderr}"
583
+ assert_no_ansi(output, cmd)
584
+
585
+ responses = []
586
+ for line in result.stdout.splitlines():
587
+ if not line.strip():
588
+ continue
589
+ try:
590
+ responses.append(json.loads(line))
591
+ except json.JSONDecodeError as error:
592
+ fail_package_smoke(context, cmd, f"MCP stdout line is not JSON: {error}")
593
+ assert_design_ai_mcp_protocol_responses(responses, context=context, cmd=cmd)
594
+
595
+
536
596
  def run_expected_failure(
537
597
  cmd: list[str],
538
598
  *,
@@ -12482,6 +12542,37 @@ def run_self_test() -> None:
12482
12542
  site_bundle_mcp_probes_payload,
12483
12543
  context=f"{context} site bundle mcp-probes.json",
12484
12544
  )
12545
+ mcp_protocol_cmd = ["design-ai-mcp"]
12546
+ assert_design_ai_mcp_protocol_responses(
12547
+ [
12548
+ {"jsonrpc": "2.0", "id": 1, "result": {"serverInfo": {"name": "design-ai"}}},
12549
+ {"jsonrpc": "2.0", "id": 2, "result": {"tools": [{"name": "design_ai_route"}, {"name": "design_ai_search"}]}},
12550
+ {
12551
+ "jsonrpc": "2.0",
12552
+ "id": 3,
12553
+ "error": {"code": -32602, "message": "design_ai_search.limit must be an integer"},
12554
+ },
12555
+ ],
12556
+ context=f"{context} design-ai MCP protocol",
12557
+ cmd=mcp_protocol_cmd,
12558
+ )
12559
+ expect_self_test_failure(
12560
+ lambda: assert_design_ai_mcp_protocol_responses(
12561
+ [
12562
+ {"jsonrpc": "2.0", "id": 1, "result": {"serverInfo": {"name": "design-ai"}}},
12563
+ {"jsonrpc": "2.0", "id": 2, "result": {"tools": [{"name": "design_ai_route"}, {"name": "design_ai_search"}]}},
12564
+ {
12565
+ "jsonrpc": "2.0",
12566
+ "id": 3,
12567
+ "error": {"code": -32602, "message": "wrong validation message"},
12568
+ },
12569
+ ],
12570
+ context=f"{context} design-ai MCP protocol",
12571
+ cmd=mcp_protocol_cmd,
12572
+ ),
12573
+ expected="MCP invalid argument response did not preserve invalid params validation",
12574
+ scope="package smoke",
12575
+ )
12485
12576
  for label in (
12486
12577
  "site bundle check",
12487
12578
  "site bundle check summary",
@@ -19602,6 +19693,9 @@ def smoke_tarball(tarball: Path) -> None:
19602
19693
  bin_path = install_root / "node_modules" / ".bin" / "design-ai"
19603
19694
  if not bin_path.exists():
19604
19695
  raise SystemExit(f"design-ai bin shim not found: {bin_path}")
19696
+ mcp_bin_path = install_root / "node_modules" / ".bin" / "design-ai-mcp"
19697
+ if not mcp_bin_path.exists():
19698
+ raise SystemExit(f"design-ai-mcp bin shim not found: {mcp_bin_path}")
19605
19699
 
19606
19700
  smoke_env = base_env.copy()
19607
19701
  smoke_env.update({
@@ -19620,6 +19714,12 @@ def smoke_tarball(tarball: Path) -> None:
19620
19714
  env=smoke_env,
19621
19715
  context="package smoke installed bin version JSON",
19622
19716
  )
19717
+ assert_design_ai_mcp_protocol_smoke(
19718
+ [str(mcp_bin_path)],
19719
+ cwd=install_root,
19720
+ env=smoke_env,
19721
+ context="package smoke installed bin design-ai-mcp protocol",
19722
+ )
19623
19723
  assert_workspace_json_smoke(
19624
19724
  [str(bin_path), "workspace", "--json"],
19625
19725
  cwd=install_root,
@@ -20999,6 +21099,12 @@ def smoke_tarball(tarball: Path) -> None:
20999
21099
  env=npx_env,
21000
21100
  context="package smoke npm exec version JSON",
21001
21101
  )
21102
+ assert_design_ai_mcp_protocol_smoke(
21103
+ npm_exec_mcp_cmd(tarball),
21104
+ cwd=npx_root,
21105
+ env=npx_env,
21106
+ context="package smoke npm exec design-ai-mcp protocol",
21107
+ )
21002
21108
  assert_workspace_json_smoke(
21003
21109
  npm_exec_cmd(tarball, "workspace", "--json"),
21004
21110
  cwd=npx_root,