@catladder/cli 0.0.0-next-80fd0ab4 → 0.0.0-next-ebc933f2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/bundles/catenv/index.js +223 -1
  2. package/dist/bundles/cli/index.js +223 -1
  3. package/dist/bundles/skills/catladder-cli/SKILL.md +53 -0
  4. package/dist/bundles/skills/catladder-cli/references/commands.md +273 -0
  5. package/dist/bundles/skills/catladder-config/SKILL.md +82 -0
  6. package/dist/bundles/skills/catladder-pipelines/SKILL.md +72 -0
  7. package/dist/bundles/skills/catladder-secrets/SKILL.md +74 -0
  8. package/dist/cli/src/scripts/generateCliSkillReference.d.ts +1 -0
  9. package/dist/cli/src/scripts/generateCliSkillReference.js +87 -0
  10. package/dist/cli/src/scripts/generateCliSkillReference.js.map +1 -0
  11. package/dist/pipeline/src/agentSkills/generateAgentSkills.d.ts +22 -0
  12. package/dist/pipeline/src/agentSkills/generateAgentSkills.js +82 -0
  13. package/dist/pipeline/src/agentSkills/generateAgentSkills.js.map +1 -0
  14. package/dist/pipeline/src/agentSkills/index.d.ts +3 -0
  15. package/dist/pipeline/src/agentSkills/index.js +27 -0
  16. package/dist/pipeline/src/agentSkills/index.js.map +1 -0
  17. package/dist/pipeline/src/agentSkills/shippedSkills.d.ts +22 -0
  18. package/dist/pipeline/src/agentSkills/shippedSkills.js +56 -0
  19. package/dist/pipeline/src/agentSkills/shippedSkills.js.map +1 -0
  20. package/dist/pipeline/src/agentSkills/types.d.ts +22 -0
  21. package/dist/pipeline/src/agentSkills/types.js +25 -0
  22. package/dist/pipeline/src/agentSkills/types.js.map +1 -0
  23. package/dist/pipeline/src/constants.js +1 -1
  24. package/dist/pipeline/src/pipeline/generatePipelineFiles.js +4 -0
  25. package/dist/pipeline/src/pipeline/generatePipelineFiles.js.map +1 -1
  26. package/dist/pipeline/src/types/config.d.ts +15 -0
  27. package/dist/pipeline/src/types/config.js.map +1 -1
  28. package/dist/skills/catladder-cli/SKILL.md +53 -0
  29. package/dist/skills/catladder-cli/references/commands.md +273 -0
  30. package/dist/skills/catladder-config/SKILL.md +82 -0
  31. package/dist/skills/catladder-pipelines/SKILL.md +72 -0
  32. package/dist/skills/catladder-secrets/SKILL.md +74 -0
  33. package/dist/tsconfig.tsbuildinfo +1 -1
  34. package/package.json +4 -2
  35. package/src/scripts/generateCliSkillReference.ts +102 -0
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.generateAgentSkills = exports.injectGeneratedMarker = exports.AGENT_SKILL_GENERATED_MARKER = void 0;
7
+ const fs_1 = require("fs");
8
+ const promises_1 = require("fs/promises");
9
+ const path_1 = require("path");
10
+ const shippedSkills_1 = require("./shippedSkills");
11
+ const types_1 = require("./types");
12
+ /**
13
+ * marks a materialized skill file as generated. Cleanup only ever
14
+ * removes skill directories whose SKILL.md carries this marker, so a
15
+ * user's own skills are never touched — even if they picked a
16
+ * `catladder-*` name.
17
+ */
18
+ exports.AGENT_SKILL_GENERATED_MARKER = "<!-- 🐱 🔨 generated by catladder — do not edit manually, this file is overwritten on every catenv run -->";
19
+ /**
20
+ * inserts the generated-marker into a markdown file: after the YAML
21
+ * frontmatter when there is one (a leading comment would break
22
+ * frontmatter parsing), at the top otherwise
23
+ */
24
+ const injectGeneratedMarker = content => {
25
+ if (content.startsWith("---\n")) {
26
+ const frontmatterEnd = content.indexOf("\n---\n", 3);
27
+ if (frontmatterEnd !== -1) {
28
+ const bodyStart = frontmatterEnd + "\n---\n".length;
29
+ return content.slice(0, bodyStart) + "\n" + exports.AGENT_SKILL_GENERATED_MARKER + "\n" + content.slice(bodyStart);
30
+ }
31
+ }
32
+ return exports.AGENT_SKILL_GENERATED_MARKER + "\n\n" + content;
33
+ };
34
+ exports.injectGeneratedMarker = injectGeneratedMarker;
35
+ /**
36
+ * removes previously materialized catladder skills from ALL known
37
+ * target directories (not just the enabled ones), so that opting out
38
+ * or narrowing the targets doesn't leave stale copies behind
39
+ */
40
+ const cleanupGeneratedAgentSkills = async rootDir => {
41
+ for (const targetDir of Object.values(types_1.AGENT_SKILL_TARGET_DIRS)) {
42
+ const skillsRoot = (0, path_1.join)(rootDir, targetDir);
43
+ if (!(0, fs_1.existsSync)(skillsRoot)) continue;
44
+ for (const entry of await (0, promises_1.readdir)(skillsRoot)) {
45
+ if (!entry.startsWith(shippedSkills_1.AGENT_SKILL_PREFIX)) continue;
46
+ const skillMd = (0, path_1.join)(skillsRoot, entry, "SKILL.md");
47
+ if (!(0, fs_1.existsSync)(skillMd)) continue;
48
+ const content = await (0, promises_1.readFile)(skillMd, "utf-8");
49
+ if (!content.includes(exports.AGENT_SKILL_GENERATED_MARKER)) continue;
50
+ await (0, promises_1.rm)((0, path_1.join)(skillsRoot, entry), {
51
+ recursive: true,
52
+ force: true
53
+ });
54
+ }
55
+ }
56
+ };
57
+ /**
58
+ * materializes the agent skills shipped with catladder (usage guides
59
+ * for AI coding agents) into the repository's agent skill directories,
60
+ * so agents working in the project use knowledge matching the installed
61
+ * catladder version. Opt out or narrow the targets via
62
+ * `agentSkills` in the config.
63
+ */
64
+ const generateAgentSkills = async (context, rootDir = ".") => {
65
+ await cleanupGeneratedAgentSkills(rootDir);
66
+ const targets = (0, types_1.getAgentSkillTargets)(context.config.agentSkills);
67
+ if (targets.length === 0) return;
68
+ const skills = (0, shippedSkills_1.getShippedSkills)();
69
+ for (const target of targets) {
70
+ for (const skill of skills) {
71
+ for (const file of skill.files) {
72
+ const path = (0, path_1.join)(rootDir, types_1.AGENT_SKILL_TARGET_DIRS[target], skill.name, file.relativePath);
73
+ await (0, promises_1.mkdir)((0, path_1.dirname)(path), {
74
+ recursive: true
75
+ });
76
+ const content = file.relativePath.endsWith(".md") ? (0, exports.injectGeneratedMarker)(file.content) : file.content;
77
+ await context.fileWriter.writeGeneratedFileRaw(path, content);
78
+ }
79
+ }
80
+ }
81
+ };
82
+ exports.generateAgentSkills = generateAgentSkills;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateAgentSkills.js","sourceRoot":"","sources":["../../../../../pipeline/src/agentSkills/generateAgentSkills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from "./types";
2
+ export * from "./shippedSkills";
3
+ export * from "./generateAgentSkills";
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+
3
+ var __createBinding = this && this.__createBinding || (Object.create ? function (o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = {
8
+ enumerable: true,
9
+ get: function () {
10
+ return m[k];
11
+ }
12
+ };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ } : function (o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ });
19
+ var __exportStar = this && this.__exportStar || function (m, exports) {
20
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
21
+ };
22
+ Object.defineProperty(exports, "__esModule", {
23
+ value: true
24
+ });
25
+ __exportStar(require("./types"), exports);
26
+ __exportStar(require("./shippedSkills"), exports);
27
+ __exportStar(require("./generateAgentSkills"), exports);
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../pipeline/src/agentSkills/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,kDAAgC;AAChC,wDAAsC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * all catladder skills use this prefix; it marks the namespace
3
+ * catladder owns inside the agent skill directories (regeneration may
4
+ * remove stale `catladder-*` skills it generated earlier)
5
+ */
6
+ export declare const AGENT_SKILL_PREFIX = "catladder-";
7
+ export type ShippedSkill = {
8
+ /** the skill directory name, e.g. "catladder-config" */
9
+ name: string;
10
+ /** all files of the skill, relative to the skill directory */
11
+ files: Array<{
12
+ relativePath: string;
13
+ content: string;
14
+ }>;
15
+ };
16
+ /**
17
+ * the directory containing the agent skill definitions shipped with
18
+ * the package (copied into dist at build time; the repository layout
19
+ * is the fallback for development and tests)
20
+ */
21
+ export declare const getShippedSkillsDir: () => string;
22
+ export declare const getShippedSkills: () => ShippedSkill[];
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getShippedSkills = exports.getShippedSkillsDir = exports.AGENT_SKILL_PREFIX = void 0;
7
+ const fs_1 = require("fs");
8
+ const path_1 = require("path");
9
+ /**
10
+ * all catladder skills use this prefix; it marks the namespace
11
+ * catladder owns inside the agent skill directories (regeneration may
12
+ * remove stale `catladder-*` skills it generated earlier)
13
+ */
14
+ exports.AGENT_SKILL_PREFIX = "catladder-";
15
+ /**
16
+ * the directory containing the agent skill definitions shipped with
17
+ * the package (copied into dist at build time; the repository layout
18
+ * is the fallback for development and tests)
19
+ */
20
+ const getShippedSkillsDir = () => {
21
+ const candidates = [
22
+ // built pipeline package: dist/agentSkills -> dist/skills
23
+ // bundled cli package (what consumers install): the ncc bundles live
24
+ // in dist/bundles/<name>, so both resolve to dist/bundles/skills
25
+ (0, path_1.join)(__dirname, "..", "skills"),
26
+ // cli tsc dist (catenv-dev): dist/pipeline/src/agentSkills -> dist/skills
27
+ // repository: pipeline/src/agentSkills -> <root>/skills
28
+ (0, path_1.join)(__dirname, "..", "..", "..", "skills")];
29
+ const found = candidates.find(candidate => (0, fs_1.existsSync)(candidate));
30
+ if (!found) {
31
+ throw new Error("shipped agent skill definitions not found");
32
+ }
33
+ return found;
34
+ };
35
+ exports.getShippedSkillsDir = getShippedSkillsDir;
36
+ const readFilesRecursively = (dir, relativeTo) => (0, fs_1.readdirSync)(dir).sort().flatMap(entry => {
37
+ const fullPath = (0, path_1.join)(dir, entry);
38
+ if ((0, fs_1.statSync)(fullPath).isDirectory()) {
39
+ return readFilesRecursively(fullPath, relativeTo);
40
+ }
41
+ return [{
42
+ relativePath: fullPath.slice(relativeTo.length + 1),
43
+ content: (0, fs_1.readFileSync)(fullPath, "utf-8")
44
+ }];
45
+ });
46
+ const getShippedSkills = () => {
47
+ const skillsDir = (0, exports.getShippedSkillsDir)();
48
+ return (0, fs_1.readdirSync)(skillsDir).sort().filter(entry => (0, fs_1.statSync)((0, path_1.join)(skillsDir, entry)).isDirectory()).map(name => {
49
+ const skillDir = (0, path_1.join)(skillsDir, name);
50
+ return {
51
+ name,
52
+ files: readFilesRecursively(skillDir, skillDir)
53
+ };
54
+ });
55
+ };
56
+ exports.getShippedSkills = getShippedSkills;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shippedSkills.js","sourceRoot":"","sources":["../../../../../pipeline/src/agentSkills/shippedSkills.ts"],"names":[],"mappings":";;;AAAA,2BAAqE;AACrE,+BAA4B;AAE5B;;;;GAIG;AACU,QAAA,kBAAkB,GAAG,YAAY,CAAC;AAS/C;;;;GAIG;AACI,MAAM,mBAAmB,GAAG,GAAW,EAAE;IAC9C,MAAM,UAAU,GAAG;QACjB,0DAA0D;QAC1D,qEAAqE;QACrE,iEAAiE;QACjE,IAAA,WAAI,EAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC;QAC/B,0EAA0E;QAC1E,wDAAwD;QACxD,IAAA,WAAI,EAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC;KAC5C,CAAC;IACF,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,IAAA,eAAU,EAAC,SAAS,CAAC,CAAC,CAAC;IACpE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAfW,QAAA,mBAAmB,uBAe9B;AAEF,MAAM,oBAAoB,GAAG,CAC3B,GAAW,EACX,UAAkB,EACgC,EAAE,CACpD,IAAA,gBAAW,EAAC,GAAG,CAAC;KACb,IAAI,EAAE;KACN,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;IACjB,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAClC,IAAI,IAAA,aAAQ,EAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACrC,OAAO,oBAAoB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACpD,CAAC;IACD,OAAO;QACL;YACE,YAAY,EAAE,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;YACnD,OAAO,EAAE,IAAA,iBAAY,EAAC,QAAQ,EAAE,OAAO,CAAC;SACzC;KACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEA,MAAM,gBAAgB,GAAG,GAAmB,EAAE;IACnD,MAAM,SAAS,GAAG,IAAA,2BAAmB,GAAE,CAAC;IACxC,OAAO,IAAA,gBAAW,EAAC,SAAS,CAAC;SAC1B,IAAI,EAAE;SACN,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,aAAQ,EAAC,IAAA,WAAI,EAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;SACjE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACvC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;IACnE,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AATW,QAAA,gBAAgB,oBAS3B"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * where agent skills get materialized, per agent ecosystem:
3
+ * - claude-code: the Claude Code project skills directory
4
+ * - agents: the cross-agent universal skills directory
5
+ * (https://agents.md convention, picked up by Cursor, Codex, ...)
6
+ */
7
+ export declare const AGENT_SKILL_TARGET_DIRS: {
8
+ readonly "claude-code": ".claude/skills";
9
+ readonly agents: ".agents/skills";
10
+ };
11
+ export type AgentSkillTargetName = keyof typeof AGENT_SKILL_TARGET_DIRS;
12
+ /**
13
+ * agent skills materialization, see {@link Config.agentSkills}
14
+ */
15
+ export type AgentSkillsConfig = boolean | {
16
+ /**
17
+ * which agent skill directories to write to.
18
+ * Defaults to all known targets.
19
+ */
20
+ targets?: AgentSkillTargetName[];
21
+ };
22
+ export declare const getAgentSkillTargets: (agentSkills: AgentSkillsConfig | undefined) => AgentSkillTargetName[];
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getAgentSkillTargets = exports.AGENT_SKILL_TARGET_DIRS = void 0;
7
+ /**
8
+ * where agent skills get materialized, per agent ecosystem:
9
+ * - claude-code: the Claude Code project skills directory
10
+ * - agents: the cross-agent universal skills directory
11
+ * (https://agents.md convention, picked up by Cursor, Codex, ...)
12
+ */
13
+ exports.AGENT_SKILL_TARGET_DIRS = {
14
+ "claude-code": ".claude/skills",
15
+ agents: ".agents/skills"
16
+ };
17
+ const getAgentSkillTargets = agentSkills => {
18
+ var _a;
19
+ if (agentSkills === false) return [];
20
+ if (agentSkills === true || agentSkills === undefined) {
21
+ return Object.keys(exports.AGENT_SKILL_TARGET_DIRS);
22
+ }
23
+ return (_a = agentSkills.targets) !== null && _a !== void 0 ? _a : Object.keys(exports.AGENT_SKILL_TARGET_DIRS);
24
+ };
25
+ exports.getAgentSkillTargets = getAgentSkillTargets;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../pipeline/src/agentSkills/types.ts"],"names":[],"mappings":";;;AAAA;;;;;GAKG;AACU,QAAA,uBAAuB,GAAG;IACrC,aAAa,EAAE,gBAAgB;IAC/B,MAAM,EAAE,gBAAgB;CAChB,CAAC;AAiBJ,MAAM,oBAAoB,GAAG,CAClC,WAA0C,EAClB,EAAE;;IAC1B,IAAI,WAAW,KAAK,KAAK;QAAE,OAAO,EAAE,CAAC;IACrC,IAAI,WAAW,KAAK,IAAI,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QACtD,OAAO,MAAM,CAAC,IAAI,CAAC,+BAAuB,CAA2B,CAAC;IACxE,CAAC;IACD,OAAO,CACL,MAAA,WAAW,CAAC,OAAO,mCAClB,MAAM,CAAC,IAAI,CAAC,+BAAuB,CAA4B,CACjE,CAAC;AACJ,CAAC,CAAC;AAXW,QAAA,oBAAoB,wBAW/B"}
@@ -4,5 +4,5 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.DOCKER_REGISTRY = exports.PIPELINE_IMAGE_TAG = void 0;
7
- exports.PIPELINE_IMAGE_TAG = "next-80fd0ab4" || "latest";
7
+ exports.PIPELINE_IMAGE_TAG = "next-ebc933f2" || "latest";
8
8
  exports.DOCKER_REGISTRY = "git.panter.ch:5001/catladder/catladder" || "git.panter.ch:5001/catladder/catladder";
@@ -10,6 +10,7 @@ const backends_1 = require("../backends");
10
10
  const gitlab_1 = require("../backends/gitlab");
11
11
  const jobImagesPlan_1 = require("../customImages/jobImagesPlan");
12
12
  const shippedCatci_1 = require("../catci/shippedCatci");
13
+ const agentSkills_1 = require("../agentSkills");
13
14
  /**
14
15
  * generates the pipeline files of all pipeline types enabled in the
15
16
  * config (see `pipelines`). Pass an explicit `pipelineType` to generate
@@ -31,6 +32,9 @@ async function generatePipelineFiles(context, pipelineType) {
31
32
  recursive: true,
32
33
  force: true
33
34
  });
35
+ // agent skills are backend-independent, materialized once per full
36
+ // generation
37
+ await (0, agentSkills_1.generateAgentSkills)(context);
34
38
  }
35
39
  for (const type of pipelineTypes) {
36
40
  await generatePipelineFilesForBackend(context, (0, backends_1.getPipelineBackend)(type));
@@ -1 +1 @@
1
- {"version":3,"file":"generatePipelineFiles.js","sourceRoot":"","sources":["../../../../../pipeline/src/pipeline/generatePipelineFiles.ts"],"names":[],"mappings":";;;AAAA,0CAAwC;AACxC,+BAA+B;AAI/B,0CAA0E;AAC1E,+CAAmD;AAEnD,iEAAwE;AACxE,wDAA+D;AAE/D;;;;GAIG;AACI,KAAK,UAAU,qBAAqB,CACzC,OAAsB,EACtB,YAA2B;IAE3B,MAAM,aAAa,GAAG,YAAY;QAChC,CAAC,CAAC,CAAC,YAAY,CAAC;QAChB,CAAC,CAAC,IAAA,kCAAuB,EAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAE5C,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,oEAAoE;QACpE,kEAAkE;QAClE,oEAAoE;QACpE,0CAA0C;QAC1C,MAAM,IAAA,aAAE,EAAC,uCAAuB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpE,iEAAiE;QACjE,MAAM,IAAA,aAAE,EAAC,qCAAsB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,MAAM,+BAA+B,CAAC,OAAO,EAAE,IAAA,6BAAkB,EAAC,IAAI,CAAC,CAAC,CAAC;IAC3E,CAAC;AACH,CAAC;AArBD,sDAqBC;AAED,KAAK,UAAU,+BAA+B,CAC5C,OAAsB,EACtB,OAAwB;IAExB,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAExD,4CAA4C;IAC5C,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IACxB,cAAc;IACd,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;QACpC,MAAM,IAAA,gBAAK,EAAC,IAAA,cAAO,EAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,MAAM,OAAO,CAAC,UAAU,CAAC,qBAAqB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAChE,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACxD,CAAC;IACH,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,yBAAyB,CAAC,MAAc;IAC5D,OAAO,IAAI,sBAAa,EAAE,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAC5D,CAAC;AAFD,8DAEC"}
1
+ {"version":3,"file":"generatePipelineFiles.js","sourceRoot":"","sources":["../../../../../pipeline/src/pipeline/generatePipelineFiles.ts"],"names":[],"mappings":";;;AAAA,0CAAwC;AACxC,+BAA+B;AAI/B,0CAA0E;AAC1E,+CAAmD;AAEnD,iEAAwE;AACxE,wDAA+D;AAC/D,gDAAqD;AAErD;;;;GAIG;AACI,KAAK,UAAU,qBAAqB,CACzC,OAAsB,EACtB,YAA2B;IAE3B,MAAM,aAAa,GAAG,YAAY;QAChC,CAAC,CAAC,CAAC,YAAY,CAAC;QAChB,CAAC,CAAC,IAAA,kCAAuB,EAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAE5C,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,oEAAoE;QACpE,kEAAkE;QAClE,oEAAoE;QACpE,0CAA0C;QAC1C,MAAM,IAAA,aAAE,EAAC,uCAAuB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpE,iEAAiE;QACjE,MAAM,IAAA,aAAE,EAAC,qCAAsB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACnE,mEAAmE;QACnE,aAAa;QACb,MAAM,IAAA,iCAAmB,EAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,MAAM,+BAA+B,CAAC,OAAO,EAAE,IAAA,6BAAkB,EAAC,IAAI,CAAC,CAAC,CAAC;IAC3E,CAAC;AACH,CAAC;AAxBD,sDAwBC;AAED,KAAK,UAAU,+BAA+B,CAC5C,OAAsB,EACtB,OAAwB;IAExB,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAExD,4CAA4C;IAC5C,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IACxB,cAAc;IACd,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;QACpC,MAAM,IAAA,gBAAK,EAAC,IAAA,cAAO,EAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,MAAM,OAAO,CAAC,UAAU,CAAC,qBAAqB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAChE,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACxD,CAAC;IACH,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,yBAAyB,CAAC,MAAc;IAC5D,OAAO,IAAI,sBAAa,EAAE,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAC5D,CAAC;AAFD,8DAEC"}
@@ -8,6 +8,7 @@ import type { AgentConfig } from "./agent";
8
8
  import type { Hooks } from "./hooks";
9
9
  import type { ReleaseConfig } from "./release";
10
10
  import type { CatladderStore } from "../store";
11
+ import type { AgentSkillsConfig } from "../agentSkills/types";
11
12
  import type { VerifyConfig } from "../verify/types";
12
13
  export declare const ALL_PIPELINE_TRIGGERS: readonly ["mainBranch", "mr", "taggedRelease"];
13
14
  export type PipelineTrigger = (typeof ALL_PIPELINE_TRIGGERS)[number];
@@ -254,6 +255,20 @@ export type Config<C extends ConfigProps = never> = {
254
255
  * github, where the central registry is not reachable)
255
256
  */
256
257
  jobImages?: "central" | "repo";
258
+ /**
259
+ * materialize the agent skills shipped with catladder (usage guides
260
+ * for AI coding agents like Claude Code) into the repository, so
261
+ * agents working in the project use knowledge matching the installed
262
+ * catladder version. The skills are written on every generation into
263
+ * `catladder-*` directories under the agent skill folders (e.g.
264
+ * `.claude/skills/`) — that namespace is owned by catladder and must
265
+ * not be edited manually.
266
+ *
267
+ * - `true` (default): write to all known agent skill directories
268
+ * - `false`: opt out (previously generated skills are removed)
269
+ * - `{ targets: [...] }`: only write to the given targets
270
+ */
271
+ agentSkills?: AgentSkillsConfig;
257
272
  /**
258
273
  * name of the customer or group
259
274
  */
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../../pipeline/src/types/config.ts"],"names":[],"mappings":";;;AAaa,QAAA,qBAAqB,GAAG;IACnC,YAAY;IACZ,IAAI;IACJ,eAAe;CACP,CAAC;AAGX;;;GAGG;AACU,QAAA,SAAS,GAAG;IACvB,GAAG,EAAE;QACH,QAAQ,EAAE,CAAC,YAAY,CAAC;KACzB;IACD,MAAM,EAAE;QACN,QAAQ,EAAE,CAAC,IAAI,CAAC;KACjB;IACD,KAAK,EAAE;QACL,QAAQ,EAAE,CAAC,eAAe,CAAC;KAC5B;IACD,IAAI,EAAE;QACJ,QAAQ,EAAE,CAAC,eAAe,CAAC;KAC5B;IACD,KAAK,EAAE;QACL,QAAQ,EAAE,EAAE;KACb;CACO,CAAC;AAEX;;;;GAIG;AACI,MAAM,oBAAoB,GAAG,CAAC,OAAwB,EAAE,EAAE,CAC/D,MAAM,CAAC,OAAO,CAAC,iBAAS,CAAC;KACtB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CACf,CAAC,CAAC,QAAuC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAC7D;KACA,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAY,CAAC,CAAC;AALnB,QAAA,oBAAoB,wBAKD;AAEnB,QAAA,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,iBAAS,CAAC,CAAC;AACtC,QAAA,iBAAiB,GAAG,oBAAyB,CAAC;AAGpD,MAAM,aAAa,GAAG,CAAC,GAAW,EAAkB,EAAE;IAC3D,OAAO,GAAG,IAAI,iBAAS,CAAC;AAC1B,CAAC,CAAC;AAFW,QAAA,aAAa,iBAExB"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../../pipeline/src/types/config.ts"],"names":[],"mappings":";;;AAca,QAAA,qBAAqB,GAAG;IACnC,YAAY;IACZ,IAAI;IACJ,eAAe;CACP,CAAC;AAGX;;;GAGG;AACU,QAAA,SAAS,GAAG;IACvB,GAAG,EAAE;QACH,QAAQ,EAAE,CAAC,YAAY,CAAC;KACzB;IACD,MAAM,EAAE;QACN,QAAQ,EAAE,CAAC,IAAI,CAAC;KACjB;IACD,KAAK,EAAE;QACL,QAAQ,EAAE,CAAC,eAAe,CAAC;KAC5B;IACD,IAAI,EAAE;QACJ,QAAQ,EAAE,CAAC,eAAe,CAAC;KAC5B;IACD,KAAK,EAAE;QACL,QAAQ,EAAE,EAAE;KACb;CACO,CAAC;AAEX;;;;GAIG;AACI,MAAM,oBAAoB,GAAG,CAAC,OAAwB,EAAE,EAAE,CAC/D,MAAM,CAAC,OAAO,CAAC,iBAAS,CAAC;KACtB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CACf,CAAC,CAAC,QAAuC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAC7D;KACA,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAY,CAAC,CAAC;AALnB,QAAA,oBAAoB,wBAKD;AAEnB,QAAA,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,iBAAS,CAAC,CAAC;AACtC,QAAA,iBAAiB,GAAG,oBAAyB,CAAC;AAGpD,MAAM,aAAa,GAAG,CAAC,GAAW,EAAkB,EAAE;IAC3D,OAAO,GAAG,IAAI,iBAAS,CAAC;AAC1B,CAAC,CAAC;AAFW,QAAA,aAAa,iBAExB"}
@@ -0,0 +1,53 @@
1
+ ---
2
+ name: catladder-cli
3
+ description: How to invoke the catladder CLI non-interactively — command structure, passing inputs via flags or --inputs JSON, skipping prompts, and the full generated command reference. Use when running any `catladder` command (project setup, doctor, secrets, k8s, ci, cloudsql, mongo) or when unsure which catladder command exists for a task. Triggers on "catladder command", "yarn catladder", "project doctor", "project setup", "run catladder".
4
+ ---
5
+
6
+ # Using the catladder CLI
7
+
8
+ catladder is installed per project — invoke it as `yarn catladder`
9
+ (never a globally installed copy). Every command can run
10
+ non-interactively, which is the mode agents should use.
11
+
12
+ ## Invocation
13
+
14
+ ```sh
15
+ yarn catladder <command...> [args] [flags]
16
+
17
+ # examples
18
+ yarn catladder project doctor
19
+ yarn catladder project ci job-log
20
+ yarn catladder --help # command tree
21
+ yarn catladder project --help # subcommands of a group
22
+ ```
23
+
24
+ ## Passing inputs
25
+
26
+ Commands declare typed inputs. Any input not provided on the command
27
+ line is prompted for interactively — in a non-interactive context
28
+ (agents!) provide them up front:
29
+
30
+ - positional inputs: `yarn catladder project k8s list-pods dev:api`
31
+ - flag per input: `--some-input value` (kebab-case of the input name),
32
+ booleans as `--flag` / `--no-flag`
33
+ - all at once as JSON: `--inputs '{"envComponent": "dev:api"}'`
34
+ - `-y` / `--yes` skips confirmation prompts
35
+
36
+ A missing required input fails with a message naming the exact flag to
37
+ pass. Environment/component selectors use the `env:component` form
38
+ (e.g. `dev:api`, `review-123:www`).
39
+
40
+ Some commands are inherently interactive (e.g.
41
+ `project config-secrets` opens `$EDITOR`) — ask the user to run those.
42
+
43
+ ## Command reference
44
+
45
+ See [references/commands.md](references/commands.md) for all commands
46
+ with their descriptions and inputs (generated from the CLI itself, so
47
+ it matches the installed version).
48
+
49
+ ## Related skills
50
+
51
+ - `catladder-config` — catladder.ts structure and regeneration
52
+ - `catladder-secrets` — env vars and secret management
53
+ - `catladder-pipelines` — pipeline behavior and CI debugging
@@ -0,0 +1,273 @@
1
+ # catladder CLI command reference
2
+
3
+ <!-- rendered from the command definitions by
4
+ cli/src/scripts/generateCliSkillReference.ts — do not edit -->
5
+
6
+ All commands run non-interactively as `yarn catladder <command> ...`;
7
+ see SKILL.md for how to pass inputs.
8
+
9
+ ## `catladder cloudsql restore-db`
10
+
11
+ restore a db from one source to another target
12
+
13
+ - `--source <value>`: Source instance (connection string or 'local')?
14
+ - `--source-local-port <value>`: Local Port for source? (default: 5432)
15
+ - `--source-username <value>`: Source Username? (default: "postgres")
16
+ - `--source-password <value>`: Source Password?
17
+ - `--source-db-name <value>`: Source DB name?
18
+ - `--target <value>`: Target INSTANCE (connection string or 'local')?
19
+ - `--target-local-port <value>`: Local Port for target? (default: 5432)
20
+ - `--target-username <value>`: Target Username? (default: "postgres")
21
+ - `--target-password <value>`: Target Password?
22
+ - `--target-db-name <value>`: Target DB name?
23
+
24
+ ## `catladder fun dadjoke`
25
+
26
+ something for jonas.
27
+
28
+ ## `catladder fun starwars`
29
+
30
+ Long time ago... in a galaxy far far away...
31
+
32
+ ## `catladder k8s current-context`
33
+
34
+ show current kubernetes context
35
+
36
+ ## `catladder k8s get-shell [namespace]`
37
+
38
+ get a shell to a pod in the environment
39
+
40
+ - `namespace` (positional): kubernetes namespace
41
+ - `--pod-name <value>`: Which pod?
42
+
43
+ ## `catladder k8s list-namespaces`
44
+
45
+ list all namespaces
46
+
47
+ ## `catladder k8s list-pods [namespace]`
48
+
49
+ list all pods of namespace
50
+
51
+ - `namespace` (positional): kubernetes namespace
52
+
53
+ ## `catladder k8s list-secrets [namespace]`
54
+
55
+ show secrets
56
+
57
+ - `namespace` (positional): kubernetes namespace
58
+
59
+ ## `catladder k8s port-forward [namespace]`
60
+
61
+ start port-forwarding
62
+
63
+ - `namespace` (positional): kubernetes namespace
64
+ - `--pod-name <value>`: Which pod?
65
+ - `--local-port <value>`: Local port:
66
+ - `--remote-port <value>`: Remote port:
67
+
68
+ ## `catladder k8s stop-portforward [name]`
69
+
70
+ stop a running port forward
71
+
72
+ - `name` (positional): port forward name
73
+
74
+ ## `catladder k8s trigger-cronjob [namespace]`
75
+
76
+ trigger cronjob
77
+
78
+ - `namespace` (positional): kubernetes namespace
79
+ - `--job-name <value>`: Which cronjob?
80
+
81
+ ## `catladder project ci job-log`
82
+
83
+ Show a job's log
84
+
85
+ - `--job-name <value>`: Which job?
86
+
87
+ ## `catladder project ci job-open`
88
+
89
+ Open a Job
90
+
91
+ - `--job-name <value>`: Which job?
92
+
93
+ ## `catladder project cloudsql proxy [envComponent]`
94
+
95
+ proxy to cloud sql db
96
+
97
+ - `envComponent` (positional): environment:component
98
+ - `--local-port <value>`: Local port: (default: 54320)
99
+
100
+ ## `catladder project cloudsql restore-db`
101
+
102
+ restores a project db from one source to another target
103
+
104
+ - `--source <value>`: Source instance?
105
+ - `--target <value>`: target env?
106
+ - `--confirm-instance <value>`: confirm:
107
+
108
+ ## `catladder project config-secrets [envComponent]`
109
+
110
+ setup/update secrets stored in pass
111
+
112
+ - `envComponent` (positional): environment:component
113
+
114
+ ## `catladder project doctor [component]`
115
+
116
+ Checks for drift between the config and the provisioned infrastructure (read-only): service accounts, IAM roles, gitlab tokens, github secrets, store entries.
117
+
118
+ - `component` (positional): component name
119
+
120
+ ## `catladder project env-vars [envComponent]`
121
+
122
+ list env vars
123
+
124
+ - `envComponent` (positional): environment:component
125
+
126
+ ## `catladder project k8s delete [envComponent]`
127
+
128
+ deletes a environment of a project (it deletes the namespace)
129
+
130
+ - `envComponent` (positional): environment:component
131
+
132
+ ## `catladder project k8s delete-pods [envComponent]`
133
+
134
+ delete / restart pods
135
+
136
+ - `envComponent` (positional): environment:component
137
+ - `--selected-pod-names <value>`: Which pods to delete / restart ?
138
+
139
+ ## `catladder project k8s get-shell [envComponent]`
140
+
141
+ get a shell to a pod in the environment
142
+
143
+ - `envComponent` (positional): environment:component
144
+ - `--pod-name <value>`: Which pod?
145
+
146
+ ## `catladder project k8s list-pods [envComponent]`
147
+
148
+ list pods of local project
149
+
150
+ - `envComponent` (positional): environment:component
151
+
152
+ ## `catladder project k8s namespace [envComponent]`
153
+
154
+ show namespace of local project
155
+
156
+ - `envComponent` (positional): environment:component
157
+
158
+ ## `catladder project k8s pause [envComponent]`
159
+
160
+ halts all running pods (scales to 0)
161
+
162
+ - `envComponent` (positional): environment:component
163
+
164
+ ## `catladder project k8s trigger-cronjob [envComponent]`
165
+
166
+ trigger cronjob
167
+
168
+ - `envComponent` (positional): environment:component
169
+ - `--job-name <value>`: Which cronjob?
170
+
171
+ ## `catladder project logs open [envComponent]`
172
+
173
+ open logs for a component (Google Cloud Logging)
174
+
175
+ - `envComponent` (positional): environment:component
176
+
177
+ ## `catladder project mongo destroy-member [envComponent]`
178
+
179
+ DESTROY a member of a replicaset in order to reinitialize it
180
+
181
+ - `envComponent` (positional): environment:component
182
+ - `--pod-name <value>`: Which pod?
183
+
184
+ ## `catladder project mongo get-shell [envComponent]`
185
+
186
+ get a shell to a mongodb in the environment
187
+
188
+ - `envComponent` (positional): environment:component
189
+ - `--pod-name <value>`: Which pod?
190
+
191
+ ## `catladder project mongo port-forward [envComponent]`
192
+
193
+ port forward to a mongodb
194
+
195
+ - `envComponent` (positional): environment:component
196
+ - `--pod-name <value>`: Which pod?
197
+ - `--local-port <value>`: Local port: (default: 30000)
198
+
199
+ ## `catladder project open env [envComponent]`
200
+
201
+ open the live environment
202
+
203
+ - `envComponent` (positional): environment:component
204
+
205
+ ## `catladder project open git`
206
+
207
+ open the repo on gitlab / github in your browser
208
+
209
+ ## `catladder project port-forward [envComponent]`
210
+
211
+ start port-forwarding
212
+
213
+ - `envComponent` (positional): environment:component
214
+ - `--pod-name <value>`: Which pod?
215
+ - `--local-port <value>`: Local port:
216
+ - `--remote-port <value>`: Remote port:
217
+ - `--mr <value>`: Which mr
218
+
219
+ ## `catladder project renew-token`
220
+
221
+ Configures the project access token for semantic release.
222
+
223
+ ## `catladder project secrets-clear-backups`
224
+
225
+ clears all backups
226
+
227
+ - `--keep <value>`: How many backups should we keep? (default: 1)
228
+
229
+ ## `catladder project secrets-sync-github [repo] [env]`
230
+
231
+ copies all secrets from the vault to github repo secrets (same names), for the github pipeline
232
+
233
+ - `repo` (positional): github repository (owner/name)
234
+ - `env` (positional): only sync these environments (comma-separated, e.g. review,dev) — github allows at most 100 repo secrets
235
+
236
+ ## `catladder project security-evaluate`
237
+
238
+ evaluate project's security audit document
239
+
240
+ ## `catladder project setup [component]`
241
+
242
+ Initializes all environments and creates required resources, service accounts, etc.
243
+
244
+ - `component` (positional): component name
245
+
246
+ ## `catladder project worktime`
247
+
248
+ show the total worktime that you spent on a project
249
+
250
+ ## `catladder security audit ci-job [path] [token] [mainBranch] [projectId] [userId]`
251
+
252
+ Evaluates security audit document. Creates MR with template if missing.
253
+
254
+ - `path` (positional): path to project root
255
+ - `token` (positional): GitLab token (api scope)
256
+ - `mainBranch` (positional): main branch name
257
+ - `projectId` (positional): GitLab project ID
258
+ - `userId` (positional): GitLab user ID (assignee)
259
+
260
+ ## `catladder security audit create [token] [mainBranch] [projectId] [userId]`
261
+
262
+ Creates a MR with the latest security audit template document
263
+
264
+ - `token` (positional): GitLab token (api scope)
265
+ - `mainBranch` (positional): main branch name
266
+ - `projectId` (positional): GitLab project ID
267
+ - `userId` (positional): GitLab user ID (assignee)
268
+
269
+ ## `catladder security audit evaluate [path]`
270
+
271
+ Evaluates security audit document in given path
272
+
273
+ - `path` (positional): path to project root