feat(cli): claudemesh skill prints bundled SKILL.md (v1.18.0)
Some checks failed
CI / Docker build (linux/amd64) (push) Has been cancelled
CI / Lint (push) Has been cancelled
CI / Typecheck (push) Has been cancelled
CI / Broker tests (Postgres) (push) Has been cancelled

Zero-install access to the protocol reference: a fresh `npm i -g
claudemesh-cli` user (or someone running the prebuilt binary) can
now `claudemesh skill | claude --skill-add -` without copying any
files into ~/.claude/skills. The skill markdown is embedded into
the CLI bundle at build time via Bun's text-import attribute.

Also replaces two `<> ALL(...)` raw SQL fragments in the dashboard
unread-count queries with drizzle's notInArray() helper — matches
the same fix already applied to /v1/me/topics in the API package.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Alejandro Gutiérrez
2026-05-03 12:24:45 +01:00
parent 50b2ae97c2
commit f9ed3fa286
6 changed files with 42 additions and 7 deletions

View File

@@ -14,7 +14,7 @@ import {
meshTopicMember,
meshTopicMessage,
} from "@turbostarter/db/schema/mesh";
import { aliasedTable, and, count, desc, eq, gt, inArray, isNull, or, sql } from "drizzle-orm";
import { aliasedTable, and, count, desc, eq, gt, inArray, isNull, notInArray, or, sql } from "drizzle-orm";
import { appConfig } from "~/config/app";
import { pathsConfig } from "~/config/paths";
@@ -110,7 +110,7 @@ export default async function UniversePage() {
and(
inArray(meshTopic.meshId, meshIds),
isNull(meshTopic.archivedAt),
sql`${meshTopicMessage.senderMemberId} <> ALL(${myMemberIds})`,
notInArray(meshTopicMessage.senderMemberId, myMemberIds),
or(
isNull(meshTopicMember.lastReadAt),
sql`${meshTopicMessage.createdAt} > ${meshTopicMember.lastReadAt}`,

View File

@@ -8,7 +8,7 @@ import {
meshTopicMember,
meshTopicMessage,
} from "@turbostarter/db/schema/mesh";
import { and, asc, count, eq, inArray, isNull, or, sql } from "drizzle-orm";
import { and, asc, count, eq, inArray, isNull, notInArray, or, sql } from "drizzle-orm";
import { pathsConfig } from "~/config/paths";
import { getSession } from "~/lib/auth/server";
@@ -107,7 +107,7 @@ export default async function WorkspaceTopicsPage() {
.where(
and(
inArray(meshTopicMessage.topicId, topicIds),
sql`${meshTopicMessage.senderMemberId} <> ALL(${myMemberIds})`,
notInArray(meshTopicMessage.senderMemberId, myMemberIds),
or(
isNull(meshTopicMember.lastReadAt),
sql`${meshTopicMessage.createdAt} > ${meshTopicMember.lastReadAt}`,