@askrjs/cli 0.2.0 → 0.2.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/dist/add.js +25 -21
- package/dist/analyze.js +1 -1
- package/dist/cli.js +1 -1
- package/dist/create.js +13 -11
- package/dist/{guardrails-uLDOExsl.js → guardrails-D_RdWKMU.js} +1 -1
- package/dist/{runner-CtcqO3cF.js → runner-ECEPm28G.js} +97 -5
- package/dist/{runner-D_GIsgIj.js → runner-QpoIdwxy.js} +1 -1
- package/dist/templates/spa/src/pages/app/_layout.tsx +2 -2
- package/dist/templates/spa/src/pages/app/admin-home.tsx +2 -2
- package/dist/templates/spa/src/pages/app/agent-runs.tsx +1 -1
- package/dist/templates/spa/src/pages/app/settings.tsx +1 -1
- package/dist/templates/spa/src/pages/auth/_layout.tsx +2 -2
- package/dist/templates/spa/src/pages/public/home.tsx +3 -3
- package/dist/templates/startkit/src/components/app-header.tsx +1 -6
- package/dist/templates/startkit/src/components/page-header.tsx +1 -1
- package/dist/templates/startkit/src/pages/workspace/accounts/index.tsx +2 -2
- package/dist/templates/startkit/src/pages/workspace/settings.tsx +2 -2
- package/dist/templates/startkit/src/styles/components.css +1 -18
- package/dist/update.js +4 -3
- package/package.json +8 -8
package/dist/add.js
CHANGED
|
@@ -83,27 +83,31 @@ function parseArgs(args) {
|
|
|
83
83
|
const arg = args[index];
|
|
84
84
|
if (arg === "--help" || arg === "-h") parsed.help = true;
|
|
85
85
|
else if (arg === "--force") parsed.force = true;
|
|
86
|
-
else if (arg === "--branch")
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
else {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
index
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
86
|
+
else if (arg === "--branch") {
|
|
87
|
+
if (index + 1 >= args.length || args[index + 1].startsWith("-")) parsed.errors.push("Missing value for --branch");
|
|
88
|
+
else {
|
|
89
|
+
parsed.branch = args[index + 1];
|
|
90
|
+
index += 1;
|
|
91
|
+
}
|
|
92
|
+
} else if (arg === "--cwd") {
|
|
93
|
+
if (index + 1 >= args.length || args[index + 1].startsWith("-")) parsed.errors.push("Missing value for --cwd");
|
|
94
|
+
else {
|
|
95
|
+
parsed.cwd = args[index + 1];
|
|
96
|
+
index += 1;
|
|
97
|
+
}
|
|
98
|
+
} else if (arg === "--title") {
|
|
99
|
+
if (index + 1 >= args.length || args[index + 1].startsWith("-")) parsed.errors.push("Missing value for --title");
|
|
100
|
+
else {
|
|
101
|
+
parsed.title = args[index + 1].trim();
|
|
102
|
+
index += 1;
|
|
103
|
+
}
|
|
104
|
+
} else if (arg === "--route") {
|
|
105
|
+
if (index + 1 >= args.length || args[index + 1].startsWith("-")) parsed.errors.push("Missing value for --route");
|
|
106
|
+
else {
|
|
107
|
+
parsed.routePath = args[index + 1].trim();
|
|
108
|
+
index += 1;
|
|
109
|
+
}
|
|
110
|
+
} else if (arg.startsWith("-")) parsed.errors.push(`Unknown option: ${arg}`);
|
|
107
111
|
else positional.push(arg);
|
|
108
112
|
}
|
|
109
113
|
return {
|
package/dist/analyze.js
CHANGED
|
@@ -71,7 +71,7 @@ async function runAnalyzeCli(args = process.argv.slice(2), io = console, runtime
|
|
|
71
71
|
io.log(helpText.trimEnd());
|
|
72
72
|
return 0;
|
|
73
73
|
}
|
|
74
|
-
const report = await (runtime.analyze ?? (await import("./runner-
|
|
74
|
+
const report = await (runtime.analyze ?? (await import("./runner-ECEPm28G.js")).runAnalysis)({
|
|
75
75
|
cwd: parsed.cwd,
|
|
76
76
|
workspacePatterns: parsed.workspacePatterns,
|
|
77
77
|
check: parsed.check
|
package/dist/cli.js
CHANGED
|
@@ -101,7 +101,7 @@ async function runCli(args = process.argv.slice(2), io = console) {
|
|
|
101
101
|
return runAnalyzeCli(args.slice(1), io);
|
|
102
102
|
}
|
|
103
103
|
if (command === "check" || command === "doctor" || command === "repair") {
|
|
104
|
-
const { runGuardrailCli } = await import("./guardrails-
|
|
104
|
+
const { runGuardrailCli } = await import("./guardrails-D_RdWKMU.js");
|
|
105
105
|
return runGuardrailCli(command, args.slice(1), io);
|
|
106
106
|
}
|
|
107
107
|
if (command === "generate") {
|
package/dist/create.js
CHANGED
|
@@ -564,17 +564,19 @@ function parseArgs(args) {
|
|
|
564
564
|
const arg = args[i];
|
|
565
565
|
if (arg === "--no-install") install = false;
|
|
566
566
|
else if (arg === "--no-skills") skills = false;
|
|
567
|
-
else if (arg === "--prompt")
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
else {
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
567
|
+
else if (arg === "--prompt") {
|
|
568
|
+
if (i + 1 >= args.length || args[i + 1].startsWith("-")) errors.push("Missing value for --prompt");
|
|
569
|
+
else {
|
|
570
|
+
promptText = normalizePromptText(args[i + 1]);
|
|
571
|
+
i += 1;
|
|
572
|
+
}
|
|
573
|
+
} else if (arg === "--dir") {
|
|
574
|
+
if (i + 1 >= args.length || args[i + 1].startsWith("-")) errors.push("Missing value for --dir");
|
|
575
|
+
else {
|
|
576
|
+
targetDir = args[i + 1];
|
|
577
|
+
i += 1;
|
|
578
|
+
}
|
|
579
|
+
} else if (arg === "--help" || arg === "-h") help = true;
|
|
578
580
|
else if (arg.startsWith("-")) errors.push(`Unknown option: ${arg}`);
|
|
579
581
|
else positional.push(arg);
|
|
580
582
|
}
|
|
@@ -98,7 +98,7 @@ async function runGuardrailCli(command, args = process.argv.slice(2), io = conso
|
|
|
98
98
|
cwd: parsed.cwd,
|
|
99
99
|
workspacePatterns: parsed.workspacePatterns
|
|
100
100
|
};
|
|
101
|
-
const { runCheck, runDoctor, runRepair } = await import("./runner-
|
|
101
|
+
const { runCheck, runDoctor, runRepair } = await import("./runner-QpoIdwxy.js");
|
|
102
102
|
const report = command === "doctor" ? await runDoctor(options, runtime) : command === "repair" ? await runRepair(options) : await runCheck(options, runtime);
|
|
103
103
|
if (parsed.json) io.log(JSON.stringify(report));
|
|
104
104
|
else if (report.command === "doctor") printDoctor(report, io);
|
|
@@ -240,6 +240,7 @@ const ASKR_MODULE_PATTERN = /^@askrjs\/askr(?:\/|$)/;
|
|
|
240
240
|
//#endregion
|
|
241
241
|
//#region src/analyze/rules.ts
|
|
242
242
|
const SOURCE_BINDING_CACHE = /* @__PURE__ */ new WeakMap();
|
|
243
|
+
const ANALYZED_JSX_MODULE_PATTERN = /^@askrjs\/(?:ui(?:\/|$)|themes\/components$)/;
|
|
243
244
|
const SOURCE_FACT_CACHE = /* @__PURE__ */ new WeakMap();
|
|
244
245
|
function sourceBindings(sourceFile) {
|
|
245
246
|
const cached = SOURCE_BINDING_CACHE.get(sourceFile);
|
|
@@ -247,7 +248,7 @@ function sourceBindings(sourceFile) {
|
|
|
247
248
|
const named = /* @__PURE__ */ new Map();
|
|
248
249
|
const namespaces = /* @__PURE__ */ new Set();
|
|
249
250
|
for (const statement of sourceFile.statements) {
|
|
250
|
-
if (!ts.isImportDeclaration(statement) || !ts.isStringLiteral(statement.moduleSpecifier) || !ASKR_MODULE_PATTERN.test(statement.moduleSpecifier.text)) continue;
|
|
251
|
+
if (!ts.isImportDeclaration(statement) || !ts.isStringLiteral(statement.moduleSpecifier) || !ASKR_MODULE_PATTERN.test(statement.moduleSpecifier.text) && !ANALYZED_JSX_MODULE_PATTERN.test(statement.moduleSpecifier.text)) continue;
|
|
251
252
|
const bindings = statement.importClause?.namedBindings;
|
|
252
253
|
if (bindings && ts.isNamedImports(bindings)) for (const element of bindings.elements) named.set(element.name.text, {
|
|
253
254
|
imported: element.propertyName?.text ?? element.name.text,
|
|
@@ -557,6 +558,22 @@ const stableDependenciesRule = {
|
|
|
557
558
|
function jsxAttributes(node) {
|
|
558
559
|
return new Map(node.attributes.properties.flatMap((attribute) => ts.isJsxAttribute(attribute) && ts.isIdentifier(attribute.name) ? [[attribute.name.text, attribute]] : []));
|
|
559
560
|
}
|
|
561
|
+
function hasJsxSpreadAttribute(node) {
|
|
562
|
+
return node.attributes.properties.some(ts.isJsxSpreadAttribute);
|
|
563
|
+
}
|
|
564
|
+
function hasNonEmptyJsxAttribute(attribute) {
|
|
565
|
+
if (!attribute) return false;
|
|
566
|
+
if (!attribute.initializer) return true;
|
|
567
|
+
if (ts.isStringLiteral(attribute.initializer)) return attribute.initializer.text.trim().length > 0;
|
|
568
|
+
const expression = jsxExpression(attribute);
|
|
569
|
+
if (!expression) return false;
|
|
570
|
+
if (ts.isStringLiteralLike(expression)) return expression.text.trim().length > 0;
|
|
571
|
+
return ![
|
|
572
|
+
ts.SyntaxKind.FalseKeyword,
|
|
573
|
+
ts.SyntaxKind.NullKeyword,
|
|
574
|
+
ts.SyntaxKind.UndefinedKeyword
|
|
575
|
+
].includes(expression.kind);
|
|
576
|
+
}
|
|
560
577
|
function staticallyNonFunction(expression, checker) {
|
|
561
578
|
if (ts.isArrowFunction(expression) || ts.isFunctionExpression(expression) || ts.isClassExpression(expression)) return false;
|
|
562
579
|
if (ts.isStringLiteral(expression) || ts.isNumericLiteral(expression) || expression.kind === ts.SyntaxKind.TrueKeyword || expression.kind === ts.SyntaxKind.FalseKeyword || expression.kind === ts.SyntaxKind.NullKeyword || ts.isObjectLiteralExpression(expression) || ts.isArrayLiteralExpression(expression)) return true;
|
|
@@ -1275,9 +1292,10 @@ const actionContractRule = {
|
|
|
1275
1292
|
const id = optionExpression(options, "id");
|
|
1276
1293
|
const idText = literalString(id);
|
|
1277
1294
|
if (!id || idText !== null && idText.trim() === "") diagnostics.push(diagnostic(context, id ?? options, this, "defineAction() requires a non-empty id.", "Use a stable workspace-unique action ID."));
|
|
1278
|
-
else if (idText !== null)
|
|
1279
|
-
|
|
1280
|
-
|
|
1295
|
+
else if (idText !== null) {
|
|
1296
|
+
if (literalIds.has(idText)) diagnostics.push(diagnostic(context, id, this, `Action ID '${idText}' is declared more than once in this workspace.`, "Give every action a unique stable ID."));
|
|
1297
|
+
else literalIds.set(idText, id);
|
|
1298
|
+
} else if (ts.isLiteralExpression(id)) diagnostics.push(diagnostic(context, id, this, "defineAction() id must be a string."));
|
|
1281
1299
|
const input = optionExpression(options, "input");
|
|
1282
1300
|
if (!input || isNullishLiteral(input)) diagnostics.push(diagnostic(context, input ?? options, this, "defineAction() requires an input schema.", "Pass an object schema as input."));
|
|
1283
1301
|
for (const invalid of invalidPrefixElements(optionExpression(options, "invalidates"))) diagnostics.push(diagnostic(context, invalid, this, "Action invalidation prefixes must be non-empty strings."));
|
|
@@ -1974,7 +1992,7 @@ const linkContractRule = {
|
|
|
1974
1992
|
if (!ts.isJsxOpeningElement(node) && !ts.isJsxSelfClosingElement(node)) return;
|
|
1975
1993
|
if (canonicalJsxName(node.tagName, bindings) !== "Link") return;
|
|
1976
1994
|
const attributes = jsxAttributes(node);
|
|
1977
|
-
if (
|
|
1995
|
+
if (hasJsxSpreadAttribute(node)) return;
|
|
1978
1996
|
const to = attributes.get("to");
|
|
1979
1997
|
const href = attributes.get("href");
|
|
1980
1998
|
if (!to && !href) diagnostics.push(diagnostic(context, node.tagName, this, "<Link> requires a to or href destination."));
|
|
@@ -2005,6 +2023,78 @@ const linkContractRule = {
|
|
|
2005
2023
|
return diagnostics;
|
|
2006
2024
|
}
|
|
2007
2025
|
};
|
|
2026
|
+
const THEMED_FLOATING_LAYER_SLOTS = {
|
|
2027
|
+
AlertDialogOverlay: "dialog-overlay",
|
|
2028
|
+
AlertDialogContent: "dialog-content",
|
|
2029
|
+
DialogOverlay: "dialog-overlay",
|
|
2030
|
+
DialogContent: "dialog-content",
|
|
2031
|
+
DropdownContent: "dropdown-content",
|
|
2032
|
+
HoverCardContent: "hover-card-content",
|
|
2033
|
+
MenuContent: "menu-content",
|
|
2034
|
+
MenubarContent: "menubar-content",
|
|
2035
|
+
MenubarSubContent: "menubar-content",
|
|
2036
|
+
PopoverContent: "popover-content",
|
|
2037
|
+
SelectContent: "select-content",
|
|
2038
|
+
TooltipContent: "tooltip-content"
|
|
2039
|
+
};
|
|
2040
|
+
const noSlotStyleOverrideRule = {
|
|
2041
|
+
id: "askr/no-slot-style-override",
|
|
2042
|
+
category: "correctness",
|
|
2043
|
+
severity: "error",
|
|
2044
|
+
description: "Themed floating layers must use their shipped slot styling.",
|
|
2045
|
+
analyze(context) {
|
|
2046
|
+
const diagnostics = [];
|
|
2047
|
+
for (const sourceFile of context.sourceFiles) {
|
|
2048
|
+
const bindings = sourceBindings(sourceFile);
|
|
2049
|
+
visit(sourceFile, (node) => {
|
|
2050
|
+
if (!ts.isJsxOpeningElement(node) && !ts.isJsxSelfClosingElement(node)) return;
|
|
2051
|
+
if (hasJsxSpreadAttribute(node)) return;
|
|
2052
|
+
const component = canonicalJsxName(node.tagName, bindings);
|
|
2053
|
+
if (!component || !(component in THEMED_FLOATING_LAYER_SLOTS)) return;
|
|
2054
|
+
const attributes = jsxAttributes(node);
|
|
2055
|
+
const classAttribute = attributes.get("class") ?? attributes.get("className");
|
|
2056
|
+
if (!hasNonEmptyJsxAttribute(classAttribute)) return;
|
|
2057
|
+
const slot = THEMED_FLOATING_LAYER_SLOTS[component];
|
|
2058
|
+
diagnostics.push(diagnostic(context, classAttribute ?? node.tagName, this, `<${component}> received a class prop; this component is already fully styled via [data-slot="${slot}"] and isn't meant to be restyled per call site.`, "Customize the owning theme tokens, such as --ak-color-backdrop, --ak-radius-xl, or --ak-shadow-lg, instead of passing a class."));
|
|
2059
|
+
});
|
|
2060
|
+
}
|
|
2061
|
+
return diagnostics;
|
|
2062
|
+
}
|
|
2063
|
+
};
|
|
2064
|
+
const BLOCK_LAYOUT_AUTHORITY_NAMES = /* @__PURE__ */ new Set(["Block"]);
|
|
2065
|
+
const BLOCK_FLEX_LAYOUT_PROPS = [
|
|
2066
|
+
"direction",
|
|
2067
|
+
"align",
|
|
2068
|
+
"justify",
|
|
2069
|
+
"gap",
|
|
2070
|
+
"wrap"
|
|
2071
|
+
];
|
|
2072
|
+
const blockLayoutAuthorityConflictRule = {
|
|
2073
|
+
id: "askr/block-layout-authority-conflict",
|
|
2074
|
+
category: "correctness",
|
|
2075
|
+
severity: "warning",
|
|
2076
|
+
description: "Block should have one deliberate flex-layout authority.",
|
|
2077
|
+
analyze(context) {
|
|
2078
|
+
const diagnostics = [];
|
|
2079
|
+
for (const sourceFile of context.sourceFiles) {
|
|
2080
|
+
const bindings = sourceBindings(sourceFile);
|
|
2081
|
+
visit(sourceFile, (node) => {
|
|
2082
|
+
if (!ts.isJsxOpeningElement(node) && !ts.isJsxSelfClosingElement(node)) return;
|
|
2083
|
+
if (hasJsxSpreadAttribute(node)) return;
|
|
2084
|
+
const component = canonicalJsxName(node.tagName, bindings);
|
|
2085
|
+
if (!component || !BLOCK_LAYOUT_AUTHORITY_NAMES.has(component)) return;
|
|
2086
|
+
const attributes = jsxAttributes(node);
|
|
2087
|
+
const classAttribute = attributes.get("class") ?? attributes.get("className");
|
|
2088
|
+
if (!hasNonEmptyJsxAttribute(classAttribute)) return;
|
|
2089
|
+
const layoutProps = BLOCK_FLEX_LAYOUT_PROPS.filter((name) => attributes.has(name));
|
|
2090
|
+
if (layoutProps.length === 0) return;
|
|
2091
|
+
const classProp = attributes.has("class") ? "class" : "className";
|
|
2092
|
+
diagnostics.push(diagnostic(context, classAttribute ?? node.tagName, this, `<${component}> combines a CSS ${classProp} with layout props (${layoutProps.join(", ")}) on the same element; verify they agree, or drop one.`, "Pick one flex-layout authority: prefer the shared class when it is reused without props, or prefer Block props when the class is local and single-use."));
|
|
2093
|
+
});
|
|
2094
|
+
}
|
|
2095
|
+
return diagnostics;
|
|
2096
|
+
}
|
|
2097
|
+
};
|
|
2008
2098
|
function packageName(manifest) {
|
|
2009
2099
|
return typeof manifest.name === "string" ? manifest.name : "";
|
|
2010
2100
|
}
|
|
@@ -2041,6 +2131,8 @@ const ANALYZE_RULES = [
|
|
|
2041
2131
|
actionContractRule,
|
|
2042
2132
|
actionPromiseRule,
|
|
2043
2133
|
renderAllocationRule,
|
|
2134
|
+
noSlotStyleOverrideRule,
|
|
2135
|
+
blockLayoutAuthorityConflictRule,
|
|
2044
2136
|
{
|
|
2045
2137
|
id: "askr/no-hardcoded-theme-token",
|
|
2046
2138
|
category: "correctness",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { t as inspectBundledSkills } from "./skills-C72Z3-Cr.js";
|
|
2
2
|
import { discoverWorkspaceProject } from "./discovery-DUDrZCIC.js";
|
|
3
|
-
import { analysisHasBlockingFindings, runAnalysis } from "./runner-
|
|
3
|
+
import { analysisHasBlockingFindings, runAnalysis } from "./runner-ECEPm28G.js";
|
|
4
4
|
import fs from "node:fs/promises";
|
|
5
5
|
import path from "node:path";
|
|
6
6
|
import { spawn } from "node:child_process";
|
|
@@ -64,12 +64,12 @@ export default function AppLayout({ children }: { children?: unknown }) {
|
|
|
64
64
|
<ShellMain>
|
|
65
65
|
<Header position="sticky" class="app-header">
|
|
66
66
|
<Container size="full">
|
|
67
|
-
<Inline justify="between" align="center" gap="3" wrap
|
|
67
|
+
<Inline justify="between" align="center" gap="3" wrap>
|
|
68
68
|
<Stack gap="none">
|
|
69
69
|
<span class="eyebrow">Operations console</span>
|
|
70
70
|
<strong>Agent workflow control plane</strong>
|
|
71
71
|
</Stack>
|
|
72
|
-
<Inline gap="2" align="center" wrap
|
|
72
|
+
<Inline gap="2" align="center" wrap>
|
|
73
73
|
<Badge>event stream healthy</Badge>
|
|
74
74
|
<ThemeToggle
|
|
75
75
|
variant="ghost"
|
|
@@ -68,7 +68,7 @@ export default function AdminHomePage() {
|
|
|
68
68
|
|
|
69
69
|
{snapshot ? (
|
|
70
70
|
<>
|
|
71
|
-
<Block
|
|
71
|
+
<Block class="metric-grid">
|
|
72
72
|
{snapshot.metrics.map((metric) => (
|
|
73
73
|
<MetricCard
|
|
74
74
|
label={metric.label}
|
|
@@ -78,7 +78,7 @@ export default function AdminHomePage() {
|
|
|
78
78
|
))}
|
|
79
79
|
</Block>
|
|
80
80
|
|
|
81
|
-
<Block
|
|
81
|
+
<Block class="chart-grid">
|
|
82
82
|
<Card>
|
|
83
83
|
<CardHeader>
|
|
84
84
|
<CardTitle>Run throughput</CardTitle>
|
|
@@ -10,12 +10,12 @@ export default function AuthLayout({ children }: { children?: unknown }) {
|
|
|
10
10
|
<div class="auth-shell">
|
|
11
11
|
<Header position="sticky" class="auth-header">
|
|
12
12
|
<Container size="full">
|
|
13
|
-
<Inline justify="between" align="center" gap="3" wrap
|
|
13
|
+
<Inline justify="between" align="center" gap="3" wrap>
|
|
14
14
|
<Link href="/" class="brand-link">
|
|
15
15
|
<span class="brand-mark">A</span>
|
|
16
16
|
<strong>{'{{appName}}'}</strong>
|
|
17
17
|
</Link>
|
|
18
|
-
<Inline gap="2" align="center" wrap
|
|
18
|
+
<Inline gap="2" align="center" wrap>
|
|
19
19
|
<ThemeToggle
|
|
20
20
|
variant="ghost"
|
|
21
21
|
size="icon"
|
|
@@ -51,7 +51,7 @@ export default function HomePage() {
|
|
|
51
51
|
<>
|
|
52
52
|
<Section paddingY="2xl">
|
|
53
53
|
<Container size="xl">
|
|
54
|
-
<Block
|
|
54
|
+
<Block class="hero-grid">
|
|
55
55
|
<Stack gap="lg" class="hero-copy">
|
|
56
56
|
<Badge>Route-first Askr SPA</Badge>
|
|
57
57
|
<Stack gap="md">
|
|
@@ -63,7 +63,7 @@ export default function HomePage() {
|
|
|
63
63
|
system.
|
|
64
64
|
</p>
|
|
65
65
|
</Stack>
|
|
66
|
-
<Inline gap="3" wrap
|
|
66
|
+
<Inline gap="3" wrap>
|
|
67
67
|
<Button asChild>
|
|
68
68
|
<Link href="/login">
|
|
69
69
|
Open console <ArrowRightIcon size={16} aria-hidden="true" />
|
|
@@ -110,7 +110,7 @@ export default function HomePage() {
|
|
|
110
110
|
|
|
111
111
|
<Section paddingY="xl">
|
|
112
112
|
<Container size="xl">
|
|
113
|
-
<Block
|
|
113
|
+
<Block class="feature-grid">
|
|
114
114
|
{capabilities.map((item) => (
|
|
115
115
|
<Card>
|
|
116
116
|
<CardHeader>
|
|
@@ -23,12 +23,7 @@ export default function AppHeader() {
|
|
|
23
23
|
|
|
24
24
|
return (
|
|
25
25
|
<header class="app-header">
|
|
26
|
-
<Inline
|
|
27
|
-
class="app-header-content"
|
|
28
|
-
align="center"
|
|
29
|
-
justify="between"
|
|
30
|
-
wrap="wrap"
|
|
31
|
-
>
|
|
26
|
+
<Inline class="app-header-content" align="center" justify="between" wrap>
|
|
32
27
|
<div class="breadcrumbs">
|
|
33
28
|
<span>App</span>
|
|
34
29
|
<span aria-hidden="true">/</span>
|
|
@@ -6,7 +6,7 @@ export default function PageHeader(props: {
|
|
|
6
6
|
actions?: unknown;
|
|
7
7
|
}) {
|
|
8
8
|
return (
|
|
9
|
-
<Inline class="page-header" align="center" justify="between" wrap
|
|
9
|
+
<Inline class="page-header" align="center" justify="between" wrap>
|
|
10
10
|
<div class="page-header-copy">
|
|
11
11
|
<h1>{props.title}</h1>
|
|
12
12
|
<p>{props.description}</p>
|
|
@@ -147,7 +147,7 @@ export default function AccountsPage() {
|
|
|
147
147
|
errorText={accountsResource.error?.message ?? null}
|
|
148
148
|
/>
|
|
149
149
|
|
|
150
|
-
<Inline class="account-bulk-actions" align="center" wrap
|
|
150
|
+
<Inline class="account-bulk-actions" align="center" wrap>
|
|
151
151
|
<span class="muted">{selectedIdsState().length} selected</span>
|
|
152
152
|
|
|
153
153
|
<AlertDialog>
|
|
@@ -161,7 +161,7 @@ export default function AccountsPage() {
|
|
|
161
161
|
</AlertDialogTrigger>
|
|
162
162
|
<AlertDialogPortal>
|
|
163
163
|
<AlertDialogOverlay />
|
|
164
|
-
<AlertDialogContent
|
|
164
|
+
<AlertDialogContent>
|
|
165
165
|
<AlertDialogTitle>Archive selected accounts?</AlertDialogTitle>
|
|
166
166
|
<AlertDialogDescription>
|
|
167
167
|
This updates selected account records in the mock data source.
|
|
@@ -172,7 +172,7 @@ export default function SettingsPage() {
|
|
|
172
172
|
</Select>
|
|
173
173
|
</Field>
|
|
174
174
|
|
|
175
|
-
<Inline class="settings-example-actions" align="center" wrap
|
|
175
|
+
<Inline class="settings-example-actions" align="center" wrap>
|
|
176
176
|
<Button class="button-secondary" disabled>
|
|
177
177
|
Disabled action example
|
|
178
178
|
</Button>
|
|
@@ -183,7 +183,7 @@ export default function SettingsPage() {
|
|
|
183
183
|
</DialogTrigger>
|
|
184
184
|
<DialogPortal>
|
|
185
185
|
<DialogOverlay />
|
|
186
|
-
<DialogContent
|
|
186
|
+
<DialogContent>
|
|
187
187
|
<DialogTitle>Reset workspace preferences?</DialogTitle>
|
|
188
188
|
<DialogDescription>
|
|
189
189
|
This is a modal wiring example. Connect this to real
|
|
@@ -380,27 +380,10 @@
|
|
|
380
380
|
z-index: 30;
|
|
381
381
|
}
|
|
382
382
|
|
|
383
|
-
.app-toast
|
|
384
|
-
[data-slot='dialog-content'] {
|
|
383
|
+
.app-toast {
|
|
385
384
|
border: 1px solid var(--ak-color-border);
|
|
386
385
|
border-radius: var(--ak-radius-lg);
|
|
387
386
|
background: var(--ak-color-surface);
|
|
388
387
|
box-shadow: none;
|
|
389
388
|
}
|
|
390
|
-
|
|
391
|
-
[data-slot='dialog-overlay'] {
|
|
392
|
-
position: fixed;
|
|
393
|
-
inset: 0;
|
|
394
|
-
background: color-mix(in srgb, var(--ak-color-fg) 25%, transparent);
|
|
395
|
-
backdrop-filter: blur(2px);
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
[data-slot='dialog-content'] {
|
|
399
|
-
position: fixed;
|
|
400
|
-
inline-size: min(30rem, calc(100vw - 2rem));
|
|
401
|
-
inset-inline-start: 50%;
|
|
402
|
-
inset-block-start: 50%;
|
|
403
|
-
transform: translate(-50%, -50%);
|
|
404
|
-
z-index: 40;
|
|
405
|
-
}
|
|
406
389
|
}
|
package/dist/update.js
CHANGED
|
@@ -47,9 +47,10 @@ function parseArgs(command, args) {
|
|
|
47
47
|
else if (argument === "--") positionalOnly = true;
|
|
48
48
|
else if (argument === "--help" || argument === "-h") parsed.help = true;
|
|
49
49
|
else if (argument === "--json") parsed.json = true;
|
|
50
|
-
else if (argument === "--force" || argument === "-f")
|
|
51
|
-
|
|
52
|
-
|
|
50
|
+
else if (argument === "--force" || argument === "-f") {
|
|
51
|
+
if (command === "upgrade") parsed.force = true;
|
|
52
|
+
else parsed.errors.push(`${argument} is only supported by askr upgrade`);
|
|
53
|
+
} else if (argument === "--cwd") {
|
|
53
54
|
const value = optionValue(args, index, "--cwd", parsed.errors);
|
|
54
55
|
if (value !== null) {
|
|
55
56
|
parsed.cwd = path.resolve(value);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@askrjs/cli",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Unified CLI for the Askr platform",
|
|
5
5
|
"homepage": "https://github.com/askrjs/askr-cli#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -58,29 +58,29 @@
|
|
|
58
58
|
},
|
|
59
59
|
"dependencies": {
|
|
60
60
|
"@npmcli/config": "^11.0.1",
|
|
61
|
-
"js-yaml": "^5.
|
|
61
|
+
"js-yaml": "^5.3.0",
|
|
62
62
|
"minimatch": "^10.2.6",
|
|
63
63
|
"npm-registry-fetch": "^20.0.1",
|
|
64
64
|
"parse5": "^8.0.1",
|
|
65
65
|
"semver": "^7.8.5",
|
|
66
|
-
"tsx": "^4.23.
|
|
66
|
+
"tsx": "^4.23.12",
|
|
67
67
|
"typescript": "npm:@typescript/typescript6@^6.0.2"
|
|
68
68
|
},
|
|
69
69
|
"devDependencies": {
|
|
70
|
-
"@askrjs/askr": ">=0.2.
|
|
70
|
+
"@askrjs/askr": ">=0.2.2 <0.3.0",
|
|
71
71
|
"@askrjs/charts": ">=0.2.0 <0.3.0",
|
|
72
72
|
"@askrjs/logos": ">=0.2.0 <0.3.0",
|
|
73
73
|
"@askrjs/lucide": ">=0.2.0 <0.3.0",
|
|
74
|
-
"@askrjs/themes": ">=0.2.
|
|
75
|
-
"@askrjs/ui": ">=0.2.
|
|
74
|
+
"@askrjs/themes": ">=0.2.2 <0.3.0",
|
|
75
|
+
"@askrjs/ui": ">=0.2.1 <0.3.0",
|
|
76
76
|
"@askrjs/vite": ">=0.2.0 <0.3.0",
|
|
77
77
|
"@types/js-yaml": "^4.0.9",
|
|
78
78
|
"@types/node": "^26.2.0",
|
|
79
79
|
"@types/semver": "^7.8.0",
|
|
80
80
|
"@typescript/native": "npm:typescript@^7.0.2",
|
|
81
81
|
"@vitest/coverage-v8": "^4.1.10",
|
|
82
|
-
"publint": "^0.3.
|
|
83
|
-
"vite-plus": "0.2.
|
|
82
|
+
"publint": "^0.3.24",
|
|
83
|
+
"vite-plus": "0.2.9",
|
|
84
84
|
"vitest": "^4.1.10"
|
|
85
85
|
},
|
|
86
86
|
"peerDependencies": {
|