@@ -1318,7 +1327,7 @@ export function PromptForm({ categories, tags, initialData, initialContributors
{/* Code output content */}
{/* eslint-disable-next-line react/jsx-no-comment-textnodes -- Intentional code preview text */}
-
// Code generated by skill...
+
// Code generated by skill, and your taste...
export function handler() {'{'}
return "...";
{'}'}
diff --git a/src/components/prompts/widget-card.tsx b/src/components/prompts/widget-card.tsx
index ffa4dd12..5118d320 100644
--- a/src/components/prompts/widget-card.tsx
+++ b/src/components/prompts/widget-card.tsx
@@ -102,7 +102,7 @@ export function WidgetCard({ prompt }: WidgetCardProps) {
{/* Content Preview */}
diff --git a/src/lib/ai/prompt-builder-tools.ts b/src/lib/ai/prompt-builder-tools.ts
index 1afac253..a281d9aa 100644
--- a/src/lib/ai/prompt-builder-tools.ts
+++ b/src/lib/ai/prompt-builder-tools.ts
@@ -5,7 +5,7 @@ export interface PromptBuilderState {
title: string;
description: string;
content: string;
- type: "TEXT" | "IMAGE" | "VIDEO" | "AUDIO" | "STRUCTURED";
+ type: "TEXT" | "IMAGE" | "VIDEO" | "AUDIO" | "STRUCTURED" | "TASTE";
structuredFormat?: "JSON" | "YAML";
categoryId?: string;
tagIds: string[];
diff --git a/src/lib/plugins/widgets/book.tsx b/src/lib/plugins/widgets/book.tsx
index e1d451b0..9ee21ac0 100644
--- a/src/lib/plugins/widgets/book.tsx
+++ b/src/lib/plugins/widgets/book.tsx
@@ -160,7 +160,11 @@ export const bookWidget: WidgetPlugin = {
repeatEvery: 60,
maxCount: 4,
},
- shouldInject: () => {
+ shouldInject: (context) => {
+ // Don't inject on the skills page
+ if (context.filters?.type === "SKILL") {
+ return false;
+ }
return true;
},
render: () =>
,
diff --git a/src/lib/plugins/widgets/coderabbit.ts b/src/lib/plugins/widgets/coderabbit.ts
index 279eadcc..ec7beb9f 100644
--- a/src/lib/plugins/widgets/coderabbit.ts
+++ b/src/lib/plugins/widgets/coderabbit.ts
@@ -57,6 +57,11 @@ Provide your review in a clear, actionable format with specific line references
shouldInject: (context) => {
const { filters } = context;
+ // Don't inject on the skills page
+ if (filters?.type === "SKILL") {
+ return false;
+ }
+
// Inject when no filters are active
if (!filters?.q && !filters?.category && !filters?.tag) {
return true;
diff --git a/src/lib/plugins/widgets/commandcode.ts b/src/lib/plugins/widgets/commandcode.ts
new file mode 100644
index 00000000..237e1145
--- /dev/null
+++ b/src/lib/plugins/widgets/commandcode.ts
@@ -0,0 +1,56 @@
+import type { WidgetPlugin } from "./types";
+
+export const commandcodeWidget: WidgetPlugin = {
+ id: "commandcode",
+ name: "CommandCode",
+ prompts: [
+ {
+ id: "commandcode-coding-agent",
+ slug: "commandcode-coding-agent-with-taste",
+ title: "CommandCode — Coding Agent with Taste",
+ description: "The first frontier coding agent that both builds software and continuously learns your coding taste. Ships full-stack projects, features, fixes bugs, writes tests, and refactors, all while learning how you write code.",
+ content: `## Install
+npm i -g command-code
+
+## get started
+cd my-project
+cmd
+
+## Manage Taste with \`npx taste\`
+Share and manage taste profiles like Git.
+
+## Push project taste to remote
+npx taste push --all
+
+## Pull taste from remote
+npx taste pull username/project-name`,
+ type: "TEXT",
+ sponsor: {
+ name: "CommandCode",
+ logo: "/sponsors/commandcode.svg",
+ logoDark: "/sponsors/commandcode-dark.svg",
+ url: "https://commandcode.ai",
+ },
+ tags: ["Coding Agents", "Developer Tools", "AI Agents"],
+ category: "Development",
+ actionUrl: "https://commandcode.ai",
+ actionLabel: "Try CommandCode",
+ positioning: {
+ position: 2,
+ mode: "repeat",
+ repeatEvery: 50,
+ maxCount: 3,
+ },
+ shouldInject: (context) => {
+ const { filters } = context;
+
+ // Only inject on the skills page (type=SKILL)
+ if (filters?.type === "SKILL") {
+ return true;
+ }
+
+ return false;
+ },
+ },
+ ],
+};
diff --git a/src/lib/plugins/widgets/index.ts b/src/lib/plugins/widgets/index.ts
index 5dd91114..fca9a0da 100644
--- a/src/lib/plugins/widgets/index.ts
+++ b/src/lib/plugins/widgets/index.ts
@@ -2,6 +2,7 @@ import type { WidgetPlugin, WidgetPrompt, WidgetContext } from "./types";
import { coderabbitWidget } from "./coderabbit";
import { bookWidget } from "./book";
import { textreamWidget } from "./textream";
+import { commandcodeWidget } from "./commandcode";
export * from "./types";
@@ -10,6 +11,7 @@ const widgetPlugins: WidgetPlugin[] = [
coderabbitWidget,
bookWidget,
textreamWidget,
+ commandcodeWidget,
];
/**
diff --git a/src/lib/plugins/widgets/textream.tsx b/src/lib/plugins/widgets/textream.tsx
index 316435ba..d7e306c1 100644
--- a/src/lib/plugins/widgets/textream.tsx
+++ b/src/lib/plugins/widgets/textream.tsx
@@ -122,6 +122,11 @@ export const textreamWidget: WidgetPlugin = {
shouldInject: (context) => {
const { filters } = context;
+ // Don't inject on the skills page
+ if (filters?.type === "SKILL") {
+ return false;
+ }
+
// Show when no filters active
if (!filters?.q && !filters?.category && !filters?.tag) {
return true;