@cashfreepayments/agent-skills 0.1.2 → 0.1.4

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 (53) hide show
  1. package/README.md +25 -4
  2. package/dist/cli-ui.d.ts +4 -0
  3. package/dist/cli-ui.d.ts.map +1 -0
  4. package/dist/cli-ui.js +124 -0
  5. package/dist/cli-ui.js.map +1 -0
  6. package/dist/cli-utils.d.ts +11 -0
  7. package/dist/cli-utils.d.ts.map +1 -0
  8. package/dist/cli-utils.js +46 -0
  9. package/dist/cli-utils.js.map +1 -0
  10. package/dist/config.d.ts.map +1 -1
  11. package/dist/config.js +8 -2
  12. package/dist/config.js.map +1 -1
  13. package/dist/generators/utils.d.ts +33 -2
  14. package/dist/generators/utils.d.ts.map +1 -1
  15. package/dist/generators/utils.js +110 -3
  16. package/dist/generators/utils.js.map +1 -1
  17. package/dist/index.js +169 -156
  18. package/dist/index.js.map +1 -1
  19. package/dist/install.d.ts +27 -0
  20. package/dist/install.d.ts.map +1 -0
  21. package/dist/install.js +60 -0
  22. package/dist/install.js.map +1 -0
  23. package/dist/skills.d.ts +12 -0
  24. package/dist/skills.d.ts.map +1 -0
  25. package/dist/skills.js +73 -0
  26. package/dist/skills.js.map +1 -0
  27. package/dist/telemetry.d.ts.map +1 -1
  28. package/dist/telemetry.js +47 -54
  29. package/dist/telemetry.js.map +1 -1
  30. package/dist/templates/common-mistakes.md +63 -0
  31. package/dist/templates/getting-started.md +26 -2
  32. package/dist/templates/manifest.d.ts.map +1 -1
  33. package/dist/templates/manifest.js +6 -4
  34. package/dist/templates/manifest.js.map +1 -1
  35. package/dist/templates/migrate-from-juspay-reference.md +5 -5
  36. package/dist/templates/migrate-from-razorpay-reference.md +15 -15
  37. package/dist/templates/payment-modes.md +89 -29
  38. package/dist/templates/pg/api.md +3 -1
  39. package/dist/templates/pg/go-live.md +26 -12
  40. package/dist/templates/pg/mobile-reference.md +2 -2
  41. package/dist/templates/pg/mobile.md +4 -5
  42. package/dist/templates/pg/offers-reference.md +9 -3
  43. package/dist/templates/pg/payment-links-reference.md +16 -11
  44. package/dist/templates/pg/refunds-reference.md +12 -11
  45. package/dist/templates/pg/sdk-reference.md +17 -20
  46. package/dist/templates/pg/sdk.md +60 -24
  47. package/dist/templates/pg/token-vault-reference.md +10 -12
  48. package/dist/templates/pg/web-sdk.md +87 -9
  49. package/dist/templates/pg/webhooks.md +23 -16
  50. package/dist/templates/progress-and-skill-feedback.md +54 -13
  51. package/dist/templates/settlements-and-reconciliation-reference.md +25 -18
  52. package/dist/templates/validation-and-testing.md +24 -3
  53. package/package.json +1 -1
package/README.md CHANGED
@@ -5,7 +5,7 @@ Add Cashfree Payments skills to your AI coding assistant projects — everything
5
5
  ## Quick Start
6
6
 
7
7
  ```bash
8
- npx @cashfreepayments/agent-skills@latest add skills
8
+ npx @cashfreepayments/agent-skills add skills
9
9
  ```
10
10
 
11
11
  ![Cashfree Payments](https://github.com/user-attachments/assets/a0a36020-7eee-4fda-9d6b-4002ea4991c6)
@@ -16,20 +16,41 @@ This will prompt you to select which AI coding assistants to configure.
16
16
 
17
17
  ### Interactive Mode
18
18
  ```bash
19
- npx @cashfreepayments/agent-skills@latest add skills
19
+ npx @cashfreepayments/agent-skills add skills
20
20
  ```
21
21
  You'll be prompted to select which AI assistants to configure.
22
22
 
23
23
  ### Specify Frameworks
24
24
  ```bash
25
- npx @cashfreepayments/agent-skills@latest add skills --frameworks cursor,claude-code,gemini-cli
25
+ npx @cashfreepayments/agent-skills add skills --frameworks cursor,claude-code,gemini-cli
26
26
  ```
27
27
 
28
28
  ### Custom Project Path
29
29
  ```bash
30
- npx @cashfreepayments/agent-skills@latest add skills --path /path/to/project
30
+ npx @cashfreepayments/agent-skills add skills --path /path/to/project
31
31
  ```
32
32
 
33
+ ### Updating Existing Skills
34
+
35
+ If you've already installed skills in a project and a newer version of the package is published, you have two options:
36
+
37
+ **Option 1 — Re-run `add skills`.** It auto-detects the installed version, compares against the latest published version on npm, and updates in place if outdated. No prompt.
38
+ ```bash
39
+ npx @cashfreepayments/agent-skills add skills
40
+ ```
41
+
42
+ **Option 2 — Use the dedicated `update` command.** Force-rewrites every skill file with the latest templates. Auto-detects which frameworks you have installed in the project; no need to re-select.
43
+ ```bash
44
+ npx @cashfreepayments/agent-skills update
45
+ ```
46
+
47
+ Target specific frameworks:
48
+ ```bash
49
+ npx @cashfreepayments/agent-skills update --frameworks cursor,claude-code
50
+ ```
51
+
52
+ Each skill file embeds its version in the YAML frontmatter (`cashfree-skills-version: …`), so the CLI can tell exactly what's installed and what needs refreshing.
53
+
33
54
  ## What Gets Created
34
55
 
35
56
  A single command creates all skill files + a manifest for each selected framework.
@@ -0,0 +1,4 @@
1
+ export declare function printBanner(): void;
2
+ export declare function printInstallSuccess(): void;
3
+ export declare function printHelp(): void;
4
+ //# sourceMappingURL=cli-ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-ui.d.ts","sourceRoot":"","sources":["../src/cli-ui.ts"],"names":[],"mappings":"AAoBA,wBAAgB,WAAW,IAAI,IAAI,CAUlC;AAiCD,wBAAgB,mBAAmB,IAAI,IAAI,CAe1C;AAwCD,wBAAgB,SAAS,IAAI,IAAI,CA0BhC"}
package/dist/cli-ui.js ADDED
@@ -0,0 +1,124 @@
1
+ import chalk from "chalk";
2
+ const BANNER_TOP_LINES = [
3
+ " ██████╗ █████╗ ███████╗██╗ ██╗███████╗██████╗ ███████╗███████╗",
4
+ " ██╔════╝██╔══██╗██╔════╝██║ ██║██╔════╝██╔══██╗██╔════╝██╔════╝",
5
+ " ██║ ███████║███████╗███████║█████╗ ██████╔╝█████╗ █████╗ ",
6
+ " ██║ ██╔══██║╚════██║██╔══██║██╔══╝ ██╔══██╗██╔══╝ ██╔══╝ ",
7
+ " ╚██████╗██║ ██║███████║██║ ██║██║ ██║ ██║███████╗███████╗",
8
+ " ╚═════╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝╚══════╝╚══════╝",
9
+ ];
10
+ const BANNER_BOTTOM_LINES = [
11
+ " ██████╗ █████╗ ██╗ ██╗███╗ ███╗███████╗███╗ ██╗████████╗███████╗",
12
+ " ██╔══██╗██╔══██╗╚██╗ ██╔╝████╗ ████║██╔════╝████╗ ██║╚══██╔══╝██╔════╝",
13
+ " ██████╔╝███████║ ╚████╔╝ ██╔████╔██║█████╗ ██╔██╗ ██║ ██║ ███████╗",
14
+ " ██╔═══╝ ██╔══██║ ╚██╔╝ ██║╚██╔╝██║██╔══╝ ██║╚██╗██║ ██║ ╚════██║",
15
+ " ██║ ██║ ██║ ██║ ██║ ╚═╝ ██║███████╗██║ ╚████║ ██║ ███████║",
16
+ " ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═══╝ ╚═╝ ╚══════╝",
17
+ ];
18
+ export function printBanner() {
19
+ console.log("\n");
20
+ for (const line of BANNER_TOP_LINES)
21
+ console.log(chalk.bold.hex("#10b981")(line));
22
+ for (const line of BANNER_BOTTOM_LINES)
23
+ console.log(chalk.bold.hex("#f59e0b")(line));
24
+ console.log("\n");
25
+ console.log(chalk.bold.cyan(" 🎯 Agent Skills Setup - Add Cashfree Payments Integration Knowledge to AI Assistants\n"));
26
+ }
27
+ const INSTALLED_TREE_LINES = [
28
+ " cashfree-skills/",
29
+ " ├── getting-started/SKILL.md",
30
+ " ├── eligible-payment-modes/SKILL.md",
31
+ " ├── pg/",
32
+ " │ ├── SKILL.md (overview)",
33
+ " │ ├── apis/SKILL.md + references/SKILL.md",
34
+ " │ ├── backend-sdks/SKILL.md + references/SKILL.md",
35
+ " │ ├── mobile-sdks/SKILL.md + references/SKILL.md",
36
+ " │ ├── webhooks/SKILL.md + references/REFERENCE.md",
37
+ " │ ├── go-live/SKILL.md + references/REFERENCE.md",
38
+ " │ ├── refunds/SKILL.md + references/REFERENCE.md",
39
+ " │ ├── disputes/SKILL.md + references/REFERENCE.md",
40
+ " │ ├── payment-links/SKILL.md + references/REFERENCE.md",
41
+ " │ ├── token-vault/SKILL.md + references/REFERENCE.md",
42
+ " │ ├── web-sdk/SKILL.md + references/REFERENCE.md",
43
+ " │ ├── easy-split/SKILL.md + references/REFERENCE.md",
44
+ " │ └── offers/SKILL.md + references/REFERENCE.md",
45
+ " ├── secure-id/SKILL.md + references/REFERENCE.md",
46
+ " ├── subscriptions/SKILL.md + references/REFERENCE.md",
47
+ " ├── cross-border/SKILL.md + references/REFERENCE.md",
48
+ " ├── payouts/SKILL.md + references/REFERENCE.md",
49
+ " ├── settlements-and-reconciliation/SKILL.md + references/REFERENCE.md",
50
+ " ├── auto-collect/SKILL.md + references/REFERENCE.md",
51
+ " ├── migrate-from-razorpay/SKILL.md + references/REFERENCE.md",
52
+ " ├── migrate-from-juspay/SKILL.md + references/REFERENCE.md",
53
+ " ├── progress-and-skill-feedback/SKILL.md",
54
+ " ├── validation-and-testing/SKILL.md",
55
+ " └── common-mistakes/SKILL.md",
56
+ ];
57
+ export function printInstallSuccess() {
58
+ console.log(chalk.bold.green("\n✅ Cashfree Payments skill configuration complete!\n"));
59
+ console.log(chalk.dim("Skills installed:"));
60
+ for (const line of INSTALLED_TREE_LINES)
61
+ console.log(chalk.dim(line));
62
+ console.log(chalk.dim("\nA manifest file has been created/updated to help your AI assistant discover these skills.\n"));
63
+ console.log(chalk.bold.cyan("👉 Try this in your AI assistant:"));
64
+ console.log(chalk.white(' "Integrate Cashfree Payments into my project"\n'));
65
+ console.log(chalk.hex("#fbbf24")("💡 ") +
66
+ chalk.bold.hex("#fbbf24")("More example prompts & next steps: ") +
67
+ chalk.bold.hex("#10b981")("npx @cashfreepayments/agent-skills help\n"));
68
+ }
69
+ const HELP_SECTIONS = [
70
+ {
71
+ title: "Getting started",
72
+ prompts: [
73
+ "Integrate Cashfree Payments into my project",
74
+ "What payment modes are enabled for my merchant account?",
75
+ ],
76
+ },
77
+ {
78
+ title: "Backend & SDK integration",
79
+ prompts: [
80
+ "Integrate Cashfree with my Express app using the Node SDK",
81
+ "Add Cashfree to my Django backend",
82
+ ],
83
+ },
84
+ {
85
+ title: "Frontend & mobile",
86
+ prompts: [
87
+ "Add Cashfree checkout to my Next.js app with the Web SDK",
88
+ "Integrate Cashfree into my Flutter app",
89
+ ],
90
+ },
91
+ {
92
+ title: "Migration & ops",
93
+ prompts: [
94
+ "Migrate my Express app from Razorpay to Cashfree",
95
+ "Replace Juspay Hypercheckout with Cashfree in my app",
96
+ ],
97
+ },
98
+ {
99
+ title: "Debugging",
100
+ prompts: [
101
+ "My webhook isn't firing — help me debug",
102
+ "I'm done coding — what should I test before going live?",
103
+ ],
104
+ },
105
+ ];
106
+ export function printHelp() {
107
+ console.log("\n" + chalk.bold.hex("#10b981")("Cashfree Agent Skills — what to do next") + "\n");
108
+ console.log(chalk.dim("Skills are installed in your project. Open your AI coding assistant\n" +
109
+ "(Claude Code, Cursor, Copilot, Gemini CLI, etc.) and paste any of the\n" +
110
+ "prompts below to put them to work.\n"));
111
+ for (const { title, prompts } of HELP_SECTIONS) {
112
+ console.log(chalk.bold.hex("#f59e0b")(`▸ ${title}`));
113
+ for (const p of prompts)
114
+ console.log(chalk.white(` • "${p}"`));
115
+ console.log("");
116
+ }
117
+ console.log(chalk.hex("#fbbf24")("💡 ") +
118
+ chalk.bold.hex("#fbbf24")("Tip: ") +
119
+ chalk.hex("#10b981")("skills are read on demand by your AI — ") +
120
+ chalk.hex("#f59e0b")("just ask in natural language.\n"));
121
+ console.log(chalk.dim("Re-run installation any time: ") +
122
+ chalk.bold("npx @cashfreepayments/agent-skills@latest add skills\n"));
123
+ }
124
+ //# sourceMappingURL=cli-ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-ui.js","sourceRoot":"","sources":["../src/cli-ui.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,gBAAgB,GAAG;IACrB,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;CACvE,CAAC;AAEF,MAAM,mBAAmB,GAAG;IACxB,2EAA2E;IAC3E,2EAA2E;IAC3E,2EAA2E;IAC3E,2EAA2E;IAC3E,2EAA2E;IAC3E,2EAA2E;CAC9E,CAAC;AAEF,MAAM,UAAU,WAAW;IACvB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClB,KAAK,MAAM,IAAI,IAAI,gBAAgB;QAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAClF,KAAK,MAAM,IAAI,IAAI,mBAAmB;QAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACrF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClB,OAAO,CAAC,GAAG,CACP,KAAK,CAAC,IAAI,CAAC,IAAI,CACX,0FAA0F,CAC7F,CACJ,CAAC;AACN,CAAC;AAED,MAAM,oBAAoB,GAAG;IACzB,oBAAoB;IACpB,gCAAgC;IAChC,uCAAuC;IACvC,WAAW;IACX,+BAA+B;IAC/B,+CAA+C;IAC/C,uDAAuD;IACvD,sDAAsD;IACtD,uDAAuD;IACvD,sDAAsD;IACtD,sDAAsD;IACtD,uDAAuD;IACvD,4DAA4D;IAC5D,0DAA0D;IAC1D,sDAAsD;IACtD,yDAAyD;IACzD,qDAAqD;IACrD,oDAAoD;IACpD,wDAAwD;IACxD,uDAAuD;IACvD,kDAAkD;IAClD,yEAAyE;IACzE,uDAAuD;IACvD,gEAAgE;IAChE,8DAA8D;IAC9D,4CAA4C;IAC5C,uCAAuC;IACvC,gCAAgC;CACnC,CAAC;AAEF,MAAM,UAAU,mBAAmB;IAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC,CAAC;IACvF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC5C,KAAK,MAAM,IAAI,IAAI,oBAAoB;QAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,CACP,KAAK,CAAC,GAAG,CAAC,+FAA+F,CAAC,CAC7G,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,CACP,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,qCAAqC,CAAC;QAChE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,2CAA2C,CAAC,CAC7E,CAAC;AACN,CAAC;AAED,MAAM,aAAa,GAA2C;IAC1D;QACI,KAAK,EAAE,iBAAiB;QACxB,OAAO,EAAE;YACL,6CAA6C;YAC7C,yDAAyD;SAC5D;KACJ;IACD;QACI,KAAK,EAAE,2BAA2B;QAClC,OAAO,EAAE;YACL,2DAA2D;YAC3D,mCAAmC;SACtC;KACJ;IACD;QACI,KAAK,EAAE,mBAAmB;QAC1B,OAAO,EAAE;YACL,0DAA0D;YAC1D,wCAAwC;SAC3C;KACJ;IACD;QACI,KAAK,EAAE,iBAAiB;QACxB,OAAO,EAAE;YACL,kDAAkD;YAClD,sDAAsD;SACzD;KACJ;IACD;QACI,KAAK,EAAE,WAAW;QAClB,OAAO,EAAE;YACL,yCAAyC;YACzC,yDAAyD;SAC5D;KACJ;CACJ,CAAC;AAEF,MAAM,UAAU,SAAS;IACrB,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,yCAAyC,CAAC,GAAG,IAAI,CAAC,CAAC;IAChG,OAAO,CAAC,GAAG,CACP,KAAK,CAAC,GAAG,CACL,uEAAuE;QACnE,yEAAyE;QACzE,sCAAsC,CAC7C,CACJ,CAAC;IAEF,KAAK,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,aAAa,EAAE,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC;QACrD,KAAK,MAAM,CAAC,IAAI,OAAO;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,CAAC,GAAG,CACP,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC;QAClC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,yCAAyC,CAAC;QAC/D,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,iCAAiC,CAAC,CAC9D,CAAC;IACF,OAAO,CAAC,GAAG,CACP,KAAK,CAAC,GAAG,CAAC,gCAAgC,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAC3E,CAAC;AACN,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { type Framework } from "./config.js";
2
+ export declare const VALID_ADD_TYPES: readonly ["skills"];
3
+ /**
4
+ * Returns the closest match from `candidates` within `maxDistance` Levenshtein
5
+ * edits, or null if no candidate is close enough. Used for "did you mean"
6
+ * hints on mistyped subcommand arguments.
7
+ */
8
+ export declare function findSimilar(input: string, candidates: readonly string[], maxDistance?: number): string | null;
9
+ export declare function collectOptionValues(value: string, previous: string[]): string[];
10
+ export declare function getFrameworkName(framework: Framework): string;
11
+ //# sourceMappingURL=cli-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-utils.d.ts","sourceRoot":"","sources":["../src/cli-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAEzD,eAAO,MAAM,eAAe,qBAAsB,CAAC;AAEnD;;;;GAIG;AACH,wBAAgB,WAAW,CACvB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,SAAS,MAAM,EAAE,EAC7B,WAAW,SAAI,GAChB,MAAM,GAAG,IAAI,CAyBf;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAG/E;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAG7D"}
@@ -0,0 +1,46 @@
1
+ import { FRAMEWORKS } from "./config.js";
2
+ export const VALID_ADD_TYPES = ["skills"];
3
+ /**
4
+ * Returns the closest match from `candidates` within `maxDistance` Levenshtein
5
+ * edits, or null if no candidate is close enough. Used for "did you mean"
6
+ * hints on mistyped subcommand arguments.
7
+ */
8
+ export function findSimilar(input, candidates, maxDistance = 2) {
9
+ const distance = (a, b) => {
10
+ const m = a.length;
11
+ const n = b.length;
12
+ const dp = Array.from({ length: m + 1 }, () => new Array(n + 1).fill(0));
13
+ for (let i = 0; i <= m; i++)
14
+ dp[i][0] = i;
15
+ for (let j = 0; j <= n; j++)
16
+ dp[0][j] = j;
17
+ for (let i = 1; i <= m; i++) {
18
+ for (let j = 1; j <= n; j++) {
19
+ if (a[i - 1] === b[j - 1])
20
+ dp[i][j] = dp[i - 1][j - 1];
21
+ else
22
+ dp[i][j] = 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);
23
+ }
24
+ }
25
+ return dp[m][n];
26
+ };
27
+ let best = null;
28
+ let bestDist = Infinity;
29
+ for (const c of candidates) {
30
+ const d = distance(input.toLowerCase(), c.toLowerCase());
31
+ if (d < bestDist) {
32
+ bestDist = d;
33
+ best = c;
34
+ }
35
+ }
36
+ return bestDist <= maxDistance ? best : null;
37
+ }
38
+ export function collectOptionValues(value, previous) {
39
+ previous.push(value);
40
+ return previous;
41
+ }
42
+ export function getFrameworkName(framework) {
43
+ const found = FRAMEWORKS.find((f) => f.value === framework);
44
+ return found?.name || framework;
45
+ }
46
+ //# sourceMappingURL=cli-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-utils.js","sourceRoot":"","sources":["../src/cli-utils.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;EASb,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC;AAE3D;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAY9D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,SAAS,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,GAAG,KAAK,CAAA;CAAE,CAYpG"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;EASb,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC;AAE3D;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAe9D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,SAAS,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,GAAG,KAAK,CAAA;CAAE,CAepG"}
package/dist/config.js CHANGED
@@ -25,7 +25,10 @@ export function getSkillsBasePath(framework) {
25
25
  case "gemini-cli": return ".gemini/skills/cashfree-skills";
26
26
  case "codex": return ".agents/skills/cashfree-skills";
27
27
  case "antigravity": return ".agent/skills/cashfree-skills";
28
- default: return ".agent/skills/cashfree-skills";
28
+ default: {
29
+ const _exhaustive = framework;
30
+ throw new Error(`Unknown framework: ${_exhaustive}`);
31
+ }
29
32
  }
30
33
  }
31
34
  /**
@@ -42,7 +45,10 @@ export function getManifestConfig(framework) {
42
45
  case "gemini-cli": return { path: "GEMINI.md", format: "markdown" };
43
46
  case "codex": return { path: "AGENTS.md", format: "markdown" };
44
47
  case "antigravity": return { path: "AGENTS.md", format: "markdown" };
45
- default: return { path: "AGENTS.md", format: "markdown" };
48
+ default: {
49
+ const _exhaustive = framework;
50
+ throw new Error(`Unknown framework: ${_exhaustive}`);
51
+ }
46
52
  }
47
53
  }
48
54
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACtB,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;IACnC,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE;IAC7C,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;IACjC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;IACvC,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,gBAAgB,EAAE;IACpD,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE;IAC3C,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE;IAC7C,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,aAAa,EAAE;CAC9C,CAAC;AAIX;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAoB;IAClD,QAAQ,SAAS,EAAE,CAAC;QAChB,KAAK,aAAa,CAAC,CAAK,OAAO,gCAAgC,CAAC;QAChE,KAAK,QAAQ,CAAC,CAAU,OAAO,yBAAyB,CAAC;QACzD,KAAK,UAAU,CAAC,CAAQ,OAAO,kCAAkC,CAAC;QAClE,KAAK,gBAAgB,CAAC,CAAE,OAAO,gCAAgC,CAAC;QAChE,KAAK,aAAa,CAAC,CAAK,OAAO,gCAAgC,CAAC;QAChE,KAAK,YAAY,CAAC,CAAM,OAAO,gCAAgC,CAAC;QAChE,KAAK,OAAO,CAAC,CAAW,OAAO,gCAAgC,CAAC;QAChE,KAAK,aAAa,CAAC,CAAK,OAAO,+BAA+B,CAAC;QAC/D,OAAO,CAAC,CAAgB,OAAO,+BAA+B,CAAC;IACnE,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAoB;IAClD,QAAQ,SAAS,EAAE,CAAC;QAChB,KAAK,aAAa,CAAC,CAAK,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QACzE,KAAK,QAAQ,CAAC,CAAU,OAAO,EAAE,IAAI,EAAE,4BAA4B,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QACrF,KAAK,UAAU,CAAC,CAAQ,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QACzE,KAAK,gBAAgB,CAAC,CAAE,OAAO,EAAE,IAAI,EAAE,iCAAiC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QAC/F,KAAK,aAAa,CAAC,CAAK,OAAO,EAAE,IAAI,EAAE,iCAAiC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QAC/F,KAAK,YAAY,CAAC,CAAM,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QACzE,KAAK,OAAO,CAAC,CAAW,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QACzE,KAAK,aAAa,CAAC,CAAK,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QACzE,OAAO,CAAC,CAAgB,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IAC7E,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACtB,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;IACnC,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE;IAC7C,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;IACjC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;IACvC,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,gBAAgB,EAAE;IACpD,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE;IAC3C,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE;IAC7C,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,aAAa,EAAE;CAC9C,CAAC;AAIX;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAoB;IAClD,QAAQ,SAAS,EAAE,CAAC;QAChB,KAAK,aAAa,CAAC,CAAK,OAAO,gCAAgC,CAAC;QAChE,KAAK,QAAQ,CAAC,CAAU,OAAO,yBAAyB,CAAC;QACzD,KAAK,UAAU,CAAC,CAAQ,OAAO,kCAAkC,CAAC;QAClE,KAAK,gBAAgB,CAAC,CAAE,OAAO,gCAAgC,CAAC;QAChE,KAAK,aAAa,CAAC,CAAK,OAAO,gCAAgC,CAAC;QAChE,KAAK,YAAY,CAAC,CAAM,OAAO,gCAAgC,CAAC;QAChE,KAAK,OAAO,CAAC,CAAW,OAAO,gCAAgC,CAAC;QAChE,KAAK,aAAa,CAAC,CAAK,OAAO,+BAA+B,CAAC;QAC/D,OAAO,CAAC,CAAC,CAAC;YACN,MAAM,WAAW,GAAU,SAAS,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,sBAAsB,WAAW,EAAE,CAAC,CAAC;QACzD,CAAC;IACL,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAoB;IAClD,QAAQ,SAAS,EAAE,CAAC;QAChB,KAAK,aAAa,CAAC,CAAK,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QACzE,KAAK,QAAQ,CAAC,CAAU,OAAO,EAAE,IAAI,EAAE,4BAA4B,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QACrF,KAAK,UAAU,CAAC,CAAQ,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QACzE,KAAK,gBAAgB,CAAC,CAAE,OAAO,EAAE,IAAI,EAAE,iCAAiC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QAC/F,KAAK,aAAa,CAAC,CAAK,OAAO,EAAE,IAAI,EAAE,iCAAiC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QAC/F,KAAK,YAAY,CAAC,CAAM,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QACzE,KAAK,OAAO,CAAC,CAAW,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QACzE,KAAK,aAAa,CAAC,CAAK,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QACzE,OAAO,CAAC,CAAC,CAAC;YACN,MAAM,WAAW,GAAU,SAAS,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,sBAAsB,WAAW,EAAE,CAAC,CAAC;QACzD,CAAC;IACL,CAAC;AACL,CAAC"}
@@ -11,11 +11,42 @@ export declare function writeTextFile(filePath: string, content: string, overwri
11
11
  export declare function logCreated(file: string): void;
12
12
  export declare function logUpdated(file: string): void;
13
13
  export declare function logSkipped(file: string): void;
14
+ /**
15
+ * Fetches the latest published version from the npm registry.
16
+ * Returns null on network/parse errors or non-2xx responses so callers
17
+ * can gracefully fall back to the locally bundled version.
18
+ */
19
+ export declare function fetchLatestPublishedVersion(): Promise<string | null>;
20
+ /**
21
+ * Compares two semver-ish strings. Returns:
22
+ * -1 if a < b, 0 if equal, 1 if a > b.
23
+ * Falls back to string compare for non-numeric segments.
24
+ */
25
+ export declare function compareVersions(a: string, b: string): number;
26
+ /**
27
+ * Injects (or updates) a `cashfree-skills-version: <v>` line inside the
28
+ * leading YAML frontmatter of a skill template. If the template lacks
29
+ * frontmatter, the version is prepended as one.
30
+ */
31
+ export declare function injectVersionMarker(content: string, version: string): string;
32
+ /**
33
+ * Reads the embedded skill version from a skill file's frontmatter.
34
+ * Returns null if the file doesn't exist or has no version marker.
35
+ */
36
+ export declare function readInstalledSkillVersion(filePath: string): Promise<string | null>;
14
37
  /**
15
38
  * Creates a skill file at {projectPath}/{skillsBasePath}/{skillDir}/{fileName}
16
- * fileName defaults to 'SKILL.md'
39
+ * fileName defaults to 'SKILL.md'. Embeds the CLI version as a marker so
40
+ * subsequent runs can detect outdated installs.
41
+ */
42
+ export declare function createSkillFile(projectPath: string, skillsBasePath: string, skillDir: string, getTemplate: () => string, fileName?: string, version?: string, overwrite?: boolean): Promise<void>;
43
+ /**
44
+ * Ensures the given path is listed in the project's .gitignore.
45
+ * - Creates .gitignore if it doesn't exist.
46
+ * - Appends the entry if missing; preserves all existing content otherwise.
47
+ * - Idempotent: skips if the exact entry is already present.
17
48
  */
18
- export declare function createSkillFile(projectPath: string, skillsBasePath: string, skillDir: string, getTemplate: () => string, fileName?: string): Promise<void>;
49
+ export declare function ensureGitignoreEntry(projectPath: string, entry: string): Promise<void>;
19
50
  /**
20
51
  * Creates or appends the Cashfree manifest to the framework's manifest file.
21
52
  * If the file already contains Cashfree config, it skips.
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/generators/utils.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9D;AAED,wBAAsB,aAAa,CAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,SAAS,UAAQ,GAClB,OAAO,CAAC,OAAO,CAAC,CAOlB;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACjC,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,MAAM,EACzB,QAAQ,SAAa,GACtB,OAAO,CAAC,IAAI,CAAC,CAaf;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACpC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAqBf"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/generators/utils.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9D;AAED,wBAAsB,aAAa,CAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,SAAS,UAAQ,GAClB,OAAO,CAAC,OAAO,CAAC,CAOlB;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE7C;AAMD;;;;GAIG;AACH,wBAAsB,2BAA2B,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAY1E;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAc5D;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAW5E;AAED;;;GAGG;AACH,wBAAsB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAKxF;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACjC,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,MAAM,EACzB,QAAQ,SAAa,EACrB,OAAO,CAAC,EAAE,MAAM,EAChB,SAAS,UAAQ,GAClB,OAAO,CAAC,IAAI,CAAC,CAiBf;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACtC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CA0Bf;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACpC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAqBf"}
@@ -23,23 +23,130 @@ export function logUpdated(file) {
23
23
  export function logSkipped(file) {
24
24
  console.log(chalk.dim(` Skipped ${file} (already exists)`));
25
25
  }
26
+ const VERSION_KEY = 'cashfree-skills-version';
27
+ const NPM_REGISTRY_URL = 'https://registry.npmjs.org/@cashfreepayments/agent-skills/latest';
28
+ /**
29
+ * Fetches the latest published version from the npm registry.
30
+ * Returns null on network/parse errors or non-2xx responses so callers
31
+ * can gracefully fall back to the locally bundled version.
32
+ */
33
+ export async function fetchLatestPublishedVersion() {
34
+ try {
35
+ const res = await fetch(NPM_REGISTRY_URL, {
36
+ signal: AbortSignal.timeout(2500),
37
+ headers: { accept: 'application/json' },
38
+ });
39
+ if (!res.ok)
40
+ return null;
41
+ const json = (await res.json());
42
+ return json.version ?? null;
43
+ }
44
+ catch {
45
+ return null;
46
+ }
47
+ }
48
+ /**
49
+ * Compares two semver-ish strings. Returns:
50
+ * -1 if a < b, 0 if equal, 1 if a > b.
51
+ * Falls back to string compare for non-numeric segments.
52
+ */
53
+ export function compareVersions(a, b) {
54
+ const pa = a.split('.').map((s) => parseInt(s, 10));
55
+ const pb = b.split('.').map((s) => parseInt(s, 10));
56
+ const len = Math.max(pa.length, pb.length);
57
+ for (let i = 0; i < len; i++) {
58
+ const x = pa[i] ?? 0;
59
+ const y = pb[i] ?? 0;
60
+ if (Number.isNaN(x) || Number.isNaN(y)) {
61
+ if (a === b)
62
+ return 0;
63
+ return a < b ? -1 : 1;
64
+ }
65
+ if (x !== y)
66
+ return x < y ? -1 : 1;
67
+ }
68
+ return 0;
69
+ }
70
+ /**
71
+ * Injects (or updates) a `cashfree-skills-version: <v>` line inside the
72
+ * leading YAML frontmatter of a skill template. If the template lacks
73
+ * frontmatter, the version is prepended as one.
74
+ */
75
+ export function injectVersionMarker(content, version) {
76
+ const fmMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
77
+ if (!fmMatch) {
78
+ return `---\n${VERSION_KEY}: ${version}\n---\n\n${content}`;
79
+ }
80
+ const fm = fmMatch[1];
81
+ const re = new RegExp(`^${VERSION_KEY}:.*$`, 'm');
82
+ const updatedFm = re.test(fm)
83
+ ? fm.replace(re, `${VERSION_KEY}: ${version}`)
84
+ : `${fm}\n${VERSION_KEY}: ${version}`;
85
+ return content.replace(fmMatch[0], `---\n${updatedFm}\n---`);
86
+ }
87
+ /**
88
+ * Reads the embedded skill version from a skill file's frontmatter.
89
+ * Returns null if the file doesn't exist or has no version marker.
90
+ */
91
+ export async function readInstalledSkillVersion(filePath) {
92
+ if (!(await fs.pathExists(filePath)))
93
+ return null;
94
+ const raw = await fs.readFile(filePath, 'utf8');
95
+ const m = raw.match(new RegExp(`^${VERSION_KEY}:\\s*(\\S+)`, 'm'));
96
+ return m ? m[1] : null;
97
+ }
26
98
  /**
27
99
  * Creates a skill file at {projectPath}/{skillsBasePath}/{skillDir}/{fileName}
28
- * fileName defaults to 'SKILL.md'
100
+ * fileName defaults to 'SKILL.md'. Embeds the CLI version as a marker so
101
+ * subsequent runs can detect outdated installs.
29
102
  */
30
- export async function createSkillFile(projectPath, skillsBasePath, skillDir, getTemplate, fileName = 'SKILL.md') {
103
+ export async function createSkillFile(projectPath, skillsBasePath, skillDir, getTemplate, fileName = 'SKILL.md', version, overwrite = false) {
31
104
  const path = await import('path');
32
105
  const skillPath = path.join(projectPath, skillsBasePath, skillDir, fileName);
33
106
  const relativePath = path.join(skillsBasePath, skillDir, fileName);
34
107
  await ensureDir(path.dirname(skillPath));
35
- const created = await writeTextFile(skillPath, getTemplate());
108
+ const rendered = version ? injectVersionMarker(getTemplate(), version) : getTemplate();
109
+ const existed = await fs.pathExists(skillPath);
110
+ const created = await writeTextFile(skillPath, rendered, overwrite);
36
111
  if (created) {
37
112
  logCreated(relativePath);
38
113
  }
114
+ else if (existed && overwrite) {
115
+ logUpdated(relativePath);
116
+ }
39
117
  else {
40
118
  logSkipped(relativePath);
41
119
  }
42
120
  }
121
+ /**
122
+ * Ensures the given path is listed in the project's .gitignore.
123
+ * - Creates .gitignore if it doesn't exist.
124
+ * - Appends the entry if missing; preserves all existing content otherwise.
125
+ * - Idempotent: skips if the exact entry is already present.
126
+ */
127
+ export async function ensureGitignoreEntry(projectPath, entry) {
128
+ const path = await import('path');
129
+ const gitignorePath = path.join(projectPath, '.gitignore');
130
+ const normalized = entry.replace(/^\/+/, '').replace(/\/+$/, '') + '/';
131
+ const exists = await fs.pathExists(gitignorePath);
132
+ if (!exists) {
133
+ await fs.writeFile(gitignorePath, normalized + '\n');
134
+ return;
135
+ }
136
+ const existing = await fs.readFile(gitignorePath, 'utf8');
137
+ const lines = existing.split(/\r?\n/).map((l) => l.trim());
138
+ const candidates = new Set([
139
+ normalized,
140
+ normalized.replace(/\/$/, ''),
141
+ '/' + normalized,
142
+ '/' + normalized.replace(/\/$/, ''),
143
+ ]);
144
+ if (lines.some((l) => candidates.has(l))) {
145
+ return;
146
+ }
147
+ const needsLeadingNewline = existing.length > 0 && !existing.endsWith('\n');
148
+ await fs.appendFile(gitignorePath, (needsLeadingNewline ? '\n' : '') + normalized + '\n');
149
+ }
43
150
  /**
44
151
  * Creates or appends the Cashfree manifest to the framework's manifest file.
45
152
  * If the file already contains Cashfree config, it skips.
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/generators/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/generators/utils.ts"],"names":[],"mappings":"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"}