🎩 You're Invited:Meet the Socket team at Black Hat in Las Vegas, August 3-6.RSVP
Sign In

create-adsk

Package Overview
Dependencies
Maintainers
1
Versions
10
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

create-adsk - npm Package Compare versions

Comparing version
0.0.0
to
0.1.0
+13
dist/banner.d.ts
/** 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;
/**
* 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 {};
#!/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":";AACA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,iFAAiF;AACjF,MAAM,QAAS,SAAQ,IAAI;IACzB,UAAU,CAAC,GAAY,EAAE,MAAY;QACnC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,gBAAgB,EAAE,CAAC;QAC5B,CAAC;QACD,OAAO,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC;CACF;AAED,OAAO,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC;AAE1C,OAAO;KACJ,IAAI,CAAC,aAAa,CAAC;KACnB,WAAW,CAAC,gBAAgB,CAAC;KAC7B,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,SAAS,UAAU,CAAC,KAAa;IAC/B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,mBAAmB,KAAK,4BAA4B,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,OAAO;KACJ,OAAO,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;KACpC,WAAW,CAAC,yCAAyC,CAAC;KACtD,MAAM,CAAC,gBAAgB,EAAE,+CAA+C,CAAC;KACzE,MAAM,CAAC,WAAW,EAAE,kDAAkD,EAAE,KAAK,CAAC;KAC9E,MAAM,CAAC,iBAAiB,EAAE,gBAAgB,EAAE,SAAS,CAAC;KACtD,MAAM,CAAC,gBAAgB,EAAE,wBAAwB,EAAE,GAAG,CAAC;KACvD,MAAM,CAAC,WAAW,EAAE,+BAA+B,EAAE,KAAK,CAAC;KAC3D,MAAM,CAAC,eAAe,EAAE,gCAAgC,EAAE,KAAK,CAAC;KAChE,MAAM,CACL,uBAAuB,EACvB,oEAAoE,EACpE,KAAK,CACN;KACA,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;QACtD,IAAI,WAAW,EAAE,CAAC;YAChB,QAAQ,EAAE,CAAC;QACb,CAAC;QACD,MAAM,OAAO,CAAC;YACZ,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;YACtB,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;YAC5B,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;YAC7B,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;YACpC,iBAAiB,EAAE,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC;SACnD,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,sDAAsD,CAAC;KACnE,MAAM,CAAC,gBAAgB,EAAE,UAAU,EAAE,GAAG,CAAC;KACzC,MAAM,CAAC,WAAW,EAAE,+BAA+B,EAAE,KAAK,CAAC;KAC3D,MAAM,CAAC,eAAe,EAAE,gCAAgC,EAAE,KAAK,CAAC;KAChE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,IAAI,CAAC;QACH,MAAM,SAAS,CAAC;YACd,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;YAC5B,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;SACrC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,mDAAmD,CAAC;KAChE,MAAM,CAAC,gBAAgB,EAAE,UAAU,EAAE,GAAG,CAAC;KACzC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;IACf,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC7C,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
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>;
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":"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"}
/**
* 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"
]
}
]
}
```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",