@sayknow-cli/coding-agent 0.5.13 → 0.5.14

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 (40) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/types/cli/setup-cli.d.ts +1 -1
  3. package/dist/types/defaults/skc-ui-skills.d.ts +12 -0
  4. package/dist/types/hooks/ui-skill-keywords.d.ts +84 -0
  5. package/dist/types/session-import/redact.d.ts +1 -1
  6. package/dist/types/setup/external-ui-skills.d.ts +37 -0
  7. package/package.json +7 -7
  8. package/src/cli/setup-cli.ts +22 -1
  9. package/src/cli/skills-cli.ts +29 -10
  10. package/src/commands/setup.ts +1 -0
  11. package/src/defaults/skc/ui-skills/LICENSE.appllama +21 -0
  12. package/src/defaults/skc/ui-skills/LICENSE.emilkowalski +21 -0
  13. package/src/defaults/skc/ui-skills/NOTICE.md +43 -0
  14. package/src/defaults/skc/ui-skills/animate/SKILL.md +536 -0
  15. package/src/defaults/skc/ui-skills/animation-vocabulary/SKILL.md +178 -0
  16. package/src/defaults/skc/ui-skills/apple-design/SKILL.md +285 -0
  17. package/src/defaults/skc/ui-skills/appllama-app-design-skill/SKILL.md +821 -0
  18. package/src/defaults/skc/ui-skills/ask-sonner/SKILL.md +157 -0
  19. package/src/defaults/skc/ui-skills/emil-design-eng/SKILL.md +671 -0
  20. package/src/defaults/skc/ui-skills/find-animation-opportunities/SKILL.md +137 -0
  21. package/src/defaults/skc/ui-skills/improve-animations/SKILL.md +305 -0
  22. package/src/defaults/skc/ui-skills/mobile-native/SKILL.md +308 -0
  23. package/src/defaults/skc/ui-skills/pick-ui-library/SKILL.md +82 -0
  24. package/src/defaults/skc/ui-skills/prototype/SKILL.md +300 -0
  25. package/src/defaults/skc/ui-skills/react-bits/SKILL.md +113 -0
  26. package/src/defaults/skc/ui-skills/review-animations/SKILL.md +312 -0
  27. package/src/defaults/skc-ui-skills.ts +108 -0
  28. package/src/extensibility/runtime-skill-discovery.ts +8 -2
  29. package/src/hooks/native-skill-hook.ts +14 -0
  30. package/src/hooks/ui-skill-keywords.ts +312 -0
  31. package/src/internal-urls/docs-index.generated.ts +1 -1
  32. package/src/prompts/agents/architect.md +1 -0
  33. package/src/prompts/agents/critic.md +1 -0
  34. package/src/prompts/agents/executor.md +1 -0
  35. package/src/prompts/agents/planner.md +1 -0
  36. package/src/prompts/system/system-prompt.md +1 -0
  37. package/src/prompts/tools/skill.md +2 -2
  38. package/src/sdk/session.ts +7 -5
  39. package/src/session-import/redact.ts +11 -6
  40. package/src/setup/external-ui-skills.ts +132 -0
package/CHANGELOG.md CHANGED
@@ -2,6 +2,21 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.5.14] - 2026-09-16
6
+
7
+ ### Added
8
+
9
+ - Bundled frontend UI/UX craft skills so SKC sessions can invoke them without a separate user install: Emil Kowalski's web craft set (`emil-design-eng`, `animate`, `review-animations`, `improve-animations`, `find-animation-opportunities`, `pick-ui-library`, `prototype`, `mobile-native`, `animation-vocabulary`, `apple-design`, `ask-sonner`) and Appllama's native mobile build bar (`appllama-app-design-skill`). These are not public workflow skills; the four workflows remain `deep-interview`, `ralplan`, `ultragoal`, and `team`. `appllama-usage` is deliberately excluded because it only drives the paid Appllama MCP, which SKC does not ship. Each skill's companion reference files are inlined as appendices by `scripts/build-ui-skill-bundle.ts`, since only `SKILL.md` is compiled into the binary and a bundled skill's `baseDir` is a virtual path.
10
+ - The native `UserPromptSubmit` hook routes frontend UI/UX prompts to the matching bundled UI skill automatically, in English and Korean, so the agent loads `animate`, `review-animations`, `pick-ui-library`, `mobile-native`, `appllama-app-design-skill`, `ask-sonner`, or the `emil-design-eng` baseline without the user naming a skill. Detection is additive to workflow-keyword activation, seeds no workflow mode state, and stays silent for non-frontend prompts and for SKC's own terminal-only UI work.
11
+ - Transition-shaped prompts route to the `transitions-dev` skill ([transitions.dev](https://github.com/Jakubantalik/transitions.dev)). When it is absent the agent installs it itself with upstream's own non-interactive command (`-a universal`, landing in `<project>/.agents/skills/`, a root SKC loads) through the `bash` tool, so the user never types an install command; when present it is loaded directly. The collection is deliberately **not** vendored: upstream licenses only its CLI and Refine tooling under MIT, while the transitions carry a clause forbidding repackaging or publishing the collection — which is what bundling into the SKC binary would do. Installing into the user's own project is explicitly permitted.
12
+ - `skc setup ui-skills` installs the routed-but-unbundled frontend skills into the current project (`<project>/.agents/skills/`, a root SKC's agents provider loads), with `--check` to audit and `--force` to reinstall. It runs upstream's own publisher CLI and verifies the payload landed, so a silent installer failure is reported instead of being treated as success.
13
+ - Animated-React-component prompts route to a new bundled `react-bits` skill covering the [React Bits](https://reactbits.dev) registry: when to reach for it, the per-component `npx shadcn@latest add @react-bits/<Component>-<Variant>` install, the `components.json` precondition that otherwise hangs a non-interactive run, post-install duties (dependency weight, reduced-motion guards), and a catalog of all 169 component names. The skill is SKC-authored guidance plus factual metadata — React Bits ships no agent skill of its own, and its MIT + Commons Clause license forbids redistributing the components, so no component source is bundled.
14
+
15
+ ### Fixed
16
+
17
+ - Runtime skill discovery ranks project `.skc/skills` ahead of the user-home catalog before applying the result limit, so a populated `~/.skc/skills` cannot hide a project skill (ported from upstream v0.16.5 skill-convention budget ranking).
18
+ - Session-import URL redaction no longer caps the scheme at 16 characters. The scheme-character run is boundary-anchored so long and digit-prefixed credential URLs still redact without quadratic scanning (ported from upstream #5402).
19
+
5
20
  ## [0.5.13] - 2026-09-15
6
21
  ### Fixed
7
22
 
@@ -5,7 +5,7 @@
5
5
  */
6
6
  import { AuthStorage, SqliteAuthCredentialStore } from "@sayknow-cli/ai";
7
7
  import { runExternalCredentialAutoImport } from "../setup/credential-auto-import";
8
- export type SetupComponent = "claude" | "codex" | "credentials" | "defaults" | "hermes" | "hooks" | "provider" | "python" | "stt";
8
+ export type SetupComponent = "claude" | "codex" | "credentials" | "defaults" | "hermes" | "hooks" | "provider" | "python" | "stt" | "ui-skills";
9
9
  export interface SetupCommandArgs {
10
10
  component: SetupComponent;
11
11
  flags: {
@@ -0,0 +1,12 @@
1
+ import type { Skill } from "../extensibility/skills";
2
+ /**
3
+ * Bundled frontend UI/UX craft skills. These are NOT public SKC workflow skills.
4
+ * The four public workflows remain deep-interview, ralplan, ultragoal, and team.
5
+ *
6
+ * Sources and deliberate exclusions are documented in
7
+ * `skc/ui-skills/NOTICE.md`; regenerate with `scripts/build-ui-skill-bundle.ts`.
8
+ */
9
+ export declare const BUNDLED_SKC_UI_SKILL_NAMES: readonly ["emil-design-eng", "animate", "review-animations", "improve-animations", "find-animation-opportunities", "pick-ui-library", "prototype", "mobile-native", "animation-vocabulary", "apple-design", "ask-sonner", "appllama-app-design-skill", "react-bits"];
10
+ export type BundledSkcUiSkillName = (typeof BUNDLED_SKC_UI_SKILL_NAMES)[number];
11
+ export declare function getEmbeddedSkcUiSkills(): Skill[];
12
+ export declare function withEmbeddedSkcUiSkills(skills: Skill[]): Skill[];
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Automatic frontend UI/UX skill routing.
3
+ *
4
+ * The bundled UI craft skills (see `defaults/skc-ui-skills.ts`) are compiled
5
+ * into the binary, so the agent can invoke them without any user install. This
6
+ * module decides WHEN: the native `UserPromptSubmit` hook matches the prompt
7
+ * against the patterns below and injects a directive naming the skill to load.
8
+ *
9
+ * Unlike the canonical workflow skills, UI skills have no `skc state` mode
10
+ * state. Detection here never seeds workflow state; it only advertises the
11
+ * skill for the current turn.
12
+ *
13
+ * Patterns cover English and Korean because prompts arrive in both.
14
+ */
15
+ import type { BundledSkcUiSkillName } from "../defaults/skc-ui-skills";
16
+ export interface UiSkillKeywordDefinition {
17
+ skill: BundledSkcUiSkillName;
18
+ /** Higher wins when several patterns match the same prompt. */
19
+ priority: number;
20
+ pattern: RegExp;
21
+ }
22
+ /** Base craft skill paired with any specialized web frontend match. */
23
+ export declare const UI_SKILL_BASE: BundledSkcUiSkillName;
24
+ /**
25
+ * Ordered specialized detectors. The first (highest priority) match selects the
26
+ * lead skill; `emil-design-eng` is added as the craft baseline for build and
27
+ * review work.
28
+ */
29
+ export declare const UI_SKILL_KEYWORD_DEFINITIONS: readonly UiSkillKeywordDefinition[];
30
+ export interface UiSkillKeywordMatch {
31
+ skill: BundledSkcUiSkillName;
32
+ keyword: string;
33
+ priority: number;
34
+ }
35
+ /**
36
+ * Detect frontend UI/UX intent. Returns matches ordered by priority, most
37
+ * specific first, with `emil-design-eng` appended as the craft baseline.
38
+ */
39
+ export declare function detectUiSkillKeywords(text: string): UiSkillKeywordMatch[];
40
+ /**
41
+ * Build the `UserPromptSubmit` directive that makes the agent load the matching
42
+ * bundled UI skill for this turn. Returns null when the prompt is not frontend
43
+ * UI/UX work.
44
+ */
45
+ export declare function buildUiSkillActivationContext(text: string): string | null;
46
+ /**
47
+ * Frontend skills SKC routes to but deliberately does NOT vendor.
48
+ *
49
+ * `transitions.dev` publishes an agent skill, but its terms license only the
50
+ * CLI and Refine tooling under MIT; the transition collection itself carries a
51
+ * separate clause that forbids repackaging or publishing the collection (or a
52
+ * substantial part of it). Compiling it into the SKC binary and shipping that
53
+ * to every user is exactly the prohibited redistribution, while installing it
54
+ * into your own project is explicitly allowed. So SKC routes to a user-owned
55
+ * install and never carries the content.
56
+ */
57
+ export interface ExternalUiSkillDefinition {
58
+ skill: string;
59
+ priority: number;
60
+ pattern: RegExp;
61
+ /**
62
+ * Upstream's own non-interactive install. `-a universal` lands the skill in
63
+ * `<project>/.agents/skills/`, which SKC's agents provider loads. It is the
64
+ * agent that runs this through its normal bash tool, so the install stays a
65
+ * visible, permissioned tool call — never a silent fetch inside the hook.
66
+ */
67
+ installCommand: string;
68
+ source: string;
69
+ }
70
+ export declare const EXTERNAL_UI_SKILL_DEFINITIONS: readonly ExternalUiSkillDefinition[];
71
+ export declare function detectExternalUiSkills(text: string): ExternalUiSkillDefinition[];
72
+ /**
73
+ * Directive for frontend skills SKC routes to but does not vendor.
74
+ *
75
+ * Installed: load it. Missing: the agent runs upstream's own non-interactive
76
+ * install itself, so the user never types the command. The install runs through
77
+ * the agent's bash tool — visible and permissioned — rather than as a silent
78
+ * network fetch inside this hook.
79
+ */
80
+ export declare function buildExternalUiSkillContext(input: {
81
+ cwd: string;
82
+ home: string;
83
+ text: string;
84
+ }): Promise<string | null>;
@@ -8,7 +8,7 @@
8
8
  */
9
9
  export declare const IMPORT_REDACTED_PLACEHOLDER = "[REDACTED]";
10
10
  /** Bumped when patterns change; persisted in import provenance. */
11
- export declare const IMPORT_SANITIZER_VERSION = 4;
11
+ export declare const IMPORT_SANITIZER_VERSION = 5;
12
12
  export interface ImportRedactionResult {
13
13
  value: string;
14
14
  redacted: number;
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Install the frontend UI skills SKC routes to but cannot bundle.
3
+ *
4
+ * Most UI craft skills are compiled into the binary (see
5
+ * `defaults/skc-ui-skills.ts`). A few upstreams license their content for use
6
+ * but forbid redistributing the collection, so SKC must not carry them. For
7
+ * those, this installs upstream's own published payload into the project, where
8
+ * SKC's skill discovery picks it up like any other project skill.
9
+ *
10
+ * Target is `<project>/.agents/skills/<name>/`, which SKC's agents provider
11
+ * loads on the project walk-up.
12
+ */
13
+ export type ExternalUiSkillStatus = "installed" | "already-present" | "failed" | "missing";
14
+ export interface ExternalUiSkillResult {
15
+ skill: string;
16
+ source: string;
17
+ status: ExternalUiSkillStatus;
18
+ path: string;
19
+ detail?: string;
20
+ }
21
+ export interface ExternalUiSkillsReport {
22
+ projectDir: string;
23
+ installed: number;
24
+ alreadyPresent: number;
25
+ failed: number;
26
+ missing: number;
27
+ skills: ExternalUiSkillResult[];
28
+ }
29
+ export interface InstallExternalUiSkillsOptions {
30
+ cwd: string;
31
+ /** Report what would happen without running any installer. */
32
+ check?: boolean;
33
+ /** Reinstall even when the skill is already present. */
34
+ force?: boolean;
35
+ }
36
+ export declare function installExternalUiSkills(options: InstallExternalUiSkillsOptions): Promise<ExternalUiSkillsReport>;
37
+ export declare function formatExternalUiSkillsReport(report: ExternalUiSkillsReport): string;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@sayknow-cli/coding-agent",
4
- "version": "0.5.13",
4
+ "version": "0.5.14",
5
5
  "description": "Sayknow-CLI CLI with read, bash, edit, write tools and session management",
6
6
  "homepage": "https://sayknow-cli.com",
7
7
  "author": "jaybeyond",
@@ -54,12 +54,12 @@
54
54
  "@agentclientprotocol/sdk": "1.3.0",
55
55
  "@babel/parser": "^7.29.3",
56
56
  "@mozilla/readability": "^0.6.0",
57
- "@sayknow-cli/stats": "0.5.13",
58
- "@sayknow-cli/agent-core": "0.5.13",
59
- "@sayknow-cli/ai": "0.5.13",
60
- "@sayknow-cli/natives": "0.5.13",
61
- "@sayknow-cli/tui": "0.5.13",
62
- "@sayknow-cli/utils": "0.5.13",
57
+ "@sayknow-cli/stats": "0.5.14",
58
+ "@sayknow-cli/agent-core": "0.5.14",
59
+ "@sayknow-cli/ai": "0.5.14",
60
+ "@sayknow-cli/natives": "0.5.14",
61
+ "@sayknow-cli/tui": "0.5.14",
62
+ "@sayknow-cli/utils": "0.5.14",
63
63
  "@puppeteer/browsers": "^2.13.0",
64
64
  "@types/turndown": "5.0.6",
65
65
  "@xterm/headless": "^6.0.0",
@@ -23,6 +23,7 @@ import {
23
23
  getAutoImportOAuthCredentialSkips,
24
24
  isAutoImportOAuthCredential,
25
25
  } from "../setup/credential-import";
26
+ import { formatExternalUiSkillsReport, installExternalUiSkills } from "../setup/external-ui-skills";
26
27
  import {
27
28
  formatHermesSetupResult,
28
29
  type HermesSetupFlags,
@@ -46,7 +47,8 @@ export type SetupComponent =
46
47
  | "hooks"
47
48
  | "provider"
48
49
  | "python"
49
- | "stt";
50
+ | "stt"
51
+ | "ui-skills";
50
52
 
51
53
  export interface SetupCommandArgs {
52
54
  component: SetupComponent;
@@ -290,6 +292,25 @@ export async function runSetupCommand(cmd: SetupCommandArgs): Promise<void> {
290
292
  case "credentials":
291
293
  await handleCredentialsSetup(cmd.flags);
292
294
  break;
295
+ case "ui-skills":
296
+ await handleUiSkillsSetup(cmd.flags);
297
+ break;
298
+ }
299
+ }
300
+
301
+ async function handleUiSkillsSetup(flags: SetupCommandArgs["flags"]): Promise<void> {
302
+ const report = await installExternalUiSkills({
303
+ cwd: process.cwd(),
304
+ check: flags.check,
305
+ force: flags.force,
306
+ });
307
+ if (flags.json) {
308
+ process.stdout.write(`${JSON.stringify(report, null, 2)}\n`);
309
+ } else {
310
+ process.stdout.write(`${formatExternalUiSkillsReport(report)}\n`);
311
+ }
312
+ if (report.failed > 0 || (flags.check && report.missing > 0)) {
313
+ process.exitCode = 1;
293
314
  }
294
315
  }
295
316
 
@@ -1,11 +1,13 @@
1
1
  /**
2
- * Handles `skc skills` for inspecting bundled workflow skill definitions.
2
+ * Handles `skc skills` for inspecting bundled workflow and UI skill definitions.
3
3
  */
4
4
  import {
5
5
  DEFAULT_SKC_DEFINITION_NAMES,
6
6
  type EmbeddedDefaultSkcSkill,
7
7
  getEmbeddedDefaultSkcSkills,
8
8
  } from "../defaults/skc-defaults";
9
+ import { getEmbeddedSkcUiSkills } from "../defaults/skc-ui-skills";
10
+ import type { Skill } from "../extensibility/skills";
9
11
 
10
12
  export type SkillsAction = "list" | "read";
11
13
 
@@ -28,17 +30,21 @@ interface SkillsReadEntry extends SkillsListEntry {
28
30
  content: string;
29
31
  }
30
32
 
31
- function getEmbeddedSkill(name: string): EmbeddedDefaultSkcSkill | undefined {
32
- return getEmbeddedDefaultSkcSkills().find(skill => skill.name === name);
33
+ function getEmbeddedSkill(name: string): EmbeddedDefaultSkcSkill | Skill | undefined {
34
+ return (
35
+ getEmbeddedDefaultSkcSkills().find(skill => skill.name === name) ??
36
+ getEmbeddedSkcUiSkills().find(skill => skill.name === name)
37
+ );
33
38
  }
34
39
 
35
40
  function listEmbeddedSkills(): SkillsListEntry[] {
36
- return getEmbeddedDefaultSkcSkills().map(skill => ({
41
+ const toEntry = (skill: EmbeddedDefaultSkcSkill | Skill): SkillsListEntry => ({
37
42
  name: skill.name,
38
43
  description: skill.description,
39
44
  path: skill.filePath,
40
45
  source: skill.source,
41
- }));
46
+ });
47
+ return [...getEmbeddedDefaultSkcSkills().map(toEntry), ...getEmbeddedSkcUiSkills().map(toEntry)];
42
48
  }
43
49
 
44
50
  function writeJson(value: unknown): void {
@@ -60,14 +66,27 @@ export async function runSkillsCommand(cmd: SkillsCommandArgs): Promise<void> {
60
66
 
61
67
  const name = cmd.name?.trim();
62
68
  if (!name) {
63
- process.stderr.write(`error: skill name is required for read (${DEFAULT_SKC_DEFINITION_NAMES.join(", ")})\n`);
69
+ process.stderr.write(
70
+ `error: skill name is required for read (${DEFAULT_SKC_DEFINITION_NAMES.join(", ")}, or a bundled UI skill such as emil-design-eng)\n`,
71
+ );
64
72
  process.exitCode = 1;
65
73
  return;
66
74
  }
67
75
 
68
76
  const skill = getEmbeddedSkill(name);
69
77
  if (!skill) {
70
- process.stderr.write(`error: unknown embedded skill "${name}" (${DEFAULT_SKC_DEFINITION_NAMES.join(", ")})\n`);
78
+ process.stderr.write(
79
+ `error: unknown embedded skill "${name}" (${DEFAULT_SKC_DEFINITION_NAMES.join(", ")}, or a bundled UI skill such as emil-design-eng)\n`,
80
+ );
81
+ process.exitCode = 1;
82
+ return;
83
+ }
84
+
85
+ // Every embedded skill carries inline content; a missing body means the
86
+ // bundle was built wrong, so fail loudly instead of printing "undefined".
87
+ const content = skill.content;
88
+ if (typeof content !== "string" || content.length === 0) {
89
+ process.stderr.write(`error: embedded skill "${name}" has no bundled content\n`);
71
90
  process.exitCode = 1;
72
91
  return;
73
92
  }
@@ -77,12 +96,12 @@ export async function runSkillsCommand(cmd: SkillsCommandArgs): Promise<void> {
77
96
  description: skill.description,
78
97
  path: skill.filePath,
79
98
  source: skill.source,
80
- content: skill.content,
99
+ content,
81
100
  };
82
101
  if (cmd.flags?.json) {
83
102
  writeJson(entry);
84
103
  return;
85
104
  }
86
- process.stdout.write(skill.content);
87
- if (!skill.content.endsWith("\n")) process.stdout.write("\n");
105
+ process.stdout.write(content);
106
+ if (!content.endsWith("\n")) process.stdout.write("\n");
88
107
  }
@@ -15,6 +15,7 @@ const COMPONENTS: SetupComponent[] = [
15
15
  "provider",
16
16
  "python",
17
17
  "stt",
18
+ "ui-skills",
18
19
  ];
19
20
 
20
21
  export default class Setup extends Command {
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Antmind Ventures Private Limited (appllama.io)
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Emil Kowalski
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,43 @@
1
+ # Bundled frontend UI/UX skills
2
+
3
+ These `SKILL.md` files are vendored from upstream skill repositories so SKC
4
+ sessions can invoke frontend UI/UX craft skills without a separate user
5
+ install. They are **not** SKC public workflow skills: the four public
6
+ workflows remain `deep-interview`, `ralplan`, `ultragoal`, and `team`.
7
+
8
+ Regenerate with:
9
+
10
+ ```bash
11
+ bun scripts/build-ui-skill-bundle.ts \
12
+ --source emilkowalski=<checkout> \
13
+ --source appllama=<checkout>
14
+ ```
15
+
16
+ Only `SKILL.md` is compiled into the binary, and a bundled skill's `baseDir`
17
+ is a virtual `embedded:skc/...` path. Companion reference files are therefore
18
+ inlined into each `SKILL.md` as appendices by the generator; do not add
19
+ loose companion files here expecting them to be readable at runtime.
20
+
21
+ ## Sources
22
+
23
+ | Upstream | License | Vendored skills |
24
+ | --- | --- | --- |
25
+ | [emilkowalski/skills](https://github.com/emilkowalski/skills) | MIT (`LICENSE.emilkowalski`), Copyright (c) 2026 Emil Kowalski | `emil-design-eng`, `animate`, `review-animations`, `improve-animations`, `find-animation-opportunities`, `pick-ui-library`, `prototype`, `mobile-native`, `animation-vocabulary`, `apple-design`, `ask-sonner` |
26
+ | [Appllama/appllama-skills](https://github.com/Appllama/appllama-skills) | MIT (`LICENSE.appllama`) | `appllama-app-design-skill` |
27
+
28
+ ## Deliberate exclusions
29
+
30
+ - `write-swift`, `animate-expo` (emilkowalski) — not web frontend craft.
31
+ - `appllama-usage` (Appllama) — it exists only to drive the paid Appllama MCP
32
+ (`mcp.appllama.io`). SKC neither ships nor enables that connector, so
33
+ bundling it would instruct the agent to call tools that do not exist.
34
+ `appllama-app-design-skill` is upstream-documented as standalone.
35
+
36
+ - [`Jakubantalik/transitions.dev`](https://github.com/Jakubantalik/transitions.dev) — **not vendored.** Its terms license only the `transitions-dev` CLI and Refine tooling under MIT; the transition collection is governed by a separate "Using the transitions" clause that permits unlimited use in your own projects but forbids repackaging or publishing the collection (or a substantial part of it). SKC therefore never carries the content: the agent installs it into the user's own project on demand via `npx -y skills@latest add Jakubantalik/transitions.dev --skill transitions-dev -a universal -y`. See `hooks/ui-skill-keywords.ts`.
37
+ - [`DavidHDev/react-bits`](https://github.com/DavidHDev/react-bits) — **components not vendored.** React Bits is a shadcn component registry, not an agent skill repo (it ships no `SKILL.md`), and its MIT + Commons Clause license forbids selling, sublicensing, or redistributing the components "alone, in a bundle, or as a ported version". The bundled `react-bits` skill is therefore **SKC-authored guidance**: when to reach for the registry, how to install one component (`npx shadcn@latest add @react-bits/<Component>-<Variant>`), the `components.json` precondition, and a factual catalog of component names. No upstream component source is included; components are installed from the registry into the user's own project.
38
+
39
+ ## Trademarks
40
+
41
+ The Appllama name, llama, and logo are trademarks of Antmind Ventures Private
42
+ Limited. The MIT license does not grant rights to use them; they appear here
43
+ only to attribute the source of the vendored skill.