@owlmeans/agent-skills 0.1.15 → 0.1.16

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 (77) hide show
  1. package/README.md +46 -18
  2. package/agent-meta/manifest.json +15 -99
  3. package/agent-meta/skills/agent-memory/SKILL.md +8 -7
  4. package/agent-meta/skills/getting-started/SKILL.md +2 -1
  5. package/agent-meta/skills/git/SKILL.md +2 -1
  6. package/agent-meta/skills/memory-promotion/SKILL.md +5 -4
  7. package/agent-meta/skills/memory-recompact/SKILL.md +3 -3
  8. package/agent-meta/skills/reuse-code/SKILL.md +4 -3
  9. package/agent-meta/skills/router-plugins/SKILL.md +2 -1
  10. package/agent-meta/skills/scaffolding/SKILL.md +15 -13
  11. package/agent-meta/skills/self-education/SKILL.md +10 -10
  12. package/agent-meta/skills/shadcn-versions/SKILL.md +3 -2
  13. package/agent-meta/skills/shadcn-web/SKILL.md +2 -1
  14. package/agent-meta/skills/skill-authoring/SKILL.md +44 -39
  15. package/build/apply.d.ts +2 -1
  16. package/build/apply.d.ts.map +1 -1
  17. package/build/apply.js +40 -4
  18. package/build/apply.js.map +1 -1
  19. package/build/args.d.ts +4 -2
  20. package/build/args.d.ts.map +1 -1
  21. package/build/args.js +6 -7
  22. package/build/args.js.map +1 -1
  23. package/build/discover.d.ts +8 -5
  24. package/build/discover.d.ts.map +1 -1
  25. package/build/discover.js +13 -11
  26. package/build/discover.js.map +1 -1
  27. package/build/llm/index.d.ts +13 -0
  28. package/build/llm/index.d.ts.map +1 -0
  29. package/build/llm/index.js +13 -0
  30. package/build/llm/index.js.map +1 -0
  31. package/build/llm/manifest.d.ts +30 -0
  32. package/build/llm/manifest.d.ts.map +1 -0
  33. package/build/llm/manifest.js +59 -0
  34. package/build/llm/manifest.js.map +1 -0
  35. package/build/llm/plugin.d.ts +17 -0
  36. package/build/llm/plugin.d.ts.map +1 -0
  37. package/build/llm/plugin.js +115 -0
  38. package/build/llm/plugin.js.map +1 -0
  39. package/build/llm/resolve.d.ts +4 -0
  40. package/build/llm/resolve.d.ts.map +1 -0
  41. package/build/llm/resolve.js +145 -0
  42. package/build/llm/resolve.js.map +1 -0
  43. package/build/llm/types.d.ts +59 -0
  44. package/build/llm/types.d.ts.map +1 -0
  45. package/build/llm/types.js +3 -0
  46. package/build/llm/types.js.map +1 -0
  47. package/build/plan.d.ts.map +1 -1
  48. package/build/plan.js +7 -6
  49. package/build/plan.js.map +1 -1
  50. package/build/run.d.ts.map +1 -1
  51. package/build/run.js +9 -12
  52. package/build/run.js.map +1 -1
  53. package/package.json +23 -1
  54. package/src/apply.ts +41 -4
  55. package/src/args.ts +12 -9
  56. package/src/discover.ts +13 -14
  57. package/src/llm/index.ts +13 -0
  58. package/src/llm/manifest.ts +75 -0
  59. package/src/llm/plugin.ts +133 -0
  60. package/src/llm/resolve.ts +180 -0
  61. package/src/llm/types.ts +71 -0
  62. package/src/plan.ts +8 -6
  63. package/src/run.ts +8 -11
  64. package/tests/installer.test.ts +61 -45
  65. package/tests/llm-plugin.test.ts +158 -0
  66. package/agent-meta/instructions/agent-memory.instructions.md +0 -143
  67. package/agent-meta/instructions/getting-started.instructions.md +0 -62
  68. package/agent-meta/instructions/git.instructions.md +0 -52
  69. package/agent-meta/instructions/memory-promotion.instructions.md +0 -111
  70. package/agent-meta/instructions/memory-recompact.instructions.md +0 -73
  71. package/agent-meta/instructions/reuse-code.instructions.md +0 -50
  72. package/agent-meta/instructions/router-plugins.instructions.md +0 -46
  73. package/agent-meta/instructions/scaffolding.instructions.md +0 -68
  74. package/agent-meta/instructions/self-education.instructions.md +0 -85
  75. package/agent-meta/instructions/shadcn-versions.instructions.md +0 -47
  76. package/agent-meta/instructions/shadcn-web.instructions.md +0 -95
  77. package/agent-meta/instructions/skill-authoring.instructions.md +0 -66
@@ -0,0 +1,115 @@
1
+ import { PromptBlock, resolveFileProvider } from '@owlmeans/llm-common';
2
+ import { renderSkill } from '@owlmeans/llm/prompt';
3
+ import { loadPackageSkills } from './resolve.js';
4
+ import { OWLMEANS_SCOPE } from './types.js';
5
+ export const PACKAGE_SKILLS_PLUGIN = 'owlmeans-packages';
6
+ const DEFAULT_MAX_PACKAGES = 5;
7
+ const DEFAULT_CATEGORIES = ['package-specific', 'multi-package'];
8
+ const escape = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
9
+ const textOf = (content) => {
10
+ if (typeof content === 'string') {
11
+ return content;
12
+ }
13
+ if (Array.isArray(content)) {
14
+ return content
15
+ .map(part => {
16
+ const text = part.text;
17
+ return typeof text === 'string' ? text : '';
18
+ })
19
+ .join('\n');
20
+ }
21
+ return '';
22
+ };
23
+ /**
24
+ * A prompt plugin that notices which `@owlmeans/*` packages a request talks about and
25
+ * loads their published skills into the system prompt.
26
+ *
27
+ * Everything the package documents is loaded — there is no relevance filtering, by
28
+ * design: choosing a subset would need a judgement the model is better placed to make
29
+ * than a regex, and a partial answer about an API is worse than none.
30
+ *
31
+ * The result lands in the `Packages` block, which sits behind its own cache breakpoint.
32
+ * That is the whole reason the block exists: what a request mentions changes call to
33
+ * call, and it must not shift a single byte of the role and skills every call shares.
34
+ */
35
+ export const owlmeansPackagesPlugin = (options = {}) => {
36
+ const scopes = options.scopes ?? [OWLMEANS_SCOPE];
37
+ // No dots and no trailing hyphen, so `@owlmeans/llm.` yields `@owlmeans/llm` — prose
38
+ // and code both end package names with punctuation.
39
+ const pattern = new RegExp(`(?:${scopes.map(escape).join('|')})\\/[a-z0-9](?:[a-z0-9-]*[a-z0-9])?`, 'g');
40
+ const exclude = options.exclude ?? [];
41
+ const maxPackages = options.maxPackages ?? DEFAULT_MAX_PACKAGES;
42
+ const categories = options.categories ?? [...DEFAULT_CATEGORIES];
43
+ /**
44
+ * Resolved packages, negatives included. Without caching the misses, a prompt that
45
+ * mentions a package which does not publish skills would hit GitHub on every call.
46
+ */
47
+ const cache = new Map();
48
+ /**
49
+ * Per-provider caches, keyed by the provider INSTANCE.
50
+ *
51
+ * A host's file provider is usually per-project (a sandbox, a slot, one checkout), so
52
+ * two executions can resolve the same package name to different content. Sharing one
53
+ * cache across them would serve project A's skills to project B. A `WeakMap` keeps the
54
+ * entries alive exactly as long as the provider is.
55
+ */
56
+ const perProvider = new WeakMap();
57
+ const load = (packageName, ctx) => {
58
+ // The context's provider is the specific one — it sees the project this call is
59
+ // actually about. The constructor option is the fallback for a host that wires one
60
+ // globally. Without this, a per-execution provider was never consulted at all.
61
+ const provider = resolveFileProvider(ctx.files) ?? resolveFileProvider(options.files);
62
+ const store = provider != null
63
+ ? perProvider.get(provider) ?? (() => {
64
+ const fresh = new Map();
65
+ perProvider.set(provider, fresh);
66
+ return fresh;
67
+ })()
68
+ : cache;
69
+ const pending = store.get(packageName);
70
+ if (pending != null) {
71
+ return pending;
72
+ }
73
+ const promise = loadPackageSkills(packageName, { ...options, files: provider }, categories);
74
+ store.set(packageName, promise);
75
+ return promise;
76
+ };
77
+ const detect = (ctx) => {
78
+ const found = new Set();
79
+ for (const message of ctx.messages) {
80
+ const text = textOf(message.content);
81
+ if (text === '') {
82
+ continue;
83
+ }
84
+ for (const match of text.matchAll(pattern)) {
85
+ found.add(match[0]);
86
+ }
87
+ }
88
+ // Alphabetical, not first-seen: two prompts that mention the same packages in a
89
+ // different order must still produce the same bytes.
90
+ return [...found]
91
+ .filter(name => !exclude.includes(name))
92
+ .sort()
93
+ .slice(0, maxPackages);
94
+ };
95
+ return {
96
+ alias: PACKAGE_SKILLS_PLUGIN,
97
+ order: 50,
98
+ inspect: async (ctx) => {
99
+ const names = detect(ctx);
100
+ if (names.length === 0) {
101
+ return;
102
+ }
103
+ const resolved = await Promise.all(names.map(name => load(name, ctx)));
104
+ for (const found of resolved) {
105
+ if (found == null) {
106
+ continue;
107
+ }
108
+ for (const skill of found.skills) {
109
+ ctx.add(PromptBlock.Packages, renderSkill(skill));
110
+ }
111
+ }
112
+ },
113
+ };
114
+ };
115
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/llm/plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { PackageSkills, PackageSkillsOptions } from './types.js';
2
+ /** Try each source in order of trustworthiness and cost. */
3
+ export declare const loadPackageSkills: (packageName: string, options: PackageSkillsOptions, categories: readonly string[]) => Promise<PackageSkills | null>;
4
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/llm/resolve.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AA0JrE,4DAA4D;AAC5D,eAAO,MAAM,iBAAiB,GAC5B,aAAa,MAAM,EACnB,SAAS,oBAAoB,EAC7B,YAAY,SAAS,MAAM,EAAE,KAC5B,OAAO,CAAC,aAAa,GAAG,IAAI,CAe9B,CAAA"}
@@ -0,0 +1,145 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { dirname, join, resolve as resolvePath } from 'node:path';
3
+ import { resolveFileProvider } from '@owlmeans/llm-common';
4
+ import { parseManifest, skillEntries, stripMeta, toSkill, unscoped } from './manifest.js';
5
+ const AGENT_META = 'agent-meta';
6
+ const MANIFEST = 'manifest.json';
7
+ const DEFAULT_REPO = 'owlmeans/common';
8
+ const DEFAULT_REF = 'main';
9
+ const DEFAULT_TIMEOUT = 5000;
10
+ /** Path of an embedded file relative to a project root, in the host's own terms. */
11
+ const projectPath = (packageName, ...parts) => ['node_modules', packageName, AGENT_META, ...parts].join('/');
12
+ /**
13
+ * Source 1 — the host's own file access.
14
+ *
15
+ * Tried first because it is the only one that sees the project the model is actually
16
+ * working on: a sandbox, a remote workspace, a container this process cannot reach.
17
+ */
18
+ const fromFiles = async (packageName, provider, categories) => {
19
+ const read = async (path) => {
20
+ try {
21
+ return await provider.readFile(path, true) ?? '';
22
+ }
23
+ catch {
24
+ return '';
25
+ }
26
+ };
27
+ const manifest = parseManifest(await read(projectPath(packageName, MANIFEST)));
28
+ if (manifest == null) {
29
+ return null;
30
+ }
31
+ const skills = [];
32
+ for (const entry of skillEntries(manifest, categories)) {
33
+ const body = stripMeta(await read(projectPath(packageName, entry.file)));
34
+ if (body !== '') {
35
+ skills.push(toSkill(packageName, entry, body));
36
+ }
37
+ }
38
+ return skills.length > 0
39
+ ? { packageName, version: manifest.version, source: 'files', skills }
40
+ : null;
41
+ };
42
+ /**
43
+ * Source 2 — an installed copy on this filesystem.
44
+ *
45
+ * Walks upward rather than assuming a layout: a hoisted install puts the package at the
46
+ * workspace root, a nested one puts it beside the consumer.
47
+ */
48
+ const findLocalDir = (packageName, from) => {
49
+ let current = resolvePath(from);
50
+ for (;;) {
51
+ const candidate = join(current, 'node_modules', packageName, AGENT_META);
52
+ if (existsSync(join(candidate, MANIFEST))) {
53
+ return candidate;
54
+ }
55
+ const parent = dirname(current);
56
+ if (parent === current) {
57
+ return null;
58
+ }
59
+ current = parent;
60
+ }
61
+ };
62
+ const fromLocal = (packageName, from, categories) => {
63
+ const dir = findLocalDir(packageName, from);
64
+ if (dir == null) {
65
+ return null;
66
+ }
67
+ const read = (path) => {
68
+ try {
69
+ return readFileSync(path, 'utf8');
70
+ }
71
+ catch {
72
+ return '';
73
+ }
74
+ };
75
+ const manifest = parseManifest(read(join(dir, MANIFEST)));
76
+ if (manifest == null) {
77
+ return null;
78
+ }
79
+ const skills = [];
80
+ for (const entry of skillEntries(manifest, categories)) {
81
+ const body = stripMeta(read(join(dir, ...entry.file.split('/'))));
82
+ if (body !== '') {
83
+ skills.push(toSkill(packageName, entry, body));
84
+ }
85
+ }
86
+ return skills.length > 0
87
+ ? { packageName, version: manifest.version, source: 'local', skills }
88
+ : null;
89
+ };
90
+ /**
91
+ * Source 3 — the canonical repository, for a package that is mentioned but not installed.
92
+ *
93
+ * It reads the EMBEDDED copies (`packages/<name>/agent-meta/`) rather than the canonical
94
+ * root ones: the embedded layout is uniform across packages and is exactly what the
95
+ * manifest describes, so one shape of URL works for every package.
96
+ */
97
+ const fromRemote = async (packageName, options, categories) => {
98
+ if (options.fetch === false || typeof globalThis.fetch !== 'function') {
99
+ return null;
100
+ }
101
+ const repo = options.repo ?? DEFAULT_REPO;
102
+ const ref = options.ref ?? DEFAULT_REF;
103
+ const timeout = options.timeout ?? DEFAULT_TIMEOUT;
104
+ const url = (file) => `https://raw.githubusercontent.com/${repo}/${ref}/packages/${unscoped(packageName)}/${AGENT_META}/${file}`;
105
+ // Every failure here is a miss, never a throw: a prompt plugin that breaks the call
106
+ // because GitHub was slow is worse than a prompt without one package's knowledge.
107
+ const get = async (file) => {
108
+ try {
109
+ const response = await fetch(url(file), { signal: AbortSignal.timeout(timeout) });
110
+ return response.ok ? await response.text() : '';
111
+ }
112
+ catch {
113
+ return '';
114
+ }
115
+ };
116
+ const manifest = parseManifest(await get(MANIFEST));
117
+ if (manifest == null) {
118
+ return null;
119
+ }
120
+ const entries = skillEntries(manifest, categories);
121
+ const bodies = await Promise.all(entries.map(async (entry) => stripMeta(await get(entry.file))));
122
+ const skills = entries
123
+ .map((entry, i) => ({ entry, body: bodies[i] }))
124
+ .filter(({ body }) => body !== '')
125
+ .map(({ entry, body }) => toSkill(packageName, entry, body));
126
+ return skills.length > 0
127
+ ? { packageName, version: manifest.version, source: 'remote', skills }
128
+ : null;
129
+ };
130
+ /** Try each source in order of trustworthiness and cost. */
131
+ export const loadPackageSkills = async (packageName, options, categories) => {
132
+ const provider = resolveFileProvider(options.files);
133
+ if (provider != null) {
134
+ const found = await fromFiles(packageName, provider, categories);
135
+ if (found != null) {
136
+ return found;
137
+ }
138
+ }
139
+ const local = fromLocal(packageName, options.dir ?? process.cwd(), categories);
140
+ if (local != null) {
141
+ return local;
142
+ }
143
+ return fromRemote(packageName, options, categories);
144
+ };
145
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/llm/resolve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import type { FileProviderRef, SkillDefinition } from '@owlmeans/llm-common';
2
+ /** The default scope the plugin looks for in a prompt. */
3
+ export declare const OWLMEANS_SCOPE = "@owlmeans";
4
+ /** Where a package's skills came from — surfaced in logs, useful when a lookup surprises you. */
5
+ export type SkillSource = 'files' | 'local' | 'remote';
6
+ export interface PackageSkills {
7
+ packageName: string;
8
+ version: string;
9
+ source: SkillSource;
10
+ skills: SkillDefinition[];
11
+ }
12
+ export interface PackageSkillsOptions {
13
+ /**
14
+ * Host file access, tried FIRST. It reads the consuming project's own tree, so it is
15
+ * the only path that works when the project lives somewhere this process cannot reach
16
+ * directly — a sandbox, a remote workspace, a container.
17
+ */
18
+ files?: FileProviderRef;
19
+ /** Package scopes to detect. Defaults to `['@owlmeans']`. */
20
+ scopes?: string[];
21
+ /**
22
+ * Directory the local `node_modules` lookup starts from, walking upward.
23
+ * Defaults to `process.cwd()`.
24
+ */
25
+ dir?: string;
26
+ /** GitHub `owner/repo` holding the canonical packages. Defaults to `owlmeans/common`. */
27
+ repo?: string;
28
+ /**
29
+ * Git ref to read the embedded copies from. Defaults to `main`.
30
+ *
31
+ * The manifest deliberately carries no ref of its own — version-matching is guaranteed
32
+ * by shipping the copy inside the tarball, so there is nothing to pin against for a
33
+ * package that is NOT installed. Set this to a tag when reproducibility matters more
34
+ * than freshness.
35
+ */
36
+ ref?: string;
37
+ /** Set to `false` to skip the GitHub fallback entirely (air-gapped runs). */
38
+ fetch?: boolean;
39
+ /** Milliseconds before a remote lookup is abandoned. Defaults to 5000. */
40
+ timeout?: number;
41
+ /**
42
+ * Packages to ignore — typically the ones whose skills the static `Skills` block
43
+ * already carries, so they are not paid for twice.
44
+ */
45
+ exclude?: string[];
46
+ /**
47
+ * Ceiling on how many mentioned packages are loaded into one prompt. Defaults to 5.
48
+ * A prompt that name-drops a dozen packages is usually not asking about all of them,
49
+ * and every one of them costs context.
50
+ */
51
+ maxPackages?: number;
52
+ /**
53
+ * Manifest categories to include. Defaults to package knowledge only — `general`
54
+ * entries describe how an agent should behave, not what a package does, and belong in
55
+ * the host's own skill catalogue rather than in a package lookup.
56
+ */
57
+ categories?: Array<'package-specific' | 'multi-package' | 'general'>;
58
+ }
59
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/llm/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAE5E,0DAA0D;AAC1D,eAAO,MAAM,cAAc,cAAc,CAAA;AAEzC,iGAAiG;AACjG,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAA;AAEtD,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,WAAW,CAAA;IACnB,MAAM,EAAE,eAAe,EAAE,CAAA;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC;;;;OAIG;IACH,KAAK,CAAC,EAAE,eAAe,CAAA;IAEvB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IAEjB;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IAEZ,yFAAyF;IACzF,IAAI,CAAC,EAAE,MAAM,CAAA;IAEb;;;;;;;OAOG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IAEZ,6EAA6E;IAC7E,KAAK,CAAC,EAAE,OAAO,CAAA;IAEf,0EAA0E;IAC1E,OAAO,CAAC,EAAE,MAAM,CAAA;IAEhB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAElB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IAEpB;;;;OAIG;IACH,UAAU,CAAC,EAAE,KAAK,CAAC,kBAAkB,GAAG,eAAe,GAAG,SAAS,CAAC,CAAA;CACrE"}
@@ -0,0 +1,3 @@
1
+ /** The default scope the plugin looks for in a prompt. */
2
+ export const OWLMEANS_SCOPE = '@owlmeans';
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/llm/types.ts"],"names":[],"mappings":"AAEA,0DAA0D;AAC1D,MAAM,CAAC,MAAM,cAAc,GAAG,WAAW,CAAA"}
@@ -1 +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"}
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;AAW7G,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 CHANGED
@@ -2,12 +2,13 @@ import { existsSync, readFileSync } from 'node:fs';
2
2
  import { join } from 'node:path';
3
3
  /** The banner text injected by sync-agent-meta into every generated file. */
4
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
- };
5
+ /**
6
+ * Skills install into `.agents/skills/<name>/SKILL.md` — the canonical store of the
7
+ * Agent Skills standard, discovered natively by Copilot and Codex. Claude Code reads
8
+ * them through the per-skill symlinks in `.claude/skills/` that {@link applyInstall}
9
+ * maintains.
10
+ */
11
+ const targetPath = (targetDir, entry) => join(targetDir, '.agents', 'skills', entry.name, 'SKILL.md');
11
12
  export const planInstall = (entries, targetDir, opts = {}) => {
12
13
  return entries.map(entry => {
13
14
  const path = targetPath(targetDir, entry);
package/build/plan.js.map CHANGED
@@ -1 +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"}
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;;;;;GAKG;AACH,MAAM,UAAU,GAAG,CAAC,SAAiB,EAAE,KAAsB,EAAU,EAAE,CACvE,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;AAO9D,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"}
@@ -1 +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"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA2CxC,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,CAgH1D,CAAA"}
package/build/run.js CHANGED
@@ -13,22 +13,18 @@ const ACTION_LABEL = {
13
13
  const padEnd = (s, n) => s + ' '.repeat(Math.max(0, n - s.length));
14
14
  const printTable = (items) => {
15
15
  const colWidths = {
16
- kind: 11,
17
- name: Math.max(...items.map(i => i.entry.name.length), 4) + 2,
16
+ name: Math.max(...items.map(i => i.entry.name.length), 5) + 2,
18
17
  pkg: Math.max(...items.map(i => i.entry.packageName.length), 7) + 2,
19
18
  action: 10,
20
19
  };
21
- const header = padEnd('kind', colWidths.kind) +
22
- padEnd('name', colWidths.name) +
20
+ const header = padEnd('skill', colWidths.name) +
23
21
  padEnd('package', colWidths.pkg) +
24
22
  'action';
25
23
  process.stdout.write(header + '\n');
26
24
  process.stdout.write('-'.repeat(header.length) + '\n');
27
25
  for (const item of items) {
28
- const kindLabel = item.entry.kind === 'skill' ? 'skill' : 'instruction';
29
26
  const actionLabel = ACTION_LABEL[item.action];
30
- process.stdout.write(padEnd(kindLabel, colWidths.kind) +
31
- padEnd(item.entry.name, colWidths.name) +
27
+ process.stdout.write(padEnd(item.entry.name, colWidths.name) +
32
28
  padEnd(item.entry.packageName, colWidths.pkg) +
33
29
  actionLabel +
34
30
  '\n');
@@ -45,8 +41,8 @@ export const run = async (args) => {
45
41
  const more = linked.evidence.length > 5 ? ` (+${linked.evidence.length - 5} more)` : '';
46
42
  process.stderr.write(`\nerror: linked monorepo detected — ${pkgList}${more} are symlinked.\n\n` +
47
43
  `In this setup, agents already load guidance from the linked monorepo's\n` +
48
- `root .claude/skills/ and .github/instructions/. Installing embedded copies\n` +
49
- `would place stale duplicates that conflict with the canonical live files.\n\n` +
44
+ `root AGENTS.md and .agents/skills/. Installing embedded copies would place\n` +
45
+ `stale duplicates that conflict with the canonical live files.\n\n` +
50
46
  `Pass --force only if you understand this and want to proceed anyway.\n\n`);
51
47
  return { code: 4, message: 'linked monorepo' };
52
48
  }
@@ -55,8 +51,6 @@ export const run = async (args) => {
55
51
  const entries = discover(targetDir, {
56
52
  extras: args.extras,
57
53
  only: args.only.length > 0 ? args.only : undefined,
58
- claudeOnly: args.claudeOnly,
59
- copilotOnly: args.copilotOnly,
60
54
  });
61
55
  if (entries.length === 0) {
62
56
  process.stdout.write(`No embedded @owlmeans/* agent guidance found in node_modules.\n` +
@@ -116,9 +110,12 @@ export const run = async (args) => {
116
110
  }
117
111
  }
118
112
  // 7. Apply
119
- const result = applyInstall(resolvedItems);
113
+ const result = applyInstall(resolvedItems, targetDir);
120
114
  process.stdout.write(`Done: ${result.installed} installed, ${result.updated} updated, ` +
121
115
  `${result.skipped} up-to-date, ${result.conflicts} skipped (conflicts).\n`);
116
+ if (result.linked > 0) {
117
+ process.stdout.write(`Linked ${result.linked} skill(s) into .claude/skills/ for Claude Code.\n`);
118
+ }
122
119
  return { code: 0 };
123
120
  };
124
121
  //# sourceMappingURL=run.js.map
package/build/run.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@owlmeans/agent-skills",
3
- "version": "0.1.15",
3
+ "version": "0.1.16",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -22,15 +22,37 @@
22
22
  "default": "./build/index.js",
23
23
  "module": "./build/index.js",
24
24
  "types": "./build/index.d.ts"
25
+ },
26
+ "./llm": {
27
+ "import": "./build/llm/index.js",
28
+ "require": "./build/llm/index.js",
29
+ "default": "./build/llm/index.js",
30
+ "module": "./build/llm/index.js",
31
+ "types": "./build/llm/index.d.ts"
25
32
  }
26
33
  },
27
34
  "devDependencies": {
35
+ "@langchain/core": "^1.1.39",
28
36
  "@owlmeans/dep-config": "workspace:*",
37
+ "@owlmeans/llm": "^0.1.16",
38
+ "@owlmeans/llm-common": "^0.1.16",
29
39
  "@types/bun": "^1.3.14",
30
40
  "@types/node": "^26.1.0",
31
41
  "nodemon": "^3.1.14",
32
42
  "typescript": "^6.0.3"
33
43
  },
44
+ "peerDependencies": {
45
+ "@owlmeans/llm": "^0.1.16",
46
+ "@owlmeans/llm-common": "^0.1.16"
47
+ },
48
+ "peerDependenciesMeta": {
49
+ "@owlmeans/llm": {
50
+ "optional": true
51
+ },
52
+ "@owlmeans/llm-common": {
53
+ "optional": true
54
+ }
55
+ },
34
56
  "publishConfig": {
35
57
  "access": "public"
36
58
  }
package/src/apply.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { mkdirSync, readFileSync, writeFileSync } from 'node:fs'
2
- import { dirname } from 'node:path'
1
+ import { existsSync, lstatSync, mkdirSync, readFileSync, rmSync, symlinkSync, writeFileSync } from 'node:fs'
2
+ import { dirname, join } from 'node:path'
3
3
  import type { InstallItem } from './plan.js'
4
4
 
5
5
  export interface ApplyResult {
@@ -7,18 +7,50 @@ export interface ApplyResult {
7
7
  updated: number
8
8
  skipped: number
9
9
  conflicts: number
10
+ linked: number
11
+ }
12
+
13
+ /**
14
+ * Claude Code discovers skills only under `.claude/skills/`, so every installed skill
15
+ * gets a per-skill symlink into the canonical `.agents/skills/` store. Copilot and
16
+ * Codex read `.agents/skills/` directly and need nothing here.
17
+ *
18
+ * Only projects that already carry a `.claude/` directory are bridged — a
19
+ * Copilot/Codex-only project stays free of Claude Code scaffolding. Real files are
20
+ * never replaced, and failures (Windows without symlink rights) are non-fatal.
21
+ */
22
+ const linkForClaude = (targetDir: string, names: string[]): number => {
23
+ if (!existsSync(join(targetDir, '.claude'))) return 0
24
+ const skillsDir = join(targetDir, '.claude', 'skills')
25
+ mkdirSync(skillsDir, { recursive: true })
26
+
27
+ let linked = 0
28
+ for (const name of names) {
29
+ const link = join(skillsDir, name)
30
+ try {
31
+ if (existsSync(link) || lstatSync(link, { throwIfNoEntry: false }) != null) {
32
+ if (!lstatSync(link).isSymbolicLink()) continue
33
+ rmSync(link)
34
+ }
35
+ symlinkSync(join('..', '..', '.agents', 'skills', name), link)
36
+ linked++
37
+ } catch { /* non-fatal: the repo's link-skills.sh can retry */ }
38
+ }
39
+ return linked
10
40
  }
11
41
 
12
42
  /**
13
43
  * Execute an install plan. Items with action 'conflict' or 'skip-uptodate'
14
44
  * are not written. Only 'install' and 'update' items are written.
15
45
  */
16
- export const applyInstall = (items: InstallItem[]): ApplyResult => {
17
- const result: ApplyResult = { installed: 0, updated: 0, skipped: 0, conflicts: 0 }
46
+ export const applyInstall = (items: InstallItem[], targetDir?: string): ApplyResult => {
47
+ const result: ApplyResult = { installed: 0, updated: 0, skipped: 0, conflicts: 0, linked: 0 }
48
+ const written: string[] = []
18
49
 
19
50
  for (const item of items) {
20
51
  if (item.action === 'skip-uptodate') {
21
52
  result.skipped++
53
+ written.push(item.entry.name)
22
54
  continue
23
55
  }
24
56
  if (item.action === 'conflict') {
@@ -29,10 +61,15 @@ export const applyInstall = (items: InstallItem[]): ApplyResult => {
29
61
  const content = readFileSync(item.entry.sourcePath, 'utf8')
30
62
  mkdirSync(dirname(item.targetPath), { recursive: true })
31
63
  writeFileSync(item.targetPath, content, 'utf8')
64
+ written.push(item.entry.name)
32
65
 
33
66
  if (item.action === 'install') result.installed++
34
67
  else result.updated++
35
68
  }
36
69
 
70
+ if (targetDir != null && written.length > 0) {
71
+ result.linked = linkForClaude(targetDir, written)
72
+ }
73
+
37
74
  return result
38
75
  }