create-adsk
Advanced tools
| /** Brand green (#00aa6f). */ | ||
| export declare const BRAND_HEX = "#00aa6f"; | ||
| /** ANSI Shadow–style wordmark (matches skills CLI density). */ | ||
| export declare const LOGO_LINES: readonly [" █████╗ ██████╗ ███████╗██╗ ██╗", "██╔══██╗██╔══██╗██╔════╝██║ ██╔╝", "███████║██║ ██║███████╗█████╔╝ ", "██╔══██║██║ ██║╚════██║██╔═██╗ ", "██║ ██║██████╔╝███████║██║ ██╗", "╚═╝ ╚═╝╚═════╝ ╚══════╝╚═╝ ╚═╝"]; | ||
| export declare const TAGLINE = "The Agentic Development Starter Kit"; | ||
| /** One-sentence product pitch (no unexplained acronyms). */ | ||
| export declare const PRODUCT_DESCRIPTION = "A ready-to-adopt kit for agentic, spec-driven development \u2014 workflow skills, Cursor slash commands, and a versioned profile for your team."; | ||
| export declare const DOCS_URL = "https://github.com/rhyanvargas/agentic-development-starter-kit"; | ||
| /** Plain + ANSI banner string (for --help and tests). */ | ||
| export declare function renderHelpBanner(): string; | ||
| /** Logo + product name + one-line pitch (interactive init intro). */ | ||
| export declare function showLogo(): void; | ||
| export declare function showHelpBanner(): void; |
+116
| /** | ||
| * Terminal landing UX — same visual language as `npx skills` | ||
| * (block logo + dim tagline + two-column commands + try/footer), | ||
| * with ADSK brand accent #00aa6f. | ||
| */ | ||
| import { TWO_TOOL_BLURB } from "./help-copy.js"; | ||
| const RESET = "\x1B[0m"; | ||
| const DIM = "\x1B[38;5;102m"; | ||
| const TEXT = "\x1B[38;5;145m"; | ||
| /** Brand green (#00aa6f). */ | ||
| export const BRAND_HEX = "#00aa6f"; | ||
| const BRAND = "\x1B[38;2;0;170;111m"; | ||
| function rgb(r, g, b) { | ||
| return `\x1B[38;2;${r};${g};${b}m`; | ||
| } | ||
| /** ANSI Shadow–style wordmark (matches skills CLI density). */ | ||
| export const LOGO_LINES = [ | ||
| " █████╗ ██████╗ ███████╗██╗ ██╗", | ||
| "██╔══██╗██╔══██╗██╔════╝██║ ██╔╝", | ||
| "███████║██║ ██║███████╗█████╔╝ ", | ||
| "██╔══██║██║ ██║╚════██║██╔═██╗ ", | ||
| "██║ ██║██████╔╝███████║██║ ██╗", | ||
| "╚═╝ ╚═╝╚═════╝ ╚══════╝╚═╝ ╚═╝", | ||
| ]; | ||
| /** Top→bottom brand gradient around #00aa6f. */ | ||
| const LOGO_COLORS = [ | ||
| rgb(102, 214, 170), | ||
| rgb(51, 196, 148), | ||
| rgb(0, 170, 111), | ||
| rgb(0, 145, 95), | ||
| rgb(0, 120, 78), | ||
| rgb(0, 95, 62), | ||
| ]; | ||
| export const TAGLINE = "The Agentic Development Starter Kit"; | ||
| /** One-sentence product pitch (no unexplained acronyms). */ | ||
| export const PRODUCT_DESCRIPTION = "A ready-to-adopt kit for agentic, spec-driven development — workflow skills, Cursor slash commands, and a versioned profile for your team."; | ||
| export const DOCS_URL = "https://github.com/rhyanvargas/agentic-development-starter-kit"; | ||
| const PRIMARY_COMMANDS = [ | ||
| { cmd: "npx create-adsk", desc: "Apply a kit profile (default)" }, | ||
| { | ||
| cmd: "npx create-adsk", | ||
| args: "--profile <id> -y", | ||
| desc: "Non-interactive adopt", | ||
| }, | ||
| { cmd: "npx create-adsk update", desc: "Refresh skills + Cursor" }, | ||
| { cmd: "npx create-adsk status", desc: "Show profile and drift" }, | ||
| ]; | ||
| const OPTION_COMMANDS = [ | ||
| { cmd: "npx create-adsk", args: "--dry-run", desc: "Preview without writing" }, | ||
| { | ||
| cmd: "npx create-adsk", | ||
| args: "--scope global", | ||
| desc: "Install skills globally", | ||
| }, | ||
| ]; | ||
| function visibleLen(s) { | ||
| return s.replace(/\x1B\[[0-9;]*m/g, "").length; | ||
| } | ||
| function formatRow(row, cmdWidth) { | ||
| const args = row.args ? ` ${DIM}${row.args}${RESET}` : ""; | ||
| const left = `${BRAND}$${RESET} ${TEXT}${row.cmd}${RESET}${args}`; | ||
| const pad = Math.max(1, cmdWidth - visibleLen(left) + 2); | ||
| return ` ${left}${" ".repeat(pad)}${DIM}${row.desc}${RESET}`; | ||
| } | ||
| function maxCmdWidth(rows) { | ||
| return Math.max(...rows.map((r) => { | ||
| const plain = `$ ${r.cmd}${r.args ? ` ${r.args}` : ""}`; | ||
| return plain.length; | ||
| })); | ||
| } | ||
| function renderLogoLines() { | ||
| return LOGO_LINES.map((line, i) => `${LOGO_COLORS[i]}${line}${RESET}`); | ||
| } | ||
| /** Plain + ANSI banner string (for --help and tests). */ | ||
| export function renderHelpBanner() { | ||
| const lines = ["", ...renderLogoLines()]; | ||
| lines.push(""); | ||
| lines.push(`${DIM}${TAGLINE}${RESET}`); | ||
| lines.push(""); | ||
| lines.push(`${TEXT}${PRODUCT_DESCRIPTION}${RESET}`); | ||
| lines.push(""); | ||
| const width = maxCmdWidth([...PRIMARY_COMMANDS, ...OPTION_COMMANDS]); | ||
| for (const row of PRIMARY_COMMANDS) { | ||
| lines.push(formatRow(row, width)); | ||
| } | ||
| lines.push(""); | ||
| for (const row of OPTION_COMMANDS) { | ||
| lines.push(formatRow(row, width)); | ||
| } | ||
| lines.push(""); | ||
| lines.push(`${DIM}try:${RESET} ${BRAND}npx create-adsk --profile core --yes${RESET}`); | ||
| lines.push(""); | ||
| // Terminal copy: drop markdown backticks for a cleaner skills-style line. | ||
| const blurb = TWO_TOOL_BLURB.replace(/`/g, ""); | ||
| lines.push(`${DIM}${blurb}${RESET}`); | ||
| lines.push(""); | ||
| lines.push(`Learn more at ${BRAND}${DOCS_URL}${RESET}`); | ||
| lines.push(""); | ||
| return lines.join("\n"); | ||
| } | ||
| /** Logo + product name + one-line pitch (interactive init intro). */ | ||
| export function showLogo() { | ||
| console.log(); | ||
| for (const line of renderLogoLines()) { | ||
| console.log(line); | ||
| } | ||
| console.log(); | ||
| console.log(`${DIM}${TAGLINE}${RESET}`); | ||
| console.log(); | ||
| console.log(`${TEXT}${PRODUCT_DESCRIPTION}${RESET}`); | ||
| console.log(); | ||
| } | ||
| export function showHelpBanner() { | ||
| process.stdout.write(renderHelpBanner()); | ||
| } | ||
| //# sourceMappingURL=banner.js.map |
| {"version":3,"file":"banner.js","sourceRoot":"","sources":["../src/banner.ts"],"names":[],"mappings":"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"} |
| #!/usr/bin/env node | ||
| export {}; |
+97
| #!/usr/bin/env node | ||
| import { Command, Help } from "commander"; | ||
| import { renderHelpBanner, showLogo } from "./banner.js"; | ||
| import { HELP_DESCRIPTION } from "./help-copy.js"; | ||
| import { runInit } from "./init.js"; | ||
| import { runStatus } from "./status.js"; | ||
| import { runUpdate } from "./update.js"; | ||
| const program = new Command(); | ||
| /** Root `--help` uses the skills-style banner; subcommands keep default Help. */ | ||
| class AdskHelp extends Help { | ||
| formatHelp(cmd, helper) { | ||
| if (!cmd.parent) { | ||
| return renderHelpBanner(); | ||
| } | ||
| return super.formatHelp(cmd, helper); | ||
| } | ||
| } | ||
| program.createHelp = () => new AdskHelp(); | ||
| program | ||
| .name("create-adsk") | ||
| .description(HELP_DESCRIPTION) | ||
| .version("0.1.0"); | ||
| function parseScope(value) { | ||
| if (value !== "project" && value !== "global") { | ||
| throw new Error(`Invalid --scope ${value} (expected project|global)`); | ||
| } | ||
| return value; | ||
| } | ||
| program | ||
| .command("init", { isDefault: true }) | ||
| .description("Apply an ADSK profile (default command)") | ||
| .option("--profile <id>", "Profile: core|delivery|maintainer|skills-only") | ||
| .option("-y, --yes", "Non-interactive; default profile core if omitted", false) | ||
| .option("--scope <scope>", "project|global", "project") | ||
| .option("--target <dir>", "App root to adopt into", ".") | ||
| .option("--dry-run", "Print actions without writing", false) | ||
| .option("--force-rules", "Overwrite existing stock rules", false) | ||
| .option("--with-optional-packs", "Include optional product-value-loop packs (default off with --yes)", false) | ||
| .action(async (opts) => { | ||
| try { | ||
| const interactive = !opts.yes && process.stdout.isTTY; | ||
| if (interactive) { | ||
| showLogo(); | ||
| } | ||
| await runInit({ | ||
| target: opts.target, | ||
| profile: opts.profile, | ||
| yes: Boolean(opts.yes), | ||
| dryRun: Boolean(opts.dryRun), | ||
| scope: parseScope(opts.scope), | ||
| forceRules: Boolean(opts.forceRules), | ||
| withOptionalPacks: Boolean(opts.withOptionalPacks), | ||
| }); | ||
| } | ||
| catch (err) { | ||
| console.error(err instanceof Error ? err.message : err); | ||
| process.exit(1); | ||
| } | ||
| }); | ||
| program | ||
| .command("update") | ||
| .description("Refresh skills + Cursor from saved .adsk/config.json") | ||
| .option("--target <dir>", "App root", ".") | ||
| .option("--dry-run", "Print actions without writing", false) | ||
| .option("--force-rules", "Overwrite existing stock rules", false) | ||
| .action(async (opts) => { | ||
| try { | ||
| await runUpdate({ | ||
| target: opts.target, | ||
| dryRun: Boolean(opts.dryRun), | ||
| forceRules: Boolean(opts.forceRules), | ||
| }); | ||
| } | ||
| catch (err) { | ||
| console.error(err instanceof Error ? err.message : err); | ||
| process.exit(1); | ||
| } | ||
| }); | ||
| program | ||
| .command("status") | ||
| .description("Show profile, kitRef, and drift (exit 1 if drift)") | ||
| .option("--target <dir>", "App root", ".") | ||
| .action((opts) => { | ||
| try { | ||
| const result = runStatus({ target: opts.target }); | ||
| process.exit(result.exitCode); | ||
| } | ||
| catch (err) { | ||
| console.error(err instanceof Error ? err.message : err); | ||
| process.exit(1); | ||
| } | ||
| }); | ||
| program.parseAsync(process.argv).catch((err) => { | ||
| console.error(err instanceof Error ? err.message : err); | ||
| process.exit(1); | ||
| }); | ||
| //# sourceMappingURL=cli.js.map |
| {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"} |
| import type { AdskConfig } from "./types.js"; | ||
| export declare const CONFIG_REL_PATH = ".adsk/config.json"; | ||
| export declare function configPath(appRoot: string): string; | ||
| export declare function writeConfig(appRoot: string, cfg: AdskConfig): void; | ||
| export declare function readConfig(appRoot: string): AdskConfig | null; |
| import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"; | ||
| import { dirname, join } from "node:path"; | ||
| import { isProfileId } from "./profiles.js"; | ||
| export const CONFIG_REL_PATH = ".adsk/config.json"; | ||
| export function configPath(appRoot) { | ||
| return join(appRoot, CONFIG_REL_PATH); | ||
| } | ||
| export function writeConfig(appRoot, cfg) { | ||
| const path = configPath(appRoot); | ||
| mkdirSync(dirname(path), { recursive: true }); | ||
| writeFileSync(path, `${JSON.stringify(cfg, null, 2)}\n`, "utf8"); | ||
| } | ||
| export function readConfig(appRoot) { | ||
| const path = configPath(appRoot); | ||
| if (!existsSync(path)) | ||
| return null; | ||
| const raw = JSON.parse(readFileSync(path, "utf8")); | ||
| return validateConfig(raw); | ||
| } | ||
| function validateConfig(raw) { | ||
| if (raw.version !== 1) | ||
| throw new Error("Invalid .adsk/config.json: version must be 1"); | ||
| if (!raw.profile || !isProfileId(raw.profile)) { | ||
| throw new Error("Invalid .adsk/config.json: missing/invalid profile"); | ||
| } | ||
| if (raw.cursor !== "commands" && raw.cursor !== "none") { | ||
| throw new Error("Invalid .adsk/config.json: cursor must be commands|none"); | ||
| } | ||
| if (raw.rules !== "stock" && raw.rules !== "none") { | ||
| throw new Error("Invalid .adsk/config.json: rules must be stock|none"); | ||
| } | ||
| if (raw.scope !== "project" && raw.scope !== "global") { | ||
| throw new Error("Invalid .adsk/config.json: scope must be project|global"); | ||
| } | ||
| if (typeof raw.kitRef !== "string" || !raw.kitRef) { | ||
| throw new Error("Invalid .adsk/config.json: kitRef required"); | ||
| } | ||
| if (!Array.isArray(raw.optionalPacks)) { | ||
| throw new Error("Invalid .adsk/config.json: optionalPacks must be an array"); | ||
| } | ||
| return { | ||
| version: 1, | ||
| profile: raw.profile, | ||
| cursor: raw.cursor, | ||
| rules: raw.rules, | ||
| scope: raw.scope, | ||
| kitRef: raw.kitRef, | ||
| optionalPacks: raw.optionalPacks.map(String), | ||
| }; | ||
| } | ||
| //# sourceMappingURL=config.js.map |
| {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,CAAC,MAAM,eAAe,GAAG,mBAAmB,CAAC;AAEnD,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,OAAO,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe,EAAE,GAAe;IAC1D,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IACjC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,aAAa,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IACjC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAwB,CAAC;IAC1E,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,cAAc,CAAC,GAAwB;IAC9C,IAAI,GAAG,CAAC,OAAO,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IACvF,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,UAAU,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,GAAG,CAAC,KAAK,KAAK,OAAO,IAAI,GAAG,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,GAAG,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QACtD,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO;QACL,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,aAAa,EAAE,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;KAC7C,CAAC;AACJ,CAAC"} |
| import type { CursorMode, RulesMode } from "./types.js"; | ||
| /** Match STOCK_RULES in scripts/sync-adsk.sh */ | ||
| export declare const STOCK_RULES: readonly ["skill-authoring", "testing", "project-cmds"]; | ||
| export declare function listSkillNamesFromSnapshot(snapshotRoot: string): string[]; | ||
| export declare function syncCursor(opts: { | ||
| snapshotRoot: string; | ||
| appRoot: string; | ||
| cursor: CursorMode; | ||
| rules: RulesMode; | ||
| forceRules: boolean; | ||
| dryRun: boolean; | ||
| }): { | ||
| commandsWritten: string[]; | ||
| rulesWritten: string[]; | ||
| skipped: string[]; | ||
| }; | ||
| export declare function commandBasenames(snapshotRoot: string): string[]; |
| import { cpSync, existsSync, mkdirSync, readdirSync, readFileSync, rmSync, statSync, writeFileSync, } from "node:fs"; | ||
| import { basename, join } from "node:path"; | ||
| import { rewriteCommandBody } from "./path-rewrite.js"; | ||
| /** Match STOCK_RULES in scripts/sync-adsk.sh */ | ||
| export const STOCK_RULES = ["skill-authoring", "testing", "project-cmds"]; | ||
| export function listSkillNamesFromSnapshot(snapshotRoot) { | ||
| const skillsDir = join(snapshotRoot, "skills"); | ||
| if (existsSync(skillsDir)) { | ||
| return readdirSync(skillsDir).filter((name) => existsSync(join(skillsDir, name, "SKILL.md"))); | ||
| } | ||
| // Snapshot may omit skills/; derive names from profiles.json | ||
| try { | ||
| const profiles = JSON.parse(readFileSync(join(snapshotRoot, "profiles.json"), "utf8")); | ||
| const set = new Set(); | ||
| for (const p of Object.values(profiles.profiles ?? {})) { | ||
| for (const s of p.skills ?? []) | ||
| set.add(s); | ||
| } | ||
| return [...set].sort(); | ||
| } | ||
| catch { | ||
| return []; | ||
| } | ||
| } | ||
| export function syncCursor(opts) { | ||
| const commandsWritten = []; | ||
| const rulesWritten = []; | ||
| const skipped = []; | ||
| if (opts.cursor === "none") { | ||
| return { commandsWritten, rulesWritten, skipped }; | ||
| } | ||
| const skillNames = listSkillNamesFromSnapshot(opts.snapshotRoot); | ||
| const srcCmds = join(opts.snapshotRoot, ".cursor", "commands"); | ||
| const destCmds = join(opts.appRoot, ".cursor", "commands"); | ||
| if (!existsSync(srcCmds)) { | ||
| throw new Error(`missing ${srcCmds}`); | ||
| } | ||
| if (!opts.dryRun) { | ||
| mkdirSync(destCmds, { recursive: true }); | ||
| } | ||
| for (const entry of readdirSync(srcCmds)) { | ||
| if (!entry.endsWith(".md")) | ||
| continue; | ||
| const src = join(srcCmds, entry); | ||
| if (!statSync(src).isFile()) | ||
| continue; | ||
| const body = rewriteCommandBody(readFileSync(src, "utf8"), skillNames); | ||
| const dest = join(destCmds, entry); | ||
| if (opts.dryRun) { | ||
| commandsWritten.push(entry); | ||
| continue; | ||
| } | ||
| writeFileSync(dest, body, "utf8"); | ||
| commandsWritten.push(entry); | ||
| } | ||
| if (opts.rules === "stock") { | ||
| const srcRules = join(opts.snapshotRoot, ".cursor", "rules"); | ||
| const destRules = join(opts.appRoot, ".cursor", "rules"); | ||
| if (existsSync(srcRules)) { | ||
| if (!opts.dryRun) | ||
| mkdirSync(destRules, { recursive: true }); | ||
| for (const name of STOCK_RULES) { | ||
| const srcDir = join(srcRules, name); | ||
| if (!existsSync(srcDir) || !statSync(srcDir).isDirectory()) | ||
| continue; | ||
| const destDir = join(destRules, name); | ||
| if (existsSync(destDir) && !opts.forceRules) { | ||
| skipped.push(name); | ||
| continue; | ||
| } | ||
| if (opts.dryRun) { | ||
| rulesWritten.push(name); | ||
| continue; | ||
| } | ||
| rmSync(destDir, { recursive: true, force: true }); | ||
| mkdirSync(destDir, { recursive: true }); | ||
| cpSync(srcDir, destDir, { recursive: true }); | ||
| rulesWritten.push(name); | ||
| } | ||
| } | ||
| } | ||
| if (!opts.dryRun) { | ||
| mkdirSync(join(opts.appRoot, ".cursor", "docs", "specs"), { | ||
| recursive: true, | ||
| }); | ||
| mkdirSync(join(opts.appRoot, ".cursor", "plans"), { recursive: true }); | ||
| } | ||
| return { commandsWritten, rulesWritten, skipped }; | ||
| } | ||
| export function commandBasenames(snapshotRoot) { | ||
| const srcCmds = join(snapshotRoot, ".cursor", "commands"); | ||
| if (!existsSync(srcCmds)) | ||
| return []; | ||
| return readdirSync(srcCmds) | ||
| .filter((e) => e.endsWith(".md")) | ||
| .map((e) => basename(e)); | ||
| } | ||
| //# sourceMappingURL=cursor-sync.js.map |
| {"version":3,"file":"cursor-sync.js","sourceRoot":"","sources":["../src/cursor-sync.ts"],"names":[],"mappings":"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"} |
| /** Shared two-tool model copy for --help and README (REQ-014). */ | ||
| export declare const TWO_TOOL_BLURB: string; | ||
| /** Short description for Commander metadata (banner owns the landing UX). */ | ||
| export declare const HELP_DESCRIPTION: string; | ||
| /** Phrases that must not appear in create-adsk help (REQ-012). */ | ||
| export declare const FORBIDDEN_HELP_PHRASES: readonly ["browse skills", "skill catalog", "discover skills from GitHub"]; |
| /** Shared two-tool model copy for --help and README (REQ-014). */ | ||
| export const TWO_TOOL_BLURB = [ | ||
| "Use `npx skills` to install skill folders.", | ||
| "Use `npx create-adsk` when you want this kit’s workflow + Cursor", | ||
| "adopted as a versioned profile in your repo — not a skills marketplace.", | ||
| ].join(" "); | ||
| /** Short description for Commander metadata (banner owns the landing UX). */ | ||
| export const HELP_DESCRIPTION = [ | ||
| "Adopt the Agentic Development Starter Kit as a versioned profile.", | ||
| TWO_TOOL_BLURB, | ||
| ].join("\n\n"); | ||
| /** Phrases that must not appear in create-adsk help (REQ-012). */ | ||
| export const FORBIDDEN_HELP_PHRASES = [ | ||
| "browse skills", | ||
| "skill catalog", | ||
| "discover skills from GitHub", | ||
| ]; | ||
| //# sourceMappingURL=help-copy.js.map |
| {"version":3,"file":"help-copy.js","sourceRoot":"","sources":["../src/help-copy.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,4CAA4C;IAC5C,kEAAkE;IAClE,yEAAyE;CAC1E,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEZ,6EAA6E;AAC7E,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,mEAAmE;IACnE,cAAc;CACf,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAEf,kEAAkE;AAClE,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,eAAe;IACf,eAAe;IACf,6BAA6B;CACrB,CAAC"} |
| export { HELP_DESCRIPTION, TWO_TOOL_BLURB } from "./help-copy.js"; | ||
| export { BRAND_HEX, LOGO_LINES, TAGLINE, PRODUCT_DESCRIPTION, DOCS_URL, renderHelpBanner, showHelpBanner, showLogo, } from "./banner.js"; | ||
| export { readConfig, writeConfig } from "./config.js"; | ||
| export { runInit } from "./init.js"; | ||
| export { runUpdate } from "./update.js"; | ||
| export { runStatus } from "./status.js"; | ||
| export { syncCursor, STOCK_RULES } from "./cursor-sync.js"; | ||
| export { buildSkillsAddArgv, buildSkillsUpdateArgv, buildOptionalPackArgv, } from "./skills.js"; | ||
| export type { AdskConfig, ProfileId, Scope } from "./types.js"; |
| export { HELP_DESCRIPTION, TWO_TOOL_BLURB } from "./help-copy.js"; | ||
| export { BRAND_HEX, LOGO_LINES, TAGLINE, PRODUCT_DESCRIPTION, DOCS_URL, renderHelpBanner, showHelpBanner, showLogo, } from "./banner.js"; | ||
| export { readConfig, writeConfig } from "./config.js"; | ||
| export { runInit } from "./init.js"; | ||
| export { runUpdate } from "./update.js"; | ||
| export { runStatus } from "./status.js"; | ||
| export { syncCursor, STOCK_RULES } from "./cursor-sync.js"; | ||
| export { buildSkillsAddArgv, buildSkillsUpdateArgv, buildOptionalPackArgv, } from "./skills.js"; | ||
| //# sourceMappingURL=index.js.map |
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EACL,SAAS,EACT,UAAU,EACV,OAAO,EACP,mBAAmB,EACnB,QAAQ,EACR,gBAAgB,EAChB,cAAc,EACd,QAAQ,GACT,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,aAAa,CAAC"} |
| import { type RunCommand } from "./skills.js"; | ||
| import type { AdskConfig, Scope } from "./types.js"; | ||
| export interface InitOptions { | ||
| target: string; | ||
| profile?: string; | ||
| yes: boolean; | ||
| dryRun: boolean; | ||
| scope: Scope; | ||
| forceRules: boolean; | ||
| withOptionalPacks: boolean; | ||
| snapshotRoot?: string; | ||
| run?: RunCommand; | ||
| } | ||
| export declare function runInit(opts: InitOptions): Promise<AdskConfig>; |
+145
| import * as p from "@clack/prompts"; | ||
| import { writeConfig } from "./config.js"; | ||
| import { syncCursor } from "./cursor-sync.js"; | ||
| import { findOptionalPack, getProfile, isProfileId, listProfileIds, loadProfiles, loadRecommendedSkills, } from "./profiles.js"; | ||
| import { getSnapshotRoot, readKitRef } from "./snapshot.js"; | ||
| import { buildOptionalPackArgv, buildSkillsAddArgv, runSkills, } from "./skills.js"; | ||
| export async function runInit(opts) { | ||
| const snapshotRoot = getSnapshotRoot(opts.snapshotRoot); | ||
| const profiles = loadProfiles(snapshotRoot); | ||
| const kitRef = readKitRef(snapshotRoot); | ||
| const profileId = await resolveProfile(opts, profiles); | ||
| const profile = getProfile(profiles, profileId); | ||
| const optionalPacks = await resolveOptionalPacks(opts, profiles); | ||
| if (opts.dryRun) { | ||
| console.log(`[dry-run] profile=${profileId} scope=${opts.scope} kitRef=${kitRef}`); | ||
| } | ||
| const skillsArgv = buildSkillsAddArgv({ | ||
| kitSource: profiles.kit_source, | ||
| skills: profile.skills, | ||
| scope: opts.scope, | ||
| yes: true, | ||
| }); | ||
| if (opts.dryRun) { | ||
| console.log(`[dry-run] would run: ${skillsArgv.join(" ")}`); | ||
| } | ||
| const skillResult = await runSkills(skillsArgv, { | ||
| cwd: opts.target, | ||
| dryRun: opts.dryRun, | ||
| run: opts.run, | ||
| }); | ||
| if (skillResult.code !== 0) { | ||
| throw new Error(`skills add failed (exit ${skillResult.code}). Check skills CLI flags/network.`); | ||
| } | ||
| if (optionalPacks.length > 0) { | ||
| const recommended = loadRecommendedSkills(snapshotRoot); | ||
| for (const packId of optionalPacks) { | ||
| const entry = findOptionalPack(recommended, packId); | ||
| if (!entry) { | ||
| throw new Error(`Unknown optional pack: ${packId}`); | ||
| } | ||
| const installCmd = opts.scope === "global" | ||
| ? entry.install_global ?? entry.install | ||
| : entry.install ?? entry.install_global; | ||
| if (!installCmd) { | ||
| throw new Error(`Optional pack ${packId} has no install command`); | ||
| } | ||
| const packArgv = buildOptionalPackArgv(installCmd, opts.scope, true); | ||
| if (opts.dryRun) { | ||
| console.log(`[dry-run] would run optional pack ${packId}: ${packArgv.join(" ")}`); | ||
| } | ||
| const packResult = await runSkills(packArgv, { | ||
| cwd: opts.target, | ||
| dryRun: opts.dryRun, | ||
| run: opts.run, | ||
| }); | ||
| if (packResult.code !== 0) { | ||
| throw new Error(`optional pack install failed: ${packId}`); | ||
| } | ||
| } | ||
| } | ||
| else if (opts.dryRun) { | ||
| console.log("[dry-run] optional packs: none"); | ||
| } | ||
| const syncResult = syncCursor({ | ||
| snapshotRoot, | ||
| appRoot: opts.target, | ||
| cursor: profile.cursor, | ||
| rules: profile.rules, | ||
| forceRules: opts.forceRules, | ||
| dryRun: opts.dryRun, | ||
| }); | ||
| if (opts.dryRun) { | ||
| if (profile.cursor === "none") { | ||
| console.log("[dry-run] Cursor sync: skipped (cursor=none)"); | ||
| } | ||
| else { | ||
| console.log(`[dry-run] would sync ${syncResult.commandsWritten.length} command(s)` + | ||
| (profile.rules === "stock" | ||
| ? `, ${syncResult.rulesWritten.length} stock rule(s)` | ||
| : "")); | ||
| } | ||
| } | ||
| const cfg = { | ||
| version: 1, | ||
| profile: profileId, | ||
| cursor: profile.cursor, | ||
| rules: profile.rules, | ||
| scope: opts.scope, | ||
| kitRef, | ||
| optionalPacks, | ||
| }; | ||
| if (opts.dryRun) { | ||
| console.log(`[dry-run] would write ${opts.target}/.adsk/config.json`); | ||
| console.log("[dry-run] no files written"); | ||
| } | ||
| else { | ||
| writeConfig(opts.target, cfg); | ||
| if (profile.cursor === "commands") { | ||
| console.log("\nNext: open Cursor and try /quick-start\n"); | ||
| } | ||
| } | ||
| return cfg; | ||
| } | ||
| async function resolveProfile(opts, profiles) { | ||
| if (opts.profile) { | ||
| if (!isProfileId(opts.profile)) { | ||
| throw new Error(`Unknown profile "${opts.profile}". Expected: ${listProfileIds().join(", ")}`); | ||
| } | ||
| return opts.profile; | ||
| } | ||
| if (opts.yes) { | ||
| return "core"; | ||
| } | ||
| const choice = await p.select({ | ||
| message: "Select an ADSK profile", | ||
| options: listProfileIds().map((id) => ({ | ||
| value: id, | ||
| label: id, | ||
| hint: profiles.profiles[id].description, | ||
| })), | ||
| }); | ||
| if (p.isCancel(choice)) { | ||
| p.cancel("Cancelled"); | ||
| process.exit(1); | ||
| } | ||
| return choice; | ||
| } | ||
| async function resolveOptionalPacks(opts, profiles) { | ||
| if (opts.yes) { | ||
| return opts.withOptionalPacks ? [...profiles.optional_packs.ids] : []; | ||
| } | ||
| if (opts.withOptionalPacks) { | ||
| return [...profiles.optional_packs.ids]; | ||
| } | ||
| const add = await p.confirm({ | ||
| message: `Add optional product-value-loop packs? (${profiles.optional_packs.description})`, | ||
| initialValue: profiles.optional_packs.prompt_default, | ||
| }); | ||
| if (p.isCancel(add)) { | ||
| p.cancel("Cancelled"); | ||
| process.exit(1); | ||
| } | ||
| return add ? [...profiles.optional_packs.ids] : []; | ||
| } | ||
| //# sourceMappingURL=init.js.map |
| {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,WAAW,EACX,cAAc,EACd,YAAY,EACZ,qBAAqB,GACtB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,SAAS,GAEV,MAAM,aAAa,CAAC;AAerB,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAiB;IAC7C,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IAExC,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAEhD,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAEjE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,qBAAqB,SAAS,UAAU,IAAI,CAAC,KAAK,WAAW,MAAM,EAAE,CAAC,CAAC;IACrF,CAAC;IAED,MAAM,UAAU,GAAG,kBAAkB,CAAC;QACpC,SAAS,EAAE,QAAQ,CAAC,UAAU;QAC9B,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,GAAG,EAAE,IAAI;KACV,CAAC,CAAC;IAEH,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,wBAAwB,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,UAAU,EAAE;QAC9C,GAAG,EAAE,IAAI,CAAC,MAAM;QAChB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,GAAG,EAAE,IAAI,CAAC,GAAG;KACd,CAAC,CAAC;IACH,IAAI,WAAW,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CACb,2BAA2B,WAAW,CAAC,IAAI,oCAAoC,CAChF,CAAC;IACJ,CAAC;IAED,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,WAAW,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAAC;QACxD,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,gBAAgB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YACpD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,IAAI,KAAK,CAAC,0BAA0B,MAAM,EAAE,CAAC,CAAC;YACtD,CAAC;YACD,MAAM,UAAU,GACd,IAAI,CAAC,KAAK,KAAK,QAAQ;gBACrB,CAAC,CAAC,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,OAAO;gBACvC,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,cAAc,CAAC;YAC5C,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CAAC,iBAAiB,MAAM,yBAAyB,CAAC,CAAC;YACpE,CAAC;YACD,MAAM,QAAQ,GAAG,qBAAqB,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACrE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,qCAAqC,MAAM,KAAK,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACpF,CAAC;YACD,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE;gBAC3C,GAAG,EAAE,IAAI,CAAC,MAAM;gBAChB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,GAAG,EAAE,IAAI,CAAC,GAAG;aACd,CAAC,CAAC;YACH,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,iCAAiC,MAAM,EAAE,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;IACH,CAAC;SAAM,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,UAAU,GAAG,UAAU,CAAC;QAC5B,YAAY;QACZ,OAAO,EAAE,IAAI,CAAC,MAAM;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,CAAC,CAAC;IAEH,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;QAC9D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CACT,wBAAwB,UAAU,CAAC,eAAe,CAAC,MAAM,aAAa;gBACpE,CAAC,OAAO,CAAC,KAAK,KAAK,OAAO;oBACxB,CAAC,CAAC,KAAK,UAAU,CAAC,YAAY,CAAC,MAAM,gBAAgB;oBACrD,CAAC,CAAC,EAAE,CAAC,CACV,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,GAAG,GAAe;QACtB,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,SAAS;QAClB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM;QACN,aAAa;KACd,CAAC;IAEF,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,CAAC,MAAM,oBAAoB,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAC5C,CAAC;SAAM,CAAC;QACN,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC9B,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,IAAiB,EACjB,QAAyC;IAEzC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CACb,oBAAoB,IAAI,CAAC,OAAO,gBAAgB,cAAc,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC9E,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IACD,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC;QAC5B,OAAO,EAAE,wBAAwB;QACjC,OAAO,EAAE,cAAc,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACrC,KAAK,EAAE,EAAE;YACT,KAAK,EAAE,EAAE;YACT,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW;SACxC,CAAC,CAAC;KACJ,CAAC,CAAC;IACH,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACvB,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,MAAmB,CAAC;AAC7B,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,IAAiB,EACjB,QAAyC;IAEzC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACxE,CAAC;IACD,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC;QAC1B,OAAO,EAAE,2CAA2C,QAAQ,CAAC,cAAc,CAAC,WAAW,GAAG;QAC1F,YAAY,EAAE,QAAQ,CAAC,cAAc,CAAC,cAAc;KACrD,CAAC,CAAC;IACH,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACpB,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACrD,CAAC"} |
| /** | ||
| * Port of sync-adsk.sh translate_command_body. | ||
| * Rewrites bare skills/<name> → .agents/skills/<name> without matching | ||
| * the substring inside .agents/skills/<name>. | ||
| */ | ||
| export declare function rewriteCommandBody(body: string, skillNames: string[]): string; |
| /** | ||
| * Port of sync-adsk.sh translate_command_body. | ||
| * Rewrites bare skills/<name> → .agents/skills/<name> without matching | ||
| * the substring inside .agents/skills/<name>. | ||
| */ | ||
| export function rewriteCommandBody(body, skillNames) { | ||
| let out = body; | ||
| for (const name of skillNames) { | ||
| const re = new RegExp(`(^|[^/])skills/${escapeRegExp(name)}`, "g"); | ||
| out = out.replace(re, `$1.agents/skills/${name}`); | ||
| } | ||
| out = out.replace(/ \(or \.agents\/skills\/skill-optimizer in adopter apps\)/g, ""); | ||
| return out; | ||
| } | ||
| function escapeRegExp(s) { | ||
| return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); | ||
| } | ||
| //# sourceMappingURL=path-rewrite.js.map |
| {"version":3,"file":"path-rewrite.js","sourceRoot":"","sources":["../src/path-rewrite.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,UAAoB;IACnE,IAAI,GAAG,GAAG,IAAI,CAAC;IACf,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,kBAAkB,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACnE,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,oBAAoB,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,GAAG,GAAG,GAAG,CAAC,OAAO,CACf,4DAA4D,EAC5D,EAAE,CACH,CAAC;IACF,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,YAAY,CAAC,CAAS;IAC7B,OAAO,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC"} |
| import type { ProfileDef, ProfileId, ProfilesFile, RecommendedSkillEntry, RecommendedSkillsFile } from "./types.js"; | ||
| export declare function isProfileId(value: string): value is ProfileId; | ||
| export declare function listProfileIds(): ProfileId[]; | ||
| export declare function loadProfiles(snapshotRoot: string): ProfilesFile; | ||
| export declare function getProfile(profiles: ProfilesFile, id: ProfileId): ProfileDef; | ||
| export declare function loadRecommendedSkills(snapshotRoot: string): RecommendedSkillsFile; | ||
| export declare function findOptionalPack(recommended: RecommendedSkillsFile, id: string): RecommendedSkillEntry | undefined; |
| import { readFileSync } from "node:fs"; | ||
| import { join } from "node:path"; | ||
| const PROFILE_IDS = ["core", "delivery", "maintainer", "skills-only"]; | ||
| export function isProfileId(value) { | ||
| return PROFILE_IDS.includes(value); | ||
| } | ||
| export function listProfileIds() { | ||
| return [...PROFILE_IDS]; | ||
| } | ||
| export function loadProfiles(snapshotRoot) { | ||
| const raw = JSON.parse(readFileSync(join(snapshotRoot, "profiles.json"), "utf8")); | ||
| for (const id of PROFILE_IDS) { | ||
| if (!raw.profiles?.[id]) { | ||
| throw new Error(`profiles.json missing profile: ${id}`); | ||
| } | ||
| } | ||
| return raw; | ||
| } | ||
| export function getProfile(profiles, id) { | ||
| const def = profiles.profiles[id]; | ||
| if (!def) | ||
| throw new Error(`Unknown profile: ${id}`); | ||
| return def; | ||
| } | ||
| export function loadRecommendedSkills(snapshotRoot) { | ||
| return JSON.parse(readFileSync(join(snapshotRoot, "recommended-skills.json"), "utf8")); | ||
| } | ||
| export function findOptionalPack(recommended, id) { | ||
| const pools = [ | ||
| ...(recommended.optional ?? []), | ||
| ...(recommended.recommended ?? []), | ||
| ]; | ||
| return pools.find((e) => e.id === id); | ||
| } | ||
| //# sourceMappingURL=profiles.js.map |
| {"version":3,"file":"profiles.js","sourceRoot":"","sources":["../src/profiles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AASjC,MAAM,WAAW,GAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;AAEnF,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAQ,WAAwB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,CAAC,GAAG,WAAW,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,YAAoB;IAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CACpB,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,EAAE,MAAM,CAAC,CAC1C,CAAC;IAClB,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,kCAAkC,EAAE,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,QAAsB,EAAE,EAAa;IAC9D,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAClC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;IACpD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,YAAoB;IAEpB,OAAO,IAAI,CAAC,KAAK,CACf,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,yBAAyB,CAAC,EAAE,MAAM,CAAC,CAC3C,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,WAAkC,EAClC,EAAU;IAEV,MAAM,KAAK,GAAG;QACZ,GAAG,CAAC,WAAW,CAAC,QAAQ,IAAI,EAAE,CAAC;QAC/B,GAAG,CAAC,WAAW,CAAC,WAAW,IAAI,EAAE,CAAC;KACnC,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACxC,CAAC"} |
| import type { Scope } from "./types.js"; | ||
| export type RunCommand = (argv: string[], opts: { | ||
| cwd: string; | ||
| dryRun: boolean; | ||
| }) => Promise<{ | ||
| code: number; | ||
| argv: string[]; | ||
| }>; | ||
| export declare function buildSkillsAddArgv(opts: { | ||
| kitSource: string; | ||
| skills: string[]; | ||
| scope: Scope; | ||
| yes: boolean; | ||
| }): string[]; | ||
| export declare function buildSkillsUpdateArgv(opts: { | ||
| scope: Scope; | ||
| yes: boolean; | ||
| }): string[]; | ||
| /** Split an install command string into argv; ensure -y when yes. */ | ||
| export declare function buildOptionalPackArgv(installCmd: string, scope: Scope, yes: boolean): string[]; | ||
| export declare const defaultRunCommand: RunCommand; | ||
| export declare function runSkills(argv: string[], opts: { | ||
| cwd: string; | ||
| dryRun: boolean; | ||
| run?: RunCommand; | ||
| }): Promise<{ | ||
| code: number; | ||
| argv: string[]; | ||
| }>; |
| import { spawn } from "node:child_process"; | ||
| export function buildSkillsAddArgv(opts) { | ||
| const argv = ["npx", "--yes", "skills", "add", opts.kitSource]; | ||
| for (const skill of opts.skills) { | ||
| argv.push("--skill", skill); | ||
| } | ||
| if (opts.scope === "global") | ||
| argv.push("-g"); | ||
| if (opts.yes) | ||
| argv.push("-y"); | ||
| return argv; | ||
| } | ||
| export function buildSkillsUpdateArgv(opts) { | ||
| const argv = ["npx", "--yes", "skills", "update"]; | ||
| if (opts.yes) | ||
| argv.push("-y"); | ||
| if (opts.scope === "global") | ||
| argv.push("-g"); | ||
| else | ||
| argv.push("-p"); | ||
| return argv; | ||
| } | ||
| /** Split an install command string into argv; ensure -y when yes. */ | ||
| export function buildOptionalPackArgv(installCmd, scope, yes) { | ||
| const parts = installCmd.trim().split(/\s+/); | ||
| let argv = [...parts]; | ||
| if (scope === "global" && !argv.includes("-g") && !argv.includes("--global")) { | ||
| argv.push("-g"); | ||
| } | ||
| if (scope === "project") { | ||
| argv = argv.filter((a) => a !== "-g" && a !== "--global"); | ||
| } | ||
| if (yes && !argv.includes("-y") && !argv.includes("--yes")) { | ||
| argv.push("-y"); | ||
| } | ||
| return argv; | ||
| } | ||
| export const defaultRunCommand = async (argv, opts) => { | ||
| if (opts.dryRun) { | ||
| return { code: 0, argv }; | ||
| } | ||
| const [cmd, ...args] = argv; | ||
| const code = await new Promise((resolve, reject) => { | ||
| const child = spawn(cmd, args, { | ||
| cwd: opts.cwd, | ||
| stdio: "inherit", | ||
| shell: false, | ||
| }); | ||
| child.on("error", reject); | ||
| child.on("close", (c) => resolve(c ?? 1)); | ||
| }); | ||
| return { code, argv }; | ||
| }; | ||
| export async function runSkills(argv, opts) { | ||
| const run = opts.run ?? defaultRunCommand; | ||
| return run(argv, { cwd: opts.cwd, dryRun: opts.dryRun }); | ||
| } | ||
| //# sourceMappingURL=skills.js.map |
| {"version":3,"file":"skills.js","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"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"} |
| /** Resolve vendored kit-snapshot/ (next to dist/ or package root). */ | ||
| export declare function getSnapshotRoot(override?: string): string; | ||
| export declare function readKitRef(snapshotRoot: string): string; |
| import { existsSync, readFileSync } from "node:fs"; | ||
| import { dirname, join } from "node:path"; | ||
| import { fileURLToPath } from "node:url"; | ||
| const HERE = dirname(fileURLToPath(import.meta.url)); | ||
| /** Resolve vendored kit-snapshot/ (next to dist/ or package root). */ | ||
| export function getSnapshotRoot(override) { | ||
| if (override) | ||
| return override; | ||
| const candidates = [ | ||
| join(HERE, "..", "kit-snapshot"), | ||
| join(HERE, "kit-snapshot"), | ||
| ]; | ||
| for (const c of candidates) { | ||
| if (existsSync(join(c, "profiles.json"))) | ||
| return c; | ||
| } | ||
| throw new Error(`kit-snapshot not found (looked in ${candidates.join(", ")}). Run scripts/prepare-create-adsk-snapshot.sh`); | ||
| } | ||
| export function readKitRef(snapshotRoot) { | ||
| const p = join(snapshotRoot, "KIT_REF"); | ||
| if (!existsSync(p)) | ||
| return "unknown"; | ||
| return readFileSync(p, "utf8").trim() || "unknown"; | ||
| } | ||
| //# sourceMappingURL=snapshot.js.map |
| {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../src/snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAErD,sEAAsE;AACtE,MAAM,UAAU,eAAe,CAAC,QAAiB;IAC/C,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC;QAChC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC;KAC3B,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IACrD,CAAC;IACD,MAAM,IAAI,KAAK,CACb,qCAAqC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,gDAAgD,CAC3G,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,YAAoB;IAC7C,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IACxC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACrC,OAAO,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC;AACrD,CAAC"} |
| export interface StatusResult { | ||
| configPresent: boolean; | ||
| profile?: string; | ||
| kitRef?: string; | ||
| cursor?: string; | ||
| rules?: string; | ||
| scope?: string; | ||
| optionalPacks?: string[]; | ||
| drift: string[]; | ||
| exitCode: number; | ||
| } | ||
| export declare function runStatus(opts: { | ||
| target: string; | ||
| snapshotRoot?: string; | ||
| }): StatusResult; |
| import { existsSync } from "node:fs"; | ||
| import { homedir } from "node:os"; | ||
| import { join } from "node:path"; | ||
| import { readConfig } from "./config.js"; | ||
| import { commandBasenames } from "./cursor-sync.js"; | ||
| import { getProfile, loadProfiles } from "./profiles.js"; | ||
| import { getSnapshotRoot } from "./snapshot.js"; | ||
| export function runStatus(opts) { | ||
| const cfg = readConfig(opts.target); | ||
| if (!cfg) { | ||
| console.log("No .adsk/config.json — run `npx create-adsk init`."); | ||
| return { configPresent: false, drift: ["missing config"], exitCode: 1 }; | ||
| } | ||
| const snapshotRoot = getSnapshotRoot(opts.snapshotRoot); | ||
| const profiles = loadProfiles(snapshotRoot); | ||
| const profile = getProfile(profiles, cfg.profile); | ||
| const skillsRoot = cfg.scope === "global" | ||
| ? join(homedir(), ".agents", "skills") | ||
| : join(opts.target, ".agents", "skills"); | ||
| const drift = []; | ||
| for (const skill of profile.skills) { | ||
| const skillMd = join(skillsRoot, skill, "SKILL.md"); | ||
| if (!existsSync(skillMd)) { | ||
| drift.push(`missing skill: ${skill} (${skillMd})`); | ||
| } | ||
| } | ||
| if (cfg.cursor === "commands") { | ||
| for (const cmd of commandBasenames(snapshotRoot)) { | ||
| const dest = join(opts.target, ".cursor", "commands", cmd); | ||
| if (!existsSync(dest)) { | ||
| drift.push(`missing command: ${cmd}`); | ||
| } | ||
| } | ||
| } | ||
| console.log(`profile: ${cfg.profile}`); | ||
| console.log(`kitRef: ${cfg.kitRef}`); | ||
| console.log(`cursor: ${cfg.cursor}`); | ||
| console.log(`rules: ${cfg.rules}`); | ||
| console.log(`scope: ${cfg.scope}`); | ||
| console.log(`optionalPacks: ${cfg.optionalPacks.join(", ") || "(none)"}`); | ||
| if (drift.length === 0) { | ||
| console.log("drift: none"); | ||
| } | ||
| else { | ||
| console.log("drift:"); | ||
| for (const d of drift) | ||
| console.log(` - ${d}`); | ||
| } | ||
| return { | ||
| configPresent: true, | ||
| profile: cfg.profile, | ||
| kitRef: cfg.kitRef, | ||
| cursor: cfg.cursor, | ||
| rules: cfg.rules, | ||
| scope: cfg.scope, | ||
| optionalPacks: cfg.optionalPacks, | ||
| drift, | ||
| exitCode: drift.length === 0 ? 0 : 1, | ||
| }; | ||
| } | ||
| //# sourceMappingURL=status.js.map |
| {"version":3,"file":"status.js","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"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"} |
| export type ProfileId = "core" | "delivery" | "maintainer" | "skills-only"; | ||
| export type CursorMode = "commands" | "none"; | ||
| export type RulesMode = "stock" | "none"; | ||
| export type Scope = "project" | "global"; | ||
| export interface ProfileDef { | ||
| description: string; | ||
| skills: string[]; | ||
| cursor: CursorMode; | ||
| rules: RulesMode; | ||
| } | ||
| export interface ProfilesFile { | ||
| version: number; | ||
| product: string; | ||
| kit_source: string; | ||
| profiles: Record<ProfileId, ProfileDef>; | ||
| optional_packs: { | ||
| prompt_default: boolean; | ||
| description: string; | ||
| ids: string[]; | ||
| source_file: string; | ||
| docs: string; | ||
| }; | ||
| config_marker: { | ||
| path: string; | ||
| fields: string[]; | ||
| }; | ||
| } | ||
| export interface AdskConfig { | ||
| version: 1; | ||
| profile: ProfileId; | ||
| cursor: CursorMode; | ||
| rules: RulesMode; | ||
| scope: Scope; | ||
| kitRef: string; | ||
| optionalPacks: string[]; | ||
| } | ||
| export interface RecommendedSkillEntry { | ||
| id: string; | ||
| install?: string; | ||
| install_global?: string; | ||
| } | ||
| export interface RecommendedSkillsFile { | ||
| optional?: RecommendedSkillEntry[]; | ||
| recommended?: RecommendedSkillEntry[]; | ||
| } |
| export {}; | ||
| //# sourceMappingURL=types.js.map |
| {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""} |
| import { type RunCommand } from "./skills.js"; | ||
| import type { AdskConfig } from "./types.js"; | ||
| export interface UpdateOptions { | ||
| target: string; | ||
| dryRun: boolean; | ||
| forceRules: boolean; | ||
| snapshotRoot?: string; | ||
| run?: RunCommand; | ||
| } | ||
| export declare function runUpdate(opts: UpdateOptions): Promise<AdskConfig>; |
| import { readConfig, writeConfig } from "./config.js"; | ||
| import { syncCursor } from "./cursor-sync.js"; | ||
| import { getSnapshotRoot, readKitRef } from "./snapshot.js"; | ||
| import { buildSkillsUpdateArgv, runSkills, } from "./skills.js"; | ||
| export async function runUpdate(opts) { | ||
| const existing = readConfig(opts.target); | ||
| if (!existing) { | ||
| throw new Error("No .adsk/config.json found. Run `npx create-adsk init` first."); | ||
| } | ||
| const snapshotRoot = getSnapshotRoot(opts.snapshotRoot); | ||
| const kitRef = readKitRef(snapshotRoot); | ||
| const updateArgv = buildSkillsUpdateArgv({ | ||
| scope: existing.scope, | ||
| yes: true, | ||
| }); | ||
| if (opts.dryRun) { | ||
| console.log(`[dry-run] profile=${existing.profile} kitRef→${kitRef}`); | ||
| console.log(`[dry-run] would run: ${updateArgv.join(" ")}`); | ||
| } | ||
| const result = await runSkills(updateArgv, { | ||
| cwd: opts.target, | ||
| dryRun: opts.dryRun, | ||
| run: opts.run, | ||
| }); | ||
| if (result.code !== 0) { | ||
| throw new Error(`skills update failed (exit ${result.code})`); | ||
| } | ||
| const syncResult = syncCursor({ | ||
| snapshotRoot, | ||
| appRoot: opts.target, | ||
| cursor: existing.cursor, | ||
| rules: existing.rules, | ||
| forceRules: opts.forceRules, | ||
| dryRun: opts.dryRun, | ||
| }); | ||
| if (opts.dryRun) { | ||
| if (existing.cursor === "none") { | ||
| console.log("[dry-run] Cursor sync: skipped (cursor=none)"); | ||
| } | ||
| else { | ||
| console.log(`[dry-run] would sync ${syncResult.commandsWritten.length} command(s)`); | ||
| } | ||
| console.log("[dry-run] no files written"); | ||
| } | ||
| const next = { ...existing, kitRef }; | ||
| if (!opts.dryRun) { | ||
| writeConfig(opts.target, next); | ||
| } | ||
| return next; | ||
| } | ||
| //# sourceMappingURL=update.js.map |
| {"version":3,"file":"update.js","sourceRoot":"","sources":["../src/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EACL,qBAAqB,EACrB,SAAS,GAEV,MAAM,aAAa,CAAC;AAWrB,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAmB;IACjD,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CACb,+DAA+D,CAChE,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IAExC,MAAM,UAAU,GAAG,qBAAqB,CAAC;QACvC,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,GAAG,EAAE,IAAI;KACV,CAAC,CAAC;IACH,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,qBAAqB,QAAQ,CAAC,OAAO,WAAW,MAAM,EAAE,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,wBAAwB,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,UAAU,EAAE;QACzC,GAAG,EAAE,IAAI,CAAC,MAAM;QAChB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,GAAG,EAAE,IAAI,CAAC,GAAG;KACd,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,8BAA8B,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,UAAU,GAAG,UAAU,CAAC;QAC5B,YAAY;QACZ,OAAO,EAAE,IAAI,CAAC,MAAM;QACpB,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,CAAC,CAAC;IACH,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;QAC9D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CACT,wBAAwB,UAAU,CAAC,eAAe,CAAC,MAAM,aAAa,CACvE,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,IAAI,GAAe,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,CAAC;IACjD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACjB,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"} |
| # /design-devops-strategy | ||
| Collaborate on a concise, project-specific DevOps strategy. | ||
| ## Skill | ||
| Read and follow **`skills/devops-strategy-facilitator`** and draft using `skills/devops-strategy-facilitator/references/strategy-template.md`. | ||
| ## Usage | ||
| ``` | ||
| /design-devops-strategy | ||
| /design-devops-strategy "Azure DevOps + AKS + 2 envs (dev/prod), quarterly releases" | ||
| ``` | ||
| ## Behavior | ||
| 1. Ask 5–10 targeted questions max (platform, runtime, envs, promotion, branching, secrets, compliance). | ||
| 2. Propose defaults when inputs are missing; mark assumptions. | ||
| 3. Produce a ≤ ~1–2 page strategy using the skill template. | ||
| 4. Offer optional next steps (pipeline skeleton, repo rules). |
| # /draft-spec | ||
| Generate a specification from a feature idea. | ||
| ## Skill | ||
| Read and follow **`skills/spec-driven-workflow`** (especially `references/spec-writing-guide.md` and `references/artifact-homes.md`). For Cursor output homes, also follow `references/cursor-adapter.md`. | ||
| ## Usage | ||
| ``` | ||
| /draft-spec "your feature idea or description" | ||
| ``` | ||
| ## Behavior | ||
| 1. If the idea is vague: surface assumptions and reframe into success criteria (2–3 questions max). Do not silently invent requirements. | ||
| 2. Scan the codebase for related patterns. | ||
| 3. Write a testable spec (prefer `REQ-XXX` IDs + acceptance criteria + test strategy). Include Assumptions / Open Questions when anything is unresolved. | ||
| 4. **Resolve the spec path** via the skill (`artifact-homes.md`). As a Cursor `/` command, default to `.cursor/docs/specs/{feature-name}.md` unless the project already uses `docs/specs/` or the user passed `--out`. | ||
| 5. Pause for user review on medium+ work; then suggest `/plan-impl`, or `/implement-spec` for small changes. | ||
| Do not duplicate the full playbook here — the skill is the source of truth. |
| # /extract-spec | ||
| Document existing code as a baseline specification (brownfield). | ||
| ## Skill | ||
| Read and follow **`skills/spec-driven-workflow`**, especially `references/brownfield-workflow.md` and `references/artifact-homes.md`. | ||
| ## Usage | ||
| ``` | ||
| /extract-spec src/auth/ | ||
| /extract-spec "user authentication" | ||
| ``` | ||
| ## Behavior | ||
| 1. Search and analyze the target code. | ||
| 2. Document **current** behavior (not desired future) with clear requirements/gaps. | ||
| 3. **Resolve the spec path** via the skill. As a Cursor `/` command, default to `.cursor/docs/specs/{area}-current.md` unless the project already uses `docs/specs/` or the user overrides. | ||
| 4. Suggest drafting a **change** spec next via `/draft-spec`. |
| # /implement-spec | ||
| Implement from a specification or plan. | ||
| ## Skill | ||
| Read and follow **`skills/spec-driven-workflow`**. Honor `@.cursor/rules/testing` and `@.cursor/rules/project-cmds` for tests and verify commands. Recommended upstream TDD skill applies when installing the recommended pack. | ||
| ## Usage | ||
| ``` | ||
| /implement-spec path/to/spec-or-plan.md | ||
| ``` | ||
| ## Behavior | ||
| 1. Read the spec or plan; follow the plan step-by-step when present. | ||
| 2. Implement with tests mapped to requirements (or justify non-behavioral exceptions). | ||
| 3. Update plan todo status as steps complete (Cursor Plan YAML `todos` and/or portable checklist — see `references/cursor-adapter.md` / `artifact-homes.md`). | ||
| 4. Run project verify commands; fix failures before claiming done. | ||
| 5. Suggest `/review` when implementation is complete. |
| # /optimize-skill | ||
| Optimize an Agent Skill for trigger accuracy, clarity, and token cost. | ||
| ## Skill | ||
| Read and follow **`skills/skill-optimizer`** (or `.agents/skills/skill-optimizer` in adopter apps). | ||
| ## Usage | ||
| ``` | ||
| /optimize-skill | ||
| /optimize-skill skills/spec-driven-workflow | ||
| /optimize-skill .agents/skills/my-company-skill | ||
| ``` | ||
| ## Behavior | ||
| 1. Locate the target skill directory (ask if unclear). | ||
| 2. Run the skill-optimizer gates (validate, description, lean body, progressive disclosure, trigger + output evals). | ||
| 3. Apply lean edits; move kit-meta/rationale into `references/` with hard when-to-load conditions. | ||
| 4. Report what changed and any remaining eval gaps. |
| # /plan-impl | ||
| Create an implementation plan from a specification. | ||
| ## Skill | ||
| Read and follow **`skills/spec-driven-workflow`**. Resolve paths with `references/artifact-homes.md`. For Cursor plan files, follow `references/cursor-adapter.md` (YAML `todos` required). Recommended upstream `writing-plans` (see `recommended-skills.json`) may also apply for granular task style. | ||
| ## Usage | ||
| ``` | ||
| /plan-impl path/to/spec.md | ||
| ``` | ||
| ## Behavior | ||
| 1. Read the spec; if open questions or unconfirmed assumptions remain, resolve those before planning. | ||
| 2. Break work into ordered, verifiable tasks (files, tests, risks). Prefer tasks that map to `REQ-XXX` and stay within a focused file set. | ||
| 3. **Resolve the plan path** via the skill. As a Cursor `/` command, default to `.cursor/plans/{feature-name}.plan.md` unless the project already uses `docs/plans/` or the user overrides the path. | ||
| 4. Write the plan with **trackable todos** (Cursor: non-empty frontmatter `todos`; never body-only REQ tables with empty Plan UI todos). | ||
| 5. Suggest `/implement-spec` only after the user approves the plan (medium+). | ||
| Keep this command thin — planning depth lives in the skill / recommended upstream. |
| # /quick-start | ||
| Initialize the ADSK spec-driven workflow for a project. | ||
| ## Skill | ||
| Read and follow **`skills/spec-driven-workflow`**, especially `references/getting-started.md`. | ||
| ## Usage | ||
| ``` | ||
| /quick-start | ||
| ``` | ||
| ## Behavior | ||
| 1. Detect stack (package managers, frameworks, test/lint tools). | ||
| 2. Detect artifact homes (Cursor `.cursor/...` vs portable `docs/...`) via `references/artifact-homes.md`; when Cursor wiring is present, update or propose `.cursor/rules/project/` and `project-cmds` with real verify commands. | ||
| 3. Guide next steps: greenfield → `/draft-spec`; brownfield → `/extract-spec`. | ||
| 4. Confirm ADSK skills are discoverable under `.agents/skills/`. If missing, point to `docs/using-adsk.md` (`npx skills add rhyanvargas/agentic-development-starter-kit`). |
| # /review | ||
| Post-implementation quality review. | ||
| ## Skill | ||
| Read and follow **`skills/spec-driven-workflow`** review guidance. Apply `@.cursor/rules/testing` and `@.cursor/rules/project-cmds`. Resolve spec paths with `references/artifact-homes.md` when locating `--spec`. | ||
| ## Usage | ||
| ``` | ||
| /review | ||
| /review path/to/file.ts | ||
| /review --spec path/to/spec.md | ||
| ``` | ||
| ## Behavior | ||
| 1. Identify changed or specified files. | ||
| 2. Check correctness, edge cases, security-sensitive paths, and test coverage vs spec. | ||
| 3. Report actionable findings; offer to apply safe fixes when asked. | ||
| 4. Re-run verify commands after fixes. |
| # /setup-releases | ||
| Wire Conventional Commits–based version and changelog automation for this repo. | ||
| ## Skill | ||
| Read and follow **`skills/release-automation`** (adopter apps: `.agents/skills/release-automation`). | ||
| ## Usage | ||
| ``` | ||
| /setup-releases | ||
| /setup-releases "Azure DevOps + squash merge on main" | ||
| /setup-releases "GitHub Actions + release-please, start at 0.1.0" | ||
| ``` | ||
| ## Behavior | ||
| 1. Confirm DevOps platform from evidence + user (GitHub Actions, Azure DevOps, or other). | ||
| 2. Persist the choice in the skill’s `references/project-context.md`. | ||
| 3. Install matching automation; update `docs/RELEASE.md` and Conventional Commit PR guidance. | ||
| 4. Call out any manual org settings (e.g. Actions allowed to open PRs, Azure tag permissions). |
| # /sync-adsk | ||
| Sync ADSK skills discovery links and/or Cursor wiring by running `scripts/sync-adsk.sh`. | ||
| ## Usage | ||
| ``` | ||
| /sync-adsk | ||
| /sync-adsk --dry-run | ||
| /sync-adsk --from /path/to/agentic-development-starter-kit | ||
| ``` | ||
| ## Behavior | ||
| When the user asks to sync ADSK, update kit Cursor artifacts, refresh skills, or run `/sync-adsk`, **run the script** (do not re-copy files by hand). | ||
| ### 1. Detect context | ||
| | Context | Signals | Command | | ||
| |---------|---------|---------| | ||
| | **Kit repo** | `scripts/sync-adsk.sh` + package source `skills/*/SKILL.md` exist in the workspace | `./scripts/sync-adsk.sh kit` | | ||
| | **Adopter app (create-adsk)** | `.adsk/config.json` present | `npx create-adsk update` (prefer over script) | | ||
| | **Adopter app (script path)** | App uses `.agents/skills/` (no kit `skills/` package tree), or user wants Cursor `/` commands updated without create-adsk | `<kit>/scripts/sync-adsk.sh adopter --from <kit>` from the **app root** | | ||
| ### 2. Kit maintainer path | ||
| 1. From the kit repo root, run: | ||
| ```bash | ||
| ./scripts/sync-adsk.sh kit | ||
| ``` | ||
| 2. After adding/removing a first-party skill, this is required so `.agents/skills/` and `.cursor/skills/` match `skills/`. | ||
| 3. Optional smoke: `./scripts/sync-adsk.sh self-check`. | ||
| 4. Report which symlinks were linked or removed. | ||
| ### 3. Adopter path | ||
| **If `.adsk/config.json` exists:** run `npx create-adsk update` (and `status` if useful). Skip the kit-clone script path unless the user asks for it. | ||
| **Otherwise (script path):** | ||
| 1. Resolve a kit source (`--from`): | ||
| - Use the path the user gave, or | ||
| - Reuse a known local checkout, or | ||
| - Clone once: `git clone https://github.com/rhyanvargas/agentic-development-starter-kit.git` to a temp or cache dir. | ||
| 2. From the **app** root, run: | ||
| ```bash | ||
| /path/to/adsk/scripts/sync-adsk.sh adopter --from /path/to/adsk | ||
| ``` | ||
| 3. Honor user flags: `--dry-run`, `--commands-only`, `--skip-skills`, `--force-rules`, `--skills-from-path`. | ||
| 4. If `npx skills` prompts for Update scope, choose **Project** for a normal app install (not Global unless they used `-g`). | ||
| 5. Report what changed. Do **not** overwrite customized rules unless the user asked for `--force-rules`. Never touch specs/plans contents. | ||
| ### 4. Done criteria | ||
| - Kit: discovery symlinks resolve to `skills/<name>/`. | ||
| - Adopter: stock commands under `.cursor/commands/` reference `.agents/skills/<name>`; skills refreshed unless `--skip-skills`. |
| # /update-readme | ||
| Synchronize README.md with the current codebase. | ||
| ## Skill | ||
| Follow **`readme-authoring`** in **update/sync** mode | ||
| (`.agents/skills/readme-authoring` — kit source: `skills/readme-authoring`). | ||
| ## Usage | ||
| ``` | ||
| /update-readme | ||
| /update-readme --section tech-stack | ||
| ``` | ||
| ## Behavior | ||
| 1. Scope the README path (root or package) and gather evidence (manifests, scripts, entry points, existing docs). | ||
| 2. List missing / stale / wrong-audience findings before editing. | ||
| 3. Patch README sections to match reality; prefer links over duplicated content. | ||
| 4. Verify install/run commands and claimed stack against actual files. | ||
| 5. Do not invent features, APIs, or dependencies. |
| --- | ||
| description: "Exact build/test/lint/typecheck commands for this repo" | ||
| alwaysApply: true | ||
| --- | ||
| # Project Commands (build/test/lint/typecheck) | ||
| This rule should list the **exact** commands the agent must use to verify work in this repo. | ||
| If this repo has no code/test tooling (docs-only), state that explicitly. | ||
| ## Default (docs + sync + skill CI + create-adsk) | ||
| This repository is documentation/templates plus `scripts/sync-adsk.sh`, Tier 1 skill gates in `scripts/check-skills-ci.sh`, and the `create-adsk` workspace package under `packages/create-adsk`. | ||
| ## Commands | ||
| ```bash | ||
| # Smoke (sync script): ./scripts/sync-adsk.sh self-check | ||
| # Kit symlinks: ./scripts/sync-adsk.sh kit | ||
| # Dry-run kit: ./scripts/sync-adsk.sh kit --dry-run | ||
| # Skill Tier 1 gates: ./scripts/check-skills-ci.sh | ||
| # Skill Tier 1 fixtures:./scripts/check-skills-ci.sh --self-test | ||
| # Dependency audit: npm ci && npm audit --audit-level=high | ||
| # create-adsk snapshot: ./scripts/prepare-create-adsk-snapshot.sh | ||
| # create-adsk npm placeholder: ./scripts/npm-bootstrap-create-adsk-placeholder.sh | ||
| # create-adsk npm tag: ./scripts/tag-create-adsk-release.sh [--push] | ||
| # create-adsk npm verify: ./scripts/verify-create-adsk-registry.sh [--npx] | ||
| # create-adsk test: npm test -w create-adsk | ||
| # create-adsk build: npm run build -w create-adsk | ||
| # create-adsk typecheck:npm run typecheck -w create-adsk | ||
| # Build: npm run build -w create-adsk | ||
| # Test: ./scripts/sync-adsk.sh self-check && ./scripts/check-skills-ci.sh --self-test && npm test -w create-adsk | ||
| # Lint: n/a | ||
| # Typecheck: npm run typecheck -w create-adsk | ||
| ``` | ||
| ## Required environment (fill when applicable) | ||
| - `ENV_VAR_1`: description | ||
| - `ENV_VAR_2`: description |
| --- | ||
| description: "Require Agent Skills optimization gates when creating or editing skills" | ||
| globs: "**/SKILL.md" | ||
| alwaysApply: false | ||
| --- | ||
| # Skill authoring quality gate | ||
| When creating or editing skills in this repo or an ADSK adopter project, follow **`skill-optimizer`** (read that skill before drafting or “done”). | ||
| Also apply when the user asks to create, optimize, or review a skill — even if `SKILL.md` is not open yet. | ||
| ## Must do | ||
| 1. Read and apply `skill-optimizer` (kit: `skills/skill-optimizer`; adopter: `.agents/skills/skill-optimizer`). | ||
| 2. Keep `SKILL.md` lean; put depth in `references/` with explicit when-to-load conditions. | ||
| 3. Write `description` as what + when; add near-miss “Do not use for…” when adjacent skills share keywords. | ||
| 4. Add/update `evals/trigger/eval_queries.json` (~20 queries, include near-misses) and behavior `evals/evals.json` when instructions change. | ||
| 5. Run `npx --yes skills-ref validate <skill-dir>` before claiming done. | ||
| ## Layout | ||
| | Context | Path | | ||
| |---------|------| | ||
| | Kit source | `skills/<name>/` + symlinks under `.agents/skills/` and `.cursor/skills/` | | ||
| | Adopter app | `.agents/skills/<name>/` only | | ||
| After adding/removing a **kit** first-party skill, sync discovery links: `./scripts/sync-adsk.sh kit` (or `/sync-adsk` / “Sync ADSK”). | ||
| Do not duplicate the full optimizer playbook into commands or this rule. |
| --- | ||
| description: "Testing policy and TDD expectations" | ||
| alwaysApply: true | ||
| --- | ||
| # Testing Rules | ||
| Tests are a first-class deliverable. For any change that affects behavior (new feature, bug fix, refactor with risk), ship tests in the same change set unless explicitly justified. | ||
| ## When tests are required | ||
| - New behavior (new feature or requirement) | ||
| - Bug fixes (add a regression test that fails before the fix) | ||
| - Refactors that change control flow, data flow, or public interfaces | ||
| - Security- or correctness-sensitive logic (authz, money, permissions, data integrity) | ||
| - Integration points (API boundaries, persistence, message queues) | ||
| ## When tests may be omitted (must be explicit) | ||
| Tests may be omitted only when the change is demonstrably non-behavioral, e.g.: | ||
| - Documentation-only changes | ||
| - Formatting-only changes | ||
| - Dependency bumps with no codepath changes (still run tests if they exist) | ||
| If tests are omitted, the plan/spec/review must include a short **“No tests needed because…”** note and the verification steps must still run the existing test suite (if present). | ||
| ## TDD guidance (apply when practical) | ||
| - Prefer **red → green → refactor** for new behavior and bug fixes. | ||
| - For bug fixes: add a regression test that reproduces the bug, then fix until it passes. | ||
| - For brownfield code with low coverage: add **characterization tests** around current behavior before changing it. | ||
| ## Coverage intent (what to test) | ||
| - Test **public interfaces and observable behavior** (inputs/outputs, side effects). | ||
| - Use the **test pyramid**: many unit tests, fewer integration tests, E2E only for critical paths. | ||
| - Avoid over-mocking; prefer real implementations at boundaries when it improves signal. | ||
| - Cover at minimum: | ||
| - Happy path | ||
| - Key edge cases from the spec’s acceptance criteria | ||
| - Failure modes and error handling at boundaries | ||
| ## Evidence required | ||
| - Run the test suite using the project’s test command(s) (see `@.cursor/rules/project-cmds` if present). | ||
| - If a repo has no automated test harness yet, include a plan task to add one (unless the repo is purely documentation). |
Sorry, the diff of this file is not supported yet
| { | ||
| "$schema_comment": "ADSK adopter profiles — machine-readable contract for create-adsk. Docs must not invent a different skill list. See docs/product/create-adsk.md.", | ||
| "version": 1, | ||
| "product": "create-adsk", | ||
| "status": "implemented", | ||
| "kit_source": "rhyanvargas/agentic-development-starter-kit", | ||
| "do_not": [ | ||
| "Expose a third-party or arbitrary GitHub skill catalog in create-adsk UX", | ||
| "Reimplement skill install — shell out to npx skills", | ||
| "Present create-adsk as a skills.sh menu wrapper", | ||
| "Put sync-adsk.sh kit (maintainer symlink mode) behind create-adsk" | ||
| ], | ||
| "cursor_modes": ["commands", "none"], | ||
| "rules_modes": ["stock", "none"], | ||
| "profiles": { | ||
| "core": { | ||
| "description": "Spec-driven delivery spine only.", | ||
| "skills": ["spec-driven-workflow"], | ||
| "cursor": "commands", | ||
| "rules": "none" | ||
| }, | ||
| "delivery": { | ||
| "description": "SDD plus DevOps strategy and release automation.", | ||
| "skills": [ | ||
| "spec-driven-workflow", | ||
| "devops-strategy-facilitator", | ||
| "release-automation" | ||
| ], | ||
| "cursor": "commands", | ||
| "rules": "none" | ||
| }, | ||
| "maintainer": { | ||
| "description": "Full first-party kit including skill authoring and README workflows.", | ||
| "skills": [ | ||
| "spec-driven-workflow", | ||
| "devops-strategy-facilitator", | ||
| "release-automation", | ||
| "skill-optimizer", | ||
| "readme-authoring" | ||
| ], | ||
| "cursor": "commands", | ||
| "rules": "stock" | ||
| }, | ||
| "skills-only": { | ||
| "description": "All first-party skills; no Cursor commands or rules writes.", | ||
| "skills": [ | ||
| "spec-driven-workflow", | ||
| "devops-strategy-facilitator", | ||
| "release-automation", | ||
| "skill-optimizer", | ||
| "readme-authoring" | ||
| ], | ||
| "cursor": "none", | ||
| "rules": "none" | ||
| } | ||
| }, | ||
| "optional_packs": { | ||
| "prompt_default": false, | ||
| "description": "Optional yes/no after profile choice — not a skill picker. Install via recommended-skills.json.", | ||
| "ids": [ | ||
| "product-value-loop-wondelai", | ||
| "product-value-loop-deanpeters", | ||
| "competitive-intelligence" | ||
| ], | ||
| "source_file": "recommended-skills.json", | ||
| "docs": "docs/product-value-loop.md" | ||
| }, | ||
| "config_marker": { | ||
| "path": ".adsk/config.json", | ||
| "fields": ["version", "profile", "cursor", "rules", "scope", "kitRef", "optionalPacks"] | ||
| } | ||
| } |
| { | ||
| "$schema_comment": "ADSK recommended upstream skills — not vendored. Pin and review before enterprise use.", | ||
| "version": 1, | ||
| "trust_policy": { | ||
| "prefer_orgs": ["anthropics", "vercel-labs", "obra"], | ||
| "require_license_review": true, | ||
| "disallow_unpinned_registry_longtail": true, | ||
| "checklist": [ | ||
| "Source org / maintainer reputation", | ||
| "License compatible with org policy", | ||
| "Install or star signal supports trust", | ||
| "Review SKILL.md and scripts/ for secrets exfiltration", | ||
| "Pin version; re-review on upgrade" | ||
| ] | ||
| }, | ||
| "recommended": [ | ||
| { | ||
| "id": "superpowers", | ||
| "source": "obra/superpowers", | ||
| "license": "See upstream repository", | ||
| "lifecycle_roles": ["plan", "develop", "test", "debug", "review"], | ||
| "skills": [ | ||
| "writing-plans", | ||
| "test-driven-development", | ||
| "systematic-debugging", | ||
| "requesting-code-review", | ||
| "brainstorming" | ||
| ], | ||
| "trust_notes": "High-adoption engineering methodology pack. May assume Superpowers-specific paths (e.g. docs/superpowers/). Pin and adapt paths to your repo layout.", | ||
| "install": "npx skills add obra/superpowers -g", | ||
| "pin": { | ||
| "strategy": "git-tag-or-commit", | ||
| "value": "latest-reviewed", | ||
| "note": "Replace with an explicit tag/commit after your security review." | ||
| }, | ||
| "disposition": "recommend" | ||
| }, | ||
| { | ||
| "id": "find-skills", | ||
| "source": "vercel-labs/skills", | ||
| "skill": "find-skills", | ||
| "license": "See upstream repository", | ||
| "lifecycle_roles": ["expand", "discover"], | ||
| "trust_notes": "Official Skills CLI discovery helper. Still apply trust checklist before installing anything it suggests.", | ||
| "install": "npx skills add vercel-labs/skills@find-skills -g", | ||
| "pin": { | ||
| "strategy": "package-or-repo-ref", | ||
| "value": "latest-reviewed", | ||
| "note": "Prefer a known-good CLI/skills release after review." | ||
| }, | ||
| "disposition": "recommend" | ||
| }, | ||
| { | ||
| "id": "skill-creator", | ||
| "source": "anthropics/skills", | ||
| "skill": "skill-creator", | ||
| "license": "Apache-2.0 (upstream)", | ||
| "lifecycle_roles": ["maintain-skills", "evals"], | ||
| "trust_notes": "Official Anthropic helper for creating and evaluating skills. Aimed at maintainers, not every app developer.", | ||
| "install": "npx skills add anthropics/skills@skill-creator -g", | ||
| "pin": { | ||
| "strategy": "git-tag-or-commit", | ||
| "value": "latest-reviewed" | ||
| }, | ||
| "disposition": "recommend-maintainers" | ||
| }, | ||
| { | ||
| "id": "dependabot", | ||
| "source": "github/awesome-copilot", | ||
| "skill": "dependabot", | ||
| "license": "See upstream repository", | ||
| "lifecycle_roles": ["secure", "maintain"], | ||
| "trust_notes": "GitHub org (high trust). Guide for Dependabot YAML, grouping, and supply-chain update workflows.", | ||
| "install": "npx skills add github/awesome-copilot@dependabot -g", | ||
| "pin": { | ||
| "strategy": "git-tag-or-commit", | ||
| "value": "latest-reviewed", | ||
| "note": "Replace with an explicit tag/commit after your security review." | ||
| }, | ||
| "disposition": "recommend" | ||
| }, | ||
| { | ||
| "id": "npm-security-best-practices", | ||
| "source": "aradotso/security-skills", | ||
| "skill": "npm-security-best-practices", | ||
| "license": "See upstream repository", | ||
| "lifecycle_roles": ["secure", "maintain"], | ||
| "trust_notes": "Smaller maintainer (~783 installs on skills.sh). Review SKILL.md before team rollout; complements Dependabot + npm audit CI.", | ||
| "install": "npx skills add aradotso/security-skills@npm-security-best-practices -g", | ||
| "pin": { | ||
| "strategy": "git-tag-or-commit", | ||
| "value": "latest-reviewed", | ||
| "note": "Replace with an explicit tag/commit after your security review." | ||
| }, | ||
| "disposition": "recommend" | ||
| } | ||
| ], | ||
| "optional": [ | ||
| { | ||
| "id": "product-value-loop-wondelai", | ||
| "source": "wondelai/skills", | ||
| "license": "MIT (upstream; verify per skill)", | ||
| "lifecycle_roles": ["discover", "prioritize", "product-strategy"], | ||
| "skills": [ | ||
| "inspired-product", | ||
| "mom-test", | ||
| "continuous-discovery", | ||
| "jobs-to-be-done" | ||
| ], | ||
| "trust_notes": "High-adoption product methodology pack (Cagan / Torres / Mom Test / JTBD). Complements ADSK SDD; does not replace it. Playbook: docs/product-value-loop.md.", | ||
| "install": "npx skills add wondelai/skills --skill inspired-product --skill mom-test --skill continuous-discovery --skill jobs-to-be-done -y", | ||
| "install_global": "npx skills add wondelai/skills --skill inspired-product --skill mom-test --skill continuous-discovery --skill jobs-to-be-done -g -y", | ||
| "pin": { | ||
| "strategy": "git-tag-or-commit", | ||
| "value": "latest-reviewed", | ||
| "note": "Replace with an explicit tag/commit after your security review." | ||
| }, | ||
| "disposition": "optional", | ||
| "docs": "docs/product-value-loop.md" | ||
| }, | ||
| { | ||
| "id": "product-value-loop-deanpeters", | ||
| "source": "deanpeters/product-manager-skills", | ||
| "license": "See upstream repository", | ||
| "lifecycle_roles": ["plan", "prioritize", "roadmap"], | ||
| "skills": [ | ||
| "product-strategy-session", | ||
| "roadmap-planning", | ||
| "prioritization-advisor" | ||
| ], | ||
| "trust_notes": "High-adoption PM facilitation skills for strategy sessions and outcome roadmaps. Pair with wondelai discovery skills; execute with ADSK spec-driven-workflow.", | ||
| "install": "npx skills add deanpeters/product-manager-skills --skill product-strategy-session --skill roadmap-planning --skill prioritization-advisor -y", | ||
| "install_global": "npx skills add deanpeters/product-manager-skills --skill product-strategy-session --skill roadmap-planning --skill prioritization-advisor -g -y", | ||
| "pin": { | ||
| "strategy": "git-tag-or-commit", | ||
| "value": "latest-reviewed" | ||
| }, | ||
| "disposition": "optional", | ||
| "docs": "docs/product-value-loop.md" | ||
| }, | ||
| { | ||
| "id": "competitive-intelligence", | ||
| "source": "anthropics/knowledge-work-plugins", | ||
| "skill": "competitive-intelligence", | ||
| "license": "See upstream repository", | ||
| "lifecycle_roles": ["research", "discover"], | ||
| "trust_notes": "Official Anthropic knowledge-work pack. Automated scanners may flag medium risk (research/network behavior). Human-review SKILL.md before team rollout.", | ||
| "install": "npx skills add anthropics/knowledge-work-plugins --skill competitive-intelligence -y", | ||
| "install_global": "npx skills add anthropics/knowledge-work-plugins --skill competitive-intelligence -g -y", | ||
| "pin": { | ||
| "strategy": "git-tag-or-commit", | ||
| "value": "latest-reviewed" | ||
| }, | ||
| "disposition": "optional", | ||
| "docs": "docs/product-value-loop.md" | ||
| }, | ||
| { | ||
| "id": "frontend-design", | ||
| "source": "anthropics/skills", | ||
| "skill": "frontend-design", | ||
| "license": "Apache-2.0 (upstream)", | ||
| "lifecycle_roles": ["design-ui"], | ||
| "trust_notes": "High-adoption UI craft skill. Optional for non-UI teams.", | ||
| "install": "npx skills add anthropics/skills@frontend-design -y", | ||
| "disposition": "optional" | ||
| } | ||
| ], | ||
| "do_not_add": [ | ||
| { | ||
| "id": "overlapping-sdd", | ||
| "examples": [ | ||
| "addyosmani/agent-skills@spec-driven-development", | ||
| "warpdotdev/common-skills@spec-driven-implementation", | ||
| "github/awesome-copilot@create-specification", | ||
| "to-spec", | ||
| "other generic spec-driven-development packs that replace ADSK SDD" | ||
| ], | ||
| "reason": "Collides with first-party skills/spec-driven-workflow (trigger overlap + divergent paths/templates). Reviewed 2026-07-17: absorb useful patterns into ADSK SDD instead of vendoring; keep Superpowers for plan/TDD complement.", | ||
| "absorbed_patterns": [ | ||
| "Surface assumptions before drafting", | ||
| "Human/self gates between specify → plan → implement", | ||
| "Reframe vague goals as measurable success criteria", | ||
| "AI-ready unambiguous language + self-contained specs", | ||
| "Optional PRODUCT/TECH split for large features only" | ||
| ] | ||
| }, | ||
| { | ||
| "id": "overlapping-readme", | ||
| "examples": [ | ||
| "softaworks/agent-toolkit@crafting-effective-readmes", | ||
| "accelint/accelint-readme-writer", | ||
| "other generic README authoring packs that replace ADSK readme-authoring" | ||
| ], | ||
| "reason": "Collides with first-party skills/readme-authoring (trigger overlap + divergent templates). Reviewed 2026-07-18: absorb audience/type templates + evidence-grounded sync into ADSK instead of vendoring.", | ||
| "absorbed_patterns": [ | ||
| "Audience/project-type templates (OSS, internal, personal, config)", | ||
| "Task modes: create, add section, update/sync, review", | ||
| "Section checklist by audience", | ||
| "Evidence discovery from manifests, entry points, examples, existing docs", | ||
| "Package-manager detection from lockfiles", | ||
| "Gap list (missing/stale) before editing", | ||
| "No fabricated examples; public surface only", | ||
| "Human prose / anti-promotional tone without requiring a separate humanizer skill" | ||
| ] | ||
| } | ||
| ] | ||
| } |
| # devops-strategy-facilitator |
| # readme-authoring |
| # release-automation |
| # skill-optimizer |
| # spec-driven-workflow |
+59
| ```text | ||
| █████╗ ██████╗ ███████╗██╗ ██╗ | ||
| ██╔══██╗██╔══██╗██╔════╝██║ ██╔╝ | ||
| ███████║██║ ██║███████╗█████╔╝ | ||
| ██╔══██║██║ ██║╚════██║██╔═██╗ | ||
| ██║ ██║██████╔╝███████║██║ ██╗ | ||
| ╚═╝ ╚═╝╚═════╝ ╚══════╝╚═╝ ╚═╝ | ||
| ``` | ||
| # create-adsk | ||
| Adopt the **Agentic Development Starter Kit (ADSK)** as a versioned **profile** — first-party skills via the skills CLI plus optional Cursor commands/rules — without a skills marketplace UX. | ||
| A ready-to-adopt kit for agentic, spec-driven development — workflow skills, Cursor slash commands, and a versioned profile for your team. | ||
| ## Two-tool model | ||
| | Tool | Owns | | ||
| |------|------| | ||
| | **`npx skills`** | Install and update skill folders into `.agents/skills/` | | ||
| | **`npx create-adsk`** | Apply an ADSK profile (skills + Cursor + `.adsk/config.json`) | | ||
| Use `npx skills` to install skill folders. Use `npx create-adsk` when you want this kit’s workflow + Cursor adopted as a versioned profile in your repo. | ||
| ## Quick start | ||
| ```bash | ||
| # From an app repo (after npm publish): | ||
| npx create-adsk --profile delivery --yes | ||
| # From a kit checkout (until publish): | ||
| npx --yes /path/to/agentic-development-starter-kit/packages/create-adsk --profile delivery --yes | ||
| ``` | ||
| Profiles (`core` | `delivery` | `maintainer` | `skills-only`) are defined in the kit [`profiles.json`](../../profiles.json). Product contract: [`docs/product/create-adsk.md`](../../docs/product/create-adsk.md). | ||
| ## Commands | ||
| ```bash | ||
| npx create-adsk init --profile delivery --yes # default command | ||
| npx create-adsk update # from .adsk/config.json | ||
| npx create-adsk status # profile + drift (exit 1 if drift) | ||
| npx create-adsk --help # skills-style banner + command list | ||
| ``` | ||
| Flags: `--yes` / `-y`, `--dry-run`, `--scope project|global`, `--force-rules`, `--with-optional-packs`, `--target <dir>`. | ||
| ## Develop in this monorepo | ||
| ```bash | ||
| # from kit root | ||
| ./scripts/prepare-create-adsk-snapshot.sh | ||
| cd packages/create-adsk && npm install && npm test && npm run build | ||
| node dist/cli.js --help | ||
| ``` | ||
| ## Publishing | ||
| Releases use npm [Trusted Publishing](https://docs.npmjs.com/trusted-publishers/) from [`.github/workflows/publish-create-adsk.yml`](../../.github/workflows/publish-create-adsk.yml) (OIDC + provenance). Day-to-day and bootstrap steps: [`docs/RELEASE.md`](../../docs/RELEASE.md). |
+34
-2
| { | ||
| "name": "create-adsk", | ||
| "version": "0.0.0", | ||
| "description": "OIDC bootstrap placeholder — real releases from GitHub Actions", | ||
| "version": "0.1.0", | ||
| "description": "Adopt the Agentic Development Starter Kit as a versioned profile (skills + Cursor wiring).", | ||
| "type": "module", | ||
| "bin": { | ||
| "create-adsk": "./dist/cli.js" | ||
| }, | ||
| "files": [ | ||
| "dist", | ||
| "kit-snapshot", | ||
| "README.md" | ||
| ], | ||
| "engines": { | ||
| "node": ">=20" | ||
| }, | ||
| "scripts": { | ||
| "build": "tsc -p tsconfig.json", | ||
| "snapshot": "bash ../../scripts/prepare-create-adsk-snapshot.sh", | ||
| "prepack": "npm run snapshot && npm run build", | ||
| "test": "vitest run", | ||
| "typecheck": "tsc -p tsconfig.json --noEmit" | ||
| }, | ||
| "dependencies": { | ||
| "@clack/prompts": "^0.10.1", | ||
| "commander": "^13.1.0" | ||
| }, | ||
| "devDependencies": { | ||
| "@types/node": "^22.15.21", | ||
| "typescript": "^5.8.3", | ||
| "vitest": "^3.1.4" | ||
| }, | ||
| "license": "MIT", | ||
| "publishConfig": { | ||
| "access": "public", | ||
| "provenance": true | ||
| }, | ||
| "repository": { | ||
@@ -7,0 +39,0 @@ "type": "git", |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Shell access
Supply chain riskThis module accesses the system shell. Accessing the system shell increases the risk of executing arbitrary code.
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Empty package
Supply chain riskPackage does not contain any code. It may be removed, is name squatting, or the result of a faulty package publish.
No README
QualityPackage does not have a README. This may indicate a failed publish or a low quality package.
No tests
QualityPackage does not have any tests. This is a strong signal of a poorly maintained or low quality package.
97585
30205.9%66
6500%1232
Infinity%2
-33.33%0
-100%60
Infinity%Yes
NaN2
Infinity%3
Infinity%6
Infinity%2
100%+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added