@owlmeans/agent-skills 0.1.8

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 (54) hide show
  1. package/README.md +92 -0
  2. package/agent-meta/instructions/shadcn-versions.instructions.md +46 -0
  3. package/agent-meta/instructions/shadcn-web.instructions.md +94 -0
  4. package/agent-meta/manifest.json +37 -0
  5. package/agent-meta/skills/shadcn-versions/SKILL.md +126 -0
  6. package/agent-meta/skills/shadcn-web/SKILL.md +222 -0
  7. package/build/apply.d.ts +13 -0
  8. package/build/apply.d.ts.map +1 -0
  9. package/build/apply.js +28 -0
  10. package/build/apply.js.map +1 -0
  11. package/build/args.d.ts +14 -0
  12. package/build/args.d.ts.map +1 -0
  13. package/build/args.js +93 -0
  14. package/build/args.js.map +1 -0
  15. package/build/bin.d.ts +3 -0
  16. package/build/bin.d.ts.map +1 -0
  17. package/build/bin.js +21 -0
  18. package/build/bin.js.map +1 -0
  19. package/build/discover.d.ts +41 -0
  20. package/build/discover.d.ts.map +1 -0
  21. package/build/discover.js +160 -0
  22. package/build/discover.js.map +1 -0
  23. package/build/index.d.ts +11 -0
  24. package/build/index.d.ts.map +1 -0
  25. package/build/index.js +6 -0
  26. package/build/index.js.map +1 -0
  27. package/build/linked.d.ts +15 -0
  28. package/build/linked.d.ts.map +1 -0
  29. package/build/linked.js +44 -0
  30. package/build/linked.js.map +1 -0
  31. package/build/plan.d.ts +15 -0
  32. package/build/plan.d.ts.map +1 -0
  33. package/build/plan.js +40 -0
  34. package/build/plan.js.map +1 -0
  35. package/build/prompt.d.ts +4 -0
  36. package/build/prompt.d.ts.map +1 -0
  37. package/build/prompt.js +21 -0
  38. package/build/prompt.js.map +1 -0
  39. package/build/run.d.ts +18 -0
  40. package/build/run.d.ts.map +1 -0
  41. package/build/run.js +124 -0
  42. package/build/run.js.map +1 -0
  43. package/package.json +37 -0
  44. package/src/apply.ts +38 -0
  45. package/src/args.ts +108 -0
  46. package/src/bin.ts +20 -0
  47. package/src/discover.ts +202 -0
  48. package/src/index.ts +14 -0
  49. package/src/linked.ts +51 -0
  50. package/src/plan.ts +69 -0
  51. package/src/prompt.ts +25 -0
  52. package/src/run.ts +167 -0
  53. package/tests/installer.test.ts +297 -0
  54. package/tsconfig.json +11 -0
@@ -0,0 +1,14 @@
1
+ export interface CliArgs {
2
+ dir: string;
3
+ yes: boolean;
4
+ only: string[];
5
+ claudeOnly: boolean;
6
+ copilotOnly: boolean;
7
+ extras: boolean;
8
+ force: boolean;
9
+ dryRun: boolean;
10
+ help: boolean;
11
+ }
12
+ export declare const parseArgs: (argv: string[]) => CliArgs | null;
13
+ export declare const printHelp: () => void;
14
+ //# sourceMappingURL=args.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,OAAO,CAAA;IACZ,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,UAAU,EAAE,OAAO,CAAA;IACnB,WAAW,EAAE,OAAO,CAAA;IACpB,MAAM,EAAE,OAAO,CAAA;IACf,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,EAAE,OAAO,CAAA;IACf,IAAI,EAAE,OAAO,CAAA;CACd;AAmBD,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,EAAE,KAAG,OAAO,GAAG,IA0EpD,CAAA;AAED,eAAO,MAAM,SAAS,QAAO,IAE5B,CAAA"}
package/build/args.js ADDED
@@ -0,0 +1,93 @@
1
+ const HELP = `owlmeans-agent-skills — install embedded @owlmeans/* agent guidance
2
+
3
+ Usage: npx @owlmeans/agent-skills [options]
4
+
5
+ Options:
6
+ --dir <path> target project directory (default: cwd)
7
+ --yes, -y skip interactive confirmation
8
+ --only <pkg,...> comma-separated @owlmeans/* package names to install from
9
+ --claude-only install only Claude Code skills
10
+ --copilot-only install only Copilot instructions
11
+ --extras include extras bundled with the installer (default: on)
12
+ --no-extras skip installer-bundled extras
13
+ --force overwrite locally-edited files (no AUTO-GENERATED banner)
14
+ --dry-run print plan without writing files
15
+ --help, -h show this help
16
+ `;
17
+ export const parseArgs = (argv) => {
18
+ const args = argv.slice(2); // strip node + script
19
+ const result = {
20
+ dir: process.cwd(),
21
+ yes: false,
22
+ only: [],
23
+ claudeOnly: false,
24
+ copilotOnly: false,
25
+ extras: true,
26
+ force: false,
27
+ dryRun: false,
28
+ help: false,
29
+ };
30
+ let i = 0;
31
+ while (i < args.length) {
32
+ const a = args[i];
33
+ switch (a) {
34
+ case '--help':
35
+ case '-h':
36
+ result.help = true;
37
+ break;
38
+ case '--yes':
39
+ case '-y':
40
+ result.yes = true;
41
+ break;
42
+ case '--force':
43
+ result.force = true;
44
+ break;
45
+ case '--dry-run':
46
+ result.dryRun = true;
47
+ break;
48
+ case '--claude-only':
49
+ result.claudeOnly = true;
50
+ break;
51
+ case '--copilot-only':
52
+ result.copilotOnly = true;
53
+ break;
54
+ case '--extras':
55
+ result.extras = true;
56
+ break;
57
+ case '--no-extras':
58
+ result.extras = false;
59
+ break;
60
+ case '--dir': {
61
+ const v = args[i + 1];
62
+ if (v == null || v.startsWith('-')) {
63
+ process.stderr.write(`error: --dir requires a path argument\n`);
64
+ return null;
65
+ }
66
+ result.dir = v;
67
+ i++;
68
+ break;
69
+ }
70
+ case '--only': {
71
+ const v = args[i + 1];
72
+ if (v == null || v.startsWith('-')) {
73
+ process.stderr.write(`error: --only requires a comma-separated package list\n`);
74
+ return null;
75
+ }
76
+ result.only = v.split(',').map(s => s.trim()).filter(Boolean);
77
+ i++;
78
+ break;
79
+ }
80
+ default:
81
+ if (a.startsWith('--')) {
82
+ process.stderr.write(`error: unknown flag ${a}\n`);
83
+ return null;
84
+ }
85
+ }
86
+ i++;
87
+ }
88
+ return result;
89
+ };
90
+ export const printHelp = () => {
91
+ process.stdout.write(HELP);
92
+ };
93
+ //# sourceMappingURL=args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"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"}
package/build/bin.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=bin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":""}
package/build/bin.js ADDED
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env node
2
+ import { parseArgs, printHelp } from './args.js';
3
+ import { run } from './run.js';
4
+ const args = parseArgs(process.argv);
5
+ if (args == null) {
6
+ process.stderr.write('Run with --help for usage.\n');
7
+ process.exit(2);
8
+ }
9
+ else if (args.help) {
10
+ printHelp();
11
+ process.exit(0);
12
+ }
13
+ else {
14
+ run(args).then(result => {
15
+ process.exit(result.code);
16
+ }).catch((err) => {
17
+ process.stderr.write(`fatal: ${err instanceof Error ? err.message : String(err)}\n`);
18
+ process.exit(1);
19
+ });
20
+ }
21
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAChD,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAE9B,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;AAEpC,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;IACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAA;IACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC;KAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;IACrB,SAAS,EAAE,CAAA;IACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC;KAAM,CAAC;IACN,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;QACtB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC3B,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;QACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACpF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,41 @@
1
+ export interface ManifestEntry {
2
+ kind: 'skill' | 'instruction';
3
+ name: string;
4
+ category: 'package-specific' | 'multi-package';
5
+ file: string;
6
+ canonicalPath: string;
7
+ }
8
+ export interface Manifest {
9
+ schemaVersion: number;
10
+ package: string;
11
+ version: string;
12
+ generatedAt: string;
13
+ canonicalRepo: string;
14
+ entries: ManifestEntry[];
15
+ }
16
+ export interface DiscoveredEntry {
17
+ kind: 'skill' | 'instruction';
18
+ name: string;
19
+ category: 'package-specific' | 'multi-package';
20
+ /** Absolute path to the embedded source file. */
21
+ sourcePath: string;
22
+ canonicalPath: string;
23
+ /** Package this came from. */
24
+ packageName: string;
25
+ version: string;
26
+ /** True for extras bundled in the installer itself. */
27
+ isExtra: boolean;
28
+ }
29
+ export interface DiscoverOptions {
30
+ /** Include installer's bundled extras. Default: true */
31
+ extras?: boolean;
32
+ /** Restrict to entries from these package names. */
33
+ only?: string[];
34
+ /** Install only skills. */
35
+ claudeOnly?: boolean;
36
+ /** Install only instructions. */
37
+ copilotOnly?: boolean;
38
+ }
39
+ /** Collect all DiscoveredEntries, deduplicated by (kind, name). */
40
+ export declare const discover: (targetDir: string, opts?: DiscoverOptions) => DiscoveredEntry[];
41
+ //# sourceMappingURL=discover.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../src/discover.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,OAAO,GAAG,aAAa,CAAA;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,kBAAkB,GAAG,eAAe,CAAA;IAC9C,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,aAAa,EAAE,CAAA;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,GAAG,aAAa,CAAA;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,kBAAkB,GAAG,eAAe,CAAA;IAC9C,iDAAiD;IACjD,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;IACrB,8BAA8B;IAC9B,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,uDAAuD;IACvD,OAAO,EAAE,OAAO,CAAA;CACjB;AA4FD,MAAM,WAAW,eAAe;IAC9B,wDAAwD;IACxD,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,2BAA2B;IAC3B,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,iCAAiC;IACjC,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED,mEAAmE;AACnE,eAAO,MAAM,QAAQ,GAAI,WAAW,MAAM,EAAE,OAAM,eAAoB,KAAG,eAAe,EA4CvF,CAAA"}
@@ -0,0 +1,160 @@
1
+ import { existsSync, readdirSync, readFileSync } from 'node:fs';
2
+ import { dirname, join } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ /** Parse a manifest.json, return null if invalid/unparseable. */
5
+ const parseManifest = (manifestPath) => {
6
+ try {
7
+ const raw = readFileSync(manifestPath, 'utf8');
8
+ const m = JSON.parse(raw);
9
+ if (typeof m.schemaVersion !== 'number' || !Array.isArray(m.entries))
10
+ return null;
11
+ return m;
12
+ }
13
+ catch {
14
+ return null;
15
+ }
16
+ };
17
+ // Scan node_modules/@owlmeans/*/agent-meta/ for manifests.
18
+ const scanNodeModules = (targetDir) => {
19
+ const nmDir = join(targetDir, 'node_modules', '@owlmeans');
20
+ if (!existsSync(nmDir))
21
+ return [];
22
+ const entries = [];
23
+ let pkgDirs;
24
+ try {
25
+ pkgDirs = readdirSync(nmDir);
26
+ }
27
+ catch {
28
+ return [];
29
+ }
30
+ for (const pkgDir of pkgDirs) {
31
+ const manifestPath = join(nmDir, pkgDir, 'agent-meta', 'manifest.json');
32
+ if (!existsSync(manifestPath))
33
+ continue;
34
+ const manifest = parseManifest(manifestPath);
35
+ if (manifest == null)
36
+ continue;
37
+ const agentMetaDir = join(nmDir, pkgDir, 'agent-meta');
38
+ for (const e of manifest.entries) {
39
+ const sourcePath = join(agentMetaDir, e.file);
40
+ if (!existsSync(sourcePath))
41
+ continue;
42
+ entries.push({
43
+ kind: e.kind,
44
+ name: e.name,
45
+ category: e.category,
46
+ sourcePath,
47
+ canonicalPath: e.canonicalPath,
48
+ packageName: manifest.package,
49
+ version: manifest.version,
50
+ isExtra: false,
51
+ });
52
+ }
53
+ }
54
+ return entries;
55
+ };
56
+ /** Resolve the installer package's own agent-meta dir (for bundled extras). */
57
+ const selfAgentMetaDir = () => {
58
+ try {
59
+ const selfDir = dirname(fileURLToPath(import.meta.url));
60
+ // src/ → .. → package root → agent-meta
61
+ const candidate = join(selfDir, '..', 'agent-meta');
62
+ return existsSync(candidate) ? candidate : null;
63
+ }
64
+ catch {
65
+ return null;
66
+ }
67
+ };
68
+ /** Scan the installer's own agent-meta/ for bundled extras. */
69
+ const scanSelfExtras = (packageName, version) => {
70
+ const agentMetaDir = selfAgentMetaDir();
71
+ if (agentMetaDir == null)
72
+ return [];
73
+ const manifestPath = join(agentMetaDir, 'manifest.json');
74
+ const manifest = parseManifest(manifestPath);
75
+ if (manifest == null)
76
+ return [];
77
+ const entries = [];
78
+ for (const e of manifest.entries) {
79
+ const sourcePath = join(agentMetaDir, e.file);
80
+ if (!existsSync(sourcePath))
81
+ continue;
82
+ entries.push({
83
+ kind: e.kind,
84
+ name: e.name,
85
+ category: e.category,
86
+ sourcePath,
87
+ canonicalPath: e.canonicalPath,
88
+ packageName,
89
+ version,
90
+ isExtra: true,
91
+ });
92
+ }
93
+ return entries;
94
+ };
95
+ /** Collect all DiscoveredEntries, deduplicated by (kind, name). */
96
+ export const discover = (targetDir, opts = {}) => {
97
+ const { extras = true, only, claudeOnly = false, copilotOnly = false } = opts;
98
+ const allEntries = scanNodeModules(targetDir);
99
+ if (extras) {
100
+ // Get installer's own package name+version from its package.json
101
+ let selfName = '@owlmeans/agent-skills';
102
+ let selfVersion = '0.0.0';
103
+ try {
104
+ const selfPkgPath = join(dirname(fileURLToPath(import.meta.url)), '..', 'package.json');
105
+ if (existsSync(selfPkgPath)) {
106
+ const pkg = JSON.parse(readFileSync(selfPkgPath, 'utf8'));
107
+ if (pkg.name)
108
+ selfName = pkg.name;
109
+ if (pkg.version)
110
+ selfVersion = pkg.version;
111
+ }
112
+ }
113
+ catch { /* use defaults */ }
114
+ allEntries.push(...scanSelfExtras(selfName, selfVersion));
115
+ }
116
+ // Deduplicate by (kind, name): prefer highest semver version
117
+ const byKey = new Map();
118
+ for (const e of allEntries) {
119
+ const key = `${e.kind}:${e.name}`;
120
+ const existing = byKey.get(key);
121
+ if (existing == null) {
122
+ byKey.set(key, e);
123
+ }
124
+ else if (compareSemver(e.version, existing.version) > 0) {
125
+ byKey.set(key, e);
126
+ }
127
+ }
128
+ let result = Array.from(byKey.values());
129
+ // Apply --only filter
130
+ if (only != null && only.length > 0) {
131
+ result = result.filter(e => only.some(n => matchPkgName(n, e.packageName)));
132
+ }
133
+ // Apply tool filters
134
+ if (claudeOnly)
135
+ result = result.filter(e => e.kind === 'skill');
136
+ if (copilotOnly)
137
+ result = result.filter(e => e.kind === 'instruction');
138
+ return result;
139
+ };
140
+ /** Compare two semver strings. Returns >0 if a > b, <0 if a < b, 0 if equal. */
141
+ const compareSemver = (a, b) => {
142
+ const parse = (s) => s.replace(/^[^0-9]*/, '').split('.').map(n => parseInt(n, 10) || 0);
143
+ const pa = parse(a);
144
+ const pb = parse(b);
145
+ for (let i = 0; i < 3; i++) {
146
+ const diff = (pa[i] ?? 0) - (pb[i] ?? 0);
147
+ if (diff !== 0)
148
+ return diff;
149
+ }
150
+ return 0;
151
+ };
152
+ /** Match package name allowing bare name without scope (@owlmeans/ prefix optional). */
153
+ const matchPkgName = (filter, pkgName) => {
154
+ if (filter === pkgName)
155
+ return true;
156
+ if (!filter.startsWith('@') && pkgName === `@owlmeans/${filter}`)
157
+ return true;
158
+ return false;
159
+ };
160
+ //# sourceMappingURL=discover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.js","sourceRoot":"","sources":["../src/discover.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export { discover } from './discover.js';
2
+ export type { DiscoveredEntry, Manifest, ManifestEntry, DiscoverOptions } from './discover.js';
3
+ export { detectLinked } from './linked.js';
4
+ export type { LinkedResult } from './linked.js';
5
+ export { planInstall, AUTO_GENERATED_BANNER } from './plan.js';
6
+ export type { InstallAction, InstallItem, PlanOptions } from './plan.js';
7
+ export { applyInstall } from './apply.js';
8
+ export type { ApplyResult } from './apply.js';
9
+ export { run } from './run.js';
10
+ export type { RunResult } from './run.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAE9F,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE/C,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAA;AAC9D,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAExE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACzC,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAC9B,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA"}
package/build/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export { discover } from './discover.js';
2
+ export { detectLinked } from './linked.js';
3
+ export { planInstall, AUTO_GENERATED_BANNER } from './plan.js';
4
+ export { applyInstall } from './apply.js';
5
+ export { run } from './run.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAGxC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAG1C,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAA;AAG9D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAGzC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA"}
@@ -0,0 +1,15 @@
1
+ export interface LinkedResult {
2
+ linked: boolean;
3
+ /** Symlinked package names found in node_modules. */
4
+ evidence: string[];
5
+ }
6
+ /**
7
+ * Detect whether @owlmeans/* packages in node_modules are symlinked
8
+ * (i.e. this project has them via a workspace/libraries/ dev link, not
9
+ * from the npm registry). Returns { linked: true } if any are found.
10
+ *
11
+ * A package is considered linked when its node_modules/@owlmeans/<pkg>
12
+ * entry is a symlink whose real path escapes the node_modules tree.
13
+ */
14
+ export declare const detectLinked: (targetDir: string) => LinkedResult;
15
+ //# sourceMappingURL=linked.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linked.d.ts","sourceRoot":"","sources":["../src/linked.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,OAAO,CAAA;IACf,qDAAqD;IACrD,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,GAAI,WAAW,MAAM,KAAG,YAiChD,CAAA"}
@@ -0,0 +1,44 @@
1
+ import { existsSync, readdirSync, lstatSync, realpathSync } from 'node:fs';
2
+ import { join, resolve } from 'node:path';
3
+ /**
4
+ * Detect whether @owlmeans/* packages in node_modules are symlinked
5
+ * (i.e. this project has them via a workspace/libraries/ dev link, not
6
+ * from the npm registry). Returns { linked: true } if any are found.
7
+ *
8
+ * A package is considered linked when its node_modules/@owlmeans/<pkg>
9
+ * entry is a symlink whose real path escapes the node_modules tree.
10
+ */
11
+ export const detectLinked = (targetDir) => {
12
+ const nmScope = join(targetDir, 'node_modules', '@owlmeans');
13
+ if (!existsSync(nmScope))
14
+ return { linked: false, evidence: [] };
15
+ let pkgNames;
16
+ try {
17
+ pkgNames = readdirSync(nmScope);
18
+ }
19
+ catch {
20
+ return { linked: false, evidence: [] };
21
+ }
22
+ const evidence = [];
23
+ const nmDir = resolve(join(targetDir, 'node_modules'));
24
+ for (const pkg of pkgNames) {
25
+ const pkgPath = join(nmScope, pkg);
26
+ try {
27
+ const stat = lstatSync(pkgPath);
28
+ if (stat.isSymbolicLink()) {
29
+ evidence.push(`@owlmeans/${pkg}`);
30
+ continue;
31
+ }
32
+ // Also check if realpath escapes node_modules (e.g. hoisted symlink)
33
+ const real = realpathSync(pkgPath);
34
+ if (!real.startsWith(nmDir + '/') && !real.startsWith(nmDir + '\\')) {
35
+ evidence.push(`@owlmeans/${pkg}`);
36
+ }
37
+ }
38
+ catch {
39
+ // Ignore stat errors
40
+ }
41
+ }
42
+ return { linked: evidence.length > 0, evidence };
43
+ };
44
+ //# sourceMappingURL=linked.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linked.js","sourceRoot":"","sources":["../src/linked.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAC1E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAQzC;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,SAAiB,EAAgB,EAAE;IAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,cAAc,EAAE,WAAW,CAAC,CAAA;IAC5D,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;IAEhE,IAAI,QAAkB,CAAA;IACtB,IAAI,CAAC;QACH,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;IACxC,CAAC;IAED,MAAM,QAAQ,GAAa,EAAE,CAAA;IAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,CAAA;IAEtD,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QAClC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,CAAA;YAC/B,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;gBAC1B,QAAQ,CAAC,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC,CAAA;gBACjC,SAAQ;YACV,CAAC;YACD,qEAAqE;YACrE,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,CAAA;YAClC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC;gBACpE,QAAQ,CAAC,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC,CAAA;YACnC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,qBAAqB;QACvB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAA;AAClD,CAAC,CAAA"}
@@ -0,0 +1,15 @@
1
+ import type { DiscoveredEntry } from './discover.js';
2
+ export type InstallAction = 'install' | 'skip-uptodate' | 'update' | 'conflict';
3
+ export interface InstallItem {
4
+ entry: DiscoveredEntry;
5
+ targetPath: string;
6
+ action: InstallAction;
7
+ }
8
+ /** The banner text injected by sync-agent-meta into every generated file. */
9
+ export declare const AUTO_GENERATED_BANNER = "<!-- AUTO-GENERATED \u2014 do not edit. Regenerate via sync-agent-meta. -->";
10
+ export interface PlanOptions {
11
+ /** Treat conflicts as 'overwrite' (--force). */
12
+ force?: boolean;
13
+ }
14
+ export declare const planInstall: (entries: DiscoveredEntry[], targetDir: string, opts?: PlanOptions) => InstallItem[];
15
+ //# sourceMappingURL=plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../src/plan.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAEpD,MAAM,MAAM,aAAa,GACrB,SAAS,GACT,eAAe,GACf,QAAQ,GACR,UAAU,CAAA;AAEd,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,eAAe,CAAA;IACtB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,aAAa,CAAA;CACtB;AAED,6EAA6E;AAC7E,eAAO,MAAM,qBAAqB,gFAA2E,CAAA;AAS7G,MAAM,WAAW,WAAW;IAC1B,gDAAgD;IAChD,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,eAAO,MAAM,WAAW,GACtB,SAAS,eAAe,EAAE,EAC1B,WAAW,MAAM,EACjB,OAAM,WAAgB,KACrB,WAAW,EAiCb,CAAA"}
package/build/plan.js ADDED
@@ -0,0 +1,40 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ /** The banner text injected by sync-agent-meta into every generated file. */
4
+ export const AUTO_GENERATED_BANNER = '<!-- AUTO-GENERATED — do not edit. Regenerate via sync-agent-meta. -->';
5
+ const targetPath = (targetDir, entry) => {
6
+ if (entry.kind === 'skill') {
7
+ return join(targetDir, '.claude', 'skills', entry.name, 'SKILL.md');
8
+ }
9
+ return join(targetDir, '.github', 'instructions', `${entry.name}.instructions.md`);
10
+ };
11
+ export const planInstall = (entries, targetDir, opts = {}) => {
12
+ return entries.map(entry => {
13
+ const path = targetPath(targetDir, entry);
14
+ if (!existsSync(path)) {
15
+ return { entry, targetPath: path, action: 'install' };
16
+ }
17
+ let existing;
18
+ try {
19
+ existing = readFileSync(path, 'utf8');
20
+ }
21
+ catch {
22
+ return { entry, targetPath: path, action: 'install' };
23
+ }
24
+ const source = readFileSync(entry.sourcePath, 'utf8');
25
+ if (existing === source) {
26
+ return { entry, targetPath: path, action: 'skip-uptodate' };
27
+ }
28
+ const isManaged = existing.includes(AUTO_GENERATED_BANNER);
29
+ if (isManaged) {
30
+ return { entry, targetPath: path, action: 'update' };
31
+ }
32
+ // Local edit: skip by default, overwrite if --force
33
+ return {
34
+ entry,
35
+ targetPath: path,
36
+ action: opts.force ? 'update' : 'conflict',
37
+ };
38
+ });
39
+ };
40
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../src/plan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAehC,6EAA6E;AAC7E,MAAM,CAAC,MAAM,qBAAqB,GAAG,wEAAwE,CAAA;AAE7G,MAAM,UAAU,GAAG,CAAC,SAAiB,EAAE,KAAsB,EAAU,EAAE;IACvE,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;IACrE,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC,IAAI,kBAAkB,CAAC,CAAA;AACpF,CAAC,CAAA;AAOD,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,OAA0B,EAC1B,SAAiB,EACjB,OAAoB,EAAE,EACP,EAAE;IACjB,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;QACzB,MAAM,IAAI,GAAG,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;QAEzC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;QACvD,CAAC;QAED,IAAI,QAAgB,CAAA;QACpB,IAAI,CAAC;YACH,QAAQ,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;QACvD,CAAC;QAED,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;QAErD,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;YACxB,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,CAAA;QAC7D,CAAC;QAED,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAA;QAC1D,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAA;QACtD,CAAC;QAED,oDAAoD;QACpD,OAAO;YACL,KAAK;YACL,UAAU,EAAE,IAAI;YAChB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU;SAC3C,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA"}
@@ -0,0 +1,4 @@
1
+ export declare const closeReadline: () => void;
2
+ export declare const confirm: (question: string) => Promise<boolean>;
3
+ export declare const isTTY: () => boolean;
4
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,aAAa,QAAO,IAKhC,CAAA;AAED,eAAO,MAAM,OAAO,GAAU,UAAU,MAAM,KAAG,OAAO,CAAC,OAAO,CAG/D,CAAA;AAED,eAAO,MAAM,KAAK,QAAO,OAAuC,CAAA"}
@@ -0,0 +1,21 @@
1
+ import { createInterface } from 'node:readline/promises';
2
+ import { stdin, stdout } from 'node:process';
3
+ let rl = null;
4
+ const getReadline = () => {
5
+ if (rl == null) {
6
+ rl = createInterface({ input: stdin, output: stdout });
7
+ }
8
+ return rl;
9
+ };
10
+ export const closeReadline = () => {
11
+ if (rl != null) {
12
+ rl.close();
13
+ rl = null;
14
+ }
15
+ };
16
+ export const confirm = async (question) => {
17
+ const answer = await getReadline().question(`${question} [y/N] `);
18
+ return answer.trim().toLowerCase() === 'y' || answer.trim().toLowerCase() === 'yes';
19
+ };
20
+ export const isTTY = () => process.stdin.isTTY === true;
21
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAE5C,IAAI,EAAE,GAA8C,IAAI,CAAA;AAExD,MAAM,WAAW,GAAG,GAAuC,EAAE;IAC3D,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC;QACf,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;IACxD,CAAC;IACD,OAAO,EAAE,CAAA;AACX,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,GAAS,EAAE;IACtC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC;QACf,EAAE,CAAC,KAAK,EAAE,CAAA;QACV,EAAE,GAAG,IAAI,CAAA;IACX,CAAC;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAAE,QAAgB,EAAoB,EAAE;IAClE,MAAM,MAAM,GAAG,MAAM,WAAW,EAAE,CAAC,QAAQ,CAAC,GAAG,QAAQ,SAAS,CAAC,CAAA;IACjE,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,KAAK,CAAA;AACrF,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,GAAY,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,CAAA"}
package/build/run.d.ts ADDED
@@ -0,0 +1,18 @@
1
+ import type { CliArgs } from './args.js';
2
+ export type RunResult = {
3
+ code: 0;
4
+ } | {
5
+ code: 2;
6
+ message: string;
7
+ } | {
8
+ code: 3;
9
+ message: string;
10
+ } | {
11
+ code: 4;
12
+ message: string;
13
+ } | {
14
+ code: 5;
15
+ message: string;
16
+ };
17
+ export declare const run: (args: CliArgs) => Promise<RunResult>;
18
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA+CxC,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,CAAC,CAAA;CAAE,GACX;IAAE,IAAI,EAAE,CAAC,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,CAAC,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,CAAC,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,CAAC,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AAEhC,eAAO,MAAM,GAAG,GAAU,MAAM,OAAO,KAAG,OAAO,CAAC,SAAS,CA+G1D,CAAA"}