@design-ai/cli 4.55.0 → 4.57.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/.claude-plugin/plugin.json +109 -25
- package/CHANGELOG.md +75 -0
- package/README.ko.md +15 -32
- package/README.md +18 -31
- package/cli/bin/design-ai.mjs +1 -0
- package/cli/commands/help.mjs +7 -4
- package/cli/commands/index.mjs +292 -0
- package/cli/commands/learn-help.mjs +149 -0
- package/cli/commands/learn-print-profile.mjs +373 -0
- package/cli/commands/learn-print-restore.mjs +349 -0
- package/cli/commands/learn-print-signals.mjs +453 -0
- package/cli/commands/learn.mjs +60 -1281
- package/cli/commands/pack.mjs +7 -3
- package/cli/commands/prompt.mjs +7 -3
- package/cli/commands/search.mjs +94 -1
- package/cli/lib/dispatch.mjs +3 -0
- package/cli/lib/embedding-index.mjs +199 -0
- package/cli/lib/embedding-provider.mjs +121 -0
- package/cli/lib/embedding-rerank.mjs +52 -0
- package/cli/lib/learn-args.mjs +490 -0
- package/cli/lib/learn-backup.mjs +748 -0
- package/cli/lib/learn-curation.mjs +612 -0
- package/cli/lib/learn-eval.mjs +459 -0
- package/cli/lib/learn-profile.mjs +763 -0
- package/cli/lib/learn-select.mjs +223 -0
- package/cli/lib/learn-shared.mjs +158 -0
- package/cli/lib/learn-test-support.mjs +218 -0
- package/cli/lib/learn-usage.mjs +360 -0
- package/cli/lib/learn.mjs +83 -3694
- package/cli/lib/lexical.mjs +137 -0
- package/cli/lib/local-config.mjs +110 -0
- package/cli/lib/mcp-server.mjs +221 -13
- package/cli/lib/pack.mjs +31 -4
- package/cli/lib/prompt.mjs +42 -4
- package/cli/lib/recall.mjs +193 -0
- package/cli/lib/retrieval-index.mjs +0 -0
- package/cli/lib/search-ranked.mjs +170 -0
- package/cli/lib/search.mjs +11 -1
- package/cli/lib/signals-backlog-commands.mjs +673 -0
- package/cli/lib/signals-backlog.mjs +361 -0
- package/cli/lib/signals-eval.mjs +176 -0
- package/cli/lib/signals-readiness.mjs +247 -0
- package/cli/lib/signals-registry.mjs +377 -0
- package/cli/lib/signals-render.mjs +478 -0
- package/cli/lib/signals-shared.mjs +75 -0
- package/cli/lib/signals.mjs +16 -2337
- package/cli/lib/site-analysis.mjs +297 -0
- package/cli/lib/site-args.mjs +433 -0
- package/cli/lib/site-bundle-build.mjs +127 -0
- package/cli/lib/site-bundle-check.mjs +454 -0
- package/cli/lib/site-bundle-commands.mjs +95 -0
- package/cli/lib/site-bundle-compare.mjs +157 -0
- package/cli/lib/site-bundle-contract.mjs +79 -0
- package/cli/lib/site-bundle-files.mjs +87 -0
- package/cli/lib/site-bundle-handoff-expected.mjs +173 -0
- package/cli/lib/site-bundle-handoff-runbook-action-summary.mjs +332 -0
- package/cli/lib/site-bundle-handoff-runbook-actions.mjs +113 -0
- package/cli/lib/site-bundle-handoff-runbook-evidence-fields.mjs +164 -0
- package/cli/lib/site-bundle-handoff-runbook-evidence.mjs +334 -0
- package/cli/lib/site-bundle-handoff-runbook-format.mjs +31 -0
- package/cli/lib/site-bundle-handoff-runbook-human-lines.mjs +167 -0
- package/cli/lib/site-bundle-handoff-runbook-maps.mjs +238 -0
- package/cli/lib/site-bundle-handoff-runbook-next-step.mjs +278 -0
- package/cli/lib/site-bundle-handoff-runbook-stage-metadata.mjs +84 -0
- package/cli/lib/site-bundle-handoff-runbook.mjs +444 -0
- package/cli/lib/site-bundle-handoff-summary.mjs +183 -0
- package/cli/lib/site-bundle-handoff.mjs +271 -0
- package/cli/lib/site-bundle-readme.mjs +98 -0
- package/cli/lib/site-bundle-repair-report.mjs +143 -0
- package/cli/lib/site-bundle-repair.mjs +68 -0
- package/cli/lib/site-content.mjs +399 -0
- package/cli/lib/site-evidence.mjs +35 -0
- package/cli/lib/site-mcp-commands.mjs +28 -0
- package/cli/lib/site-mcp-probes.mjs +159 -0
- package/cli/lib/site-mcp-readiness.mjs +157 -0
- package/cli/lib/site-mcp-report.mjs +324 -0
- package/cli/lib/site-next-actions.mjs +333 -0
- package/cli/lib/site-options.mjs +104 -0
- package/cli/lib/site-prompts.mjs +332 -0
- package/cli/lib/site-starter.mjs +153 -0
- package/cli/lib/site-strings.mjs +23 -0
- package/cli/lib/site-tasks.mjs +93 -0
- package/cli/lib/site-test-support.mjs +68 -0
- package/cli/lib/site-workflow-graph.mjs +309 -0
- package/cli/lib/site-workspace.mjs +492 -0
- package/cli/lib/site.mjs +108 -6617
- package/cli/lib/skill-proposals-apply-commands.mjs +135 -0
- package/cli/lib/skill-proposals-apply-contract.mjs +750 -0
- package/cli/lib/skill-proposals-apply-plan.mjs +118 -0
- package/cli/lib/skill-proposals-generate.mjs +298 -0
- package/cli/lib/skill-proposals-render.mjs +532 -0
- package/cli/lib/skill-proposals-review.mjs +262 -0
- package/cli/lib/skill-proposals.mjs +15 -2046
- package/cli/lib/workspace-args.mjs +83 -0
- package/cli/lib/workspace-git.mjs +169 -0
- package/cli/lib/workspace-learning.mjs +483 -0
- package/cli/lib/workspace-repo.mjs +139 -0
- package/cli/lib/workspace-report.mjs +283 -0
- package/cli/lib/workspace-test-support.mjs +99 -0
- package/cli/lib/workspace.mjs +30 -1056
- package/docs/AI-LEARNING-PHASE2.md +215 -0
- package/docs/DISTRIBUTION.ko.md +35 -6
- package/docs/DISTRIBUTION.md +35 -8
- package/docs/NEXT-SURFACE-DECISION.md +125 -0
- package/docs/PRODUCT-READINESS.md +3 -3
- package/docs/RELEASE-CHECKLIST.md +20 -3
- package/docs/RELEASE-GATES.ko.md +35 -0
- package/docs/RELEASE-GATES.md +234 -0
- package/docs/ROADMAP.md +2232 -8
- package/docs/external-status.md +20 -7
- package/docs/inspection-20260630.md +169 -0
- package/docs/integrations/design-ai-mcp-server.md +35 -3
- package/docs/integrations/vscode-walkthrough.ko.md +3 -3
- package/docs/integrations/vscode-walkthrough.md +3 -3
- package/docs/reference/ant-design.md +413 -0
- package/docs/reference/awesome-design-md.md +439 -0
- package/docs/reference/mui.md +783 -0
- package/docs/reference/shadcn-ui.md +298 -0
- package/docs/site-overrides/main.html +1 -1
- package/examples/component-accordion-actions.md +5 -5
- package/examples/component-accordion-details.md +5 -5
- package/examples/component-accordion-summary.md +5 -5
- package/examples/component-accordion.md +3 -3
- package/examples/component-affix.md +1 -1
- package/examples/component-alert-dialog.md +1 -1
- package/examples/component-alert-title.md +1 -1
- package/examples/component-alert.md +3 -3
- package/examples/component-anchor.md +1 -1
- package/examples/component-app-bar.md +1 -1
- package/examples/component-aspect-ratio.md +1 -1
- package/examples/component-auto-complete.md +2 -2
- package/examples/component-avatar-group.md +5 -5
- package/examples/component-avatar.md +3 -3
- package/examples/component-back-top.md +1 -1
- package/examples/component-backdrop.md +1 -1
- package/examples/component-badge.md +3 -3
- package/examples/component-border-beam.md +3 -3
- package/examples/component-bottom-navigation.md +1 -1
- package/examples/component-box.md +1 -1
- package/examples/component-breadcrumb.md +3 -3
- package/examples/component-button-base.md +3 -3
- package/examples/component-button-group.md +2 -2
- package/examples/component-button.md +3 -3
- package/examples/component-calendar.md +2 -2
- package/examples/component-card-actions.md +1 -1
- package/examples/component-card-content.md +1 -1
- package/examples/component-card-header.md +1 -1
- package/examples/component-card-media.md +1 -1
- package/examples/component-card.md +3 -3
- package/examples/component-carousel.md +2 -2
- package/examples/component-cascader.md +1 -1
- package/examples/component-chart.md +1 -1
- package/examples/component-checkbox.md +3 -3
- package/examples/component-click-away-listener.md +1 -1
- package/examples/component-code.md +1 -1
- package/examples/component-collapsible.md +1 -1
- package/examples/component-color-picker.md +1 -1
- package/examples/component-combobox.md +1 -1
- package/examples/component-command.md +1 -1
- package/examples/component-config-provider.md +3 -3
- package/examples/component-context-menu.md +1 -1
- package/examples/component-css-baseline.md +3 -3
- package/examples/component-date-picker.md +2 -2
- package/examples/component-descriptions.md +1 -1
- package/examples/component-dialog-actions.md +1 -1
- package/examples/component-dialog-content-text.md +1 -1
- package/examples/component-dialog-content.md +1 -1
- package/examples/component-dialog-title.md +1 -1
- package/examples/component-dialog.md +2 -2
- package/examples/component-divider.md +3 -3
- package/examples/component-drawer.md +3 -3
- package/examples/component-dropdown.md +3 -3
- package/examples/component-empty.md +2 -2
- package/examples/component-fade.md +1 -1
- package/examples/component-field.md +1 -1
- package/examples/component-filled-input.md +1 -1
- package/examples/component-flex.md +1 -1
- package/examples/component-float-button.md +2 -2
- package/examples/component-form-control-label.md +1 -1
- package/examples/component-form-control.md +1 -1
- package/examples/component-form-controls.md +1 -1
- package/examples/component-form-group.md +1 -1
- package/examples/component-form-helper-text.md +1 -1
- package/examples/component-form-label.md +1 -1
- package/examples/component-form.md +2 -2
- package/examples/component-grid.md +2 -2
- package/examples/component-grow.md +1 -1
- package/examples/component-hover-card.md +1 -1
- package/examples/component-icon-button.md +1 -1
- package/examples/component-icon.md +1 -1
- package/examples/component-image-list.md +1 -1
- package/examples/component-image.md +1 -1
- package/examples/component-input-adornment.md +1 -1
- package/examples/component-input-base.md +1 -1
- package/examples/component-input-number.md +1 -1
- package/examples/component-input-otp.md +2 -2
- package/examples/component-input.md +3 -3
- package/examples/component-item.md +1 -1
- package/examples/component-label.md +1 -1
- package/examples/component-layout.md +1 -1
- package/examples/component-link.md +1 -1
- package/examples/component-list-item-avatar.md +1 -1
- package/examples/component-list-item-button.md +1 -1
- package/examples/component-list-item-icon.md +1 -1
- package/examples/component-list-item-text.md +1 -1
- package/examples/component-list-item.md +1 -1
- package/examples/component-list-subheader.md +1 -1
- package/examples/component-list.md +2 -2
- package/examples/component-masonry.md +1 -1
- package/examples/component-mentions.md +1 -1
- package/examples/component-menu-item.md +1 -1
- package/examples/component-menu-list.md +1 -1
- package/examples/component-menu.md +1 -1
- package/examples/component-menubar.md +1 -1
- package/examples/component-message.md +1 -1
- package/examples/component-mobile-stepper.md +1 -1
- package/examples/component-modal.md +5 -5
- package/examples/component-navigation-menu.md +1 -1
- package/examples/component-notification.md +1 -1
- package/examples/component-outlined-input.md +1 -1
- package/examples/component-pagination.md +3 -3
- package/examples/component-paper.md +1 -1
- package/examples/component-popconfirm.md +1 -1
- package/examples/component-popover.md +3 -3
- package/examples/component-popper.md +1 -1
- package/examples/component-progress.md +2 -2
- package/examples/component-qr-code.md +1 -1
- package/examples/component-radio.md +3 -3
- package/examples/component-rate.md +2 -2
- package/examples/component-resizable.md +1 -1
- package/examples/component-result.md +1 -1
- package/examples/component-scroll-area.md +1 -1
- package/examples/component-segmented.md +3 -3
- package/examples/component-select.md +3 -3
- package/examples/component-separator.md +1 -1
- package/examples/component-sheet.md +1 -1
- package/examples/component-sidebar.md +1 -1
- package/examples/component-skeleton.md +3 -3
- package/examples/component-slide.md +1 -1
- package/examples/component-slider.md +3 -3
- package/examples/component-snackbar-content.md +1 -1
- package/examples/component-snackbar.md +1 -1
- package/examples/component-sonner.md +1 -1
- package/examples/component-space.md +1 -1
- package/examples/component-speed-dial-action.md +1 -1
- package/examples/component-speed-dial.md +1 -1
- package/examples/component-spin.md +2 -2
- package/examples/component-spinner.md +1 -1
- package/examples/component-splitter.md +2 -2
- package/examples/component-stack.md +1 -1
- package/examples/component-statistic.md +1 -1
- package/examples/component-step-button.md +4 -4
- package/examples/component-step-connector.md +4 -4
- package/examples/component-step-content.md +1 -1
- package/examples/component-step-icon.md +1 -1
- package/examples/component-step-label.md +1 -1
- package/examples/component-step.md +2 -2
- package/examples/component-steps.md +2 -2
- package/examples/component-swipeable-drawer.md +1 -1
- package/examples/component-switch.md +3 -3
- package/examples/component-tab-scroll-button.md +5 -5
- package/examples/component-tab.md +1 -1
- package/examples/component-table-body.md +1 -1
- package/examples/component-table-cell.md +1 -1
- package/examples/component-table-container.md +1 -1
- package/examples/component-table-footer.md +1 -1
- package/examples/component-table-head.md +1 -1
- package/examples/component-table-pagination.md +1 -1
- package/examples/component-table-row.md +1 -1
- package/examples/component-table-sort-label.md +1 -1
- package/examples/component-table.md +2 -2
- package/examples/component-tabs.md +3 -3
- package/examples/component-tag-badge.md +2 -2
- package/examples/component-tag.md +1 -1
- package/examples/component-textarea-autosize.md +1 -1
- package/examples/component-textarea.md +1 -1
- package/examples/component-time-picker.md +1 -1
- package/examples/component-timeline.md +1 -1
- package/examples/component-toast.md +4 -4
- package/examples/component-toggle-button.md +1 -1
- package/examples/component-toggle.md +1 -1
- package/examples/component-toolbar.md +1 -1
- package/examples/component-tooltip.md +3 -3
- package/examples/component-tour.md +1 -1
- package/examples/component-transfer.md +1 -1
- package/examples/component-tree-select.md +1 -1
- package/examples/component-tree.md +1 -1
- package/examples/component-typography.md +2 -2
- package/examples/component-upload.md +1 -1
- package/examples/component-watermark.md +1 -1
- package/examples/component-zoom.md +1 -1
- package/knowledge/COVERAGE.md +4 -3
- package/knowledge/components/INDEX.md +202 -202
- package/knowledge/patterns/brand-references.md +72 -72
- package/package.json +1 -1
- package/tools/audit/local-ci.py +16 -1
- package/tools/audit/package-smoke.py +717 -9
- package/tools/audit/registry-smoke.py +912 -10
- package/tools/audit/release-metadata.py +47 -1
- package/tools/audit/smoke_assertions.py +998 -35
- package/tools/migrations/refs-links-to-reference-pages.py +179 -0
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
// Static Website Improvement content catalogs shared by the site CLI helpers.
|
|
2
|
+
|
|
3
|
+
export const SITE_INTAKE_TEMPLATE_SECTIONS = [
|
|
4
|
+
"site-profile",
|
|
5
|
+
"priority-pages",
|
|
6
|
+
"primary-user-flows",
|
|
7
|
+
"brand-and-content-notes",
|
|
8
|
+
"mcp-readiness-notes",
|
|
9
|
+
"initial-audit-findings",
|
|
10
|
+
"first-bundle-commands",
|
|
11
|
+
"target-repo-verification-plan",
|
|
12
|
+
"stop-conditions",
|
|
13
|
+
];
|
|
14
|
+
|
|
15
|
+
export const SITE_INTAKE_TEMPLATE_MARKDOWN = `# Company Website Intake Template
|
|
16
|
+
|
|
17
|
+
Fill this template before the first Website Improvement dogfood pass. Keep sensitive credentials, private tokens, production secrets, and customer data out of this document.
|
|
18
|
+
|
|
19
|
+
## Site Profile
|
|
20
|
+
|
|
21
|
+
| Field | Value |
|
|
22
|
+
|---|---|
|
|
23
|
+
| Site name | |
|
|
24
|
+
| Live URL | |
|
|
25
|
+
| Target repo URL | |
|
|
26
|
+
| Target repo local path | |
|
|
27
|
+
| Figma URL | |
|
|
28
|
+
| Deploy provider | \`vercel\` / \`netlify\` / \`cloudflare\` / \`other\` / \`none\` |
|
|
29
|
+
| Sentry project | |
|
|
30
|
+
| CMS | \`sanity\` / \`contentful\` / \`wordpress\` / \`shopify\` / \`none\` / \`other\` |
|
|
31
|
+
| Database | \`supabase\` / \`neon\` / \`postgres\` / \`none\` / \`other\` |
|
|
32
|
+
|
|
33
|
+
## Priority Pages
|
|
34
|
+
|
|
35
|
+
List 2-5 pages for the first pilot. Start with pages that affect conversion, trust, signup, inquiry, purchase, or onboarding.
|
|
36
|
+
|
|
37
|
+
| Priority | Path or URL | Why it matters |
|
|
38
|
+
|---:|---|---|
|
|
39
|
+
| 1 | \`/\` | |
|
|
40
|
+
| 2 | | |
|
|
41
|
+
| 3 | | |
|
|
42
|
+
| 4 | | |
|
|
43
|
+
| 5 | | |
|
|
44
|
+
|
|
45
|
+
## Primary User Flows
|
|
46
|
+
|
|
47
|
+
| Priority | Flow | Success signal |
|
|
48
|
+
|---:|---|---|
|
|
49
|
+
| 1 | | |
|
|
50
|
+
| 2 | | |
|
|
51
|
+
| 3 | | |
|
|
52
|
+
|
|
53
|
+
## Brand And Content Notes
|
|
54
|
+
|
|
55
|
+
| Area | Notes |
|
|
56
|
+
|---|---|
|
|
57
|
+
| Brand tone | |
|
|
58
|
+
| Typography constraints | |
|
|
59
|
+
| Color constraints | |
|
|
60
|
+
| Korean copy rules | |
|
|
61
|
+
| Legal or compliance copy | |
|
|
62
|
+
| Trust signals | |
|
|
63
|
+
| Competitors or references | |
|
|
64
|
+
|
|
65
|
+
## MCP Readiness Notes
|
|
66
|
+
|
|
67
|
+
Mark each external system as \`required\`, \`optional\`, \`unused\`, or \`unavailable\`.
|
|
68
|
+
|
|
69
|
+
| System | Status | Evidence or fallback |
|
|
70
|
+
|---|---|---|
|
|
71
|
+
| GitHub | | |
|
|
72
|
+
| Figma | | |
|
|
73
|
+
| Browser / Playwright | | |
|
|
74
|
+
| Chrome DevTools | | |
|
|
75
|
+
| Deploy provider | | |
|
|
76
|
+
| Sentry | | |
|
|
77
|
+
| Database | | |
|
|
78
|
+
| CMS | | |
|
|
79
|
+
| Collaboration tool | | |
|
|
80
|
+
| Research tool | | |
|
|
81
|
+
|
|
82
|
+
## Initial Audit Findings
|
|
83
|
+
|
|
84
|
+
Capture only findings that are grounded in inspection. Do not invent Lighthouse, axe, crawler, or analytics results unless those tools were actually run in the target repo or browser.
|
|
85
|
+
|
|
86
|
+
| Category | Finding | Evidence | Page |
|
|
87
|
+
|---|---|---|---|
|
|
88
|
+
| Visual design | | | |
|
|
89
|
+
| UX flow | | | |
|
|
90
|
+
| Responsive | | | |
|
|
91
|
+
| Accessibility | | | |
|
|
92
|
+
| Performance | | | |
|
|
93
|
+
| SEO | | | |
|
|
94
|
+
| Technical quality | | | |
|
|
95
|
+
| Runtime issues | | | |
|
|
96
|
+
| Content quality | | | |
|
|
97
|
+
|
|
98
|
+
## First Bundle Commands
|
|
99
|
+
|
|
100
|
+
Replace placeholders and run from the \`design-ai\` repository.
|
|
101
|
+
|
|
102
|
+
\`\`\`bash
|
|
103
|
+
design-ai site --init \\
|
|
104
|
+
--name "<site name>" \\
|
|
105
|
+
--live-url <live-url> \\
|
|
106
|
+
--local-path <absolute-target-repo-path> \\
|
|
107
|
+
--page / \\
|
|
108
|
+
--page <priority-page-2> \\
|
|
109
|
+
--flow "<primary user flow>" \\
|
|
110
|
+
--next-actions \\
|
|
111
|
+
--out website-next-actions.md \\
|
|
112
|
+
--force
|
|
113
|
+
\`\`\`
|
|
114
|
+
|
|
115
|
+
\`\`\`bash
|
|
116
|
+
design-ai site --init \\
|
|
117
|
+
--name "<site name>" \\
|
|
118
|
+
--live-url <live-url> \\
|
|
119
|
+
--local-path <absolute-target-repo-path> \\
|
|
120
|
+
--page / \\
|
|
121
|
+
--page <priority-page-2> \\
|
|
122
|
+
--flow "<primary user flow>" \\
|
|
123
|
+
--bundle \\
|
|
124
|
+
--out website-handoff-bundle \\
|
|
125
|
+
--strict \\
|
|
126
|
+
--force
|
|
127
|
+
\`\`\`
|
|
128
|
+
|
|
129
|
+
\`\`\`bash
|
|
130
|
+
design-ai site website-handoff-bundle --bundle-check --strict --json --out website-bundle-check.json --force
|
|
131
|
+
design-ai site website-handoff-bundle --bundle-handoff --strict --out target-repo-handoff.md --force
|
|
132
|
+
\`\`\`
|
|
133
|
+
|
|
134
|
+
## Target Repo Verification Plan
|
|
135
|
+
|
|
136
|
+
Fill this before implementation so the target-repo agent has a clear quality gate.
|
|
137
|
+
|
|
138
|
+
| Gate | Command or manual check | Required for pilot |
|
|
139
|
+
|---|---|---:|
|
|
140
|
+
| Install | | yes |
|
|
141
|
+
| Lint | | yes |
|
|
142
|
+
| Typecheck | | if available |
|
|
143
|
+
| Unit tests | | if available |
|
|
144
|
+
| Build | | yes |
|
|
145
|
+
| Browser smoke | | yes |
|
|
146
|
+
| Accessibility spot check | | yes |
|
|
147
|
+
| Deployment preview | | if available |
|
|
148
|
+
|
|
149
|
+
## Stop Conditions
|
|
150
|
+
|
|
151
|
+
Stop before target-repo edits when any answer is unclear:
|
|
152
|
+
|
|
153
|
+
- Which repo and branch should be modified?
|
|
154
|
+
- Which single task should be implemented first?
|
|
155
|
+
- Which verification commands must pass?
|
|
156
|
+
- Which credentials or production systems are off limits?
|
|
157
|
+
- Where should implementation evidence be recorded after the target-repo pass?
|
|
158
|
+
`;
|
|
159
|
+
|
|
160
|
+
export const SITE_INTAKE_TEMPLATE_MARKDOWN_KO = `# 회사 웹사이트 Intake Template
|
|
161
|
+
|
|
162
|
+
첫 Website Improvement dogfood 전에 이 template을 채웁니다. 민감한 credential, private token, production secret, 고객 데이터는 이 문서에 적지 않습니다.
|
|
163
|
+
|
|
164
|
+
## Site Profile
|
|
165
|
+
|
|
166
|
+
| 항목 | 값 |
|
|
167
|
+
|---|---|
|
|
168
|
+
| 사이트 이름 | |
|
|
169
|
+
| Live URL | |
|
|
170
|
+
| 대상 repo URL | |
|
|
171
|
+
| 대상 repo local path | |
|
|
172
|
+
| Figma URL | |
|
|
173
|
+
| 배포 플랫폼 | \`vercel\` / \`netlify\` / \`cloudflare\` / \`other\` / \`none\` |
|
|
174
|
+
| Sentry 프로젝트 | |
|
|
175
|
+
| CMS | \`sanity\` / \`contentful\` / \`wordpress\` / \`shopify\` / \`none\` / \`other\` |
|
|
176
|
+
| Database | \`supabase\` / \`neon\` / \`postgres\` / \`none\` / \`other\` |
|
|
177
|
+
|
|
178
|
+
## 우선순위 페이지
|
|
179
|
+
|
|
180
|
+
첫 pilot에서는 2-5개 페이지를 고릅니다. 전환, 신뢰, 가입, 문의, 구매, 온보딩에 영향을 주는 페이지부터 시작합니다.
|
|
181
|
+
|
|
182
|
+
| 우선순위 | Path 또는 URL | 중요한 이유 |
|
|
183
|
+
|---:|---|---|
|
|
184
|
+
| 1 | \`/\` | |
|
|
185
|
+
| 2 | | |
|
|
186
|
+
| 3 | | |
|
|
187
|
+
| 4 | | |
|
|
188
|
+
| 5 | | |
|
|
189
|
+
|
|
190
|
+
## 주요 사용자 흐름
|
|
191
|
+
|
|
192
|
+
| 우선순위 | Flow | 성공 신호 |
|
|
193
|
+
|---:|---|---|
|
|
194
|
+
| 1 | | |
|
|
195
|
+
| 2 | | |
|
|
196
|
+
| 3 | | |
|
|
197
|
+
|
|
198
|
+
## Brand And Content Notes
|
|
199
|
+
|
|
200
|
+
| 영역 | 메모 |
|
|
201
|
+
|---|---|
|
|
202
|
+
| 브랜드 톤 | |
|
|
203
|
+
| 타이포그래피 제약 | |
|
|
204
|
+
| 컬러 제약 | |
|
|
205
|
+
| 한국어 카피 규칙 | |
|
|
206
|
+
| 법무 또는 compliance 문구 | |
|
|
207
|
+
| 신뢰 요소 | |
|
|
208
|
+
| 경쟁사 또는 레퍼런스 | |
|
|
209
|
+
|
|
210
|
+
## MCP Readiness Notes
|
|
211
|
+
|
|
212
|
+
각 외부 시스템을 \`required\`, \`optional\`, \`unused\`, \`unavailable\` 중 하나로 표시합니다.
|
|
213
|
+
|
|
214
|
+
| 시스템 | 상태 | 근거 또는 fallback |
|
|
215
|
+
|---|---|---|
|
|
216
|
+
| GitHub | | |
|
|
217
|
+
| Figma | | |
|
|
218
|
+
| Browser / Playwright | | |
|
|
219
|
+
| Chrome DevTools | | |
|
|
220
|
+
| 배포 플랫폼 | | |
|
|
221
|
+
| Sentry | | |
|
|
222
|
+
| Database | | |
|
|
223
|
+
| CMS | | |
|
|
224
|
+
| 협업 도구 | | |
|
|
225
|
+
| 리서치 도구 | | |
|
|
226
|
+
|
|
227
|
+
## 초기 Audit Findings
|
|
228
|
+
|
|
229
|
+
실제로 확인한 finding만 기록합니다. Lighthouse, axe, crawler, analytics를 실제로 실행하지 않았다면 해당 결과를 만들어 쓰지 않습니다.
|
|
230
|
+
|
|
231
|
+
| Category | Finding | Evidence | Page |
|
|
232
|
+
|---|---|---|---|
|
|
233
|
+
| Visual design | | | |
|
|
234
|
+
| UX flow | | | |
|
|
235
|
+
| Responsive | | | |
|
|
236
|
+
| Accessibility | | | |
|
|
237
|
+
| Performance | | | |
|
|
238
|
+
| SEO | | | |
|
|
239
|
+
| Technical quality | | | |
|
|
240
|
+
| Runtime issues | | | |
|
|
241
|
+
| Content quality | | | |
|
|
242
|
+
|
|
243
|
+
## 첫 Bundle Commands
|
|
244
|
+
|
|
245
|
+
placeholder를 바꾼 뒤 \`design-ai\` repo에서 실행합니다.
|
|
246
|
+
|
|
247
|
+
\`\`\`bash
|
|
248
|
+
design-ai site --init \\
|
|
249
|
+
--name "<site name>" \\
|
|
250
|
+
--live-url <live-url> \\
|
|
251
|
+
--local-path <absolute-target-repo-path> \\
|
|
252
|
+
--page / \\
|
|
253
|
+
--page <priority-page-2> \\
|
|
254
|
+
--flow "<primary user flow>" \\
|
|
255
|
+
--next-actions \\
|
|
256
|
+
--out website-next-actions.md \\
|
|
257
|
+
--force
|
|
258
|
+
\`\`\`
|
|
259
|
+
|
|
260
|
+
\`\`\`bash
|
|
261
|
+
design-ai site --init \\
|
|
262
|
+
--name "<site name>" \\
|
|
263
|
+
--live-url <live-url> \\
|
|
264
|
+
--local-path <absolute-target-repo-path> \\
|
|
265
|
+
--page / \\
|
|
266
|
+
--page <priority-page-2> \\
|
|
267
|
+
--flow "<primary user flow>" \\
|
|
268
|
+
--bundle \\
|
|
269
|
+
--out website-handoff-bundle \\
|
|
270
|
+
--strict \\
|
|
271
|
+
--force
|
|
272
|
+
\`\`\`
|
|
273
|
+
|
|
274
|
+
\`\`\`bash
|
|
275
|
+
design-ai site website-handoff-bundle --bundle-check --strict --json --out website-bundle-check.json --force
|
|
276
|
+
design-ai site website-handoff-bundle --bundle-handoff --strict --out target-repo-handoff.md --force
|
|
277
|
+
\`\`\`
|
|
278
|
+
|
|
279
|
+
## Target Repo Verification Plan
|
|
280
|
+
|
|
281
|
+
구현 전에 채워서 target-repo agent가 명확한 quality gate를 갖게 합니다.
|
|
282
|
+
|
|
283
|
+
| Gate | 명령 또는 수동 확인 | Pilot 필수 |
|
|
284
|
+
|---|---|---:|
|
|
285
|
+
| Install | | 예 |
|
|
286
|
+
| Lint | | 예 |
|
|
287
|
+
| Typecheck | | 가능하면 |
|
|
288
|
+
| Unit tests | | 가능하면 |
|
|
289
|
+
| Build | | 예 |
|
|
290
|
+
| Browser smoke | | 예 |
|
|
291
|
+
| Accessibility spot check | | 예 |
|
|
292
|
+
| Deployment preview | | 가능하면 |
|
|
293
|
+
|
|
294
|
+
## Stop Conditions
|
|
295
|
+
|
|
296
|
+
아래 질문 중 하나라도 불명확하면 target repo 수정 전에 멈춥니다.
|
|
297
|
+
|
|
298
|
+
- 어떤 repo와 branch를 수정해야 하는가?
|
|
299
|
+
- 첫 번째로 구현할 single task는 무엇인가?
|
|
300
|
+
- 어떤 verification command가 반드시 통과해야 하는가?
|
|
301
|
+
- 어떤 credential 또는 production system이 off limits인가?
|
|
302
|
+
- target-repo pass 이후 implementation evidence를 어디에 기록해야 하는가?
|
|
303
|
+
`;
|
|
304
|
+
|
|
305
|
+
export const SITE_PROMPT_TEMPLATE_IDS = [
|
|
306
|
+
"codex-repo-intake",
|
|
307
|
+
"codex-implementation",
|
|
308
|
+
"codex-visual-qa",
|
|
309
|
+
"codex-deployment",
|
|
310
|
+
"claude-design-review",
|
|
311
|
+
"claude-competitor",
|
|
312
|
+
"claude-copy-ux",
|
|
313
|
+
"handoff-report",
|
|
314
|
+
];
|
|
315
|
+
|
|
316
|
+
export const SITE_BUNDLE_FILES = [
|
|
317
|
+
"README.md",
|
|
318
|
+
"summary.json",
|
|
319
|
+
"website-workspace.tasks.json",
|
|
320
|
+
"mcp-check.json",
|
|
321
|
+
"mcp-probes.json",
|
|
322
|
+
"mcp-action-plan.md",
|
|
323
|
+
"website-handoff.md",
|
|
324
|
+
"website-prompts.md",
|
|
325
|
+
"codex-implementation.md",
|
|
326
|
+
];
|
|
327
|
+
|
|
328
|
+
export const SITE_BUNDLE_CHECKSUM_FILES = SITE_BUNDLE_FILES.filter((filePath) => filePath !== "summary.json");
|
|
329
|
+
|
|
330
|
+
export const SITE_PROMPT_TEMPLATES = [
|
|
331
|
+
{
|
|
332
|
+
id: "codex-repo-intake",
|
|
333
|
+
label: "Codex repo intake",
|
|
334
|
+
agent: "codex",
|
|
335
|
+
output: "Repository inspection plan",
|
|
336
|
+
description: "Inspect the target website repo and return structure, likely touch points, risks, and verification commands.",
|
|
337
|
+
taskSelectable: false,
|
|
338
|
+
},
|
|
339
|
+
{
|
|
340
|
+
id: "codex-implementation",
|
|
341
|
+
label: "Codex implementation",
|
|
342
|
+
agent: "codex",
|
|
343
|
+
output: "Focused implementation prompt",
|
|
344
|
+
description: "Implement the selected website improvement task in the target repo with scoped verification.",
|
|
345
|
+
taskSelectable: true,
|
|
346
|
+
},
|
|
347
|
+
{
|
|
348
|
+
id: "codex-visual-qa",
|
|
349
|
+
label: "Codex visual QA",
|
|
350
|
+
agent: "codex",
|
|
351
|
+
output: "Browser/Playwright QA checklist",
|
|
352
|
+
description: "Verify priority pages across configured viewports for layout, focus, console, and asset issues.",
|
|
353
|
+
taskSelectable: false,
|
|
354
|
+
},
|
|
355
|
+
{
|
|
356
|
+
id: "codex-deployment",
|
|
357
|
+
label: "Codex deployment verification",
|
|
358
|
+
agent: "codex",
|
|
359
|
+
output: "Deployment verification prompt",
|
|
360
|
+
description: "Check preview or production deployment, logs, metadata, user flows, and remaining launch risks.",
|
|
361
|
+
taskSelectable: false,
|
|
362
|
+
},
|
|
363
|
+
{
|
|
364
|
+
id: "claude-design-review",
|
|
365
|
+
label: "Claude design review",
|
|
366
|
+
agent: "claude",
|
|
367
|
+
output: "Senior design critique",
|
|
368
|
+
description: "Review visual hierarchy, layout rhythm, typography, CTA clarity, responsive behavior, and accessibility concerns.",
|
|
369
|
+
taskSelectable: false,
|
|
370
|
+
},
|
|
371
|
+
{
|
|
372
|
+
id: "claude-competitor",
|
|
373
|
+
label: "Claude competitor research",
|
|
374
|
+
agent: "claude",
|
|
375
|
+
output: "Competitor opportunity map",
|
|
376
|
+
description: "Compare relevant peer sites for structure, conversion path, proof, pricing, tone, content, and SEO positioning.",
|
|
377
|
+
taskSelectable: false,
|
|
378
|
+
},
|
|
379
|
+
{
|
|
380
|
+
id: "claude-copy-ux",
|
|
381
|
+
label: "Claude copy/UX critique",
|
|
382
|
+
agent: "claude",
|
|
383
|
+
output: "Copy and UX improvement notes",
|
|
384
|
+
description: "Critique copy, information architecture, trust signals, CTA language, and conversion flow.",
|
|
385
|
+
taskSelectable: false,
|
|
386
|
+
},
|
|
387
|
+
{
|
|
388
|
+
id: "handoff-report",
|
|
389
|
+
label: "Final handoff report",
|
|
390
|
+
agent: "codex-or-claude",
|
|
391
|
+
output: "Final handoff report prompt",
|
|
392
|
+
description: "Generate a final report covering target site info, audit summary, recommendations, executed work, verification, risks, and next actions.",
|
|
393
|
+
taskSelectable: false,
|
|
394
|
+
},
|
|
395
|
+
];
|
|
396
|
+
|
|
397
|
+
if (SITE_PROMPT_TEMPLATE_IDS.join("\n") !== SITE_PROMPT_TEMPLATES.map((template) => template.id).join("\n")) {
|
|
398
|
+
throw new Error("SITE_PROMPT_TEMPLATES must match SITE_PROMPT_TEMPLATE_IDS order");
|
|
399
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// Implementation evidence helpers for Website Improvement workspaces.
|
|
2
|
+
|
|
3
|
+
import { normalizeStringArray } from "./site-strings.mjs";
|
|
4
|
+
|
|
5
|
+
export const IMPLEMENTATION_EVIDENCE_KEYS = ["executedWork", "verificationResults", "remainingRisks", "nextActions"];
|
|
6
|
+
|
|
7
|
+
export const DEFAULT_IMPLEMENTATION_RISKS = [
|
|
8
|
+
"MCP readiness gaps may limit verification depth.",
|
|
9
|
+
"Copy or brand changes may require stakeholder review.",
|
|
10
|
+
"Automated performance/accessibility tooling is outside this MVP unless run in the target repo.",
|
|
11
|
+
];
|
|
12
|
+
|
|
13
|
+
function normalizeObject(value) {
|
|
14
|
+
return value && typeof value === "object" && !Array.isArray(value) ? value : {};
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function normalizeImplementationEvidence(value) {
|
|
18
|
+
const source = normalizeObject(value);
|
|
19
|
+
return {
|
|
20
|
+
executedWork: normalizeStringArray(source.executedWork),
|
|
21
|
+
verificationResults: normalizeStringArray(source.verificationResults),
|
|
22
|
+
remainingRisks: normalizeStringArray(source.remainingRisks, DEFAULT_IMPLEMENTATION_RISKS),
|
|
23
|
+
nextActions: normalizeStringArray(source.nextActions),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function countImplementationEvidence(value = {}) {
|
|
28
|
+
const source = normalizeObject(value);
|
|
29
|
+
return Object.fromEntries(IMPLEMENTATION_EVIDENCE_KEYS.map((key) => {
|
|
30
|
+
const items = source[key];
|
|
31
|
+
if (Array.isArray(items)) return [key, items.length];
|
|
32
|
+
if (Number.isInteger(items) && items >= 0) return [key, items];
|
|
33
|
+
return [key, 0];
|
|
34
|
+
}));
|
|
35
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// Command helpers for Website Improvement MCP readiness flows.
|
|
2
|
+
|
|
3
|
+
export function siteMcpCommandTarget(filePath) {
|
|
4
|
+
return filePath === "stdin" ? "<workspace.json>" : filePath;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function buildSiteMcpProbeCommandSet(commandTarget) {
|
|
8
|
+
return {
|
|
9
|
+
mcpCheckProbesHumanOut: `design-ai site ${commandTarget} --mcp-check --probes --out mcp-check-probes.txt`,
|
|
10
|
+
mcpCheckProbesJsonOut: `design-ai site ${commandTarget} --mcp-check --probes --json --out mcp-check-probes.json`,
|
|
11
|
+
mcpPlanProbesJson: `design-ai site ${commandTarget} --mcp-plan --probes --json`,
|
|
12
|
+
mcpPlanProbesJsonOut: `design-ai site ${commandTarget} --mcp-plan --probes --json --out mcp-action-plan-probes.json`,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function buildSiteNextActionCommandSet(commandTarget) {
|
|
17
|
+
return {
|
|
18
|
+
summary: `design-ai site ${commandTarget} --json`,
|
|
19
|
+
mcpCheck: `design-ai site ${commandTarget} --mcp-check --strict --json`,
|
|
20
|
+
mcpPlan: `design-ai site ${commandTarget} --mcp-plan --out mcp-action-plan.md`,
|
|
21
|
+
mcpCheckProbes: `design-ai site ${commandTarget} --mcp-check --probes --json --out mcp-check-probes.json`,
|
|
22
|
+
mcpPlanProbes: `design-ai site ${commandTarget} --mcp-plan --probes --json --out mcp-action-plan-probes.json`,
|
|
23
|
+
tasks: `design-ai site ${commandTarget} --tasks --out website-workspace.tasks.json`,
|
|
24
|
+
implementationPrompt: `design-ai site ${commandTarget} --prompt codex-implementation --task 1 --out codex-implementation.md`,
|
|
25
|
+
handoffReport: `design-ai site ${commandTarget} --report --out website-handoff.md`,
|
|
26
|
+
handoffBundle: `design-ai site ${commandTarget} --bundle --out website-handoff-bundle`,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
// Read-only MCP probe helpers for Website Improvement workspaces.
|
|
2
|
+
|
|
3
|
+
import { existsSync, statSync } from "node:fs";
|
|
4
|
+
|
|
5
|
+
function parseHttpUrl(value) {
|
|
6
|
+
const raw = String(value || "").trim();
|
|
7
|
+
if (!raw) return null;
|
|
8
|
+
try {
|
|
9
|
+
const parsed = new URL(raw);
|
|
10
|
+
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") return null;
|
|
11
|
+
return parsed;
|
|
12
|
+
} catch {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function probeLevel({ passed, requestedStatus }) {
|
|
18
|
+
if (passed) return "pass";
|
|
19
|
+
return requestedStatus === "required" ? "fail" : "warn";
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function probeStatus(items) {
|
|
23
|
+
if (items.some((item) => item.level === "fail")) return "fail";
|
|
24
|
+
if (items.some((item) => item.level === "warn")) return "warn";
|
|
25
|
+
return "pass";
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function githubRepoSlug(repoUrl) {
|
|
29
|
+
const parsed = parseHttpUrl(repoUrl);
|
|
30
|
+
if (!parsed) return "";
|
|
31
|
+
const host = parsed.hostname.toLowerCase();
|
|
32
|
+
if (host !== "github.com" && !host.endsWith(".github.com")) return "";
|
|
33
|
+
const parts = parsed.pathname.replace(/^\/+|\/+$/g, "").replace(/\.git$/i, "").split("/");
|
|
34
|
+
if (parts.length < 2 || !parts[0] || !parts[1]) return "";
|
|
35
|
+
return `${parts[0]}/${parts[1]}`;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function figmaFileReference(figmaUrl) {
|
|
39
|
+
const parsed = parseHttpUrl(figmaUrl);
|
|
40
|
+
if (!parsed) return "";
|
|
41
|
+
const host = parsed.hostname.toLowerCase();
|
|
42
|
+
if (host !== "figma.com" && !host.endsWith(".figma.com")) return "";
|
|
43
|
+
const parts = parsed.pathname.replace(/^\/+|\/+$/g, "").split("/");
|
|
44
|
+
const supportedKinds = new Set(["design", "file", "board", "slides", "make"]);
|
|
45
|
+
if (parts.length < 2 || !supportedKinds.has(parts[0]) || !parts[1]) return "";
|
|
46
|
+
return `${parts[0]}/${parts[1]}`;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function pathExistsAsDirectory(localPath) {
|
|
50
|
+
const raw = String(localPath || "").trim();
|
|
51
|
+
if (!raw) return false;
|
|
52
|
+
try {
|
|
53
|
+
return existsSync(raw) && statSync(raw).isDirectory();
|
|
54
|
+
} catch {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function buildProbeItem({ id, key, label, requestedStatus, passed, message, evidence = [], actions = [] }) {
|
|
60
|
+
const level = probeLevel({ passed, requestedStatus });
|
|
61
|
+
return {
|
|
62
|
+
id,
|
|
63
|
+
key,
|
|
64
|
+
label,
|
|
65
|
+
requestedStatus,
|
|
66
|
+
level,
|
|
67
|
+
passed,
|
|
68
|
+
message,
|
|
69
|
+
evidence,
|
|
70
|
+
actions: passed ? [] : actions,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function buildSiteMcpProbeItems(workspace) {
|
|
75
|
+
const profile = workspace.siteProfile;
|
|
76
|
+
const liveUrl = parseHttpUrl(profile.liveUrl);
|
|
77
|
+
const repoSlug = githubRepoSlug(profile.repoUrl);
|
|
78
|
+
const localRepoAvailable = pathExistsAsDirectory(profile.localPath);
|
|
79
|
+
const figmaRef = figmaFileReference(profile.figmaUrl);
|
|
80
|
+
const deployConfigured = profile.deployProvider !== "none";
|
|
81
|
+
const browserTargetReady = Boolean(liveUrl && profile.viewports.length > 0);
|
|
82
|
+
|
|
83
|
+
return [
|
|
84
|
+
buildProbeItem({
|
|
85
|
+
id: "github-repo-reference",
|
|
86
|
+
key: "github",
|
|
87
|
+
label: "GitHub repo reference",
|
|
88
|
+
requestedStatus: workspace.mcpReadiness.github,
|
|
89
|
+
passed: Boolean(repoSlug || localRepoAvailable),
|
|
90
|
+
message: repoSlug || localRepoAvailable
|
|
91
|
+
? "Target repo reference is parseable for Codex handoff."
|
|
92
|
+
: "Target repo reference is not probe-ready.",
|
|
93
|
+
evidence: [
|
|
94
|
+
repoSlug ? `github repo: ${repoSlug}` : "",
|
|
95
|
+
localRepoAvailable ? `localPath exists: ${profile.localPath}` : "",
|
|
96
|
+
].filter(Boolean),
|
|
97
|
+
actions: ["Add a github.com owner/repo URL or an existing local repo path before implementation handoff."],
|
|
98
|
+
}),
|
|
99
|
+
buildProbeItem({
|
|
100
|
+
id: "figma-url-reference",
|
|
101
|
+
key: "figma",
|
|
102
|
+
label: "Figma file reference",
|
|
103
|
+
requestedStatus: workspace.mcpReadiness.figma,
|
|
104
|
+
passed: Boolean(figmaRef),
|
|
105
|
+
message: figmaRef
|
|
106
|
+
? "Figma URL is parseable for design-context handoff."
|
|
107
|
+
: "Figma URL is missing or not parseable.",
|
|
108
|
+
evidence: figmaRef ? [`figma reference: ${figmaRef}`] : [],
|
|
109
|
+
actions: ["Add a figma.com design/file/board/slides/make URL or mark Figma unused."],
|
|
110
|
+
}),
|
|
111
|
+
buildProbeItem({
|
|
112
|
+
id: "browser-smoke-target",
|
|
113
|
+
key: "browser",
|
|
114
|
+
label: "Browser smoke target",
|
|
115
|
+
requestedStatus: workspace.mcpReadiness.browser,
|
|
116
|
+
passed: browserTargetReady,
|
|
117
|
+
message: browserTargetReady
|
|
118
|
+
? "Browser smoke target and viewport set are ready for manual or MCP-driven QA."
|
|
119
|
+
: "Browser smoke target is incomplete.",
|
|
120
|
+
evidence: [
|
|
121
|
+
liveUrl ? `liveUrl host: ${liveUrl.hostname}` : "",
|
|
122
|
+
profile.viewports.length ? `viewports: ${profile.viewports.join(", ")}` : "",
|
|
123
|
+
].filter(Boolean),
|
|
124
|
+
actions: ["Add a valid http(s) liveUrl and at least one viewport before Browser/Playwright QA."],
|
|
125
|
+
}),
|
|
126
|
+
buildProbeItem({
|
|
127
|
+
id: "deploy-provider-reference",
|
|
128
|
+
key: "deploy",
|
|
129
|
+
label: "Deployment provider reference",
|
|
130
|
+
requestedStatus: workspace.mcpReadiness.deploy,
|
|
131
|
+
passed: Boolean(deployConfigured && liveUrl),
|
|
132
|
+
message: deployConfigured && liveUrl
|
|
133
|
+
? "Deployment provider and live URL are configured for verification handoff."
|
|
134
|
+
: "Deployment provider or live URL is not configured.",
|
|
135
|
+
evidence: [
|
|
136
|
+
`deployProvider: ${profile.deployProvider}`,
|
|
137
|
+
liveUrl ? `liveUrl host: ${liveUrl.hostname}` : "",
|
|
138
|
+
].filter(Boolean),
|
|
139
|
+
actions: ["Set siteProfile.deployProvider and liveUrl before deployment verification."],
|
|
140
|
+
}),
|
|
141
|
+
];
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export function buildSiteMcpProbeReport(workspace) {
|
|
145
|
+
const items = buildSiteMcpProbeItems(workspace)
|
|
146
|
+
.filter((item) => item.requestedStatus !== "unused" && item.requestedStatus !== "unavailable");
|
|
147
|
+
const status = probeStatus(items);
|
|
148
|
+
return {
|
|
149
|
+
enabled: true,
|
|
150
|
+
mode: "read-only-local",
|
|
151
|
+
externalCalls: false,
|
|
152
|
+
status,
|
|
153
|
+
count: items.length,
|
|
154
|
+
pass: items.filter((item) => item.level === "pass").length,
|
|
155
|
+
warn: items.filter((item) => item.level === "warn").length,
|
|
156
|
+
fail: items.filter((item) => item.level === "fail").length,
|
|
157
|
+
items,
|
|
158
|
+
};
|
|
159
|
+
}
|