@design-ai/cli 4.56.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 +36 -0
- package/README.ko.md +9 -26
- package/README.md +10 -23
- 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 +13 -3
- 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-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-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.mjs +44 -931
- package/cli/lib/site-test-support.mjs +68 -0
- 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 +2 -2
- package/docs/DISTRIBUTION.md +2 -2
- package/docs/NEXT-SURFACE-DECISION.md +125 -0
- package/docs/PRODUCT-READINESS.md +3 -3
- package/docs/RELEASE-GATES.ko.md +35 -0
- package/docs/RELEASE-GATES.md +234 -0
- package/docs/ROADMAP.md +53 -8
- package/docs/external-status.md +6 -8
- package/docs/inspection-20260630.md +169 -0
- package/docs/integrations/design-ai-mcp-server.md +4 -4
- 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/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 +611 -9
- package/tools/audit/registry-smoke.py +534 -0
- package/tools/audit/release-metadata.py +47 -1
- package/tools/audit/smoke_assertions.py +915 -13
- package/tools/migrations/refs-links-to-reference-pages.py +179 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
// Shared test helpers for the site.* test suite.
|
|
2
|
+
|
|
3
|
+
import { createHash } from "node:crypto";
|
|
4
|
+
import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
5
|
+
import { tmpdir } from "node:os";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
SITE_BUNDLE_CHECKSUM_FILES,
|
|
10
|
+
analyzeSiteWorkspace,
|
|
11
|
+
buildSiteBundleHandoffReport,
|
|
12
|
+
buildSiteHandoffBundle,
|
|
13
|
+
createSampleSiteWorkspace,
|
|
14
|
+
formatSiteBundleHandoffHuman,
|
|
15
|
+
formatSiteBundleHandoffJson,
|
|
16
|
+
} from "./site.mjs";
|
|
17
|
+
|
|
18
|
+
export function sha256HexForTest(content) {
|
|
19
|
+
return createHash("sha256").update(content, "utf8").digest("hex");
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
export function bundleDigestForTest(checksumFiles) {
|
|
24
|
+
const manifest = SITE_BUNDLE_CHECKSUM_FILES.map((filePath) => `${filePath}\t${checksumFiles[filePath] || ""}`).join("\n");
|
|
25
|
+
return sha256HexForTest(`${manifest}\n`);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export async function captureConsole(fn) {
|
|
29
|
+
const stdout = [];
|
|
30
|
+
const originalLog = console.log;
|
|
31
|
+
const originalExitCode = process.exitCode;
|
|
32
|
+
console.log = (...args) => {
|
|
33
|
+
stdout.push(args.join(" "));
|
|
34
|
+
};
|
|
35
|
+
process.exitCode = undefined;
|
|
36
|
+
try {
|
|
37
|
+
await fn();
|
|
38
|
+
return {
|
|
39
|
+
stdout: stdout.join("\n"),
|
|
40
|
+
exitCode: process.exitCode,
|
|
41
|
+
};
|
|
42
|
+
} finally {
|
|
43
|
+
console.log = originalLog;
|
|
44
|
+
process.exitCode = originalExitCode;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export async function withTempDir(fn) {
|
|
49
|
+
const dir = mkdtempSync(path.join(tmpdir(), "design-ai-site-"));
|
|
50
|
+
try {
|
|
51
|
+
return await fn(dir);
|
|
52
|
+
} finally {
|
|
53
|
+
rmSync(dir, { recursive: true, force: true });
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function buildHandoffFixture(dir) {
|
|
58
|
+
const workspace = createSampleSiteWorkspace();
|
|
59
|
+
const { summary } = analyzeSiteWorkspace(workspace, { filePath: "stdin" });
|
|
60
|
+
const bundle = buildSiteHandoffBundle(workspace, summary);
|
|
61
|
+
for (const file of bundle.files) {
|
|
62
|
+
writeFileSync(path.join(dir, file.path), file.content, "utf8");
|
|
63
|
+
}
|
|
64
|
+
const report = buildSiteBundleHandoffReport({ target: dir });
|
|
65
|
+
const json = JSON.parse(formatSiteBundleHandoffJson(report));
|
|
66
|
+
const human = formatSiteBundleHandoffHuman(report);
|
|
67
|
+
return { workspace, summary, bundle, report, json, human };
|
|
68
|
+
}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
// Apply-plan follow-up command specs and argument helpers for skill proposals.
|
|
2
|
+
|
|
3
|
+
export const APPLY_PLAN_FOLLOW_UP_COMMAND_SPECS = Object.freeze({
|
|
4
|
+
reviewCheckJson: ["--review-check", "--json"],
|
|
5
|
+
reviewCheckReport: ["--review-check", "--report", "--out", "skill-proposal-review-check.md"],
|
|
6
|
+
proposalPatchPreview: ["--patch", "--out", "skill-proposals.patch"],
|
|
7
|
+
strictGate: ["--strict", "--json"],
|
|
8
|
+
});
|
|
9
|
+
export const APPLY_PLAN_FOLLOW_UP_COMMAND_POLICIES = Object.freeze({
|
|
10
|
+
reviewCheckJson: "preview-only",
|
|
11
|
+
reviewCheckReport: "output-artifact",
|
|
12
|
+
proposalPatchPreview: "output-artifact",
|
|
13
|
+
strictGate: "strict-readiness-gate",
|
|
14
|
+
});
|
|
15
|
+
export const APPLY_PLAN_FOLLOW_UP_COMMAND_DISPLAY_LABELS = Object.freeze({
|
|
16
|
+
reviewCheckJson: "Review check JSON",
|
|
17
|
+
reviewCheckReport: "Review check Markdown report",
|
|
18
|
+
proposalPatchPreview: "Skill proposal patch preview",
|
|
19
|
+
strictGate: "Strict proposal readiness gate",
|
|
20
|
+
});
|
|
21
|
+
export const APPLY_PLAN_FOLLOW_UP_COMMAND_DESCRIPTIONS = Object.freeze({
|
|
22
|
+
reviewCheckJson: "Check proposal review readiness as machine-readable JSON without writing local files.",
|
|
23
|
+
reviewCheckReport: "Generate a Markdown review-check artifact for accepted proposal readiness.",
|
|
24
|
+
proposalPatchPreview: "Generate a unified diff preview for accepted skill proposal edits.",
|
|
25
|
+
strictGate: "Run the strict proposal readiness gate before marking accepted proposals applied.",
|
|
26
|
+
});
|
|
27
|
+
export const APPLY_PLAN_FOLLOW_UP_COMMAND_OUTPUT_ARTIFACTS = Object.freeze({
|
|
28
|
+
reviewCheckReport: "skill-proposal-review-check.md",
|
|
29
|
+
proposalPatchPreview: "skill-proposals.patch",
|
|
30
|
+
});
|
|
31
|
+
export const APPLY_PLAN_FOLLOW_UP_COMMAND_OUTPUT_ARTIFACT_TYPES = Object.freeze({
|
|
32
|
+
reviewCheckReport: "markdown-report",
|
|
33
|
+
proposalPatchPreview: "unified-diff",
|
|
34
|
+
});
|
|
35
|
+
export const APPLY_PLAN_FOLLOW_UP_COMMAND_OUTPUT_ARTIFACT_ACTIONS = Object.freeze({
|
|
36
|
+
reviewCheckReport: "render-markdown-report",
|
|
37
|
+
proposalPatchPreview: "render-unified-diff-preview",
|
|
38
|
+
});
|
|
39
|
+
export const APPLY_PLAN_FOLLOW_UP_COMMAND_OUTPUT_ARTIFACT_MEDIA_TYPES = Object.freeze({
|
|
40
|
+
reviewCheckReport: "text/markdown",
|
|
41
|
+
proposalPatchPreview: "text/x-diff",
|
|
42
|
+
});
|
|
43
|
+
export const APPLY_PLAN_FOLLOW_UP_COMMAND_OUTPUT_ARTIFACT_DISPOSITIONS = Object.freeze({
|
|
44
|
+
reviewCheckReport: "review-only",
|
|
45
|
+
proposalPatchPreview: "manual-apply-preview",
|
|
46
|
+
});
|
|
47
|
+
export const APPLY_PLAN_FOLLOW_UP_COMMAND_OUTPUT_ARTIFACT_MANUAL_APPLY_CANDIDATES = Object.freeze({
|
|
48
|
+
reviewCheckReport: false,
|
|
49
|
+
proposalPatchPreview: true,
|
|
50
|
+
});
|
|
51
|
+
export const APPLY_PLAN_FOLLOW_UP_COMMAND_OUTPUT_ARTIFACT_REQUIRES_MANUAL_REVIEW = Object.freeze({
|
|
52
|
+
reviewCheckReport: false,
|
|
53
|
+
proposalPatchPreview: true,
|
|
54
|
+
});
|
|
55
|
+
export const APPLY_PLAN_FOLLOW_UP_COMMAND_OUTPUT_ARTIFACT_REVIEW_INSTRUCTIONS = Object.freeze({
|
|
56
|
+
reviewCheckReport: "Review the Markdown readiness report before changing proposal review status.",
|
|
57
|
+
proposalPatchPreview: "Review the unified diff manually before applying any skill-file edits.",
|
|
58
|
+
});
|
|
59
|
+
export const APPLY_PLAN_FOLLOW_UP_COMMAND_OUTPUT_ARTIFACT_REQUIRES_CLEAN_WORKSPACE_BEFORE_APPLY = Object.freeze({
|
|
60
|
+
reviewCheckReport: false,
|
|
61
|
+
proposalPatchPreview: true,
|
|
62
|
+
});
|
|
63
|
+
export const APPLY_PLAN_FOLLOW_UP_COMMAND_OUTPUT_ARTIFACT_APPLY_PRECONDITION_IDS = Object.freeze({
|
|
64
|
+
reviewCheckReport: Object.freeze([]),
|
|
65
|
+
proposalPatchPreview: Object.freeze(["manual-review", "clean-workspace"]),
|
|
66
|
+
});
|
|
67
|
+
export const APPLY_PLAN_FOLLOW_UP_COMMAND_OUTPUT_ARTIFACT_APPLY_PRECONDITION_LABELS = Object.freeze({
|
|
68
|
+
reviewCheckReport: Object.freeze([]),
|
|
69
|
+
proposalPatchPreview: Object.freeze(["Manual review completed", "Clean workspace confirmed"]),
|
|
70
|
+
});
|
|
71
|
+
export const APPLY_PLAN_BASE_COMMAND = Object.freeze(["design-ai", "learn", "--propose-skills"]);
|
|
72
|
+
export const APPLY_PLAN_FORBIDDEN_FLAGS = Object.freeze(["--yes"]);
|
|
73
|
+
|
|
74
|
+
function shellQuote(value) {
|
|
75
|
+
const text = String(value ?? "");
|
|
76
|
+
if (/^[A-Za-z0-9_./:=@%+-]+$/.test(text)) return text;
|
|
77
|
+
return `'${text.replace(/'/g, "'\\''")}'`;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function commandFromArgs(args) {
|
|
81
|
+
return args.map(shellQuote).join(" ");
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function proposalContextArgs(payload = {}) {
|
|
85
|
+
const args = [];
|
|
86
|
+
if (payload.file) args.push("--file", payload.file);
|
|
87
|
+
if (payload.usageFile) args.push("--usage-file", payload.usageFile);
|
|
88
|
+
if (payload.signalSource) args.push("--from-file", payload.signalSource);
|
|
89
|
+
return args;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function commandForReviewFile(payload, extraArgs = []) {
|
|
93
|
+
const reviewFile = payload.reviewFile || payload.review?.file || "skill-proposals.review.json";
|
|
94
|
+
const args = [
|
|
95
|
+
"design-ai",
|
|
96
|
+
"learn",
|
|
97
|
+
"--propose-skills",
|
|
98
|
+
...proposalContextArgs(payload),
|
|
99
|
+
"--review-file",
|
|
100
|
+
reviewFile,
|
|
101
|
+
...extraArgs,
|
|
102
|
+
];
|
|
103
|
+
return {
|
|
104
|
+
command: commandFromArgs(args),
|
|
105
|
+
commandArgs: args.map((item) => String(item)),
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export function applyPlanFollowUpCommands(payload, reviewFile) {
|
|
110
|
+
const context = { ...payload, reviewFile };
|
|
111
|
+
return Object.fromEntries(Object.entries(APPLY_PLAN_FOLLOW_UP_COMMAND_SPECS).map(([key, extraArgs]) => [
|
|
112
|
+
key,
|
|
113
|
+
commandForReviewFile(context, extraArgs),
|
|
114
|
+
]));
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export function argsEndWith(args, suffix) {
|
|
118
|
+
if (!Array.isArray(args) || args.length < suffix.length) return false;
|
|
119
|
+
return suffix.every((item, index) => args[args.length - suffix.length + index] === item);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export function argsStartWith(args, prefix) {
|
|
123
|
+
if (!Array.isArray(args) || args.length < prefix.length) return false;
|
|
124
|
+
return prefix.every((item, index) => args[index] === item);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export function commandArgCheck({ id, passed, message, evidence = {} }) {
|
|
128
|
+
return {
|
|
129
|
+
id,
|
|
130
|
+
level: passed ? "pass" : "fail",
|
|
131
|
+
passed,
|
|
132
|
+
message,
|
|
133
|
+
evidence,
|
|
134
|
+
};
|
|
135
|
+
}
|