@sentroy-co/client-sdk 2.13.9 → 2.14.0
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.
- package/README.md +24 -5
- package/dist/cli/ai.d.ts +35 -0
- package/dist/cli/ai.d.ts.map +1 -0
- package/dist/cli/ai.js +399 -0
- package/dist/cli/ai.js.map +1 -0
- package/dist/cli/args.d.ts +62 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +199 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/env.d.ts.map +1 -1
- package/dist/cli/env.js +8 -2
- package/dist/cli/env.js.map +1 -1
- package/dist/cli/format.d.ts +37 -0
- package/dist/cli/format.d.ts.map +1 -0
- package/dist/cli/format.js +129 -0
- package/dist/cli/format.js.map +1 -0
- package/dist/cli/index.d.ts +8 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +128 -25
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/mail.d.ts +25 -0
- package/dist/cli/mail.d.ts.map +1 -0
- package/dist/cli/mail.js +253 -0
- package/dist/cli/mail.js.map +1 -0
- package/dist/cli/storage.d.ts +28 -0
- package/dist/cli/storage.d.ts.map +1 -0
- package/dist/cli/storage.js +189 -0
- package/dist/cli/storage.js.map +1 -0
- package/package.json +4 -2
- package/skill/SKILL.md +542 -0
- package/src/cli/ai.ts +440 -0
- package/src/cli/args.ts +225 -0
- package/src/cli/env.ts +10 -2
- package/src/cli/format.ts +147 -0
- package/src/cli/index.ts +147 -25
- package/src/cli/mail.ts +363 -0
- package/src/cli/storage.ts +307 -0
package/README.md
CHANGED
|
@@ -179,17 +179,36 @@ Configure the receiver URL in the vault dashboard under the project's **Webhooks
|
|
|
179
179
|
|
|
180
180
|
### CLI
|
|
181
181
|
|
|
182
|
-
The package ships a `sentroy` CLI
|
|
182
|
+
The package ships a `sentroy` CLI with four command groups: `env`, `mail`, `storage`, `ai`. Full reference at [docs.sentroy.com/cli](https://docs.sentroy.com/cli).
|
|
183
183
|
|
|
184
184
|
```bash
|
|
185
|
-
#
|
|
185
|
+
# Env Vault sync (SENTROY_ENV_API_KEY)
|
|
186
186
|
npx sentroy env push .env.production --delete-missing
|
|
187
|
-
npx sentroy env diff .env.production
|
|
188
187
|
npx sentroy env pull .env.staging --force
|
|
189
|
-
|
|
188
|
+
|
|
189
|
+
# Mail / Storage queries (SENTROY_API_KEY + SENTROY_COMPANY_SLUG)
|
|
190
|
+
npx sentroy mail templates list
|
|
191
|
+
npx sentroy mail logs list --status=bounced --days=7
|
|
192
|
+
npx sentroy storage buckets list
|
|
193
|
+
npx sentroy storage media list <bucket-slug> --type=image
|
|
194
|
+
npx sentroy mail templates list --output=json | jq '.[].name'
|
|
195
|
+
|
|
196
|
+
# Install the Sentroy AI Skill into your project (Claude, Cursor, Windsurf,
|
|
197
|
+
# AGENTS.md). Lets AI agents use Sentroy without trial-and-error.
|
|
198
|
+
npx sentroy ai install
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
The vault token's (project, environment) scope is implicit. Mail/storage commands need `SENTROY_API_KEY` (`stk_<48-hex>`) plus a company slug (env var or `--company-slug`). Every list/get supports `--output=json` for scripting. Full command list and recipes: [docs.sentroy.com/cli](https://docs.sentroy.com/cli).
|
|
202
|
+
|
|
203
|
+
### AI Skill
|
|
204
|
+
|
|
205
|
+
Sentroy ships a canonical [`SKILL.md`](https://docs.sentroy.com/skill.md) (Anthropic Skills format) so AI coding agents (Claude Code, Cursor, Windsurf, OpenAI Codex via AGENTS.md) understand the auth model, endpoints, and gotchas without trial-and-error.
|
|
206
|
+
|
|
207
|
+
```bash
|
|
208
|
+
npx sentroy ai install # autodetects target tools and installs everywhere
|
|
190
209
|
```
|
|
191
210
|
|
|
192
|
-
|
|
211
|
+
Targets: `.claude/skills/sentroy/SKILL.md`, `.cursor/rules/sentroy.mdc`, `.windsurfrules`, and `AGENTS.md` (sentinel-block merged). See [docs.sentroy.com/ai-skills](https://docs.sentroy.com/ai-skills) for the full install guide.
|
|
193
212
|
|
|
194
213
|
## Self-hosted vs hosted
|
|
195
214
|
|
package/dist/cli/ai.d.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `sentroy ai install` — install the Sentroy SDK skill into AI coding
|
|
3
|
+
* assistants (Claude Code, Cursor, Windsurf) and/or a universal
|
|
4
|
+
* AGENTS.md file at the project root.
|
|
5
|
+
*
|
|
6
|
+
* Detection rules (autodetect mode, no explicit target flags):
|
|
7
|
+
* - `.claude/` dir OR `CLAUDE.md` file present → install Claude target
|
|
8
|
+
* - `.cursor/` dir present → install Cursor target
|
|
9
|
+
* - `.windsurfrules` file present → install Windsurf target
|
|
10
|
+
* - none of the above → fall back to AGENTS.md
|
|
11
|
+
*
|
|
12
|
+
* Explicit flags override detection:
|
|
13
|
+
* --claude / --cursor / --windsurf / --agents → install only those
|
|
14
|
+
* --all → install every target
|
|
15
|
+
* --no-agents → suppress AGENTS.md fallback
|
|
16
|
+
*
|
|
17
|
+
* Re-install / upgrade:
|
|
18
|
+
* Each merge-capable target wraps its body in a versioned sentinel block
|
|
19
|
+
* so future installs can find and replace it in-place. --upgrade refuses
|
|
20
|
+
* to write when the installed version already matches the bundled one.
|
|
21
|
+
*
|
|
22
|
+
* Dry-run:
|
|
23
|
+
* --check prints the plan (created / updated / unchanged / skipped) and
|
|
24
|
+
* exits without touching the filesystem.
|
|
25
|
+
*
|
|
26
|
+
* Source override:
|
|
27
|
+
* --source <path> loads SKILL.md from a local file instead of the
|
|
28
|
+
* bundled `<package>/skill/SKILL.md` shipped with the npm package.
|
|
29
|
+
*/
|
|
30
|
+
declare function cmdInstall(args: string[]): Promise<void>;
|
|
31
|
+
export declare const AI_HANDLERS: {
|
|
32
|
+
install: typeof cmdInstall;
|
|
33
|
+
};
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=ai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../src/cli/ai.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AA0UH,iBAAe,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAiEvD;AAcD,eAAO,MAAM,WAAW;;CAEvB,CAAA"}
|
package/dist/cli/ai.js
ADDED
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `sentroy ai install` — install the Sentroy SDK skill into AI coding
|
|
4
|
+
* assistants (Claude Code, Cursor, Windsurf) and/or a universal
|
|
5
|
+
* AGENTS.md file at the project root.
|
|
6
|
+
*
|
|
7
|
+
* Detection rules (autodetect mode, no explicit target flags):
|
|
8
|
+
* - `.claude/` dir OR `CLAUDE.md` file present → install Claude target
|
|
9
|
+
* - `.cursor/` dir present → install Cursor target
|
|
10
|
+
* - `.windsurfrules` file present → install Windsurf target
|
|
11
|
+
* - none of the above → fall back to AGENTS.md
|
|
12
|
+
*
|
|
13
|
+
* Explicit flags override detection:
|
|
14
|
+
* --claude / --cursor / --windsurf / --agents → install only those
|
|
15
|
+
* --all → install every target
|
|
16
|
+
* --no-agents → suppress AGENTS.md fallback
|
|
17
|
+
*
|
|
18
|
+
* Re-install / upgrade:
|
|
19
|
+
* Each merge-capable target wraps its body in a versioned sentinel block
|
|
20
|
+
* so future installs can find and replace it in-place. --upgrade refuses
|
|
21
|
+
* to write when the installed version already matches the bundled one.
|
|
22
|
+
*
|
|
23
|
+
* Dry-run:
|
|
24
|
+
* --check prints the plan (created / updated / unchanged / skipped) and
|
|
25
|
+
* exits without touching the filesystem.
|
|
26
|
+
*
|
|
27
|
+
* Source override:
|
|
28
|
+
* --source <path> loads SKILL.md from a local file instead of the
|
|
29
|
+
* bundled `<package>/skill/SKILL.md` shipped with the npm package.
|
|
30
|
+
*/
|
|
31
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
32
|
+
if (k2 === undefined) k2 = k;
|
|
33
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
34
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
35
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
36
|
+
}
|
|
37
|
+
Object.defineProperty(o, k2, desc);
|
|
38
|
+
}) : (function(o, m, k, k2) {
|
|
39
|
+
if (k2 === undefined) k2 = k;
|
|
40
|
+
o[k2] = m[k];
|
|
41
|
+
}));
|
|
42
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
43
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
44
|
+
}) : function(o, v) {
|
|
45
|
+
o["default"] = v;
|
|
46
|
+
});
|
|
47
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
48
|
+
var ownKeys = function(o) {
|
|
49
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
50
|
+
var ar = [];
|
|
51
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
52
|
+
return ar;
|
|
53
|
+
};
|
|
54
|
+
return ownKeys(o);
|
|
55
|
+
};
|
|
56
|
+
return function (mod) {
|
|
57
|
+
if (mod && mod.__esModule) return mod;
|
|
58
|
+
var result = {};
|
|
59
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
60
|
+
__setModuleDefault(result, mod);
|
|
61
|
+
return result;
|
|
62
|
+
};
|
|
63
|
+
})();
|
|
64
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
65
|
+
exports.AI_HANDLERS = void 0;
|
|
66
|
+
const fs = __importStar(require("fs"));
|
|
67
|
+
const path = __importStar(require("path"));
|
|
68
|
+
const args_1 = require("./args");
|
|
69
|
+
// ── Constants ────────────────────────────────────────────────────────────
|
|
70
|
+
const SENTINEL_BEGIN = "<!-- sentroy-skill-begin";
|
|
71
|
+
const SENTINEL_END = "<!-- sentroy-skill-end -->";
|
|
72
|
+
// ── Bundled skill loader ─────────────────────────────────────────────────
|
|
73
|
+
/**
|
|
74
|
+
* Load the canonical SKILL.md. By default reads from the package's
|
|
75
|
+
* `skill/SKILL.md` (sibling of `dist/`). With --source, reads any
|
|
76
|
+
* local file the caller points at.
|
|
77
|
+
*
|
|
78
|
+
* Version resolution priority:
|
|
79
|
+
* 1. `version:` field in YAML frontmatter (preferred — single source of truth)
|
|
80
|
+
* 2. footer comment `<!-- skill-version: x.y.z -->`
|
|
81
|
+
* 3. package.json version of the SDK (fallback — always present)
|
|
82
|
+
*/
|
|
83
|
+
function readBundledSkill(sourceFlag) {
|
|
84
|
+
const resolved = sourceFlag
|
|
85
|
+
? path.resolve(process.cwd(), sourceFlag)
|
|
86
|
+
: path.join(__dirname, "..", "..", "skill", "SKILL.md");
|
|
87
|
+
if (!fs.existsSync(resolved)) {
|
|
88
|
+
(0, args_1.fail)(sourceFlag
|
|
89
|
+
? `--source path not found: ${resolved}`
|
|
90
|
+
: `bundled SKILL.md missing at ${resolved}. Reinstall @sentroy-co/client-sdk.`);
|
|
91
|
+
}
|
|
92
|
+
const raw = fs.readFileSync(resolved, "utf8");
|
|
93
|
+
const version = parseSkillVersion(raw) ?? readPackageVersion();
|
|
94
|
+
return { raw, version };
|
|
95
|
+
}
|
|
96
|
+
function parseSkillVersion(raw) {
|
|
97
|
+
// Try frontmatter first.
|
|
98
|
+
const fm = extractFrontmatter(raw);
|
|
99
|
+
if (fm) {
|
|
100
|
+
const m = fm.match(/^\s*version\s*:\s*['"]?([^'"\n]+)['"]?\s*$/m);
|
|
101
|
+
if (m)
|
|
102
|
+
return m[1].trim();
|
|
103
|
+
}
|
|
104
|
+
// Fallback: footer/anywhere comment.
|
|
105
|
+
const c2 = raw.match(/<!--\s*skill-version:\s*([^\s>]+)\s*-->/i);
|
|
106
|
+
if (c2)
|
|
107
|
+
return c2[1].trim();
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
function readPackageVersion() {
|
|
111
|
+
try {
|
|
112
|
+
// From dist/cli/ai.js → ../../package.json. From src during tests too.
|
|
113
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
114
|
+
const pkg = require(path.join(__dirname, "..", "..", "package.json"));
|
|
115
|
+
return pkg.version;
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return "0.0.0";
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// ── Frontmatter helpers ──────────────────────────────────────────────────
|
|
122
|
+
function extractFrontmatter(raw) {
|
|
123
|
+
if (!raw.startsWith("---"))
|
|
124
|
+
return null;
|
|
125
|
+
// Match a leading `---\n...\n---` block. Use a non-greedy capture.
|
|
126
|
+
const m = raw.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?/);
|
|
127
|
+
return m ? m[1] : null;
|
|
128
|
+
}
|
|
129
|
+
function stripFrontmatter(raw) {
|
|
130
|
+
if (!raw.startsWith("---"))
|
|
131
|
+
return raw;
|
|
132
|
+
const m = raw.match(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/);
|
|
133
|
+
if (!m)
|
|
134
|
+
return raw;
|
|
135
|
+
return raw.slice(m[0].length).replace(/^\r?\n+/, "");
|
|
136
|
+
}
|
|
137
|
+
// ── Sentinel block helpers (load-bearing for re-installs) ────────────────
|
|
138
|
+
function makeSentinelBlock(body, version) {
|
|
139
|
+
const header = `${SENTINEL_BEGIN} v${version} -->`;
|
|
140
|
+
// Always terminate with a single trailing newline so concatenation in
|
|
141
|
+
// merged files stays tidy across re-installs.
|
|
142
|
+
return `${header}\n${body.trimEnd()}\n${SENTINEL_END}\n`;
|
|
143
|
+
}
|
|
144
|
+
function findSentinelBlock(contents) {
|
|
145
|
+
const beginRe = /<!--\s*sentroy-skill-begin(?:\s+v([^\s>]+))?\s*-->/;
|
|
146
|
+
const beginMatch = beginRe.exec(contents);
|
|
147
|
+
if (!beginMatch)
|
|
148
|
+
return null;
|
|
149
|
+
const start = beginMatch.index;
|
|
150
|
+
const endIdx = contents.indexOf(SENTINEL_END, start);
|
|
151
|
+
if (endIdx < 0)
|
|
152
|
+
return null;
|
|
153
|
+
const end = endIdx + SENTINEL_END.length;
|
|
154
|
+
return { start, end, version: beginMatch[1] ?? null };
|
|
155
|
+
}
|
|
156
|
+
function getInstalledVersion(filePath) {
|
|
157
|
+
if (!fs.existsSync(filePath))
|
|
158
|
+
return null;
|
|
159
|
+
const raw = fs.readFileSync(filePath, "utf8");
|
|
160
|
+
const block = findSentinelBlock(raw);
|
|
161
|
+
return block?.version ?? null;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Append-or-replace a sentinel-wrapped block in a merge-capable file.
|
|
165
|
+
* Creates the file (and parent dirs) when missing.
|
|
166
|
+
*
|
|
167
|
+
* Returns:
|
|
168
|
+
* "created" — file did not exist before
|
|
169
|
+
* "updated" — block existed but body/version differed
|
|
170
|
+
* "unchanged" — block existed and content matched exactly
|
|
171
|
+
*/
|
|
172
|
+
function writeSentinelBlock(filePath, body, version, opts) {
|
|
173
|
+
const block = makeSentinelBlock(body, version);
|
|
174
|
+
const exists = fs.existsSync(filePath);
|
|
175
|
+
if (!exists) {
|
|
176
|
+
if (opts.check)
|
|
177
|
+
return { status: "created", path: filePath };
|
|
178
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
179
|
+
fs.writeFileSync(filePath, block, "utf8");
|
|
180
|
+
return { status: "created", path: filePath };
|
|
181
|
+
}
|
|
182
|
+
const current = fs.readFileSync(filePath, "utf8");
|
|
183
|
+
const found = findSentinelBlock(current);
|
|
184
|
+
let next;
|
|
185
|
+
if (found) {
|
|
186
|
+
const existingBlock = current.slice(found.start, found.end);
|
|
187
|
+
if (existingBlock.trimEnd() === block.trimEnd()) {
|
|
188
|
+
return { status: "unchanged", path: filePath };
|
|
189
|
+
}
|
|
190
|
+
if (opts.upgrade && found.version === version) {
|
|
191
|
+
// Same version but body drifted (manual edit?). Don't clobber unless
|
|
192
|
+
// explicitly asked via --all/non-upgrade install path.
|
|
193
|
+
return {
|
|
194
|
+
status: "unchanged",
|
|
195
|
+
path: filePath,
|
|
196
|
+
note: "version matches; pass --all to force overwrite",
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
next =
|
|
200
|
+
current.slice(0, found.start) +
|
|
201
|
+
block.trimEnd() +
|
|
202
|
+
"\n" +
|
|
203
|
+
current.slice(found.end).replace(/^\r?\n+/, "");
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
// Append at end with a separating blank line.
|
|
207
|
+
const sep = current.endsWith("\n") ? "\n" : "\n\n";
|
|
208
|
+
next = current + sep + block;
|
|
209
|
+
}
|
|
210
|
+
if (opts.check)
|
|
211
|
+
return { status: "updated", path: filePath };
|
|
212
|
+
fs.writeFileSync(filePath, next, "utf8");
|
|
213
|
+
return { status: "updated", path: filePath };
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Write a standalone file (Claude / Cursor targets) without sentinel.
|
|
217
|
+
* Compares bytes to detect unchanged. Always creates parent dirs.
|
|
218
|
+
*/
|
|
219
|
+
function writeStandalone(filePath, contents, opts) {
|
|
220
|
+
const exists = fs.existsSync(filePath);
|
|
221
|
+
if (exists) {
|
|
222
|
+
const current = fs.readFileSync(filePath, "utf8");
|
|
223
|
+
if (current === contents)
|
|
224
|
+
return { status: "unchanged", path: filePath };
|
|
225
|
+
if (opts.upgrade && opts.installedVersion === opts.nextVersion) {
|
|
226
|
+
return {
|
|
227
|
+
status: "unchanged",
|
|
228
|
+
path: filePath,
|
|
229
|
+
note: "version matches; pass --all to force overwrite",
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
if (opts.check) {
|
|
234
|
+
return { status: exists ? "updated" : "created", path: filePath };
|
|
235
|
+
}
|
|
236
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
237
|
+
fs.writeFileSync(filePath, contents, "utf8");
|
|
238
|
+
return { status: exists ? "updated" : "created", path: filePath };
|
|
239
|
+
}
|
|
240
|
+
function detectTargets(cwd, flags) {
|
|
241
|
+
if (flags.all)
|
|
242
|
+
return ["claude", "cursor", "windsurf", "agents"];
|
|
243
|
+
const explicit = [];
|
|
244
|
+
if (flags.claude)
|
|
245
|
+
explicit.push("claude");
|
|
246
|
+
if (flags.cursor)
|
|
247
|
+
explicit.push("cursor");
|
|
248
|
+
if (flags.windsurf)
|
|
249
|
+
explicit.push("windsurf");
|
|
250
|
+
if (flags.agents)
|
|
251
|
+
explicit.push("agents");
|
|
252
|
+
if (explicit.length > 0)
|
|
253
|
+
return explicit;
|
|
254
|
+
// Autodetect.
|
|
255
|
+
const detected = [];
|
|
256
|
+
if (fs.existsSync(path.join(cwd, ".claude")) ||
|
|
257
|
+
fs.existsSync(path.join(cwd, "CLAUDE.md"))) {
|
|
258
|
+
detected.push("claude");
|
|
259
|
+
}
|
|
260
|
+
if (fs.existsSync(path.join(cwd, ".cursor")))
|
|
261
|
+
detected.push("cursor");
|
|
262
|
+
if (fs.existsSync(path.join(cwd, ".windsurfrules")))
|
|
263
|
+
detected.push("windsurf");
|
|
264
|
+
if (detected.length === 0 && !flags.noAgents) {
|
|
265
|
+
detected.push("agents");
|
|
266
|
+
}
|
|
267
|
+
else if (!flags.noAgents && !detected.includes("agents")) {
|
|
268
|
+
// Also drop an AGENTS.md alongside detected tools so non-Claude/Cursor
|
|
269
|
+
// agents (Aider, Cline, Codex, …) still pick up the skill.
|
|
270
|
+
detected.push("agents");
|
|
271
|
+
}
|
|
272
|
+
return detected;
|
|
273
|
+
}
|
|
274
|
+
// ── Per-target installers ────────────────────────────────────────────────
|
|
275
|
+
function installClaude(cwd, skill, opts) {
|
|
276
|
+
// Claude SKILL spec requires the file as-is with frontmatter.
|
|
277
|
+
const target = path.join(cwd, ".claude", "skills", "sentroy", "SKILL.md");
|
|
278
|
+
const installed = parseSkillVersion(fs.existsSync(target) ? fs.readFileSync(target, "utf8") : "");
|
|
279
|
+
return writeStandalone(target, skill.raw, {
|
|
280
|
+
check: opts.check,
|
|
281
|
+
upgrade: opts.upgrade,
|
|
282
|
+
installedVersion: installed,
|
|
283
|
+
nextVersion: skill.version,
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
function installCursor(cwd, skill, opts) {
|
|
287
|
+
const target = path.join(cwd, ".cursor", "rules", "sentroy.mdc");
|
|
288
|
+
const body = stripFrontmatter(skill.raw);
|
|
289
|
+
const mdc = `---\n` +
|
|
290
|
+
`description: Sentroy SDK reference\n` +
|
|
291
|
+
`globs: "**/*"\n` +
|
|
292
|
+
`alwaysApply: false\n` +
|
|
293
|
+
`version: ${skill.version}\n` +
|
|
294
|
+
`---\n\n` +
|
|
295
|
+
body;
|
|
296
|
+
// Parse installed version from the .mdc frontmatter we wrote previously.
|
|
297
|
+
let installed = null;
|
|
298
|
+
if (fs.existsSync(target)) {
|
|
299
|
+
const fm = extractFrontmatter(fs.readFileSync(target, "utf8"));
|
|
300
|
+
if (fm) {
|
|
301
|
+
const m = fm.match(/^\s*version\s*:\s*['"]?([^'"\n]+)['"]?\s*$/m);
|
|
302
|
+
if (m)
|
|
303
|
+
installed = m[1].trim();
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
return writeStandalone(target, mdc, {
|
|
307
|
+
check: opts.check,
|
|
308
|
+
upgrade: opts.upgrade,
|
|
309
|
+
installedVersion: installed,
|
|
310
|
+
nextVersion: skill.version,
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
function installWindsurf(cwd, skill, opts) {
|
|
314
|
+
const target = path.join(cwd, ".windsurfrules");
|
|
315
|
+
const body = stripFrontmatter(skill.raw);
|
|
316
|
+
return writeSentinelBlock(target, body, skill.version, opts);
|
|
317
|
+
}
|
|
318
|
+
function installAgents(cwd, skill, opts) {
|
|
319
|
+
const target = path.join(cwd, "AGENTS.md");
|
|
320
|
+
// Keep frontmatter for AGENTS.md too — many tools (Codex, Cline) read it
|
|
321
|
+
// verbatim, and the YAML block is harmless markdown to those that don't.
|
|
322
|
+
const body = skill.raw;
|
|
323
|
+
return writeSentinelBlock(target, body, skill.version, opts);
|
|
324
|
+
}
|
|
325
|
+
// ── Main handler ─────────────────────────────────────────────────────────
|
|
326
|
+
async function cmdInstall(args) {
|
|
327
|
+
const { flags } = (0, args_1.parseFlags)(args);
|
|
328
|
+
const detectFlags = {
|
|
329
|
+
claude: flags.claude === true,
|
|
330
|
+
cursor: flags.cursor === true,
|
|
331
|
+
windsurf: flags.windsurf === true,
|
|
332
|
+
agents: flags.agents === true,
|
|
333
|
+
all: flags.all === true,
|
|
334
|
+
noAgents: flags["no-agents"] === true,
|
|
335
|
+
};
|
|
336
|
+
const check = flags.check === true;
|
|
337
|
+
const upgrade = flags.upgrade === true;
|
|
338
|
+
const sourceFlag = typeof flags.source === "string" ? flags.source : undefined;
|
|
339
|
+
const skill = readBundledSkill(sourceFlag);
|
|
340
|
+
const cwd = process.cwd();
|
|
341
|
+
const targets = detectTargets(cwd, detectFlags);
|
|
342
|
+
if (targets.length === 0) {
|
|
343
|
+
(0, args_1.fail)("no install targets resolved. Pass --claude/--cursor/--windsurf/--agents or --all.");
|
|
344
|
+
}
|
|
345
|
+
(0, args_1.info)(`Sentroy skill v${args_1.c.bold(skill.version)} ${check ? args_1.c.dim("(dry-run)") : ""}`.trim());
|
|
346
|
+
(0, args_1.info)(`source: ${args_1.c.dim(sourceFlag ?? "bundled (" + path.join(__dirname, "..", "..", "skill", "SKILL.md") + ")")}`);
|
|
347
|
+
(0, args_1.info)(`targets: ${args_1.c.cyan(targets.join(", "))}`);
|
|
348
|
+
process.stdout.write("\n");
|
|
349
|
+
const results = [];
|
|
350
|
+
for (const t of targets) {
|
|
351
|
+
try {
|
|
352
|
+
let r;
|
|
353
|
+
if (t === "claude")
|
|
354
|
+
r = installClaude(cwd, skill, { check, upgrade });
|
|
355
|
+
else if (t === "cursor")
|
|
356
|
+
r = installCursor(cwd, skill, { check, upgrade });
|
|
357
|
+
else if (t === "windsurf")
|
|
358
|
+
r = installWindsurf(cwd, skill, { check, upgrade });
|
|
359
|
+
else
|
|
360
|
+
r = installAgents(cwd, skill, { check, upgrade });
|
|
361
|
+
results.push(r);
|
|
362
|
+
printResult(t, r, check);
|
|
363
|
+
}
|
|
364
|
+
catch (err) {
|
|
365
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
366
|
+
(0, args_1.warn)(`${t}: ${msg}`);
|
|
367
|
+
results.push({ status: "skipped", path: "(error)", note: msg });
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
process.stdout.write("\n");
|
|
371
|
+
const created = results.filter((r) => r.status === "created").length;
|
|
372
|
+
const updated = results.filter((r) => r.status === "updated").length;
|
|
373
|
+
const unchanged = results.filter((r) => r.status === "unchanged").length;
|
|
374
|
+
const skipped = results.filter((r) => r.status === "skipped").length;
|
|
375
|
+
const verb = check ? "would" : "";
|
|
376
|
+
(0, args_1.ok)(`${verb ? verb + " " : ""}created: ${args_1.c.bold(String(created))} ` +
|
|
377
|
+
`${verb ? verb + " " : ""}updated: ${args_1.c.bold(String(updated))} ` +
|
|
378
|
+
`unchanged: ${args_1.c.bold(String(unchanged))} ` +
|
|
379
|
+
`skipped: ${args_1.c.bold(String(skipped))}`);
|
|
380
|
+
if (check)
|
|
381
|
+
(0, args_1.info)("dry-run — no files written. Re-run without --check to apply.");
|
|
382
|
+
}
|
|
383
|
+
function printResult(target, r, check) {
|
|
384
|
+
const verb = check ? "would " : "";
|
|
385
|
+
const rel = path.relative(process.cwd(), r.path) || r.path;
|
|
386
|
+
if (r.status === "created")
|
|
387
|
+
(0, args_1.ok)(`${target}: ${verb}create ${args_1.c.dim(rel)}`);
|
|
388
|
+
else if (r.status === "updated")
|
|
389
|
+
(0, args_1.ok)(`${target}: ${verb}update ${args_1.c.dim(rel)}`);
|
|
390
|
+
else if (r.status === "unchanged")
|
|
391
|
+
(0, args_1.info)(`${target}: unchanged ${args_1.c.dim(rel)}${r.note ? args_1.c.dim(" — " + r.note) : ""}`);
|
|
392
|
+
else
|
|
393
|
+
(0, args_1.warn)(`${target}: skipped ${r.note ? args_1.c.dim(r.note) : ""}`);
|
|
394
|
+
}
|
|
395
|
+
// ── Export ───────────────────────────────────────────────────────────────
|
|
396
|
+
exports.AI_HANDLERS = {
|
|
397
|
+
install: cmdInstall,
|
|
398
|
+
};
|
|
399
|
+
//# sourceMappingURL=ai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai.js","sourceRoot":"","sources":["../../src/cli/ai.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared CLI utilities — flag parser, ANSI helpers, auth resolver, HTTP
|
|
3
|
+
* client, fail/info/ok/warn loggers. Reused by every subcommand
|
|
4
|
+
* (env, mail, storage, ai).
|
|
5
|
+
*
|
|
6
|
+
* `env.ts` historically inlined these; new subcommands import them from
|
|
7
|
+
* here to stay DRY and to allow extending `VALUE_FLAGS` in one place.
|
|
8
|
+
*/
|
|
9
|
+
export interface ParsedArgs {
|
|
10
|
+
positional: string[];
|
|
11
|
+
flags: Record<string, string | boolean>;
|
|
12
|
+
}
|
|
13
|
+
export interface SharedOpts {
|
|
14
|
+
token: string;
|
|
15
|
+
baseUrl: string;
|
|
16
|
+
/** Company slug — mail/storage commands need it; env doesn't (token is
|
|
17
|
+
* vault-scoped). Resolved from --company-slug, $SENTROY_COMPANY_SLUG,
|
|
18
|
+
* or thrown error. */
|
|
19
|
+
companySlug?: string;
|
|
20
|
+
}
|
|
21
|
+
export declare const c: {
|
|
22
|
+
bold: (s: string) => string;
|
|
23
|
+
dim: (s: string) => string;
|
|
24
|
+
red: (s: string) => string;
|
|
25
|
+
green: (s: string) => string;
|
|
26
|
+
yellow: (s: string) => string;
|
|
27
|
+
cyan: (s: string) => string;
|
|
28
|
+
magenta: (s: string) => string;
|
|
29
|
+
};
|
|
30
|
+
export declare function fail(msg: string): never;
|
|
31
|
+
export declare function info(msg: string): void;
|
|
32
|
+
export declare function ok(msg: string): void;
|
|
33
|
+
export declare function warn(msg: string): void;
|
|
34
|
+
export declare function parseFlags(args: string[]): ParsedArgs;
|
|
35
|
+
/**
|
|
36
|
+
* Resolve shared opts for general (non-vault) Sentroy CLI commands.
|
|
37
|
+
*
|
|
38
|
+
* Token resolution priority:
|
|
39
|
+
* 1. --token=stk_... flag
|
|
40
|
+
* 2. SENTROY_API_KEY env var
|
|
41
|
+
* 3. SENTROY_ENV_API_KEY env var (back-compat — same token namespace works)
|
|
42
|
+
*
|
|
43
|
+
* Base URL priority:
|
|
44
|
+
* 1. --url=https://... flag
|
|
45
|
+
* 2. SENTROY_API_URL env var
|
|
46
|
+
* 3. SENTROY_ENV_API_URL env var
|
|
47
|
+
* 4. https://sentroy.com
|
|
48
|
+
*
|
|
49
|
+
* Company slug priority (REQUIRED for mail/storage):
|
|
50
|
+
* 1. --company-slug=<slug> flag
|
|
51
|
+
* 2. SENTROY_COMPANY_SLUG env var
|
|
52
|
+
*/
|
|
53
|
+
export declare function resolveSharedOpts(flags: Record<string, string | boolean>, opts?: {
|
|
54
|
+
requireCompanySlug?: boolean;
|
|
55
|
+
}): SharedOpts;
|
|
56
|
+
/**
|
|
57
|
+
* Thin fetch wrapper used by all subcommands that hit the Sentroy REST
|
|
58
|
+
* API. Strips trailing slashes from baseUrl, adds Bearer auth, unwraps
|
|
59
|
+
* `{success, data}` envelope, raises on non-2xx with a useful message.
|
|
60
|
+
*/
|
|
61
|
+
export declare function apiFetch<T = unknown>(shared: SharedOpts, path: string, init?: RequestInit): Promise<T>;
|
|
62
|
+
//# sourceMappingURL=args.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAA;CACxC;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf;;2BAEuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAaD,eAAO,MAAM,CAAC;cACF,MAAM;aACP,MAAM;aACN,MAAM;eACJ,MAAM;gBACL,MAAM;cACR,MAAM;iBACH,MAAM;CACpB,CAAA;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAGvC;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEtC;AAED,wBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEpC;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEtC;AAgCD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CA6BrD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,EACvC,IAAI,GAAE;IAAE,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC1C,UAAU,CA8BZ;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,CAAC,GAAG,OAAO,EACxC,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,CAAC,CAAC,CAwCZ"}
|