@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 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") if (index + 1 >= args.length || args[index + 1].startsWith("-")) parsed.errors.push("Missing value for --branch");
87
- else {
88
- parsed.branch = args[index + 1];
89
- index += 1;
90
- }
91
- else if (arg === "--cwd") if (index + 1 >= args.length || args[index + 1].startsWith("-")) parsed.errors.push("Missing value for --cwd");
92
- else {
93
- parsed.cwd = args[index + 1];
94
- index += 1;
95
- }
96
- else if (arg === "--title") if (index + 1 >= args.length || args[index + 1].startsWith("-")) parsed.errors.push("Missing value for --title");
97
- else {
98
- parsed.title = args[index + 1].trim();
99
- index += 1;
100
- }
101
- else if (arg === "--route") if (index + 1 >= args.length || args[index + 1].startsWith("-")) parsed.errors.push("Missing value for --route");
102
- else {
103
- parsed.routePath = args[index + 1].trim();
104
- index += 1;
105
- }
106
- else if (arg.startsWith("-")) parsed.errors.push(`Unknown option: ${arg}`);
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-CtcqO3cF.js")).runAnalysis)({
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-uLDOExsl.js");
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") if (i + 1 >= args.length || args[i + 1].startsWith("-")) errors.push("Missing value for --prompt");
568
- else {
569
- promptText = normalizePromptText(args[i + 1]);
570
- i += 1;
571
- }
572
- else if (arg === "--dir") if (i + 1 >= args.length || args[i + 1].startsWith("-")) errors.push("Missing value for --dir");
573
- else {
574
- targetDir = args[i + 1];
575
- i += 1;
576
- }
577
- else if (arg === "--help" || arg === "-h") help = true;
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-D_GIsgIj.js");
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) 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."));
1279
- else literalIds.set(idText, id);
1280
- else if (ts.isLiteralExpression(id)) diagnostics.push(diagnostic(context, id, this, "defineAction() id must be a string."));
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 ([...attributes.values()].some(ts.isJsxSpreadAttribute)) return;
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-CtcqO3cF.js";
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="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="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 gap="md" class="metric-grid">
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 gap="md" align="stretch" class="chart-grid">
81
+ <Block class="chart-grid">
82
82
  <Card>
83
83
  <CardHeader>
84
84
  <CardTitle>Run throughput</CardTitle>
@@ -60,7 +60,7 @@ export default function AgentRunsPage() {
60
60
  </Stack>
61
61
  </section>
62
62
 
63
- <Block gap="md" class="agent-grid">
63
+ <Block class="agent-grid">
64
64
  {runs.map((run) => (
65
65
  <Card>
66
66
  <CardHeader>
@@ -38,7 +38,7 @@ export default function SettingsPage() {
38
38
  </Stack>
39
39
  </section>
40
40
 
41
- <Block gap="md" align="start" class="settings-grid">
41
+ <Block class="settings-grid">
42
42
  <Card>
43
43
  <CardHeader>
44
44
  <CardTitle>API adapter</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="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="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 gap="lg" align="center" class="hero-grid">
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="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 gap="md" class="feature-grid">
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="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="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 class="panel stack-md">
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="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 class="panel stack-md">
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") if (command === "upgrade") parsed.force = true;
51
- else parsed.errors.push(`${argument} is only supported by askr upgrade`);
52
- else if (argument === "--cwd") {
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.0",
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.2.3",
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.11",
66
+ "tsx": "^4.23.12",
67
67
  "typescript": "npm:@typescript/typescript6@^6.0.2"
68
68
  },
69
69
  "devDependencies": {
70
- "@askrjs/askr": ">=0.2.0 <0.3.0",
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.0 <0.3.0",
75
- "@askrjs/ui": ">=0.2.0 <0.3.0",
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.23",
83
- "vite-plus": "0.2.8",
82
+ "publint": "^0.3.24",
83
+ "vite-plus": "0.2.9",
84
84
  "vitest": "^4.1.10"
85
85
  },
86
86
  "peerDependencies": {