@snipl/cli 1.0.0-next.1

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 (42) hide show
  1. package/LICENSE +21 -0
  2. package/dist/src/commands/add.d.ts +10 -0
  3. package/dist/src/commands/add.d.ts.map +1 -0
  4. package/dist/src/commands/add.js +112 -0
  5. package/dist/src/commands/add.js.map +1 -0
  6. package/dist/src/commands/init.d.ts +11 -0
  7. package/dist/src/commands/init.d.ts.map +1 -0
  8. package/dist/src/commands/init.js +85 -0
  9. package/dist/src/commands/init.js.map +1 -0
  10. package/dist/src/commands/list.d.ts +6 -0
  11. package/dist/src/commands/list.d.ts.map +1 -0
  12. package/dist/src/commands/list.js +17 -0
  13. package/dist/src/commands/list.js.map +1 -0
  14. package/dist/src/commands/search.d.ts +7 -0
  15. package/dist/src/commands/search.d.ts.map +1 -0
  16. package/dist/src/commands/search.js +27 -0
  17. package/dist/src/commands/search.js.map +1 -0
  18. package/dist/src/commands/status.d.ts +17 -0
  19. package/dist/src/commands/status.d.ts.map +1 -0
  20. package/dist/src/commands/status.js +82 -0
  21. package/dist/src/commands/status.js.map +1 -0
  22. package/dist/src/commands/view.d.ts +7 -0
  23. package/dist/src/commands/view.d.ts.map +1 -0
  24. package/dist/src/commands/view.js +23 -0
  25. package/dist/src/commands/view.js.map +1 -0
  26. package/dist/src/exit-codes.d.ts +8 -0
  27. package/dist/src/exit-codes.d.ts.map +1 -0
  28. package/dist/src/exit-codes.js +8 -0
  29. package/dist/src/exit-codes.js.map +1 -0
  30. package/dist/src/index.d.ts +3 -0
  31. package/dist/src/index.d.ts.map +1 -0
  32. package/dist/src/index.js +168 -0
  33. package/dist/src/index.js.map +1 -0
  34. package/dist/src/renderers/human.d.ts +8 -0
  35. package/dist/src/renderers/human.d.ts.map +1 -0
  36. package/dist/src/renderers/human.js +72 -0
  37. package/dist/src/renderers/human.js.map +1 -0
  38. package/dist/src/renderers/json.d.ts +11 -0
  39. package/dist/src/renderers/json.d.ts.map +1 -0
  40. package/dist/src/renderers/json.js +9 -0
  41. package/dist/src/renderers/json.js.map +1 -0
  42. package/package.json +39 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Snippet CLI
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,10 @@
1
+ import type { RegistryResolver } from '@snipl/core';
2
+ export interface AddOptions {
3
+ cwd: string;
4
+ json: boolean;
5
+ yes: boolean;
6
+ dryRun: boolean;
7
+ overwrite: boolean;
8
+ }
9
+ export declare function addCommand(resolver: RegistryResolver, name: string, opts: AddOptions): Promise<number>;
10
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../../src/commands/add.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAYpD,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,OAAO,CAAC;IACd,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,gBAAgB,EAC1B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,MAAM,CAAC,CAoGjB"}
@@ -0,0 +1,112 @@
1
+ import { loadConfig, buildWritePlan, executeWritePlan, loadManifest, configExists, } from '@snipl/core';
2
+ import { ExitCode } from '../exit-codes.js';
3
+ import { printJson, printJsonError } from '../renderers/json.js';
4
+ import { printWritePlan, printWriteResult } from '../renderers/human.js';
5
+ export async function addCommand(resolver, name, opts) {
6
+ const item = resolver.getByName(name);
7
+ if (!item) {
8
+ const msg = `Item "${name}" not found.`;
9
+ if (opts.json) {
10
+ printJsonError('ITEM_NOT_FOUND', msg);
11
+ }
12
+ else {
13
+ process.stderr.write(` ${msg}\n`);
14
+ }
15
+ return ExitCode.INVALID_INPUT;
16
+ }
17
+ if (!configExists(opts.cwd)) {
18
+ const msg = `No snippets.json found in ${opts.cwd}. Run \`snipl init\` first.`;
19
+ if (opts.json) {
20
+ printJsonError('NO_CONFIG', msg);
21
+ }
22
+ else {
23
+ process.stderr.write(` ${msg}\n`);
24
+ }
25
+ return ExitCode.UNEXPECTED_ERROR;
26
+ }
27
+ const config = loadConfig(opts.cwd);
28
+ const outputDir = config.output;
29
+ const manifest = loadManifest(opts.cwd);
30
+ const existing = manifest.items.find((i) => i.name === item.name);
31
+ if (existing) {
32
+ const msg = `"${item.name}" is already installed. Run \`snipl status\` to check its state.`;
33
+ if (opts.json) {
34
+ printJsonError('ALREADY_INSTALLED', msg);
35
+ }
36
+ else {
37
+ process.stderr.write(` ${msg}\n`);
38
+ }
39
+ return ExitCode.INVALID_INPUT;
40
+ }
41
+ let plan;
42
+ try {
43
+ plan = buildWritePlan(item, opts.cwd, outputDir, { overwrite: opts.overwrite });
44
+ }
45
+ catch (err) {
46
+ const message = err instanceof Error ? err.message : String(err);
47
+ if (opts.json) {
48
+ printJsonError('PLAN_ERROR', message);
49
+ }
50
+ else {
51
+ process.stderr.write(` Error: ${message}\n`);
52
+ }
53
+ return ExitCode.INTEGRITY_FAILURE;
54
+ }
55
+ if (plan.collisions.length > 0 && !opts.overwrite) {
56
+ const msg = 'The following files already exist. Use --overwrite to replace them:\n' +
57
+ plan.collisions.join('\n');
58
+ if (opts.json) {
59
+ printJsonError('COLLISION', msg);
60
+ }
61
+ else {
62
+ process.stderr.write(` ${msg}\n`);
63
+ }
64
+ return ExitCode.INVALID_INPUT;
65
+ }
66
+ if (opts.json) {
67
+ if (opts.dryRun) {
68
+ printJson({ plan: plan.entries.map((e) => ({ type: e.type, targetPath: e.targetPath })) });
69
+ return ExitCode.SUCCESS;
70
+ }
71
+ const result = executeWritePlan(plan, manifest);
72
+ if (result.success) {
73
+ printJson({ installed: item.name, files: result.written });
74
+ }
75
+ else {
76
+ printJsonError('INSTALL_FAILED', `Written: ${result.written.length}, Failed: ${result.failed.length}`);
77
+ }
78
+ return result.success ? ExitCode.SUCCESS : ExitCode.UNEXPECTED_ERROR;
79
+ }
80
+ printWritePlan(plan, item);
81
+ if (opts.dryRun) {
82
+ process.stdout.write(' (dry run — no files written)\n');
83
+ return ExitCode.SUCCESS;
84
+ }
85
+ if (!opts.yes) {
86
+ process.stdout.write(' Continue? [Y/n] ');
87
+ const answer = await readYesNo();
88
+ if (answer === false) {
89
+ process.stdout.write(' Cancelled.\n');
90
+ return ExitCode.USER_CANCELLATION;
91
+ }
92
+ }
93
+ const result = executeWritePlan(plan, manifest);
94
+ printWriteResult(result, item.name);
95
+ return result.success ? ExitCode.SUCCESS : ExitCode.UNEXPECTED_ERROR;
96
+ }
97
+ function readYesNo() {
98
+ return new Promise((resolve) => {
99
+ const stdin = process.stdin;
100
+ stdin.setEncoding('utf-8');
101
+ stdin.once('data', (data) => {
102
+ const trimmed = data.trim().toLowerCase();
103
+ if (trimmed === '' || trimmed === 'y' || trimmed === 'yes') {
104
+ resolve(true);
105
+ }
106
+ else {
107
+ resolve(false);
108
+ }
109
+ });
110
+ });
111
+ }
112
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../../src/commands/add.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export interface InitOptions {
2
+ cwd: string;
3
+ output?: string;
4
+ language?: 'ts' | 'js';
5
+ yes: boolean;
6
+ dryRun: boolean;
7
+ json: boolean;
8
+ overwrite: boolean;
9
+ }
10
+ export declare function initCommand(opts: InitOptions): Promise<number>;
11
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;CACpB;AAOD,wBAAsB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CA6DpE"}
@@ -0,0 +1,85 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { writeConfig, configExists, findConfigPath, CONFIG_FILENAME } from '@snipl/core';
4
+ import { ExitCode } from '../exit-codes.js';
5
+ import { printJson, printJsonError } from '../renderers/json.js';
6
+ function detectDefaultOutput(cwd) {
7
+ if (fs.existsSync(path.join(cwd, 'src')))
8
+ return 'src/snippets';
9
+ return 'snippets';
10
+ }
11
+ export async function initCommand(opts) {
12
+ const configPath = findConfigPath(opts.cwd);
13
+ const exists = configExists(opts.cwd);
14
+ if (exists && !opts.overwrite) {
15
+ const msg = `${CONFIG_FILENAME} already exists. Use --overwrite to replace it.`;
16
+ if (opts.json) {
17
+ printJsonError('CONFIG_EXISTS', msg);
18
+ }
19
+ else {
20
+ process.stderr.write(msg + '\n');
21
+ }
22
+ return ExitCode.INVALID_INPUT;
23
+ }
24
+ const defaultOutput = detectDefaultOutput(opts.cwd);
25
+ const config = {
26
+ output: opts.output ?? defaultOutput,
27
+ language: opts.language ?? 'ts',
28
+ registries: [{ name: 'official', source: 'builtin' }],
29
+ };
30
+ if (opts.json) {
31
+ printJson(config);
32
+ if (opts.dryRun)
33
+ return ExitCode.SUCCESS;
34
+ try {
35
+ writeConfig(opts.cwd, config);
36
+ }
37
+ catch (err) {
38
+ printJsonError('WRITE_ERROR', err instanceof Error ? err.message : String(err));
39
+ return ExitCode.UNEXPECTED_ERROR;
40
+ }
41
+ return ExitCode.SUCCESS;
42
+ }
43
+ if (!opts.yes) {
44
+ process.stdout.write(`\n The following ${CONFIG_FILENAME} will be created:\n\n`);
45
+ process.stdout.write(` ${JSON.stringify(config, null, 4).split('\n').join('\n ')}\n\n`);
46
+ }
47
+ if (opts.dryRun) {
48
+ process.stdout.write(' (dry run — no files written)\n');
49
+ return ExitCode.SUCCESS;
50
+ }
51
+ if (!opts.yes) {
52
+ process.stdout.write(' Continue? [Y/n] ');
53
+ const answer = await readYesNo();
54
+ if (answer === false) {
55
+ process.stdout.write(' Cancelled.\n');
56
+ return ExitCode.USER_CANCELLATION;
57
+ }
58
+ }
59
+ try {
60
+ writeConfig(opts.cwd, config);
61
+ process.stdout.write(` ✓ Created ${configPath}\n`);
62
+ return ExitCode.SUCCESS;
63
+ }
64
+ catch (err) {
65
+ const message = err instanceof Error ? err.message : String(err);
66
+ process.stderr.write(` ✗ Failed to create config: ${message}\n`);
67
+ return ExitCode.UNEXPECTED_ERROR;
68
+ }
69
+ }
70
+ function readYesNo() {
71
+ return new Promise((resolve) => {
72
+ const stdin = process.stdin;
73
+ stdin.setEncoding('utf-8');
74
+ stdin.once('data', (data) => {
75
+ const trimmed = data.trim().toLowerCase();
76
+ if (trimmed === '' || trimmed === 'y' || trimmed === 'yes') {
77
+ resolve(true);
78
+ }
79
+ else {
80
+ resolve(false);
81
+ }
82
+ });
83
+ });
84
+ }
85
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACzF,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAYjE,SAAS,mBAAmB,CAAC,GAAW;IACtC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAAE,OAAO,cAAc,CAAC;IAChE,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAiB;IACjD,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEtC,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,GAAG,eAAe,iDAAiD,CAAC;QAChF,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,cAAc,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,QAAQ,CAAC,aAAa,CAAC;IAChC,CAAC;IAED,MAAM,aAAa,GAAG,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpD,MAAM,MAAM,GAAkB;QAC5B,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,aAAa;QACpC,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI;QAC/B,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;KACtD,CAAC;IAEF,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,SAAS,CAAC,MAAM,CAAC,CAAC;QAClB,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,QAAQ,CAAC,OAAO,CAAC;QACzC,IAAI,CAAC;YACH,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,cAAc,CAAC,aAAa,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAChF,OAAO,QAAQ,CAAC,gBAAgB,CAAC;QACnC,CAAC;QACD,OAAO,QAAQ,CAAC,OAAO,CAAC;IAC1B,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,eAAe,uBAAuB,CAAC,CAAC;QAClF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5F,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACzD,OAAO,QAAQ,CAAC,OAAO,CAAC;IAC1B,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;QACjC,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;YACvC,OAAO,QAAQ,CAAC,iBAAiB,CAAC;QACpC,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,UAAU,IAAI,CAAC,CAAC;QACpD,OAAO,QAAQ,CAAC,OAAO,CAAC;IAC1B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,OAAO,IAAI,CAAC,CAAC;QAClE,OAAO,QAAQ,CAAC,gBAAgB,CAAC;IACnC,CAAC;AACH,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC5B,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YAClC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC1C,IAAI,OAAO,KAAK,EAAE,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;gBAC3D,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { RegistryResolver } from '@snipl/core';
2
+ export interface ListOptions {
3
+ json: boolean;
4
+ }
5
+ export declare function listCommand(resolver: RegistryResolver, opts: ListOptions): number;
6
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAKpD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,CAAC;CACf;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,GAAG,MAAM,CAejF"}
@@ -0,0 +1,17 @@
1
+ import { ExitCode } from '../exit-codes.js';
2
+ import { printJson } from '../renderers/json.js';
3
+ import { printItemList } from '../renderers/human.js';
4
+ export function listCommand(resolver, opts) {
5
+ const items = resolver.getAll();
6
+ if (opts.json) {
7
+ printJson(items);
8
+ return ExitCode.SUCCESS;
9
+ }
10
+ if (items.length === 0) {
11
+ process.stdout.write(' No items available.\n');
12
+ return ExitCode.SUCCESS;
13
+ }
14
+ printItemList(items);
15
+ return ExitCode.SUCCESS;
16
+ }
17
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/list.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAMtD,MAAM,UAAU,WAAW,CAAC,QAA0B,EAAE,IAAiB;IACvE,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;IAEhC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,SAAS,CAAC,KAAK,CAAC,CAAC;QACjB,OAAO,QAAQ,CAAC,OAAO,CAAC;IAC1B,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAChD,OAAO,QAAQ,CAAC,OAAO,CAAC;IAC1B,CAAC;IAED,aAAa,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO,QAAQ,CAAC,OAAO,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { RegistryResolver } from '@snipl/core';
2
+ export interface SearchOptions {
3
+ query: string;
4
+ json: boolean;
5
+ }
6
+ export declare function searchCommand(resolver: RegistryResolver, opts: SearchOptions): number;
7
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/commands/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAKpD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;CACf;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,CAyBrF"}
@@ -0,0 +1,27 @@
1
+ import { ExitCode } from '../exit-codes.js';
2
+ import { printJson, printJsonError } from '../renderers/json.js';
3
+ import { printItemList } from '../renderers/human.js';
4
+ export function searchCommand(resolver, opts) {
5
+ if (!opts.query || opts.query.trim() === '') {
6
+ if (opts.json) {
7
+ printJsonError('EMPTY_QUERY', 'Search query cannot be empty.');
8
+ }
9
+ else {
10
+ process.stderr.write(' Please provide a search query.\n');
11
+ }
12
+ return ExitCode.INVALID_INPUT;
13
+ }
14
+ const results = resolver.search(opts.query.trim());
15
+ if (opts.json) {
16
+ printJson(results);
17
+ return ExitCode.SUCCESS;
18
+ }
19
+ if (results.length === 0) {
20
+ process.stdout.write(` No items found for "${opts.query}".\n`);
21
+ return ExitCode.SUCCESS;
22
+ }
23
+ process.stdout.write(`\n ${results.length} result(s) for "${opts.query}":\n\n`);
24
+ printItemList(results);
25
+ return ExitCode.SUCCESS;
26
+ }
27
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/commands/search.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAOtD,MAAM,UAAU,aAAa,CAAC,QAA0B,EAAE,IAAmB;IAC3E,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC5C,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,cAAc,CAAC,aAAa,EAAE,+BAA+B,CAAC,CAAC;QACjE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,QAAQ,CAAC,aAAa,CAAC;IAChC,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAEnD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,SAAS,CAAC,OAAO,CAAC,CAAC;QACnB,OAAO,QAAQ,CAAC,OAAO,CAAC;IAC1B,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,IAAI,CAAC,KAAK,MAAM,CAAC,CAAC;QAChE,OAAO,QAAQ,CAAC,OAAO,CAAC;IAC1B,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,MAAM,mBAAmB,IAAI,CAAC,KAAK,QAAQ,CAAC,CAAC;IACjF,aAAa,CAAC,OAAO,CAAC,CAAC;IACvB,OAAO,QAAQ,CAAC,OAAO,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,17 @@
1
+ export interface StatusOptions {
2
+ cwd: string;
3
+ json: boolean;
4
+ }
5
+ export interface FileStatus {
6
+ filePath: string;
7
+ status: 'unchanged' | 'modified' | 'missing' | 'untracked';
8
+ expectedSha256?: string;
9
+ }
10
+ export interface ItemStatus {
11
+ name: string;
12
+ version: string;
13
+ registry: string;
14
+ files: FileStatus[];
15
+ }
16
+ export declare function statusCommand(opts: StatusOptions): number;
17
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/commands/status.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW,CAAC;IAC3D,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAoFzD"}
@@ -0,0 +1,82 @@
1
+ import * as fs from 'fs';
2
+ import * as crypto from 'crypto';
3
+ import * as path from 'path';
4
+ import { loadManifest, configExists } from '@snipl/core';
5
+ import { ExitCode } from '../exit-codes.js';
6
+ import { printJson, printJsonError } from '../renderers/json.js';
7
+ export function statusCommand(opts) {
8
+ if (!configExists(opts.cwd)) {
9
+ const msg = `No snippets.json found in ${opts.cwd}. Run \`snipl init\` first.`;
10
+ if (opts.json) {
11
+ printJsonError('NO_CONFIG', msg);
12
+ }
13
+ else {
14
+ process.stderr.write(` ${msg}\n`);
15
+ }
16
+ return ExitCode.UNEXPECTED_ERROR;
17
+ }
18
+ const manifest = loadManifest(opts.cwd);
19
+ if (manifest.items.length === 0) {
20
+ if (opts.json) {
21
+ printJson({ items: [] });
22
+ }
23
+ else {
24
+ process.stdout.write(' No items installed. Use `snipl add <name>` to install.\n');
25
+ }
26
+ return ExitCode.SUCCESS;
27
+ }
28
+ const itemStatuses = [];
29
+ for (const item of manifest.items) {
30
+ const fileStatuses = [];
31
+ for (const file of item.files) {
32
+ const fullPath = path.resolve(opts.cwd, file.path);
33
+ if (!fs.existsSync(fullPath)) {
34
+ fileStatuses.push({ filePath: file.path, status: 'missing', expectedSha256: file.sha256 });
35
+ continue;
36
+ }
37
+ const stat = fs.statSync(fullPath);
38
+ if (!stat.isFile()) {
39
+ fileStatuses.push({ filePath: file.path, status: 'modified', expectedSha256: file.sha256 });
40
+ continue;
41
+ }
42
+ const content = fs.readFileSync(fullPath, 'utf-8');
43
+ const actualSha256 = crypto.createHash('sha256').update(content, 'utf-8').digest('hex');
44
+ if (actualSha256 === file.sha256) {
45
+ fileStatuses.push({
46
+ filePath: file.path,
47
+ status: 'unchanged',
48
+ expectedSha256: file.sha256,
49
+ });
50
+ }
51
+ else {
52
+ fileStatuses.push({ filePath: file.path, status: 'modified', expectedSha256: file.sha256 });
53
+ }
54
+ }
55
+ itemStatuses.push({
56
+ name: item.name,
57
+ version: item.version,
58
+ registry: item.registry,
59
+ files: fileStatuses,
60
+ });
61
+ }
62
+ if (opts.json) {
63
+ printJson({ items: itemStatuses });
64
+ return ExitCode.SUCCESS;
65
+ }
66
+ let anyProblem = false;
67
+ for (const itemStatus of itemStatuses) {
68
+ process.stdout.write(`\n ${itemStatus.name}@${itemStatus.version} (${itemStatus.registry})\n`);
69
+ for (const file of itemStatus.files) {
70
+ const icon = file.status === 'unchanged' ? '✓' : file.status === 'modified' ? '⚠' : '✗';
71
+ process.stdout.write(` ${icon} ${file.filePath} [${file.status}]\n`);
72
+ if (file.status !== 'unchanged')
73
+ anyProblem = true;
74
+ }
75
+ }
76
+ if (!anyProblem) {
77
+ process.stdout.write('\n All installed items are unchanged.\n');
78
+ }
79
+ process.stdout.write('\n');
80
+ return ExitCode.SUCCESS;
81
+ }
82
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { RegistryResolver } from '@snipl/core';
2
+ export interface ViewOptions {
3
+ name: string;
4
+ json: boolean;
5
+ }
6
+ export declare function viewCommand(resolver: RegistryResolver, opts: ViewOptions): number;
7
+ //# sourceMappingURL=view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../../src/commands/view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAKpD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;CACf;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,GAAG,MAAM,CAoBjF"}
@@ -0,0 +1,23 @@
1
+ import { ExitCode } from '../exit-codes.js';
2
+ import { printJson, printJsonError } from '../renderers/json.js';
3
+ import { printItemDetail } from '../renderers/human.js';
4
+ export function viewCommand(resolver, opts) {
5
+ const item = resolver.getByName(opts.name);
6
+ if (!item) {
7
+ const msg = `Item "${opts.name}" not found.`;
8
+ if (opts.json) {
9
+ printJsonError('ITEM_NOT_FOUND', msg);
10
+ }
11
+ else {
12
+ process.stderr.write(` ${msg}\n`);
13
+ }
14
+ return ExitCode.INVALID_INPUT;
15
+ }
16
+ if (opts.json) {
17
+ printJson(item);
18
+ return ExitCode.SUCCESS;
19
+ }
20
+ printItemDetail(item);
21
+ return ExitCode.SUCCESS;
22
+ }
23
+ //# sourceMappingURL=view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.js","sourceRoot":"","sources":["../../../src/commands/view.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAOxD,MAAM,UAAU,WAAW,CAAC,QAA0B,EAAE,IAAiB;IACvE,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE3C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,GAAG,GAAG,SAAS,IAAI,CAAC,IAAI,cAAc,CAAC;QAC7C,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,cAAc,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;QACrC,CAAC;QACD,OAAO,QAAQ,CAAC,aAAa,CAAC;IAChC,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,SAAS,CAAC,IAAI,CAAC,CAAC;QAChB,OAAO,QAAQ,CAAC,OAAO,CAAC;IAC1B,CAAC;IAED,eAAe,CAAC,IAAI,CAAC,CAAC;IACtB,OAAO,QAAQ,CAAC,OAAO,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare const ExitCode: {
2
+ readonly SUCCESS: 0;
3
+ readonly UNEXPECTED_ERROR: 1;
4
+ readonly INVALID_INPUT: 2;
5
+ readonly USER_CANCELLATION: 3;
6
+ readonly INTEGRITY_FAILURE: 4;
7
+ };
8
+ //# sourceMappingURL=exit-codes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exit-codes.d.ts","sourceRoot":"","sources":["../../src/exit-codes.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ;;;;;;CAMX,CAAC"}
@@ -0,0 +1,8 @@
1
+ export const ExitCode = {
2
+ SUCCESS: 0,
3
+ UNEXPECTED_ERROR: 1,
4
+ INVALID_INPUT: 2,
5
+ USER_CANCELLATION: 3,
6
+ INTEGRITY_FAILURE: 4,
7
+ };
8
+ //# sourceMappingURL=exit-codes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exit-codes.js","sourceRoot":"","sources":["../../src/exit-codes.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,OAAO,EAAE,CAAC;IACV,gBAAgB,EAAE,CAAC;IACnB,aAAa,EAAE,CAAC;IAChB,iBAAiB,EAAE,CAAC;IACpB,iBAAiB,EAAE,CAAC;CACZ,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,168 @@
1
+ #!/usr/bin/env node
2
+ import { cac } from 'cac';
3
+ import * as fs from 'fs';
4
+ import * as path from 'path';
5
+ import { BuiltinRegistryResolver } from '@snipl/core';
6
+ import { initCommand } from './commands/init.js';
7
+ import { listCommand } from './commands/list.js';
8
+ import { searchCommand } from './commands/search.js';
9
+ import { viewCommand } from './commands/view.js';
10
+ import { addCommand } from './commands/add.js';
11
+ import { statusCommand } from './commands/status.js';
12
+ import { ExitCode } from './exit-codes.js';
13
+ const cli = cac('snipl');
14
+ cli.option('--cwd <path>', 'Working directory', { default: '.' });
15
+ cli.option('--json', 'Output as JSON');
16
+ cli.option('--yes, -y', 'Skip confirmation prompts');
17
+ cli.option('--dry-run', 'Preview without writing');
18
+ cli.option('--verbose', 'Verbose output');
19
+ cli.option('--overwrite', 'Allow overwriting existing files');
20
+ cli.option('--output <path>', 'Output directory for snippets');
21
+ cli.option('--language <lang>', 'Language (ts or js)');
22
+ function resolveCwd(cwd) {
23
+ const resolved = path.resolve(cwd);
24
+ if (!fs.existsSync(resolved)) {
25
+ process.stderr.write(`Error: --cwd path "${cwd}" does not exist.\n`);
26
+ process.exit(ExitCode.INVALID_INPUT);
27
+ }
28
+ if (!fs.statSync(resolved).isDirectory()) {
29
+ process.stderr.write(`Error: --cwd path "${cwd}" is not a directory.\n`);
30
+ process.exit(ExitCode.INVALID_INPUT);
31
+ }
32
+ return resolved;
33
+ }
34
+ function parseGlobalOptions(raw) {
35
+ return {
36
+ cwd: typeof raw.cwd === 'string' ? raw.cwd : '.',
37
+ json: raw.json === true,
38
+ yes: raw.yes === true,
39
+ dryRun: raw.dryRun === true,
40
+ verbose: raw.verbose === true,
41
+ overwrite: raw.overwrite === true,
42
+ output: typeof raw.output === 'string' ? raw.output : undefined,
43
+ language: typeof raw.language === 'string' ? raw.language : undefined,
44
+ };
45
+ }
46
+ cli
47
+ .command('init', 'Initialize snippets.json in the project')
48
+ .action(async (options) => {
49
+ const opts = parseGlobalOptions(options);
50
+ const cwd = resolveCwd(opts.cwd ?? '.');
51
+ const exitCode = await initCommand({
52
+ cwd,
53
+ output: opts.output,
54
+ language: opts.language,
55
+ yes: opts.yes ?? false,
56
+ dryRun: opts.dryRun ?? false,
57
+ json: opts.json ?? false,
58
+ overwrite: opts.overwrite ?? false,
59
+ });
60
+ process.exit(exitCode);
61
+ });
62
+ function withCwd(options, fn) {
63
+ const opts = parseGlobalOptions(options);
64
+ const cwd = resolveCwd(opts.cwd ?? '.');
65
+ return fn(cwd);
66
+ }
67
+ cli.command('list', 'List all available items').action((options) => {
68
+ withCwd(options, () => {
69
+ const opts = parseGlobalOptions(options);
70
+ const resolver = new BuiltinRegistryResolver();
71
+ try {
72
+ const exitCode = listCommand(resolver, { json: opts.json ?? false });
73
+ process.exit(exitCode);
74
+ }
75
+ catch (err) {
76
+ handleError(err, opts.json ?? false);
77
+ }
78
+ });
79
+ });
80
+ cli
81
+ .command('search <query>', 'Search for items')
82
+ .action((query, options) => {
83
+ withCwd(options, () => {
84
+ const opts = parseGlobalOptions(options);
85
+ const resolver = new BuiltinRegistryResolver();
86
+ try {
87
+ const exitCode = searchCommand(resolver, {
88
+ query,
89
+ json: opts.json ?? false,
90
+ });
91
+ process.exit(exitCode);
92
+ }
93
+ catch (err) {
94
+ handleError(err, opts.json ?? false);
95
+ }
96
+ });
97
+ });
98
+ cli.command('view <name>', 'View item details').action((name, options) => {
99
+ withCwd(options, () => {
100
+ const opts = parseGlobalOptions(options);
101
+ const resolver = new BuiltinRegistryResolver();
102
+ try {
103
+ const exitCode = viewCommand(resolver, {
104
+ name,
105
+ json: opts.json ?? false,
106
+ });
107
+ process.exit(exitCode);
108
+ }
109
+ catch (err) {
110
+ handleError(err, opts.json ?? false);
111
+ }
112
+ });
113
+ });
114
+ cli
115
+ .command('add <name>', 'Install an item')
116
+ .option('--path <path>', 'Explicit destination root')
117
+ .action(async (name, options) => {
118
+ const opts = parseGlobalOptions(options);
119
+ const cwd = resolveCwd(opts.cwd ?? '.');
120
+ try {
121
+ const resolver = new BuiltinRegistryResolver();
122
+ const exitCode = await addCommand(resolver, name, {
123
+ cwd,
124
+ json: opts.json ?? false,
125
+ yes: opts.yes ?? false,
126
+ dryRun: opts.dryRun ?? false,
127
+ overwrite: opts.overwrite ?? false,
128
+ });
129
+ process.exit(exitCode);
130
+ }
131
+ catch (err) {
132
+ handleError(err, opts.json ?? false);
133
+ }
134
+ });
135
+ cli.command('status', 'Check installed items').action((options) => {
136
+ withCwd(options, () => {
137
+ const opts = parseGlobalOptions(options);
138
+ try {
139
+ const exitCode = statusCommand({
140
+ cwd: opts.cwd ?? '.',
141
+ json: opts.json ?? false,
142
+ });
143
+ process.exit(exitCode);
144
+ }
145
+ catch (err) {
146
+ handleError(err, opts.json ?? false);
147
+ }
148
+ });
149
+ });
150
+ cli.help();
151
+ cli.version('0.0.0');
152
+ function handleError(err, json) {
153
+ const message = err instanceof Error ? err.message : String(err);
154
+ if (json) {
155
+ process.stdout.write(JSON.stringify({ ok: false, error: { code: 'UNEXPECTED_ERROR', message } }) + '\n');
156
+ }
157
+ else {
158
+ process.stderr.write(`Error: ${message}\n`);
159
+ }
160
+ process.exit(ExitCode.UNEXPECTED_ERROR);
161
+ }
162
+ try {
163
+ cli.parse();
164
+ }
165
+ catch (err) {
166
+ handleError(err, false);
167
+ }
168
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { RegistryItem } from '@snipl/registry-schema';
2
+ import type { WritePlan } from '@snipl/core';
3
+ import type { WriteResult } from '@snipl/core';
4
+ export declare function printItemList(items: RegistryItem[]): void;
5
+ export declare function printItemDetail(item: RegistryItem): void;
6
+ export declare function printWritePlan(plan: WritePlan, item: RegistryItem): void;
7
+ export declare function printWriteResult(result: WriteResult, itemName: string): void;
8
+ //# sourceMappingURL=human.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"human.d.ts","sourceRoot":"","sources":["../../../src/renderers/human.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,IAAI,CAIzD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CA+BxD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAaxE;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAkB5E"}
@@ -0,0 +1,72 @@
1
+ export function printItemList(items) {
2
+ for (const item of items) {
3
+ console.log(`${item.name.padEnd(20)} ${item.summary}`);
4
+ }
5
+ }
6
+ export function printItemDetail(item) {
7
+ console.log(`\n ${item.name}@${item.version}`);
8
+ console.log(` ${'─'.repeat(40)}`);
9
+ console.log(` ${item.summary}`);
10
+ console.log(` Language: ${item.language}`);
11
+ console.log(` Environments: ${item.environments.join(', ')}`);
12
+ console.log(` License: ${item.license.spdx} (${item.license.source})`);
13
+ if (item.license.attribution) {
14
+ console.log(` Attribution: ${item.license.attribution}`);
15
+ }
16
+ console.log('');
17
+ console.log(' Exports:');
18
+ for (const exp of item.exports) {
19
+ console.log(` ${exp.kind} ${exp.name}`);
20
+ }
21
+ console.log('');
22
+ console.log(' Files:');
23
+ for (const file of item.files) {
24
+ console.log(` ${file.path}`);
25
+ }
26
+ console.log('');
27
+ console.log(' Usage:');
28
+ console.log(` ${item.docs.usage}`);
29
+ if (item.docs.caveats.length > 0) {
30
+ console.log('');
31
+ console.log(' Caveats:');
32
+ for (const caveat of item.docs.caveats) {
33
+ console.log(` ⚠ ${caveat}`);
34
+ }
35
+ }
36
+ console.log('');
37
+ }
38
+ export function printWritePlan(plan, item) {
39
+ console.log(`\n Will install ${item.name}@${item.version}\n`);
40
+ for (const entry of plan.entries) {
41
+ const action = entry.type === 'create' ? 'create' : 'overwrite';
42
+ console.log(` ${action.padEnd(12)} ${entry.targetPath}`);
43
+ }
44
+ if (plan.collisions.length > 0) {
45
+ console.log('\n Collisions (use --overwrite to replace):');
46
+ for (const coll of plan.collisions) {
47
+ console.log(` ${coll}`);
48
+ }
49
+ }
50
+ console.log('');
51
+ }
52
+ export function printWriteResult(result, itemName) {
53
+ if (result.success) {
54
+ console.log(` ✓ Installed ${itemName} (${result.written.length} file(s))`);
55
+ }
56
+ else {
57
+ console.log(` ✗ Failed to install ${itemName}`);
58
+ if (result.written.length > 0) {
59
+ console.log(` Written: ${result.written.length} file(s)`);
60
+ }
61
+ if (result.failed.length > 0) {
62
+ console.log(` Failed: ${result.failed.length} file(s)`);
63
+ for (const f of result.failed) {
64
+ console.log(` - ${f}`);
65
+ }
66
+ }
67
+ if (result.restored.length > 0) {
68
+ console.log(` Restored: ${result.restored.length} file(s)`);
69
+ }
70
+ }
71
+ }
72
+ //# sourceMappingURL=human.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"human.js","sourceRoot":"","sources":["../../../src/renderers/human.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export interface JsonEnvelope<T = unknown> {
2
+ ok: boolean;
3
+ data?: T;
4
+ error?: {
5
+ code: string;
6
+ message: string;
7
+ };
8
+ }
9
+ export declare function printJson<T>(data: T): void;
10
+ export declare function printJsonError(code: string, message: string): void;
11
+ //# sourceMappingURL=json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../../src/renderers/json.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,OAAO;IACvC,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAG1C;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAGlE"}
@@ -0,0 +1,9 @@
1
+ export function printJson(data) {
2
+ const envelope = { ok: true, data };
3
+ process.stdout.write(JSON.stringify(envelope) + '\n');
4
+ }
5
+ export function printJsonError(code, message) {
6
+ const envelope = { ok: false, error: { code, message } };
7
+ process.stdout.write(JSON.stringify(envelope) + '\n');
8
+ }
9
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../../src/renderers/json.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,SAAS,CAAI,IAAO;IAClC,MAAM,QAAQ,GAAoB,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACrD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,OAAe;IAC1D,MAAM,QAAQ,GAAiB,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC;IACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;AACxD,CAAC"}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@snipl/cli",
3
+ "version": "1.0.0-next.1",
4
+ "private": false,
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/ysr-hameed/snipl.git"
10
+ },
11
+ "bugs": {
12
+ "url": "https://github.com/ysr-hameed/snipl/issues"
13
+ },
14
+ "bin": {
15
+ "snipl": "./dist/src/index.js"
16
+ },
17
+ "files": [
18
+ "dist/src",
19
+ "!dist/src/**/*.tsbuildinfo"
20
+ ],
21
+ "dependencies": {
22
+ "cac": "^7.0.0",
23
+ "@snipl/core": "1.0.0-next.1",
24
+ "@snipl/registry-schema": "1.0.0-next.1"
25
+ },
26
+ "devDependencies": {
27
+ "@types/node": "^22.20.1",
28
+ "typescript": "^5.7.0",
29
+ "vitest": "^3.0.0"
30
+ },
31
+ "engines": {
32
+ "node": ">=22.0.0"
33
+ },
34
+ "scripts": {
35
+ "build": "tsc -b",
36
+ "typecheck": "tsc -b",
37
+ "test": "vitest run"
38
+ }
39
+ }