vskill 0.5.106 → 0.5.108

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/README.md +109 -0
  2. package/agents.json +1 -1
  3. package/dist/commands/add.d.ts +36 -0
  4. package/dist/commands/add.js +149 -0
  5. package/dist/commands/add.js.map +1 -1
  6. package/dist/commands/cleanup.d.ts +6 -1
  7. package/dist/commands/cleanup.js +37 -5
  8. package/dist/commands/cleanup.js.map +1 -1
  9. package/dist/commands/disable.d.ts +8 -0
  10. package/dist/commands/disable.js +194 -0
  11. package/dist/commands/disable.js.map +1 -0
  12. package/dist/commands/enable.d.ts +11 -0
  13. package/dist/commands/enable.js +209 -0
  14. package/dist/commands/enable.js.map +1 -0
  15. package/dist/commands/eval/serve.js +18 -4
  16. package/dist/commands/eval/serve.js.map +1 -1
  17. package/dist/commands/list.d.ts +2 -0
  18. package/dist/commands/list.js +83 -1
  19. package/dist/commands/list.js.map +1 -1
  20. package/dist/commands/remove.d.ts +2 -0
  21. package/dist/commands/remove.js +84 -11
  22. package/dist/commands/remove.js.map +1 -1
  23. package/dist/eval/llm.js +7 -0
  24. package/dist/eval/llm.js.map +1 -1
  25. package/dist/eval-server/__tests__/helpers/skill-md-test-helpers.d.ts +1 -0
  26. package/dist/eval-server/__tests__/helpers/skill-md-test-helpers.js +16 -0
  27. package/dist/eval-server/__tests__/helpers/skill-md-test-helpers.js.map +1 -0
  28. package/dist/eval-server/api-routes.d.ts +20 -2
  29. package/dist/eval-server/api-routes.js +339 -38
  30. package/dist/eval-server/api-routes.js.map +1 -1
  31. package/dist/eval-server/eval-server.js +9 -6
  32. package/dist/eval-server/eval-server.js.map +1 -1
  33. package/dist/eval-server/improve-routes.js +50 -2
  34. package/dist/eval-server/improve-routes.js.map +1 -1
  35. package/dist/eval-server/platform-proxy.d.ts +22 -0
  36. package/dist/eval-server/platform-proxy.js +53 -4
  37. package/dist/eval-server/platform-proxy.js.map +1 -1
  38. package/dist/eval-server/providers.js +4 -1
  39. package/dist/eval-server/providers.js.map +1 -1
  40. package/dist/eval-server/settings-store.js +19 -1
  41. package/dist/eval-server/settings-store.js.map +1 -1
  42. package/dist/eval-server/skill-create-routes.d.ts +7 -0
  43. package/dist/eval-server/skill-create-routes.js +92 -17
  44. package/dist/eval-server/skill-create-routes.js.map +1 -1
  45. package/dist/eval-server/studio-json.js +12 -3
  46. package/dist/eval-server/studio-json.js.map +1 -1
  47. package/dist/eval-ui/assets/{CommandPalette-COqdrmRl.js → CommandPalette-mzfSdGtx.js} +1 -1
  48. package/dist/eval-ui/assets/CreateSkillPage-CjeJOSY4.js +12 -0
  49. package/dist/eval-ui/assets/{UpdateDropdown-DnKKMBBN.js → UpdateDropdown-QP4FPm7W.js} +1 -1
  50. package/dist/eval-ui/assets/index-BBoVqs6V.css +1 -0
  51. package/dist/eval-ui/assets/index-CKclbM8p.js +102 -0
  52. package/dist/eval-ui/index.html +2 -2
  53. package/dist/index.js +38 -2
  54. package/dist/index.js.map +1 -1
  55. package/dist/lib/skill-lifecycle.d.ts +78 -0
  56. package/dist/lib/skill-lifecycle.js +136 -0
  57. package/dist/lib/skill-lifecycle.js.map +1 -0
  58. package/dist/utils/version.d.ts +13 -0
  59. package/dist/utils/version.js +29 -0
  60. package/dist/utils/version.js.map +1 -1
  61. package/package.json +2 -1
  62. package/dist/eval-ui/assets/CreateSkillPage-C3IjO8es.js +0 -12
  63. package/dist/eval-ui/assets/index-Dmja1p3A.css +0 -1
  64. package/dist/eval-ui/assets/index-KIcQ5e5a.js +0 -102
@@ -46,8 +46,8 @@
46
46
  }
47
47
  })();
48
48
  </script>
49
- <script type="module" crossorigin src="/assets/index-KIcQ5e5a.js"></script>
50
- <link rel="stylesheet" crossorigin href="/assets/index-Dmja1p3A.css">
49
+ <script type="module" crossorigin src="/assets/index-CKclbM8p.js"></script>
50
+ <link rel="stylesheet" crossorigin href="/assets/index-BBoVqs6V.css">
51
51
  <link rel="stylesheet" crossorigin href="/assets/fonts-i7Lkz2zN.css">
52
52
  </head>
53
53
  <body>
package/dist/index.js CHANGED
@@ -28,11 +28,41 @@ program
28
28
  .option("--copy", "Install as independent copies instead of symlinks (default: symlink)")
29
29
  .option("--select", "Interactively select skills and agents (default: install all)")
30
30
  .option("--only-skills <names>", "Only install specific skills from a plugin (comma-separated)")
31
+ // 0724 T-006: opt out of the claude-plugin enable step (file extraction + lockfile only)
32
+ .option("--no-enable", "Install skill files + lockfile entry but skip claude plugin install (skill is on disk but not enabled)")
33
+ // 0724 T-006: explicit user|project scope (mirrors enable/disable). Default behaviour preserved when neither is passed.
34
+ .option("--scope <scope>", "Plugin enable scope: user|project (default mirrors --global)")
35
+ // 0724 T-006: dry-run preview of the would-be invocations
36
+ .option("--dry-run", "Preview install / enable invocations without executing them")
31
37
  .option("-y, --yes", "Skip all prompts, use defaults (all skills, all agents, project scope, symlink)")
32
38
  .action(async (source, opts) => {
33
39
  const { addCommand } = await import("./commands/add.js");
34
40
  await addCommand(source, opts);
35
41
  });
42
+ // 0724 T-002: enable a previously-installed skill (flip enabledPlugins back on).
43
+ program
44
+ .command("enable <name>")
45
+ .description("Enable a previously-installed skill in Claude Code (flip enabledPlugins on)")
46
+ .option("--scope <scope>", "Settings scope: user|project (default: user)", "user")
47
+ .option("--dry-run", "Print the claude plugin install invocation without running it")
48
+ .option("-V, --verbose", "Verbose output (resolved paths, exit codes)")
49
+ .option("--json", "Emit machine-readable JSON")
50
+ .action(async (name, opts) => {
51
+ const { enableCommand } = await import("./commands/enable.js");
52
+ await enableCommand(name, opts);
53
+ });
54
+ // 0724 T-002: disable an installed skill without removing files.
55
+ program
56
+ .command("disable <name>")
57
+ .description("Disable a skill in Claude Code (remove enabledPlugins entry; on-disk files untouched)")
58
+ .option("--scope <scope>", "Settings scope: user|project (default: user)", "user")
59
+ .option("--dry-run", "Print the claude plugin uninstall invocation without running it")
60
+ .option("-V, --verbose", "Verbose output (resolved paths, exit codes)")
61
+ .option("--json", "Emit machine-readable JSON")
62
+ .action(async (name, opts) => {
63
+ const { disableCommand } = await import("./commands/disable.js");
64
+ await disableCommand(name, opts);
65
+ });
36
66
  program
37
67
  .command("init")
38
68
  .description("Detect installed AI agents, create lockfile, and sync core skills")
@@ -52,6 +82,8 @@ program
52
82
  .command("list")
53
83
  .description("List installed skills or detected agents")
54
84
  .option("--agents", "Show all 39 known agents with installed status")
85
+ // 0724 T-005: per-scope enable status table joining lockfile with settings.json reads.
86
+ .option("--installed", "Show installed skills with enabled/disabled status per scope")
55
87
  .option("--json", "Output as JSON")
56
88
  .action(async (opts) => {
57
89
  const { listCommand } = await import("./commands/list.js");
@@ -63,6 +95,8 @@ program
63
95
  .option("--global", "Only remove from global agent directories")
64
96
  .option("--local", "Only remove from local agent directories")
65
97
  .option("--force", "Skip confirmation and proceed even if not in lockfile")
98
+ // 0724 T-007: structured per-agent JSON output (matches enable/disable shape).
99
+ .option("--json", "Emit machine-readable JSON of the per-agent action report")
66
100
  .action(async (skillName, opts) => {
67
101
  const { removeCommand } = await import("./commands/remove.js");
68
102
  await removeCommand(skillName, opts);
@@ -200,9 +234,11 @@ program
200
234
  program
201
235
  .command("cleanup")
202
236
  .description("Remove stale plugin entries from settings.json and orphaned cache")
203
- .action(async () => {
237
+ // 0724 T-008: preview the would-be uninstall invocations + reconciliation summary.
238
+ .option("--dry-run", "Preview stale plugin uninstalls without executing them")
239
+ .action(async (opts) => {
204
240
  const { cleanupCommand } = await import("./commands/cleanup.js");
205
- await cleanupCommand();
241
+ await cleanupCommand(opts);
206
242
  });
207
243
  program
208
244
  .command("pin <skill> [version]")
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ import type { SkillLockEntry } from "../lockfile/types.js";
2
+ import type { AgentDefinition } from "../agents/agents-registry.js";
3
+ /**
4
+ * How an agent surface receives a skill enablement.
5
+ *
6
+ * - "claude-code-style": the agent reads `enabledPlugins` from a
7
+ * settings.json file (today, only Claude Code), so toggling requires a
8
+ * `claude plugin install/uninstall` invocation.
9
+ * - "auto-discover": the agent picks up skills by scanning its
10
+ * `localSkillsDir` / `globalSkillsDir`, so there is nothing to toggle —
11
+ * `vskill remove <name>` is the only way to un-load such a skill.
12
+ */
13
+ export type AgentSurfaceClass = "claude-code-style" | "auto-discover";
14
+ /**
15
+ * The lifecycle action that produced the report row.
16
+ *
17
+ * Drives the wording in the human-readable line. Machine consumers should
18
+ * read the structured `action` field rather than parsing the string.
19
+ */
20
+ export type LifecycleAction = "enabled" | "already-enabled" | "disabled" | "already-disabled" | "not-applicable";
21
+ export interface PerAgentReportEntry {
22
+ /** Agent id (e.g. "claude-code") */
23
+ id: string;
24
+ /** Display name (e.g. "Claude Code") */
25
+ displayName: string;
26
+ /** Whether this agent uses enabledPlugins or auto-discovers from disk */
27
+ surface: AgentSurfaceClass;
28
+ /** The lifecycle action that resolved for this agent */
29
+ action: LifecycleAction;
30
+ /** Pre-formatted human-readable line, e.g. "Claude Code (user) — enabled via claude CLI" */
31
+ line: string;
32
+ }
33
+ export interface BuildPerAgentReportOptions {
34
+ /** Skill name (used for log context, not currently embedded in the line). */
35
+ skill: string;
36
+ /** Target scope of the operation. */
37
+ scope: "user" | "project";
38
+ /** The action that triggered the report. Auto-discover agents always map to `not-applicable` for enable/disable actions. */
39
+ action: LifecycleAction;
40
+ /** The list of agents detected on the local machine. */
41
+ agents: AgentDefinition[];
42
+ }
43
+ /**
44
+ * Compute the plugin id used by the claude CLI.
45
+ *
46
+ * Format: `<skillName>@<marketplace>`. Returns `null` when the lockfile
47
+ * entry has no `marketplace` field (or it is empty), which signals that the
48
+ * skill is auto-discovered and there is no plugin entry to enable / disable.
49
+ *
50
+ * Parameter type is narrowed to `Pick<SkillLockEntry, 'marketplace'>` so
51
+ * callers that only have a partial entry shape (e.g. enableAfterInstall in
52
+ * add.ts) don't need to cast — the function only ever reads `marketplace`.
53
+ */
54
+ export declare function resolvePluginId(skillName: string, entry: Pick<SkillLockEntry, "marketplace">): string | null;
55
+ /**
56
+ * Decide whether an agent uses settings.json's enabledPlugins (claude-code
57
+ * style) or auto-discovers skills from its skills dir.
58
+ *
59
+ * Today the only `claude-code-style` agent is `claude-code` itself. Every
60
+ * other agent in the registry auto-discovers from its `localSkillsDir` /
61
+ * `globalSkillsDir`, so toggling a skill there is a no-op (the only way to
62
+ * un-load it is to delete the files via `vskill remove`).
63
+ *
64
+ * Kept as a function rather than a flag on `AgentDefinition` so we don't
65
+ * have to mutate 53 registry rows just for this one branching point — and
66
+ * so we can extend the rule (e.g. another agent ships its own settings.json)
67
+ * without a registry migration.
68
+ */
69
+ export declare function classifyAgentSurface(agent: AgentDefinition): AgentSurfaceClass;
70
+ /**
71
+ * Walk the supplied agent list and produce one PerAgentReportEntry per
72
+ * agent. Used by `enable`, `disable`, `install`, and `remove` for both
73
+ * human-readable and JSON output.
74
+ *
75
+ * Pure — does not detect agents, does not read settings.json. Callers must
76
+ * pass the already-detected list (via `detectInstalledAgents()`).
77
+ */
78
+ export declare function buildPerAgentReport(opts: BuildPerAgentReportOptions): PerAgentReportEntry[];
@@ -0,0 +1,136 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Skill lifecycle helpers (0724 T-001)
3
+ //
4
+ // Pure functions used by the install / enable / disable surface to:
5
+ // - resolve a `<skillName>@<marketplace>` plugin id from a lockfile entry
6
+ // - classify each agent surface into "claude-code-style" (uses
7
+ // enabledPlugins in settings.json) or "auto-discover" (just reads its
8
+ // skills dir on the filesystem)
9
+ // - build a per-agent report ({id, displayName, surface, line, action})
10
+ // that drives both human-readable and JSON output on enable/disable/
11
+ // install/remove.
12
+ //
13
+ // All functions are pure — no I/O, no subprocess, no fs. Heavy lifting (the
14
+ // actual `claude plugin install/uninstall` invocation, lockfile read/write,
15
+ // settings.json read) is the caller's responsibility.
16
+ // ---------------------------------------------------------------------------
17
+ // ---------------------------------------------------------------------------
18
+ // resolvePluginId
19
+ // ---------------------------------------------------------------------------
20
+ /**
21
+ * Compute the plugin id used by the claude CLI.
22
+ *
23
+ * Format: `<skillName>@<marketplace>`. Returns `null` when the lockfile
24
+ * entry has no `marketplace` field (or it is empty), which signals that the
25
+ * skill is auto-discovered and there is no plugin entry to enable / disable.
26
+ *
27
+ * Parameter type is narrowed to `Pick<SkillLockEntry, 'marketplace'>` so
28
+ * callers that only have a partial entry shape (e.g. enableAfterInstall in
29
+ * add.ts) don't need to cast — the function only ever reads `marketplace`.
30
+ */
31
+ export function resolvePluginId(skillName, entry) {
32
+ if (!entry.marketplace || entry.marketplace.length === 0) {
33
+ return null;
34
+ }
35
+ return `${skillName}@${entry.marketplace}`;
36
+ }
37
+ // ---------------------------------------------------------------------------
38
+ // classifyAgentSurface
39
+ // ---------------------------------------------------------------------------
40
+ /**
41
+ * Decide whether an agent uses settings.json's enabledPlugins (claude-code
42
+ * style) or auto-discovers skills from its skills dir.
43
+ *
44
+ * Today the only `claude-code-style` agent is `claude-code` itself. Every
45
+ * other agent in the registry auto-discovers from its `localSkillsDir` /
46
+ * `globalSkillsDir`, so toggling a skill there is a no-op (the only way to
47
+ * un-load it is to delete the files via `vskill remove`).
48
+ *
49
+ * Kept as a function rather than a flag on `AgentDefinition` so we don't
50
+ * have to mutate 53 registry rows just for this one branching point — and
51
+ * so we can extend the rule (e.g. another agent ships its own settings.json)
52
+ * without a registry migration.
53
+ */
54
+ export function classifyAgentSurface(agent) {
55
+ if (agent.id === "claude-code")
56
+ return "claude-code-style";
57
+ return "auto-discover";
58
+ }
59
+ // ---------------------------------------------------------------------------
60
+ // buildPerAgentReport
61
+ // ---------------------------------------------------------------------------
62
+ function lineFor(agent, surface, action, scope) {
63
+ if (surface === "claude-code-style") {
64
+ switch (action) {
65
+ case "enabled":
66
+ return {
67
+ action: "enabled",
68
+ line: `${agent.displayName} (${scope}) — enabled via claude CLI`,
69
+ };
70
+ case "already-enabled":
71
+ return {
72
+ action: "already-enabled",
73
+ line: `${agent.displayName} (${scope}) — already enabled`,
74
+ };
75
+ case "disabled":
76
+ return {
77
+ action: "disabled",
78
+ line: `${agent.displayName} (${scope}) — disabled via claude CLI`,
79
+ };
80
+ case "already-disabled":
81
+ return {
82
+ action: "already-disabled",
83
+ line: `${agent.displayName} (${scope}) — already disabled`,
84
+ };
85
+ case "not-applicable":
86
+ return {
87
+ action: "not-applicable",
88
+ line: `${agent.displayName} (${scope}) — not applicable`,
89
+ };
90
+ }
91
+ }
92
+ // auto-discover surfaces never need an explicit enable/disable.
93
+ // Map enable/disable to `not-applicable` so machine consumers can detect
94
+ // the no-op uniformly.
95
+ switch (action) {
96
+ case "enabled":
97
+ case "already-enabled":
98
+ return {
99
+ action: "not-applicable",
100
+ line: `${agent.displayName} — auto-discovers from ${agent.localSkillsDir} (no plugin enable needed)`,
101
+ };
102
+ case "disabled":
103
+ case "already-disabled":
104
+ return {
105
+ action: "not-applicable",
106
+ line: `${agent.displayName} — auto-discovers from ${agent.localSkillsDir} (no plugin entry to disable; run vskill remove to stop loading)`,
107
+ };
108
+ case "not-applicable":
109
+ return {
110
+ action: "not-applicable",
111
+ line: `${agent.displayName} — auto-discovers (not applicable)`,
112
+ };
113
+ }
114
+ }
115
+ /**
116
+ * Walk the supplied agent list and produce one PerAgentReportEntry per
117
+ * agent. Used by `enable`, `disable`, `install`, and `remove` for both
118
+ * human-readable and JSON output.
119
+ *
120
+ * Pure — does not detect agents, does not read settings.json. Callers must
121
+ * pass the already-detected list (via `detectInstalledAgents()`).
122
+ */
123
+ export function buildPerAgentReport(opts) {
124
+ return opts.agents.map((agent) => {
125
+ const surface = classifyAgentSurface(agent);
126
+ const { action, line } = lineFor(agent, surface, opts.action, opts.scope);
127
+ return {
128
+ id: agent.id,
129
+ displayName: agent.displayName,
130
+ surface,
131
+ action,
132
+ line,
133
+ };
134
+ });
135
+ }
136
+ //# sourceMappingURL=skill-lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-lifecycle.js","sourceRoot":"","sources":["../../src/lib/skill-lifecycle.ts"],"names":[],"mappings":"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"}
@@ -20,3 +20,16 @@ export declare function resolveVersion(opts: {
20
20
  hashChanged: boolean;
21
21
  isFirstInstall: boolean;
22
22
  }): string;
23
+ /**
24
+ * Set or insert the `version:` field inside SKILL.md frontmatter.
25
+ *
26
+ * Behavior:
27
+ * - If frontmatter exists and contains `version:` → replace its value.
28
+ * - If frontmatter exists but has no `version:` → insert as the first field.
29
+ * - If no frontmatter at all → prepend a minimal `---\nversion: "X"\n---` block.
30
+ *
31
+ * The version is always emitted quoted to match the convention used by
32
+ * skill-create-routes' buildSkillMd emitter and to keep YAML parsers happy
33
+ * for non-numeric semver strings.
34
+ */
35
+ export declare function setFrontmatterVersion(content: string, version: string): string;
@@ -46,4 +46,33 @@ export function resolveVersion(opts) {
46
46
  }
47
47
  return "1.0.0";
48
48
  }
49
+ /**
50
+ * Set or insert the `version:` field inside SKILL.md frontmatter.
51
+ *
52
+ * Behavior:
53
+ * - If frontmatter exists and contains `version:` → replace its value.
54
+ * - If frontmatter exists but has no `version:` → insert as the first field.
55
+ * - If no frontmatter at all → prepend a minimal `---\nversion: "X"\n---` block.
56
+ *
57
+ * The version is always emitted quoted to match the convention used by
58
+ * skill-create-routes' buildSkillMd emitter and to keep YAML parsers happy
59
+ * for non-numeric semver strings.
60
+ */
61
+ export function setFrontmatterVersion(content, version) {
62
+ const fmMatch = content.match(/^(---\s*\n)([\s\S]*?)(\n---)/);
63
+ if (!fmMatch) {
64
+ return `---\nversion: "${version}"\n---\n\n${content}`;
65
+ }
66
+ const [, openFence, body, closeFence] = fmMatch;
67
+ const versionLineRe = /^version:\s*"?[^\n]*"?\s*$/m;
68
+ let newBody;
69
+ if (versionLineRe.test(body)) {
70
+ newBody = body.replace(versionLineRe, `version: "${version}"`);
71
+ }
72
+ else {
73
+ // Insert version as the first frontmatter line so it's stable + obvious.
74
+ newBody = `version: "${version}"\n${body}`;
75
+ }
76
+ return content.replace(fmMatch[0], `${openFence}${newBody}${closeFence}`);
77
+ }
49
78
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/utils/version.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,yCAAyC;AACzC,8EAA8E;AAE9E,MAAM,SAAS,GAAG,iBAAiB,CAAC;AAEpC;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CACvC,OAAe;IAEf,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC1D,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAE/B,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,CACpC,6BAA6B,CAC9B,CAAC;IACF,IAAI,CAAC,YAAY;QAAE,OAAO,SAAS,CAAC;IAEpC,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAChC,OAAO,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;IACzC,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC;AAC5C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,IAM9B;IACC,IAAI,IAAI,CAAC,aAAa;QAAE,OAAO,IAAI,CAAC,aAAa,CAAC;IAClD,IAAI,IAAI,CAAC,kBAAkB;QAAE,OAAO,IAAI,CAAC,kBAAkB,CAAC;IAE5D,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,WAAW;YACrB,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC;YAChC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;IAC1B,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/utils/version.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,yCAAyC;AACzC,8EAA8E;AAE9E,MAAM,SAAS,GAAG,iBAAiB,CAAC;AAEpC;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CACvC,OAAe;IAEf,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC1D,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAE/B,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,CACpC,6BAA6B,CAC9B,CAAC;IACF,IAAI,CAAC,YAAY;QAAE,OAAO,SAAS,CAAC;IAEpC,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAChC,OAAO,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;IACzC,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC;AAC5C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,IAM9B;IACC,IAAI,IAAI,CAAC,aAAa;QAAE,OAAO,IAAI,CAAC,aAAa,CAAC;IAClD,IAAI,IAAI,CAAC,kBAAkB;QAAE,OAAO,IAAI,CAAC,kBAAkB,CAAC;IAE5D,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,WAAW;YACrB,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC;YAChC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;IAC1B,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAe,EAAE,OAAe;IACpE,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC9D,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,kBAAkB,OAAO,aAAa,OAAO,EAAE,CAAC;IACzD,CAAC;IAED,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,CAAC,GAAG,OAAO,CAAC;IAChD,MAAM,aAAa,GAAG,6BAA6B,CAAC;IACpD,IAAI,OAAe,CAAC;IACpB,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,aAAa,OAAO,GAAG,CAAC,CAAC;IACjE,CAAC;SAAM,CAAC;QACN,yEAAyE;QACzE,OAAO,GAAG,aAAa,OAAO,MAAM,IAAI,EAAE,CAAC;IAC7C,CAAC;IAED,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,EAAE,CAAC,CAAC;AAC5E,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vskill",
3
- "version": "0.5.106",
3
+ "version": "0.5.108",
4
4
  "type": "module",
5
5
  "description": "Secure multi-platform AI skill installer — scan before you install",
6
6
  "bin": {
@@ -65,6 +65,7 @@
65
65
  "@types/react": "^19.2.14",
66
66
  "@types/react-dom": "^19.2.3",
67
67
  "@vitejs/plugin-react": "^4.7.0",
68
+ "@vitest/coverage-v8": "^3.2.4",
68
69
  "axe-core": "^4.11.3",
69
70
  "react": "^19.2.4",
70
71
  "react-dom": "^19.2.4",
@@ -1,12 +0,0 @@
1
- import{j as e,u as H,a as O,R as G,r as c,g as E,b as R,w as _,c as $,t as j,L as S,P as q,E as U,d as K,S as Y}from"./index-KIcQ5e5a.js";/* empty css */const V=[{key:"slashCommands",label:"Slash"},{key:"hooks",label:"Hooks"},{key:"mcp",label:"MCP"},{key:"customSystemPrompt",label:"Prompt"}];function Q({supported:l,label:a}){return e.jsx("span",{style:{display:"inline-block",fontSize:10,padding:"1px 5px",borderRadius:3,marginRight:3,background:l?"var(--color-success-bg, #d4edda)":"var(--surface-3, #2a2a2a)",color:l?"var(--color-success, #28a745)":"var(--text-tertiary, #666)",border:`1px solid ${l?"var(--color-success, #28a745)":"var(--border-subtle, #333)"}`},children:a})}function T({agent:l,checked:a,onToggle:x}){return e.jsxs("label",{style:{display:"flex",alignItems:"center",gap:8,padding:"6px 8px",borderRadius:6,cursor:"pointer",border:l.installed?"1px solid var(--color-primary, #6366f1)":"1px solid var(--border-subtle, #333)",background:a?"var(--surface-2, #1e1e1e)":"transparent"},children:[e.jsx("input",{type:"checkbox",checked:a,onChange:x,style:{accentColor:"var(--color-primary, #6366f1)"}}),e.jsxs("div",{style:{flex:1},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:6},children:[e.jsx("span",{style:{fontWeight:500,fontSize:13,color:"var(--text-primary, #fff)"},children:l.displayName}),l.installed&&e.jsx("span",{style:{fontSize:10,padding:"1px 5px",borderRadius:3,background:"var(--color-primary-bg, #312e81)",color:"var(--color-primary, #6366f1)"},children:"installed"})]}),e.jsx("div",{style:{marginTop:3},children:V.map(i=>e.jsx(Q,{supported:l.featureSupport[i.key],label:i.label},i.key))})]})]})}function Z({agents:l,selectedIds:a,onChange:x}){const i=new Set(a),g=l.filter(o=>o.isUniversal),v=l.filter(o=>!o.isUniversal),m=o=>{const h=i.has(o)?a.filter(b=>b!==o):[...a,o];x(h)};return e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:12},children:[g.length>0&&e.jsxs("div",{children:[e.jsx("div",{style:{fontSize:11,fontWeight:600,textTransform:"uppercase",letterSpacing:"0.05em",color:"var(--text-tertiary, #999)",marginBottom:6},children:"Universal Agents"}),e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:4},children:g.map(o=>e.jsx(T,{agent:o,checked:i.has(o.id),onToggle:()=>m(o.id)},o.id))})]}),v.length>0&&e.jsxs("div",{children:[e.jsx("div",{style:{fontSize:11,fontWeight:600,textTransform:"uppercase",letterSpacing:"0.05em",color:"var(--text-tertiary, #999)",marginBottom:6},children:"Other Agents"}),e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:4},children:v.map(o=>e.jsx(T,{agent:o,checked:i.has(o.id),onToggle:()=>m(o.id)},o.id))})]})]})}const p={background:"var(--surface-3)",color:"var(--text-primary)",border:"1px solid var(--border-subtle)"};function J(l){return l?/API usage limits|usage limit/i.test(l)&&/regain access|reset/i.test(l):!1}function X(l){const a=l.match(/regain access on ([^"\\]+?)(?:\s*UTC)?["\\]/i)??l.match(/regain access on ([^"\\]+)/i);return a?`Resets ${a[1].trim()} UTC`:"Quota resets at the start of your next billing period"}function k(l){switch(l){case"claude-cli":return"Uses your logged-in Claude Code session (Pro/Max subscription). No API key. When your quota runs out, excess usage is billed at API rates if you've enabled extra usage.";case"anthropic":return"Direct Anthropic API — pay-per-token. Full Opus / Sonnet / Haiku catalog. Requires ANTHROPIC_API_KEY.";case"openrouter":return"One API key → 300+ models from Anthropic, OpenAI (GPT-5 / o4-mini), Google (Gemini), Meta (Llama) and more. Same prices as direct.";case"ollama":return"Local models on your machine (Llama, Qwen, Mistral, etc.). Zero cost, zero data leaves your laptop.";case"lm-studio":return"Local models via LM Studio's OpenAI-compatible server. Works offline. Pick any model you've loaded in LM Studio.";default:return""}}function L({size:l=14,color:a="currentColor"}){return e.jsx("svg",{width:l,height:l,viewBox:"0 0 24 24",fill:"none",stroke:a,strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:e.jsx("path",{d:"M12 3l1.912 5.813a2 2 0 001.275 1.275L21 12l-5.813 1.912a2 2 0 00-1.275 1.275L12 21l-1.912-5.813a2 2 0 00-1.275-1.275L3 12l5.813-1.912a2 2 0 001.275-1.275L12 3z"})})}function te(){const l=H(),{config:a}=O(),x=G.useMemo(()=>{if(typeof window>"u")return{};const t=window.location.hash,s=t.indexOf("?");if(s===-1)return{};const u=new URLSearchParams(t.slice(s+1)),d={};for(const n of["mode","skillName","description","pluginName"]){const f=u.get(n);f&&(d[n]=f)}return d},[]),[i,g]=c.useState("claude-cli"),[v,m]=c.useState("sonnet"),[o,h]=c.useState(!1),[b,P]=c.useState(null),w=c.useRef(!1),[C,I]=c.useState([]),[F,z]=c.useState(()=>E("activeAgent",null));c.useEffect(()=>{function t(){z(E("activeAgent",null))}return window.addEventListener("studio:agent-changed",t),window.addEventListener("storage",t),()=>{window.removeEventListener("studio:agent-changed",t),window.removeEventListener("storage",t)}},[]);const B=F!=="claude-code";c.useEffect(()=>{fetch("/api/agents/installed").then(t=>t.json()).then(t=>{t.agents&&I(t.agents)}).catch(()=>{})},[]),c.useEffect(()=>{var d;if(!a)return;const t=a.providers.filter(n=>n.available),s=R().skillGenModel;if(t.length===0){w.current=!0;return}if(s&&typeof s=="object"&&typeof s.provider=="string"&&typeof s.model=="string"){const n=t.find(N=>N.id===s.provider),f=n==null?void 0:n.models.some(N=>N.id===s.model);if(n&&f){g(s.provider),m(s.model),h(!0),w.current=!0;return}P({provider:s.provider,model:s.model})}if(t.find(n=>n.id==="claude-cli"))g("claude-cli"),m("sonnet");else{const n=t[0];g(n.id),m(((d=n.models[0])==null?void 0:d.id)??"")}h(!1),w.current=!0},[a]),c.useEffect(()=>{const t=s=>{if(s.key!==null&&!s.key.includes("vskill.studio.prefs"))return;const d=R().skillGenModel;d&&typeof d=="object"&&typeof d.provider=="string"&&typeof d.model=="string"&&(g(d.provider),m(d.model),h(!0))};return window.addEventListener("storage",t),()=>window.removeEventListener("storage",t)},[]);const A=c.useCallback((t,s)=>{_("skillGenModel",{provider:t,model:s}),h(!0)},[]),D=c.useCallback(()=>({provider:i,model:v}),[i,v]),W=x.mode==="standalone"?3:void 0,r=$({onCreated:(t,s)=>l(`/skills/${t}/${s}`),resolveAiConfigOverride:D,forceLayout:W});c.useEffect(()=>{x.skillName&&!r.name&&r.setName(j(x.skillName)),x.description&&!r.description&&r.setDescription(x.description),x.description&&!r.aiPrompt&&r.setAiPrompt(x.description),x.pluginName&&!r.plugin&&r.setPlugin(j(x.pluginName))},[]);const y=a==null?void 0:a.providers.find(t=>t.id===i&&t.available),M=c.useMemo(()=>{const t=["---"];return r.description?t.push(`description: "${r.description.replace(/"/g,'\\"')}"`):t.push('description: ""'),r.allowedTools.trim()&&t.push(`allowed-tools: ${r.allowedTools.trim()}`),r.model&&t.push(`model: ${r.model}`),r.targetAgents.length>0&&t.push(`target-agents: ${r.targetAgents.join(", ")}`),t.push("---"),t.push(""),r.body.trim()?t.push(r.body.trim()):(t.push(`# /${r.name||"skill-name"}`),t.push(""),t.push("You are a helpful assistant.")),t.join(`
2
- `)},[r.name,r.description,r.model,r.allowedTools,r.body]);return e.jsxs("div",{className:"px-4 py-6 sm:px-6 sm:py-7 lg:px-10 lg:py-8 max-w-6xl",children:[e.jsxs("div",{className:"mb-6",children:[e.jsxs("div",{className:"flex items-center gap-2 text-[12px] mb-3",style:{color:"var(--text-tertiary)"},children:[e.jsx(S,{to:"/",className:"hover:underline",style:{color:"var(--text-tertiary)"},children:"Skills"}),e.jsx("span",{children:"/"}),e.jsx("span",{style:{color:"var(--text-secondary)"},children:"New Skill"})]}),e.jsxs("div",{className:"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("h2",{className:"text-[22px] font-semibold tracking-tight",style:{color:"var(--text-primary)"},children:"Create a New Skill"}),e.jsx("p",{className:"text-[13px] mt-1",style:{color:"var(--text-tertiary)"},children:"Define your skill's metadata, content, and placement"})]}),e.jsxs("div",{className:"inline-flex rounded-lg p-1 self-start sm:self-auto sm:flex-shrink-0",style:{background:"var(--surface-2)",border:"1px solid var(--border-subtle)"},children:[e.jsx("button",{onClick:()=>r.setMode("ai"),className:"px-4 py-2 rounded-md text-[13px] font-medium transition-all duration-200",style:{background:r.mode==="ai"?"var(--purple-muted)":"transparent",color:r.mode==="ai"?"var(--purple)":"var(--text-tertiary)",boxShadow:r.mode==="ai"?"0 1px 3px rgba(0,0,0,0.08)":"none"},children:e.jsxs("span",{className:"flex items-center gap-1.5",children:[e.jsx(L,{size:14}),"AI-Assisted"]})}),e.jsx("button",{onClick:()=>r.setMode("manual"),className:"px-4 py-2 rounded-md text-[13px] font-medium transition-all duration-200",style:{background:r.mode==="manual"?"var(--surface-4, var(--surface-3))":"transparent",color:r.mode==="manual"?"var(--text-primary)":"var(--text-tertiary)",boxShadow:r.mode==="manual"?"0 1px 3px rgba(0,0,0,0.1)":"none"},children:"Manual"})]})]})]}),r.layoutLoading&&e.jsxs("div",{className:"space-y-3",children:[e.jsx("div",{className:"skeleton h-10 w-full rounded-lg"}),e.jsx("div",{className:"skeleton h-10 w-full rounded-lg"}),e.jsx("div",{className:"skeleton h-10 w-full rounded-lg"})]}),!r.layoutLoading&&r.layout&&r.mode==="ai"&&e.jsxs("div",{className:"flex flex-col lg:flex-row gap-6 animate-fade-in",children:[e.jsxs("div",{className:"flex-1 min-w-0 space-y-5",children:[e.jsxs("div",{className:"glass-card p-5",children:[e.jsxs("h3",{className:"text-[13px] font-semibold mb-3 flex items-center gap-2",style:{color:"var(--text-primary)"},children:[e.jsx("div",{className:"w-6 h-6 rounded-md flex items-center justify-center",style:{background:"var(--purple-muted)"},children:e.jsx(L,{size:13,color:"var(--purple)"})}),"Describe Your Skill"]}),e.jsx("textarea",{ref:r.promptRef,value:r.aiPrompt,onChange:t=>r.setAiPrompt(t.target.value),placeholder:`e.g., A skill that helps format SQL queries, optimize them for performance, and explain query execution plans.
3
-
4
- Include any specific behaviors, constraints, or output formats you want.`,rows:6,disabled:r.generating,className:"w-full px-3 py-2.5 rounded-lg text-[13px] resize-y",style:{...p,minHeight:"140px"},onKeyDown:t=>{t.key==="Enter"&&(t.metaKey||t.ctrlKey)&&(t.preventDefault(),r.handleGenerate())}}),e.jsx("p",{className:"text-[11px] mt-2",style:{color:"var(--text-quaternary, var(--text-tertiary))"},children:"Cmd+Enter to generate"})]}),e.jsxs("div",{className:"glass-card p-5",children:[e.jsxs("h3",{className:"text-[13px] font-semibold mb-3 flex items-center gap-2",style:{color:"var(--text-primary)"},children:[e.jsx("span",{children:"Source Model"}),!o&&i==="claude-cli"&&v==="sonnet"&&e.jsx("span",{className:"text-[10px] font-normal uppercase tracking-wider px-1.5 py-0.5 rounded",style:{color:"var(--text-tertiary)",background:"var(--surface-2)"},children:"Default"})]}),b&&e.jsxs("div",{role:"status",className:"mb-3 px-3 py-2 rounded-lg text-[12px] flex items-center justify-between gap-3",style:{background:"var(--surface-2)",color:"var(--text-secondary)",border:"1px solid var(--border-subtle)"},children:[e.jsxs("span",{children:["Previous selection ",e.jsxs("code",{children:[b.provider,"/",b.model]})," unavailable — reverted to default."]}),e.jsx("button",{onClick:()=>P(null),className:"text-[11px]",style:{color:"var(--text-tertiary)",background:"none",border:"none",cursor:"pointer"},"aria-label":"Dismiss notice",children:"✕"})]}),e.jsxs("div",{className:"flex flex-col sm:flex-row gap-4",title:y?void 0:"Install a provider (Ollama / LM Studio / OpenRouter) or run `claude login` to enable model selection.",children:[e.jsxs("div",{className:"flex-1",children:[e.jsx("label",{className:"text-[11px] font-medium uppercase tracking-wider mb-2 block",style:{color:"var(--text-tertiary)"},children:"Provider"}),e.jsx("select",{value:i,onChange:t=>{var n;const s=t.target.value;g(s);const u=a==null?void 0:a.providers.find(f=>f.id===s),d=((n=u==null?void 0:u.models[0])==null?void 0:n.id)??v;u!=null&&u.models[0]&&m(d),A(s,d)},disabled:r.generating||!y,title:y?k(i)||void 0:"Install a provider (Ollama / LM Studio / OpenRouter) or run `claude login` to enable model selection.",className:"w-full px-3 py-2 rounded-lg text-[13px]",style:p,children:a==null?void 0:a.providers.filter(t=>t.available).map(t=>e.jsx("option",{value:t.id,title:k(t.id),children:t.label},t.id))}),k(i)&&e.jsxs("div",{className:"mt-1.5 text-[11px]",style:{color:"var(--text-tertiary)",lineHeight:1.5},children:[k(i),i==="claude-cli"&&e.jsxs(e.Fragment,{children:[" ",e.jsx("a",{href:"https://claude.com/settings/usage",target:"_blank",rel:"noreferrer",style:{color:"var(--color-accent, #2f6f8f)",textDecoration:"underline"},children:"Enable extra usage →"})]})]})]}),e.jsxs("div",{className:"flex-1",children:[e.jsx("label",{className:"text-[11px] font-medium uppercase tracking-wider mb-2 block",style:{color:"var(--text-tertiary)"},children:"Model"}),e.jsx("select",{value:v,onChange:t=>{const s=t.target.value;m(s),A(i,s)},disabled:r.generating||!y,className:"w-full px-3 py-2 rounded-lg text-[13px]",style:p,children:y==null?void 0:y.models.map(t=>e.jsx("option",{value:t.id,children:t.label},t.id))})]})]})]}),B&&C.length>0&&e.jsxs("div",{className:"glass-card p-5",children:[e.jsxs("h3",{className:"text-[13px] font-semibold mb-3",style:{color:"var(--text-primary)"},children:["Target Agents",e.jsx("span",{className:"text-[11px] font-normal ml-2",style:{color:"var(--text-tertiary)"},children:"(optional — leave empty for Claude Code default)"})]}),e.jsx(Z,{agents:C,selectedIds:r.targetAgents,onChange:r.setTargetAgents})]}),r.generating&&r.aiProgress.length>0&&e.jsx("div",{children:e.jsx(q,{entries:r.aiProgress,isRunning:!0})}),r.aiError&&e.jsx("div",{children:J(r.aiError)?e.jsxs("div",{className:"px-4 py-3 rounded-lg text-[13px]",style:{background:"var(--yellow-muted)",color:"var(--text-primary)",border:"1px solid var(--yellow)"},children:[e.jsx("div",{style:{fontWeight:600,marginBottom:4},children:"Your Claude Max subscription quota is exhausted"}),e.jsxs("div",{style:{fontSize:12,color:"var(--text-secondary)",lineHeight:1.5,marginBottom:8},children:[X(r.aiError),". Switch to another provider (Anthropic API, OpenRouter, or a local model) or enable extra usage to continue past your monthly quota."]}),e.jsxs("div",{style:{display:"flex",gap:8,flexWrap:"wrap"},children:[e.jsx("a",{href:"https://claude.com/settings/usage",target:"_blank",rel:"noreferrer",style:{display:"inline-flex",alignItems:"center",padding:"4px 10px",fontSize:12,fontWeight:500,color:"var(--color-paper, #fff)",background:"var(--color-accent, #2f6f8f)",borderRadius:4,textDecoration:"none"},children:"Enable extra usage →"}),e.jsx("button",{onClick:r.clearAiError,style:{padding:"4px 10px",fontSize:12,color:"var(--text-primary)",background:"transparent",border:"1px solid var(--border-default)",borderRadius:4,cursor:"pointer"},children:"Dismiss"})]})]}):r.aiClassifiedError?e.jsx(U,{error:r.aiClassifiedError,onRetry:r.handleGenerate,onDismiss:r.clearAiError}):e.jsx("div",{className:"px-4 py-3 rounded-lg text-[13px]",style:{background:"var(--red-muted)",color:"var(--red)",border:"1px solid var(--red-muted)"},children:r.aiError})}),e.jsxs("div",{className:"flex items-center gap-3",children:[r.generating?e.jsx("button",{onClick:r.handleCancelGenerate,className:"px-6 py-2.5 rounded-lg text-[13px] font-medium transition-all duration-150 flex items-center gap-2",style:{background:"var(--surface-3)",color:"var(--text-secondary)"},children:"Cancel Generation"}):e.jsxs("button",{onClick:r.handleGenerate,disabled:!r.aiPrompt.trim(),className:"px-6 py-2.5 rounded-lg text-[13px] font-medium transition-all duration-150 flex items-center gap-2",style:{background:r.aiPrompt.trim()?"var(--color-action, #2F5B8E)":"var(--surface-3)",color:r.aiPrompt.trim()?"var(--color-action-ink, #FFFFFF)":"var(--text-tertiary)",cursor:r.aiPrompt.trim()?"pointer":"not-allowed"},children:[e.jsx(L,{size:14})," Generate Skill"]}),e.jsx(S,{to:"/",className:"px-4 py-2.5 rounded-lg text-[13px] font-medium",style:{color:"var(--text-secondary)"},children:"Cancel"})]})]}),e.jsx("div",{className:"w-full lg:w-[340px] lg:flex-shrink-0",children:e.jsx("div",{className:"lg:sticky lg:top-8",children:e.jsxs("div",{className:"glass-card p-4",children:[e.jsx("h3",{className:"text-[11px] font-semibold uppercase tracking-wider mb-3",style:{color:"var(--text-tertiary)"},children:"SKILL.md Preview"}),e.jsx("pre",{className:"text-[11px] font-mono leading-relaxed overflow-auto max-h-[500px] p-3 rounded-lg",style:{background:"var(--surface-0)",color:"var(--text-secondary)",border:"1px solid var(--border-subtle)",whiteSpace:"pre-wrap",wordBreak:"break-word"},children:M})]})})})]}),!r.layoutLoading&&r.layout&&r.mode==="manual"&&e.jsx("div",{className:"animate-fade-in",children:e.jsxs("div",{className:"flex flex-col lg:flex-row gap-6",children:[e.jsxs("div",{className:"flex-1 min-w-0 space-y-5",children:[e.jsxs("div",{className:"glass-card p-5",children:[e.jsx("h3",{className:"text-[13px] font-semibold mb-3",style:{color:"var(--text-primary)"},children:"Location"}),r.creatableLayouts.length>1&&e.jsxs("div",{className:"mb-4",children:[e.jsx("label",{className:"text-[11px] font-medium uppercase tracking-wider mb-2 block",style:{color:"var(--text-tertiary)"},children:"Layout"}),e.jsxs("div",{className:"flex gap-2",children:[r.creatableLayouts.map(t=>e.jsx("button",{onClick:()=>{r.setSelectedLayout(t.layout);const s=t.existingPlugins[0];r.setPlugin(s||""),r.setNewPlugin("")},className:"px-3 py-1.5 rounded-lg text-[12px] font-medium transition-all duration-150",style:{background:r.selectedLayout===t.layout?"var(--accent)":"var(--surface-3)",color:r.selectedLayout===t.layout?"var(--color-paper)":"var(--text-secondary)",border:`1px solid ${r.selectedLayout===t.layout?"var(--accent)":"var(--border-subtle)"}`},children:t.label},t.layout)),!r.creatableLayouts.find(t=>t.layout===3)&&e.jsx("button",{onClick:()=>{r.setSelectedLayout(3),r.setPlugin("")},className:"px-3 py-1.5 rounded-lg text-[12px] font-medium transition-all duration-150",style:{background:r.selectedLayout===3?"var(--accent)":"var(--surface-3)",color:r.selectedLayout===3?"var(--color-paper)":"var(--text-secondary)",border:`1px solid ${r.selectedLayout===3?"var(--accent)":"var(--border-subtle)"}`},children:"Root skills/"})]})]}),r.selectedLayout!==3&&e.jsxs("div",{className:"mb-4",children:[e.jsx("label",{className:"text-[11px] font-medium uppercase tracking-wider mb-2 block",style:{color:"var(--text-tertiary)"},children:"Plugin"}),e.jsxs("select",{value:r.plugin,onChange:t=>{r.setPlugin(t.target.value),r.setNewPlugin("")},className:"w-full px-3 py-2 rounded-lg text-[13px]",style:p,children:[r.availablePlugins.map(t=>e.jsx("option",{value:t,children:t},t)),e.jsx("option",{value:"__new__",children:"+ New plugin..."})]}),r.plugin==="__new__"&&e.jsx("input",{type:"text",value:r.newPlugin,onChange:t=>r.setNewPlugin(j(t.target.value)),placeholder:"my-plugin",className:"w-full mt-2 px-3 py-2 rounded-lg text-[13px]",style:p})]}),e.jsx("div",{className:"px-3 py-2 rounded-lg text-[11px] font-mono",style:{background:"var(--surface-0)",color:"var(--text-tertiary)",border:"1px solid var(--border-subtle)",wordBreak:"break-all",lineHeight:1.55},children:r.pathPreview})]}),r.showPluginRecommendation&&r.pluginLayoutInfo&&r.selectedLayout===3&&e.jsxs("div",{className:"px-4 py-3 rounded-lg text-[12px] animate-fade-in flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3",style:{background:"var(--accent-muted)",color:"var(--text-secondary)",border:"1px solid var(--accent-muted)"},children:[e.jsxs("div",{className:"flex items-start gap-2 min-w-0",children:[e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"var(--accent)",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("circle",{cx:"12",cy:"12",r:"10"}),e.jsx("line",{x1:"12",y1:"16",x2:"12",y2:"12"}),e.jsx("line",{x1:"12",y1:"8",x2:"12.01",y2:"8"})]}),e.jsxs("span",{children:["Plugins detected (",e.jsx("strong",{children:r.pluginLayoutInfo.plugins.slice(0,3).join(", ")}),"). Add this skill to a plugin for better organization."]})]}),e.jsxs("div",{className:"flex items-center gap-2 flex-shrink-0",children:[e.jsx("button",{onClick:r.applyPluginRecommendation,className:"px-3 py-1 rounded-md text-[11px] font-medium",style:{background:"var(--accent)",color:"var(--color-paper)",border:"none",cursor:"pointer"},children:"Use plugin"}),e.jsx("button",{onClick:()=>r.setShowPluginRecommendation(!1),className:"w-5 h-5 rounded flex items-center justify-center",style:{color:"var(--text-tertiary)",background:"none",border:"none",cursor:"pointer"},children:e.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]})]}),e.jsxs("div",{className:"glass-card p-5",children:[e.jsx("h3",{className:"text-[13px] font-semibold mb-3",style:{color:"var(--text-primary)"},children:"Skill Details"}),e.jsxs("div",{className:"mb-4",children:[e.jsxs("label",{className:"text-[11px] font-medium uppercase tracking-wider mb-2 block",style:{color:"var(--text-tertiary)"},children:["Name ",e.jsx("span",{style:{color:"var(--red)"},children:"*"})]}),e.jsx("input",{type:"text",value:r.name,onChange:t=>r.setName(j(t.target.value,!1)),placeholder:"my-skill",className:"w-full px-3 py-2 rounded-lg text-[13px]",style:p})]}),e.jsxs("div",{className:"mb-4",children:[e.jsxs("label",{className:"text-[11px] font-medium uppercase tracking-wider mb-2 block",style:{color:"var(--text-tertiary)"},children:["Description ",e.jsx("span",{style:{color:"var(--red)"},children:"*"})]}),e.jsx("textarea",{value:r.description,onChange:t=>r.setDescription(t.target.value),placeholder:"Brief description — used for auto-activation keywords",rows:3,className:"w-full px-3 py-2 rounded-lg text-[13px] resize-y",style:{...p,minHeight:"72px"}}),e.jsx("p",{className:"text-[11px] mt-1",style:{color:"var(--text-tertiary)"},children:"This text is used by Claude to decide when to activate the skill"})]}),e.jsxs("div",{className:"flex flex-col sm:flex-row gap-4 mb-4",children:[e.jsxs("div",{className:"flex-1",children:[e.jsx("label",{className:"text-[11px] font-medium uppercase tracking-wider mb-2 block",style:{color:"var(--text-tertiary)"},children:"Model"}),e.jsxs("select",{value:r.model,onChange:t=>r.setModel(t.target.value),className:"w-full px-3 py-2 rounded-lg text-[13px]",style:p,children:[e.jsx("option",{value:"",children:"Any (default)"}),e.jsx("option",{value:"opus",children:"Opus"}),e.jsx("option",{value:"sonnet",children:"Sonnet"}),e.jsx("option",{value:"haiku",children:"Haiku"})]})]}),e.jsxs("div",{className:"flex-1",children:[e.jsx("label",{className:"text-[11px] font-medium uppercase tracking-wider mb-2 block",style:{color:"var(--text-tertiary)"},children:"Allowed Tools"}),e.jsx("input",{type:"text",value:r.allowedTools,onChange:t=>r.setAllowedTools(t.target.value),placeholder:"Read, Write, Edit, Bash, Glob, Grep",className:"w-full px-3 py-2 rounded-lg text-[13px]",style:p})]})]})]}),e.jsxs("div",{className:"glass-card p-5",children:[e.jsxs("div",{className:"flex items-center justify-between mb-3",children:[e.jsxs("div",{className:"flex items-center gap-2.5",children:[e.jsx("div",{className:"w-7 h-7 rounded-lg flex items-center justify-center",style:{background:"var(--accent-muted)"},children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"var(--accent)",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"}),e.jsx("line",{x1:"16",y1:"13",x2:"8",y2:"13"}),e.jsx("line",{x1:"16",y1:"17",x2:"8",y2:"17"})]})}),e.jsxs("div",{children:[e.jsx("span",{className:"text-[13px] font-semibold",style:{color:"var(--text-primary)"},children:"SKILL.md"}),e.jsx("span",{className:"text-[11px] ml-2",style:{color:"var(--text-tertiary)"},children:"Skill Definition"})]})]}),e.jsx("div",{className:"flex items-center",style:{background:"var(--surface-2)",borderRadius:8,padding:2,gap:1},children:["write","preview"].map(t=>e.jsxs("button",{onClick:()=>r.setBodyViewMode(t),className:"flex items-center gap-1 rounded-md transition-all duration-150",style:{padding:"4px 10px",background:r.bodyViewMode===t?"var(--surface-4)":"transparent",color:r.bodyViewMode===t?"var(--text-primary)":"var(--text-tertiary)",fontSize:11,fontWeight:r.bodyViewMode===t?600:400,border:"none",cursor:"pointer"},children:[t==="write"?e.jsxs("svg",{width:"13",height:"13",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("polyline",{points:"16 18 22 12 16 6"}),e.jsx("polyline",{points:"8 6 2 12 8 18"})]}):e.jsxs("svg",{width:"13",height:"13",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("path",{d:"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"}),e.jsx("circle",{cx:"12",cy:"12",r:"3"})]}),e.jsx("span",{children:t==="write"?"Write":"Preview"})]},t))})]}),r.bodyViewMode==="write"?e.jsx("textarea",{value:r.body,onChange:t=>r.setBody(t.target.value),placeholder:`# /my-skill
5
-
6
- You are an expert at...
7
-
8
- ## Workflow
9
-
10
- 1. First, understand the request
11
- 2. Then, implement the solution
12
- 3. Finally, verify the result`,rows:12,className:"w-full px-3 py-2 rounded-lg text-[13px] font-mono resize-y",style:{...p,minHeight:"200px"}}):r.body.trim()?e.jsx("div",{className:"text-[13px] leading-relaxed overflow-x-auto rounded-lg px-4 py-3",style:{background:"var(--surface-0)",color:"var(--text-secondary)",border:"1px solid var(--border-subtle)",minHeight:"200px",maxHeight:"400px",overflowY:"auto"},dangerouslySetInnerHTML:{__html:K(r.body)}}):e.jsx("div",{className:"text-[13px] leading-relaxed overflow-x-auto rounded-lg px-4 py-3",style:{background:"var(--surface-0)",color:"var(--text-secondary)",border:"1px solid var(--border-subtle)",minHeight:"200px",maxHeight:"400px",overflowY:"auto"},children:e.jsx("span",{style:{color:"var(--text-tertiary)"},children:"Start writing to see preview"})})]}),e.jsx(Y,{skillName:r.name||"{skill}",hasEvals:!1,isDraft:r.draftSaved}),r.error&&e.jsx("div",{className:"px-4 py-3 rounded-lg text-[13px]",style:{background:"var(--red-muted)",color:"var(--red)",border:"1px solid var(--red-muted)"},children:r.error}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("button",{onClick:r.handleCreate,disabled:r.creating||!r.name||!r.description,className:"px-5 py-2.5 rounded-lg text-[13px] font-medium transition-all duration-150",style:{background:r.creating||!r.name||!r.description?"var(--surface-3)":"var(--color-action, #2F5B8E)",color:r.creating||!r.name||!r.description?"var(--text-tertiary)":"var(--color-action-ink, #FFFFFF)",cursor:r.creating||!r.name||!r.description?"not-allowed":"pointer",opacity:r.creating?.7:1},children:r.creating?"Creating...":"Create Skill"}),e.jsx(S,{to:"/",className:"px-4 py-2.5 rounded-lg text-[13px] font-medium",style:{color:"var(--text-secondary)"},children:"Cancel"})]})]}),e.jsx("div",{className:"w-full lg:w-[340px] lg:flex-shrink-0",children:e.jsx("div",{className:"lg:sticky lg:top-8",children:e.jsxs("div",{className:"glass-card p-4",children:[e.jsx("h3",{className:"text-[11px] font-semibold uppercase tracking-wider mb-3",style:{color:"var(--text-tertiary)"},children:"SKILL.md Preview"}),e.jsx("pre",{className:"text-[11px] font-mono leading-relaxed overflow-auto max-h-[500px] p-3 rounded-lg",style:{background:"var(--surface-0)",color:"var(--text-secondary)",border:"1px solid var(--border-subtle)",whiteSpace:"pre-wrap",wordBreak:"break-word"},children:M})]})})})]})})]})}export{te as CreateSkillPage};
@@ -1 +0,0 @@
1
- /*! tailwindcss v4.2.1 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-serif:ui-serif, Georgia, Cambria, "Times New Roman", Times, serif;--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-black:#000;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-5xl:64rem;--container-6xl:72rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--ease-out:cubic-bezier(0, 0, .2, 1);--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.top-0{top:calc(var(--spacing) * 0)}.top-1{top:calc(var(--spacing) * 1)}.top-1\.5{top:calc(var(--spacing) * 1.5)}.top-4{top:calc(var(--spacing) * 4)}.top-full{top:100%}.right-0{right:calc(var(--spacing) * 0)}.right-1{right:calc(var(--spacing) * 1)}.right-4{right:calc(var(--spacing) * 4)}.right-5{right:calc(var(--spacing) * 5)}.bottom-0{bottom:calc(var(--spacing) * 0)}.bottom-4{bottom:calc(var(--spacing) * 4)}.bottom-5{bottom:calc(var(--spacing) * 5)}.left-0{left:calc(var(--spacing) * 0)}.left-1\.5{left:calc(var(--spacing) * 1.5)}.left-3{left:calc(var(--spacing) * 3)}.z-50{z-index:50}.col-span-1{grid-column:span 1/span 1}.col-span-2{grid-column:span 2/span 2}.col-span-3{grid-column:span 3/span 3}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.-mx-2{margin-inline:calc(var(--spacing) * -2)}.mx-4{margin-inline:calc(var(--spacing) * 4)}.mx-auto{margin-inline:auto}.my-4{margin-block:calc(var(--spacing) * 4)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-2\.5{margin-top:calc(var(--spacing) * 2.5)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-3\.5{margin-top:calc(var(--spacing) * 3.5)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mb-0\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-2\.5{margin-bottom:calc(var(--spacing) * 2.5)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-7{margin-bottom:calc(var(--spacing) * 7)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-3{margin-left:calc(var(--spacing) * 3)}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-16{height:calc(var(--spacing) * 16)}.h-20{height:calc(var(--spacing) * 20)}.h-24{height:calc(var(--spacing) * 24)}.h-32{height:calc(var(--spacing) * 32)}.h-36{height:calc(var(--spacing) * 36)}.h-48{height:calc(var(--spacing) * 48)}.h-full{height:100%}.h-px{height:1px}.max-h-40{max-height:calc(var(--spacing) * 40)}.max-h-48{max-height:calc(var(--spacing) * 48)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-72{max-height:calc(var(--spacing) * 72)}.max-h-80{max-height:calc(var(--spacing) * 80)}.max-h-\[500px\]{max-height:500px}.min-h-0{min-height:calc(var(--spacing) * 0)}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-12{width:calc(var(--spacing) * 12)}.w-14{width:calc(var(--spacing) * 14)}.w-16{width:calc(var(--spacing) * 16)}.w-20{width:calc(var(--spacing) * 20)}.w-28{width:calc(var(--spacing) * 28)}.w-32{width:calc(var(--spacing) * 32)}.w-36{width:calc(var(--spacing) * 36)}.w-40{width:calc(var(--spacing) * 40)}.w-48{width:calc(var(--spacing) * 48)}.w-\[520px\]{width:520px}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-\[92vw\]{max-width:92vw}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.grow{flex-grow:1}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.cursor-pointer{cursor:pointer}.resize{resize:both}.resize-none{resize:none}.resize-y{resize:vertical}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-\[3fr_2fr\]{grid-template-columns:3fr 2fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0{gap:calc(var(--spacing) * 0)}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-8{gap:calc(var(--spacing) * 8)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-y-1{row-gap:calc(var(--spacing) * 1)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}.self-start{align-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-\[3px\]{border-radius:3px}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.bg-black\/30{background-color:#0000004d}@supports (color:color-mix(in lab,red,red)){.bg-black\/30{background-color:color-mix(in oklab,var(--color-black) 30%,transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black) 50%,transparent)}}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:calc(var(--spacing) * 1)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-3\.5{padding:calc(var(--spacing) * 3.5)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.px-0{padding-inline:calc(var(--spacing) * 0)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-8{padding-inline:calc(var(--spacing) * 8)}.px-10{padding-inline:calc(var(--spacing) * 10)}.py-0{padding-block:calc(var(--spacing) * 0)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-3\.5{padding-block:calc(var(--spacing) * 3.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-12{padding-block:calc(var(--spacing) * 12)}.py-16{padding-block:calc(var(--spacing) * 16)}.py-20{padding-block:calc(var(--spacing) * 20)}.py-px{padding-block:1px}.pt-1{padding-top:calc(var(--spacing) * 1)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-2\.5{padding-top:calc(var(--spacing) * 2.5)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-3\.5{padding-top:calc(var(--spacing) * 3.5)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-24{padding-top:calc(var(--spacing) * 24)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-2\.5{padding-bottom:calc(var(--spacing) * 2.5)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pl-8{padding-left:calc(var(--spacing) * 8)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[9px\]{font-size:9px}.text-\[10\.5px\]{font-size:10.5px}.text-\[10px\]{font-size:10px}.text-\[11\.5px\]{font-size:11.5px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[14px\]{font-size:14px}.text-\[15px\]{font-size:15px}.text-\[16px\]{font-size:16px}.text-\[18px\]{font-size:18px}.text-\[20px\]{font-size:20px}.text-\[22px\]{font-size:22px}.text-\[24px\]{font-size:24px}.text-\[28px\]{font-size:28px}.text-\[32px\]{font-size:32px}.text-\[36px\]{font-size:36px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-pre-wrap{white-space:pre-wrap}.capitalize{text-transform:capitalize}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.underline{text-decoration-line:underline}.opacity-0{opacity:0}.opacity-70{opacity:.7}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-100{--tw-duration:.1s;transition-duration:.1s}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}@media(hover:hover){.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}.hover\:underline:hover{text-decoration-line:underline}}@media(min-width:40rem){.sm\:flex-shrink-0{flex-shrink:0}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}.sm\:self-auto{align-self:auto}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:py-7{padding-block:calc(var(--spacing) * 7)}}@media(min-width:64rem){.lg\:sticky{position:sticky}.lg\:top-8{top:calc(var(--spacing) * 8)}.lg\:w-\[340px\]{width:340px}.lg\:flex-shrink-0{flex-shrink:0}.lg\:flex-row{flex-direction:row}.lg\:px-10{padding-inline:calc(var(--spacing) * 10)}.lg\:py-8{padding-block:calc(var(--spacing) * 8)}}}:root{--color-paper:#fbf8f3;--color-surface:#fff;--color-ink:#191919;--color-ink-muted:#5a5651;--color-rule:#e8e1d6;--color-accent:#d4a27f;--color-accent-ink:#7a4a24;--color-installed:#2f6a4a;--color-own:#8a5a1f;--color-focus:#3b6ea8;--color-action:#2f5b8e;--color-action-hover:#264a73;--color-action-ink:#fff;--font-serif:"Source Serif 4 Variable", "Source Serif 4", Georgia, serif;--font-sans:"Inter Tight Variable", "Inter Tight", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;--font-mono:"JetBrains Mono Variable", "JetBrains Mono", "SF Mono", Menlo, Consolas, monospace;--ease-standard:cubic-bezier(.2, 0, 0, 1);--duration-fast:.12s;--duration-base:.18s;--duration-modal:.24s}[data-theme=light]{--color-paper:#fbf8f3;--color-surface:#fff;--color-ink:#191919;--color-ink-muted:#5a5651;--color-rule:#e8e1d6;--color-accent:#d4a27f;--color-accent-ink:#7a4a24;--color-installed:#2f6a4a;--color-own:#8a5a1f;--color-focus:#3b6ea8;--color-action:#2f5b8e;--color-action-hover:#264a73;--color-action-ink:#fff}[data-theme=dark]{--color-paper:#1a1814;--color-surface:#221f1a;--color-ink:#f2ece1;--color-ink-muted:#a59d8f;--color-rule:#2e2a24;--color-accent:#e0b793;--color-accent-ink:#f2ece1;--color-installed:#86c9a5;--color-own:#e6b877;--color-focus:#7ca8d9;--color-action:#4a82c8;--color-action-hover:#6093d6;--color-action-ink:#0b1420}[data-contrast=more]{--color-ink-muted:#3d3a36;--color-rule:#b8ad9a}[data-theme=dark][data-contrast=more]{--color-ink-muted:#d4cbba;--color-rule:#4a453d}:root{--bg-canvas:var(--color-paper);--bg-surface:var(--color-surface);--text-primary:var(--color-ink);--text-secondary:var(--color-ink-muted);--text-accent:var(--color-accent-ink);--border-default:var(--color-rule);--border-focus:var(--color-focus);--status-installed:var(--color-installed);--status-own:var(--color-own);--accent-surface:var(--color-accent);--surface-0:var(--color-paper);--surface-1:var(--color-surface);--surface-2:var(--color-surface);--surface-3:var(--color-rule);--surface-4:var(--color-rule);--border-subtle:var(--color-rule);--border-hover:var(--color-accent);--border-active:var(--color-focus);--text-tertiary:var(--color-ink-muted);--accent:var(--color-accent);--accent-hover:var(--color-accent-ink);--accent-muted:var(--color-accent)}@supports (color:color-mix(in lab,red,red)){:root{--accent-muted:color-mix(in srgb, var(--color-accent) 20%, transparent)}}:root{--green:var(--color-installed);--green-muted:var(--color-installed)}@supports (color:color-mix(in lab,red,red)){:root{--green-muted:color-mix(in srgb, var(--color-installed) 18%, transparent)}}:root{--red:#b54444;--red-muted:#b544442e;--yellow:var(--color-own);--yellow-muted:var(--color-own)}@supports (color:color-mix(in lab,red,red)){:root{--yellow-muted:color-mix(in srgb, var(--color-own) 18%, transparent)}}:root{--orange:var(--color-own);--orange-muted:var(--color-own)}@supports (color:color-mix(in lab,red,red)){:root{--orange-muted:color-mix(in srgb, var(--color-own) 18%, transparent)}}:root{--purple:var(--color-accent);--purple-muted:var(--color-accent)}@supports (color:color-mix(in lab,red,red)){:root{--purple-muted:color-mix(in srgb, var(--color-accent) 18%, transparent)}}:root{--ease-out-expo:var(--ease-standard);--ease-spring:var(--ease-standard)}[data-theme=dark]{--red:#d48a8a;--red-muted:#d48a8a38}html{background:var(--bg-canvas);color:var(--text-primary)}body{background:var(--bg-canvas);color:var(--text-primary);font-family:var(--font-sans);font-feature-settings:"ss01","cv11";-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}::selection{background:var(--color-accent)}@supports (color:color-mix(in lab,red,red)){::selection{background:color-mix(in srgb,var(--color-accent) 35%,transparent)}}::selection{color:var(--text-primary)}:focus-visible{outline:2px solid var(--border-focus);outline-offset:2px;border-radius:4px}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:var(--border-default);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:var(--text-secondary)}@keyframes fade-in{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}@keyframes fade-in-scale{0%{opacity:0;transform:scale(.98)translateY(4px)}to{opacity:1;transform:scale(1)translateY(0)}}@keyframes slide-in-right{0%{opacity:0;transform:translate(8px)}to{opacity:1;transform:translate(0)}}@keyframes overlay-in{0%{opacity:0}to{opacity:1}}@keyframes modal-in{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}@keyframes spin-slow{to{transform:rotate(360deg)}}.animate-fade-in{animation:fade-in var(--duration-base) var(--ease-standard) both}.animate-fade-in-scale{animation:fade-in-scale var(--duration-base) var(--ease-standard) both}.animate-slide-in-right{animation:slide-in-right var(--duration-base) var(--ease-standard) both}.animate-overlay-in{animation:overlay-in var(--duration-fast) var(--ease-standard) both}.animate-modal-in{animation:modal-in var(--duration-modal) var(--ease-standard) both}.stagger-children>*{animation:fade-in var(--duration-base) var(--ease-standard) both}.stagger-children>:first-child{animation-delay:0s}.stagger-children>:nth-child(2){animation-delay:30ms}.stagger-children>:nth-child(3){animation-delay:60ms}.stagger-children>:nth-child(4){animation-delay:90ms}.stagger-children>:nth-child(n+5){animation-delay:.12s}@media(prefers-reduced-motion:reduce){*,:before,:after{transition-duration:0s!important;transition-delay:0s!important;animation-duration:0s!important;animation-delay:0s!important}}.placeholder,.skeleton{background:var(--border-default);opacity:.6;border-radius:4px}.glass-card{background:var(--bg-surface);border:1px solid var(--border-default);transition:border-color var(--duration-fast) var(--ease-standard);border-radius:8px}.glass-card:hover,.glass-card-interactive:hover{border-color:var(--color-accent)}.pill{letter-spacing:.02em;color:var(--text-secondary);align-items:center;gap:6px;padding:2px 0;font-size:11px;font-weight:500;line-height:1.4;display:inline-flex}.pill:before{content:"";background:currentColor;border-radius:50%;width:6px;height:6px}.pill-installed{color:var(--status-installed)}.pill-own{color:var(--status-own)}.input-field{background:var(--bg-surface);border:1px solid var(--border-default);color:var(--text-primary);font-size:13px;font-family:var(--font-sans);transition:border-color var(--duration-fast) var(--ease-standard);border-radius:6px;outline:none;width:100%;padding:8px 12px}.input-field:focus{border-color:var(--border-focus);box-shadow:0 0 0 3px var(--color-focus)}@supports (color:color-mix(in lab,red,red)){.input-field:focus{box-shadow:0 0 0 3px color-mix(in srgb,var(--color-focus) 18%,transparent)}}.input-field::placeholder{color:var(--text-secondary)}.btn{height:36px;font-size:13px;font-weight:500;font-family:var(--font-sans);cursor:pointer;transition:background-color var(--duration-fast) var(--ease-standard),color var(--duration-fast) var(--ease-standard),border-color var(--duration-fast) var(--ease-standard);white-space:nowrap;border:1px solid #0000;border-radius:6px;outline:none;justify-content:center;align-items:center;gap:6px;padding:8px 14px;display:inline-flex}.btn:disabled{opacity:.4;cursor:not-allowed}.btn-primary{background:var(--color-ink);color:var(--color-paper)}.btn-primary:hover:not(:disabled){background:var(--color-ink)}@supports (color:color-mix(in lab,red,red)){.btn-primary:hover:not(:disabled){background:color-mix(in srgb,var(--color-ink) 88%,var(--color-accent))}}.btn-secondary{color:var(--text-primary);border-color:var(--border-default);background:0 0}.btn-secondary:hover:not(:disabled){border-color:var(--color-accent);color:var(--text-primary)}.btn-purple{background:var(--color-ink);color:var(--color-paper)}.btn-purple:hover:not(:disabled){background:var(--color-ink)}@supports (color:color-mix(in lab,red,red)){.btn-purple:hover:not(:disabled){background:color-mix(in srgb,var(--color-ink) 88%,var(--color-accent))}}.btn-danger{color:var(--red);border-color:var(--red);background:0 0}.btn-danger:hover:not(:disabled){background:var(--red-muted)}.btn-ghost{color:var(--text-secondary);background:0 0;height:auto;padding:6px 10px}.btn-ghost:hover:not(:disabled){color:var(--text-primary);background:var(--border-default)}.spinner{border:2px solid var(--border-default);border-top-color:var(--color-accent);border-radius:50%;width:16px;height:16px;animation:.6s linear infinite spin-slow}.spinner-lg{border-width:2.5px;width:24px;height:24px}.score-ring{--size:56px;--stroke:4px;width:var(--size);height:var(--size);justify-content:center;align-items:center;display:flex;position:relative}.score-ring svg{position:absolute;top:0;right:0;bottom:0;left:0;transform:rotate(-90deg)}.score-ring circle{fill:none;stroke-width:var(--stroke);stroke-linecap:round}.score-ring .track{stroke:var(--border-default)}.score-ring .fill{transition:stroke-dashoffset .8s var(--ease-standard)}.divide-y>*+*{border-top-color:var(--border-default)}hr{border:none;border-top:1px solid var(--border-default);margin:0}:root{--theme-transition:background-color .15s var(--ease-standard), color .15s var(--ease-standard), border-color .15s var(--ease-standard)}html,body,.glass-card,.pill,.input-field,.btn,aside,header,footer,main,nav,section,[data-theme-surface]{transition:var(--theme-transition)}:focus-visible{transition-property:none}input:focus,textarea:focus,select:focus,button:focus{transition:none}.focus-ring:focus-visible,[role=button]:focus-visible,[role=menuitem]:focus-visible,[role=tab]:focus-visible,[role=option]:focus-visible,a:focus-visible,summary:focus-visible{outline:2px solid var(--border-focus);outline-offset:2px;border-radius:4px}[data-contrast=more] :focus-visible,[data-contrast=more] .focus-ring:focus-visible{outline-width:3px}@media(max-width:1024px)and (min-width:768px){.studio-grid{grid-template-columns:240px 1px 1fr!important}}@media(max-width:767px){.studio-grid{grid-template-columns:1fr!important}.studio-grid>:nth-child(2),.studio-grid>:nth-child(3){display:none}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}