skilld 1.7.2 → 1.7.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/dist/_chunks/agent.mjs +693 -599
  2. package/dist/_chunks/agent.mjs.map +1 -1
  3. package/dist/_chunks/assemble.mjs +3 -3
  4. package/dist/_chunks/assemble.mjs.map +1 -1
  5. package/dist/_chunks/author-group.mjs.map +1 -1
  6. package/dist/_chunks/author.mjs +51 -121
  7. package/dist/_chunks/author.mjs.map +1 -1
  8. package/dist/_chunks/cache.mjs +315 -9
  9. package/dist/_chunks/cache.mjs.map +1 -1
  10. package/dist/_chunks/cache2.mjs +2 -2
  11. package/dist/_chunks/cache2.mjs.map +1 -1
  12. package/dist/_chunks/cli-helpers.mjs +3 -3
  13. package/dist/_chunks/cli-helpers.mjs.map +1 -1
  14. package/dist/_chunks/core.mjs +7 -4
  15. package/dist/_chunks/detect.mjs +1 -1
  16. package/dist/_chunks/detect.mjs.map +1 -1
  17. package/dist/_chunks/embedding-cache2.mjs +2 -2
  18. package/dist/_chunks/embedding-cache2.mjs.map +1 -1
  19. package/dist/_chunks/index.d.mts +305 -112
  20. package/dist/_chunks/index.d.mts.map +1 -1
  21. package/dist/_chunks/index2.d.mts +267 -32
  22. package/dist/_chunks/index2.d.mts.map +1 -1
  23. package/dist/_chunks/index3.d.mts +32 -577
  24. package/dist/_chunks/index3.d.mts.map +1 -1
  25. package/dist/_chunks/index4.d.mts +553 -0
  26. package/dist/_chunks/index4.d.mts.map +1 -0
  27. package/dist/_chunks/install.mjs +48 -88
  28. package/dist/_chunks/install.mjs.map +1 -1
  29. package/dist/_chunks/list.mjs +1 -1
  30. package/dist/_chunks/list.mjs.map +1 -1
  31. package/dist/_chunks/lockfile.mjs +29 -6
  32. package/dist/_chunks/lockfile.mjs.map +1 -1
  33. package/dist/_chunks/markdown.mjs.map +1 -1
  34. package/dist/_chunks/monorepo.mjs +71 -0
  35. package/dist/_chunks/monorepo.mjs.map +1 -0
  36. package/dist/_chunks/package-json.mjs.map +1 -1
  37. package/dist/_chunks/{shared.mjs → package-registry.mjs} +2 -40
  38. package/dist/_chunks/package-registry.mjs.map +1 -0
  39. package/dist/_chunks/paths.mjs +49 -0
  40. package/dist/_chunks/paths.mjs.map +1 -0
  41. package/dist/_chunks/pool2.mjs +7 -2
  42. package/dist/_chunks/pool2.mjs.map +1 -1
  43. package/dist/_chunks/prepare.mjs +1 -1
  44. package/dist/_chunks/prepare.mjs.map +1 -1
  45. package/dist/_chunks/prepare2.mjs +5 -5
  46. package/dist/_chunks/prepare2.mjs.map +1 -1
  47. package/dist/_chunks/prompts.mjs +366 -18
  48. package/dist/_chunks/prompts.mjs.map +1 -1
  49. package/dist/_chunks/retriv.mjs.map +1 -1
  50. package/dist/_chunks/sanitize.mjs.map +1 -1
  51. package/dist/_chunks/search-helpers.mjs +5 -6
  52. package/dist/_chunks/search-helpers.mjs.map +1 -1
  53. package/dist/_chunks/search-interactive.mjs +1 -1
  54. package/dist/_chunks/search-interactive.mjs.map +1 -1
  55. package/dist/_chunks/search.mjs +1 -2
  56. package/dist/_chunks/search.mjs.map +1 -1
  57. package/dist/_chunks/semver.mjs +13 -0
  58. package/dist/_chunks/semver.mjs.map +1 -0
  59. package/dist/_chunks/setup.mjs.map +1 -1
  60. package/dist/_chunks/skill-installer.mjs +2 -0
  61. package/dist/_chunks/skill-installer2.mjs +155 -0
  62. package/dist/_chunks/skill-installer2.mjs.map +1 -0
  63. package/dist/_chunks/skills.mjs +10 -9
  64. package/dist/_chunks/skills.mjs.map +1 -1
  65. package/dist/_chunks/sources.mjs +575 -386
  66. package/dist/_chunks/sources.mjs.map +1 -1
  67. package/dist/_chunks/sync-pipeline.mjs +952 -0
  68. package/dist/_chunks/sync-pipeline.mjs.map +1 -0
  69. package/dist/_chunks/sync-registry.mjs +19 -13
  70. package/dist/_chunks/sync-registry.mjs.map +1 -1
  71. package/dist/_chunks/sync.mjs +797 -886
  72. package/dist/_chunks/sync.mjs.map +1 -1
  73. package/dist/_chunks/sync2.mjs +4 -2
  74. package/dist/_chunks/types.d.mts +65 -77
  75. package/dist/_chunks/types.d.mts.map +1 -1
  76. package/dist/_chunks/types2.d.mts +88 -0
  77. package/dist/_chunks/types2.d.mts.map +1 -0
  78. package/dist/_chunks/uninstall.mjs +7 -8
  79. package/dist/_chunks/uninstall.mjs.map +1 -1
  80. package/dist/_chunks/upload.mjs +2 -2
  81. package/dist/_chunks/upload.mjs.map +1 -1
  82. package/dist/_chunks/validate.mjs +1 -1
  83. package/dist/_chunks/validate.mjs.map +1 -1
  84. package/dist/_chunks/version.mjs +3 -13
  85. package/dist/_chunks/version.mjs.map +1 -1
  86. package/dist/_chunks/wizard.mjs +2 -2
  87. package/dist/_chunks/wizard.mjs.map +1 -1
  88. package/dist/_chunks/yaml.mjs.map +1 -1
  89. package/dist/agent/index.d.mts +2 -346
  90. package/dist/agent/index.mjs +2 -3
  91. package/dist/cache/index.d.mts +2 -2
  92. package/dist/cache/index.mjs +4 -3
  93. package/dist/cli.mjs +12 -13
  94. package/dist/cli.mjs.map +1 -1
  95. package/dist/index.d.mts +5 -4
  96. package/dist/index.mjs +4 -3
  97. package/dist/prepare.mjs +2 -2
  98. package/dist/prepare.mjs.map +1 -1
  99. package/dist/retriv/index.d.mts +2 -2
  100. package/dist/retriv/worker.d.mts +2 -1
  101. package/dist/retriv/worker.d.mts.map +1 -1
  102. package/dist/retriv/worker.mjs +2 -1
  103. package/dist/retriv/worker.mjs.map +1 -1
  104. package/dist/sources/index.d.mts +3 -2
  105. package/dist/sources/index.mjs +3 -3
  106. package/dist/types.d.mts +3 -3
  107. package/package.json +5 -5
  108. package/dist/_chunks/config.mjs +0 -122
  109. package/dist/_chunks/config.mjs.map +0 -1
  110. package/dist/_chunks/prefix.mjs +0 -108
  111. package/dist/_chunks/prefix.mjs.map +0 -1
  112. package/dist/_chunks/shared.mjs.map +0 -1
  113. package/dist/_chunks/skill.mjs +0 -329
  114. package/dist/_chunks/skill.mjs.map +0 -1
  115. package/dist/_chunks/sync-shared.mjs +0 -2
  116. package/dist/_chunks/sync-shared2.mjs +0 -1020
  117. package/dist/_chunks/sync-shared2.mjs.map +0 -1
  118. package/dist/agent/index.d.mts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"author-group.mjs","names":[],"sources":["../../src/commands/author-group.ts"],"sourcesContent":["import { defineCommand } from 'citty'\n\nexport const authorGroupDef = defineCommand({\n meta: { name: 'author', description: 'Create, generate, and publish skills' },\n subCommands: {\n package: () => import('./author.ts').then(m => m.authorCommandDef),\n publish: () => import('./upload.ts').then(m => m.uploadCommandDef),\n eject: () => import('./sync.ts').then(m => m.ejectCommandDef),\n validate: () => import('./validate.ts').then(m => m.validateCommandDef),\n assemble: () => import('./assemble.ts').then(m => m.assembleCommandDef),\n },\n})\n"],"mappings":";AAEA,MAAa,iBAAiB,cAAc;CAC1C,MAAM;EAAE,MAAM;EAAU,aAAa;EAAwC;CAC7E,aAAa;EACX,eAAe,OAAO,gBAAe,MAAK,MAAK,EAAE,iBAAiB;EAClE,eAAe,OAAO,gBAAe,MAAK,MAAK,EAAE,iBAAiB;EAClE,aAAa,OAAO,eAAa,MAAK,MAAK,EAAE,gBAAgB;EAC7D,gBAAgB,OAAO,kBAAiB,MAAK,MAAK,EAAE,mBAAmB;EACvE,gBAAgB,OAAO,kBAAiB,MAAK,MAAK,EAAE,mBAAA;;CAEvD,CAAC"}
1
+ {"version":3,"file":"author-group.mjs","names":[],"sources":["../../src/commands/author-group.ts"],"sourcesContent":["import { defineCommand } from 'citty'\n\nexport const authorGroupDef = defineCommand({\n meta: { name: 'author', description: 'Create, generate, and publish skills' },\n subCommands: {\n package: () => import('./author.ts').then(m => m.authorCommandDef),\n publish: () => import('./upload.ts').then(m => m.uploadCommandDef),\n eject: () => import('./sync.ts').then(m => m.ejectCommandDef),\n validate: () => import('./validate.ts').then(m => m.validateCommandDef),\n assemble: () => import('./assemble.ts').then(m => m.assembleCommandDef),\n },\n})\n"],"mappings":";AAEA,MAAa,iBAAiB,cAAc;CAC1C,MAAM;EAAE,MAAM;EAAU,aAAa;EAAwC;CAC7E,aAAa;EACX,eAAe,OAAO,gBAAe,MAAK,MAAK,EAAE,iBAAiB;EAClE,eAAe,OAAO,gBAAe,MAAK,MAAK,EAAE,iBAAiB;EAClE,aAAa,OAAO,eAAa,MAAK,MAAK,EAAE,gBAAgB;EAC7D,gBAAgB,OAAO,kBAAiB,MAAK,MAAK,EAAE,mBAAmB;EACvE,gBAAgB,OAAO,kBAAiB,MAAK,MAAK,EAAE,mBAAmB;EACxE;CACF,CAAC"}
@@ -1,78 +1,17 @@
1
- import { a as getModelLabel } from "./agent.mjs";
2
- import { t as getCacheDir } from "./version.mjs";
1
+ import { p as skillInternalDir } from "./paths.mjs";
2
+ import { P as readConfig, i as ensureCacheDir, k as defaultFeatures, t as createReferenceCache } from "./cache.mjs";
3
3
  import { i as readPackageJsonSafe, r as patchPackageJson, t as appendToJsonArray } from "./package-json.mjs";
4
4
  import { n as sanitizeMarkdown } from "./sanitize.mjs";
5
- import { r as ensureCacheDir, v as writeToCache } from "./cache.mjs";
6
- import { B as fetchGitHubIssues, H as generateIssueIndex, U as isGhAvailable, V as formatIssueAsMarkdown, b as formatDiscussionAsMarkdown, c as readLocalPackageInfo, rt as parseGitHubUrl, x as generateDiscussionIndex, y as fetchGitHubDiscussions } from "./sources.mjs";
7
- import { _ as timedSpinner, i as computeSkillDirName, n as writeGeneratedSkillMd } from "./skill.mjs";
8
- import { a as readConfig, t as defaultFeatures } from "./config.mjs";
5
+ import { D as generateDiscussionIndex, E as formatDiscussionAsMarkdown, H as formatIssueAsMarkdown, T as fetchGitHubDiscussions, U as generateIssueIndex, V as fetchGitHubIssues, W as isGhAvailable, p as readLocalPackageInfo, ut as parseGitHubUrl } from "./sources.mjs";
6
+ import { i as getModelLabel } from "./agent.mjs";
7
+ import { _ as timedSpinner, i as computeSkillDirName, n as writeGeneratedSkillMd } from "./prompts.mjs";
9
8
  import { u as guard } from "./cli-helpers.mjs";
10
- import { S as writePromptFiles, _ as linkAllReferences, b as selectLlmConfig, c as ejectReferences, l as enhanceSkillWithLLM, m as forceClearCache, o as detectChangelog } from "./sync-shared2.mjs";
11
- import { join, relative, resolve } from "pathe";
9
+ import { t as detectMonorepoPackages } from "./monorepo.mjs";
10
+ import { f as enhanceSkillWithLLM, h as writePromptFiles, l as selectLlmConfig, n as detectChangelog } from "./sync-pipeline.mjs";
12
11
  import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync } from "node:fs";
12
+ import { join, relative, resolve } from "pathe";
13
13
  import * as p from "@clack/prompts";
14
14
  import { defineCommand } from "citty";
15
- const QUOTE_PREFIX_RE = /^['"]/;
16
- const QUOTE_SUFFIX_RE = /['"]$/;
17
- function detectMonorepoPackages(cwd) {
18
- const rootResult = readPackageJsonSafe(join(cwd, "package.json"));
19
- if (!rootResult) return null;
20
- const pkg = rootResult.parsed;
21
- if (!pkg.private) return null;
22
- let patterns = [];
23
- if (Array.isArray(pkg.workspaces)) patterns = pkg.workspaces;
24
- else if (pkg.workspaces?.packages) patterns = pkg.workspaces.packages;
25
- if (patterns.length === 0) {
26
- const pnpmWs = join(cwd, "pnpm-workspace.yaml");
27
- if (existsSync(pnpmWs)) {
28
- const lines = readFileSync(pnpmWs, "utf-8").split("\n");
29
- for (const line of lines) {
30
- const trimmed = line.trim();
31
- if (!trimmed.startsWith("-")) continue;
32
- const value = trimmed.slice(1).trim().replace(QUOTE_PREFIX_RE, "").replace(QUOTE_SUFFIX_RE, "");
33
- if (value) patterns.push(value);
34
- }
35
- }
36
- }
37
- if (patterns.length === 0) return null;
38
- const packages = [];
39
- for (const pattern of patterns) {
40
- const scanDir = resolve(cwd, pattern.replace(/\/?\*+$/, ""));
41
- if (!existsSync(scanDir)) continue;
42
- const directResult = readPackageJsonSafe(join(scanDir, "package.json"));
43
- if (directResult) {
44
- const directPkg = directResult.parsed;
45
- if (!directPkg.private && directPkg.name) {
46
- const repoUrl = typeof directPkg.repository === "string" ? directPkg.repository : directPkg.repository?.url?.replace(/^git\+/, "").replace(/\.git$/, "");
47
- packages.push({
48
- name: directPkg.name,
49
- version: directPkg.version || "0.0.0",
50
- description: directPkg.description,
51
- repoUrl,
52
- dir: scanDir
53
- });
54
- continue;
55
- }
56
- }
57
- for (const entry of readdirSync(scanDir, { withFileTypes: true })) {
58
- if (!entry.isDirectory()) continue;
59
- const childResult = readPackageJsonSafe(join(scanDir, entry.name, "package.json"));
60
- if (!childResult) continue;
61
- const childPkg = childResult.parsed;
62
- if (childPkg.private) continue;
63
- if (!childPkg.name) continue;
64
- const repoUrl = typeof childPkg.repository === "string" ? childPkg.repository : childPkg.repository?.url?.replace(/^git\+/, "").replace(/\.git$/, "");
65
- packages.push({
66
- name: childPkg.name,
67
- version: childPkg.version || "0.0.0",
68
- description: childPkg.description,
69
- repoUrl,
70
- dir: join(scanDir, entry.name)
71
- });
72
- }
73
- }
74
- return packages.length > 0 ? packages : null;
75
- }
76
15
  function walkMarkdownFiles(dir, base = "") {
77
16
  const results = [];
78
17
  if (!existsSync(dir)) return results;
@@ -87,9 +26,9 @@ function walkMarkdownFiles(dir, base = "") {
87
26
  }
88
27
  return results;
89
28
  }
90
- function resolveLocalDocs(packageDir, packageName, version, monorepoRoot) {
29
+ function resolveLocalDocs(cache, packageDir, monorepoRoot) {
91
30
  const cachedDocs = [];
92
- const cacheChangelog = () => cacheLocalChangelog(packageDir, packageName, version, monorepoRoot);
31
+ const cacheChangelog = () => cacheLocalChangelog(cache, packageDir, monorepoRoot);
93
32
  const docsDir = join(packageDir, "docs");
94
33
  if (existsSync(docsDir)) {
95
34
  const mdFiles = walkMarkdownFiles(docsDir);
@@ -98,7 +37,7 @@ function resolveLocalDocs(packageDir, packageName, version, monorepoRoot) {
98
37
  path: `docs/${f.path}`,
99
38
  content: sanitizeMarkdown(f.content)
100
39
  });
101
- writeToCache(packageName, version, cachedDocs);
40
+ cache.write(cachedDocs);
102
41
  cacheChangelog();
103
42
  return {
104
43
  docsType: "docs",
@@ -115,7 +54,7 @@ function resolveLocalDocs(packageDir, packageName, version, monorepoRoot) {
115
54
  path: `docs/${f.path}`,
116
55
  content: sanitizeMarkdown(f.content)
117
56
  });
118
- writeToCache(packageName, version, cachedDocs);
57
+ cache.write(cachedDocs);
119
58
  cacheChangelog();
120
59
  return {
121
60
  docsType: "docs",
@@ -131,7 +70,7 @@ function resolveLocalDocs(packageDir, packageName, version, monorepoRoot) {
131
70
  path: "llms.txt",
132
71
  content: sanitizeMarkdown(readFileSync(llmsPath, "utf-8"))
133
72
  });
134
- writeToCache(packageName, version, cachedDocs);
73
+ cache.write(cachedDocs);
135
74
  cacheChangelog();
136
75
  return {
137
76
  docsType: "llms.txt",
@@ -146,7 +85,7 @@ function resolveLocalDocs(packageDir, packageName, version, monorepoRoot) {
146
85
  path: "docs/README.md",
147
86
  content: sanitizeMarkdown(readFileSync(join(dir, readmeFile), "utf-8"))
148
87
  });
149
- writeToCache(packageName, version, cachedDocs);
88
+ cache.write(cachedDocs);
150
89
  cacheChangelog();
151
90
  return {
152
91
  docsType: "readme",
@@ -160,17 +99,17 @@ function resolveLocalDocs(packageDir, packageName, version, monorepoRoot) {
160
99
  docSource: "none"
161
100
  };
162
101
  }
163
- function cacheLocalChangelog(dir, packageName, version, monorepoRoot) {
102
+ function cacheLocalChangelog(cache, dir, monorepoRoot) {
164
103
  const candidates = ["CHANGELOG.md", "changelog.md"];
165
104
  const changelogFile = candidates.find((f) => existsSync(join(dir, f))) || (monorepoRoot ? candidates.find((f) => existsSync(join(monorepoRoot, f))) : void 0);
166
105
  const changelogDir = changelogFile && existsSync(join(dir, changelogFile)) ? dir : monorepoRoot;
167
- if (changelogFile && changelogDir) writeToCache(packageName, version, [{
106
+ if (changelogFile && changelogDir) cache.write([{
168
107
  path: `releases/${changelogFile}`,
169
108
  content: sanitizeMarkdown(readFileSync(join(changelogDir, changelogFile), "utf-8"))
170
109
  }]);
171
110
  }
172
111
  async function fetchRemoteSupplements(opts) {
173
- const { packageName, version, repoUrl, features, onProgress } = opts;
112
+ const { cache, repoUrl, features, onProgress } = opts;
174
113
  if (!repoUrl || !isGhAvailable()) return {
175
114
  hasIssues: false,
176
115
  hasDiscussions: false
@@ -180,19 +119,18 @@ async function fetchRemoteSupplements(opts) {
180
119
  hasIssues: false,
181
120
  hasDiscussions: false
182
121
  };
183
- const cacheDir = getCacheDir(packageName, version);
184
122
  let hasIssues = false;
185
- const issuesDir = join(cacheDir, "issues");
123
+ const issuesDir = join(cache.dir, "issues");
186
124
  if (features.issues && !existsSync(issuesDir)) {
187
125
  onProgress("Fetching issues via GitHub API");
188
126
  const issues = await fetchGitHubIssues(gh.owner, gh.repo, 30).catch(() => []);
189
127
  if (issues.length > 0) {
190
128
  onProgress(`Caching ${issues.length} issues`);
191
- writeToCache(packageName, version, issues.map((issue) => ({
129
+ cache.write(issues.map((issue) => ({
192
130
  path: `issues/issue-${issue.number}.md`,
193
131
  content: formatIssueAsMarkdown(issue)
194
132
  })));
195
- writeToCache(packageName, version, [{
133
+ cache.write([{
196
134
  path: "issues/_INDEX.md",
197
135
  content: generateIssueIndex(issues)
198
136
  }]);
@@ -200,17 +138,17 @@ async function fetchRemoteSupplements(opts) {
200
138
  }
201
139
  } else hasIssues = features.issues && existsSync(issuesDir);
202
140
  let hasDiscussions = false;
203
- const discussionsDir = join(cacheDir, "discussions");
141
+ const discussionsDir = join(cache.dir, "discussions");
204
142
  if (features.discussions && !existsSync(discussionsDir)) {
205
143
  onProgress("Fetching discussions via GitHub API");
206
144
  const discussions = await fetchGitHubDiscussions(gh.owner, gh.repo, 20).catch(() => []);
207
145
  if (discussions.length > 0) {
208
146
  onProgress(`Caching ${discussions.length} discussions`);
209
- writeToCache(packageName, version, discussions.map((d) => ({
147
+ cache.write(discussions.map((d) => ({
210
148
  path: `discussions/discussion-${d.number}.md`,
211
149
  content: formatDiscussionAsMarkdown(d)
212
150
  })));
213
- writeToCache(packageName, version, [{
151
+ cache.write([{
214
152
  path: "discussions/_INDEX.md",
215
153
  content: generateDiscussionIndex(discussions)
216
154
  }]);
@@ -251,17 +189,17 @@ async function authorSinglePackage(opts) {
251
189
  force: true
252
190
  });
253
191
  mkdirSync(outDir, { recursive: true });
254
- if (opts.force) forceClearCache(packageName, version);
192
+ const cache = createReferenceCache(packageName, version);
193
+ if (opts.force) cache.clearForce();
255
194
  ensureCacheDir();
256
195
  const features = readConfig().features ?? defaultFeatures;
257
196
  spin.start("Resolving local docs");
258
- const { docsType, docSource } = resolveLocalDocs(packageDir, packageName, version, opts.monorepoRoot);
197
+ const { docsType, docSource } = resolveLocalDocs(cache, packageDir, opts.monorepoRoot);
259
198
  spin.stop(`Resolved docs: ${docSource}`);
260
199
  const supSpin = timedSpinner();
261
200
  supSpin.start("Checking remote supplements");
262
201
  const { hasIssues, hasDiscussions } = await fetchRemoteSupplements({
263
- packageName,
264
- version,
202
+ cache,
265
203
  repoUrl: opts.repoUrl,
266
204
  features,
267
205
  onProgress: (msg) => supSpin.message(msg)
@@ -270,10 +208,9 @@ async function authorSinglePackage(opts) {
270
208
  if (hasIssues) supParts.push("issues");
271
209
  if (hasDiscussions) supParts.push("discussions");
272
210
  supSpin.stop(supParts.length > 0 ? `Fetched ${supParts.join(", ")}` : "No remote supplements");
273
- linkAllReferences(outDir, packageName, packageDir, version, docsType, void 0, features);
274
- const cacheDir = getCacheDir(packageName, version);
275
- const hasChangelog = detectChangelog(packageDir, cacheDir);
276
- const hasReleases = existsSync(join(cacheDir, "releases"));
211
+ cache.linkInto(outDir, packageDir, docsType, { features });
212
+ const hasChangelog = detectChangelog(packageDir, cache.dir);
213
+ const hasReleases = existsSync(join(cache.dir, "releases"));
277
214
  writeGeneratedSkillMd(outDir, {
278
215
  name: packageName,
279
216
  version,
@@ -292,50 +229,43 @@ async function authorSinglePackage(opts) {
292
229
  eject: true
293
230
  });
294
231
  p.log.success(`Created base skill: ${relative(packageDir, outDir)}`);
295
- const skilldDir = join(outDir, ".skilld");
232
+ const skilldDir = skillInternalDir(outDir);
296
233
  try {
297
234
  const llmConfig = opts.llmConfig;
298
- if (llmConfig?.promptOnly) writePromptFiles({
235
+ const baseCtx = {
299
236
  packageName,
300
- skillDir: outDir,
301
237
  version,
302
- hasIssues,
303
- hasDiscussions,
304
- hasReleases,
305
- hasChangelog,
306
- docsType,
307
- hasShippedDocs: false,
308
- pkgFiles: [],
309
- sections: llmConfig.sections,
310
- customPrompt: llmConfig.customPrompt,
238
+ skillDir: outDir,
239
+ dirName: sanitizedName,
240
+ references: {
241
+ docsType,
242
+ hasShippedDocs: false,
243
+ pkgFiles: [],
244
+ hasIssues,
245
+ hasDiscussions,
246
+ hasReleases,
247
+ hasChangelog
248
+ },
249
+ resolved: { repoUrl: opts.repoUrl },
250
+ relatedSkills: [],
311
251
  features
252
+ };
253
+ if (llmConfig?.promptOnly) writePromptFiles(baseCtx, {
254
+ sections: llmConfig.sections,
255
+ customPrompt: llmConfig.customPrompt
312
256
  });
313
257
  else if (llmConfig) {
314
258
  p.log.step(getModelLabel(llmConfig.model));
315
- await enhanceSkillWithLLM({
316
- packageName,
317
- version,
318
- skillDir: outDir,
319
- dirName: sanitizedName,
259
+ await enhanceSkillWithLLM(baseCtx, {
320
260
  model: llmConfig.model,
321
- resolved: { repoUrl: opts.repoUrl },
322
- relatedSkills: [],
323
- hasIssues,
324
- hasDiscussions,
325
- hasReleases,
326
- hasChangelog,
327
- docsType,
328
- hasShippedDocs: false,
329
- pkgFiles: [],
330
261
  force: opts.force,
331
262
  debug: opts.debug,
332
263
  sections: llmConfig.sections,
333
264
  customPrompt: llmConfig.customPrompt,
334
- features,
335
265
  eject: true
336
266
  });
337
267
  }
338
- ejectReferences(outDir, packageName, packageDir, version, docsType, features);
268
+ cache.eject(outDir, packageDir, docsType, { features });
339
269
  } finally {
340
270
  if (existsSync(skilldDir)) rmSync(skilldDir, {
341
271
  recursive: true,
@@ -1 +1 @@
1
- {"version":3,"file":"author.mjs","names":[],"sources":["../../src/commands/author.ts"],"sourcesContent":["import type { OptimizeModel } from '../agent/index.ts'\nimport type { FeaturesConfig } from '../core/config.ts'\nimport type { LlmConfig } from './sync-shared.ts'\nimport { existsSync, mkdirSync, readdirSync, readFileSync, rmSync } from 'node:fs'\nimport * as p from '@clack/prompts'\nimport { defineCommand } from 'citty'\nimport { join, relative, resolve } from 'pathe'\nimport {\n computeSkillDirName,\n getModelLabel,\n writeGeneratedSkillMd,\n} from '../agent/index.ts'\nimport {\n ensureCacheDir,\n getCacheDir,\n writeToCache,\n} from '../cache/index.ts'\nimport { guard } from '../cli-helpers.ts'\nimport { defaultFeatures, readConfig } from '../core/config.ts'\nimport { timedSpinner } from '../core/formatting.ts'\nimport { appendToJsonArray, patchPackageJson, readPackageJsonSafe } from '../core/package-json.ts'\nimport { sanitizeMarkdown } from '../core/sanitize.ts'\nimport {\n fetchGitHubDiscussions,\n fetchGitHubIssues,\n formatDiscussionAsMarkdown,\n formatIssueAsMarkdown,\n generateDiscussionIndex,\n generateIssueIndex,\n isGhAvailable,\n parseGitHubUrl,\n readLocalPackageInfo,\n} from '../sources/index.ts'\nimport {\n detectChangelog,\n ejectReferences,\n enhanceSkillWithLLM,\n forceClearCache,\n linkAllReferences,\n selectLlmConfig,\n writePromptFiles,\n} from './sync-shared.ts'\n\nconst QUOTE_PREFIX_RE = /^['\"]/\nconst QUOTE_SUFFIX_RE = /['\"]$/\n\n// ── Monorepo detection ──\n\nexport interface MonorepoPackage {\n name: string\n version: string\n description?: string\n repoUrl?: string\n dir: string\n}\n\nexport function detectMonorepoPackages(cwd: string): MonorepoPackage[] | null {\n const rootResult = readPackageJsonSafe(join(cwd, 'package.json'))\n if (!rootResult)\n return null\n\n const pkg = rootResult.parsed as Record<string, any>\n\n // Must be private (monorepo root) with workspaces or pnpm-workspace.yaml\n if (!pkg.private)\n return null\n\n let patterns: string[] = []\n\n if (Array.isArray(pkg.workspaces)) {\n patterns = pkg.workspaces\n }\n else if (pkg.workspaces?.packages) {\n patterns = pkg.workspaces.packages\n }\n\n // Check pnpm-workspace.yaml\n if (patterns.length === 0) {\n const pnpmWs = join(cwd, 'pnpm-workspace.yaml')\n if (existsSync(pnpmWs)) {\n const lines = readFileSync(pnpmWs, 'utf-8').split('\\n')\n for (const line of lines) {\n const trimmed = line.trim()\n if (!trimmed.startsWith('-'))\n continue\n const value = trimmed.slice(1).trim().replace(QUOTE_PREFIX_RE, '').replace(QUOTE_SUFFIX_RE, '')\n if (value)\n patterns.push(value)\n }\n }\n }\n\n if (patterns.length === 0)\n return null\n\n const packages: MonorepoPackage[] = []\n\n for (const pattern of patterns) {\n // Expand simple glob: \"packages/*\" → scan packages/*/package.json\n const base = pattern.replace(/\\/?\\*+$/, '')\n const scanDir = resolve(cwd, base)\n if (!existsSync(scanDir))\n continue\n\n const directResult = readPackageJsonSafe(join(scanDir, 'package.json'))\n if (directResult) {\n const directPkg = directResult.parsed as Record<string, any>\n if (!directPkg.private && directPkg.name) {\n const repoUrl = typeof directPkg.repository === 'string'\n ? directPkg.repository\n : directPkg.repository?.url?.replace(/^git\\+/, '').replace(/\\.git$/, '')\n\n packages.push({\n name: directPkg.name,\n version: directPkg.version || '0.0.0',\n description: directPkg.description,\n repoUrl,\n dir: scanDir,\n })\n continue\n }\n }\n\n for (const entry of readdirSync(scanDir, { withFileTypes: true })) {\n if (!entry.isDirectory())\n continue\n const childResult = readPackageJsonSafe(join(scanDir, entry.name, 'package.json'))\n if (!childResult)\n continue\n\n const childPkg = childResult.parsed as Record<string, any>\n if (childPkg.private)\n continue\n if (!childPkg.name)\n continue\n\n const repoUrl = typeof childPkg.repository === 'string'\n ? childPkg.repository\n : childPkg.repository?.url?.replace(/^git\\+/, '').replace(/\\.git$/, '')\n\n packages.push({\n name: childPkg.name,\n version: childPkg.version || '0.0.0',\n description: childPkg.description,\n repoUrl,\n dir: join(scanDir, entry.name),\n })\n }\n }\n\n return packages.length > 0 ? packages : null\n}\n\n// ── Docs resolution ──\n\nfunction walkMarkdownFiles(dir: string, base = ''): Array<{ path: string, content: string }> {\n const results: Array<{ path: string, content: string }> = []\n if (!existsSync(dir))\n return results\n\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n const rel = base ? `${base}/${entry.name}` : entry.name\n const full = join(dir, entry.name)\n if (entry.isDirectory()) {\n results.push(...walkMarkdownFiles(full, rel))\n }\n else if (/\\.mdx?$/.test(entry.name)) {\n results.push({ path: rel, content: readFileSync(full, 'utf-8') })\n }\n }\n return results\n}\n\n/**\n * Resolve docs from local filesystem. Cascade:\n * 1. Package-level docs/ directory\n * 2. Monorepo-root docs/ directory (if monorepoRoot provided)\n * 3. Monorepo-root docs/content/ (Nuxt Content convention)\n * 4. llms.txt in package dir\n * 5. README.md in package dir\n */\nfunction resolveLocalDocs(\n packageDir: string,\n packageName: string,\n version: string,\n monorepoRoot?: string,\n): { docsType: 'docs' | 'llms.txt' | 'readme', docSource: string } {\n const cachedDocs: Array<{ path: string, content: string }> = []\n\n const cacheChangelog = () => cacheLocalChangelog(packageDir, packageName, version, monorepoRoot)\n\n // 1. Package-level docs/\n const docsDir = join(packageDir, 'docs')\n if (existsSync(docsDir)) {\n const mdFiles = walkMarkdownFiles(docsDir)\n if (mdFiles.length > 0) {\n for (const f of mdFiles)\n cachedDocs.push({ path: `docs/${f.path}`, content: sanitizeMarkdown(f.content) })\n writeToCache(packageName, version, cachedDocs)\n cacheChangelog()\n return { docsType: 'docs', docSource: `local docs/ (${mdFiles.length} files)` }\n }\n }\n\n // 2. Monorepo-root docs/ or docs/content/\n if (monorepoRoot) {\n for (const candidate of ['docs/content', 'docs']) {\n const rootDocsDir = join(monorepoRoot, candidate)\n if (existsSync(rootDocsDir)) {\n const mdFiles = walkMarkdownFiles(rootDocsDir)\n if (mdFiles.length > 0) {\n for (const f of mdFiles)\n cachedDocs.push({ path: `docs/${f.path}`, content: sanitizeMarkdown(f.content) })\n writeToCache(packageName, version, cachedDocs)\n cacheChangelog()\n return { docsType: 'docs', docSource: `monorepo ${candidate}/ (${mdFiles.length} files)` }\n }\n }\n }\n }\n\n // 3. llms.txt (package dir, then monorepo root)\n for (const dir of [packageDir, monorepoRoot].filter(Boolean) as string[]) {\n const llmsPath = join(dir, 'llms.txt')\n if (existsSync(llmsPath)) {\n cachedDocs.push({ path: 'llms.txt', content: sanitizeMarkdown(readFileSync(llmsPath, 'utf-8')) })\n writeToCache(packageName, version, cachedDocs)\n cacheChangelog()\n const source = dir === packageDir ? 'local llms.txt' : 'monorepo llms.txt'\n return { docsType: 'llms.txt', docSource: source }\n }\n }\n\n // 4. README.md (package dir, then monorepo root)\n for (const dir of [packageDir, monorepoRoot].filter(Boolean) as string[]) {\n const readmeFile = readdirSync(dir).find(f => /^readme\\.md$/i.test(f))\n if (readmeFile) {\n cachedDocs.push({ path: 'docs/README.md', content: sanitizeMarkdown(readFileSync(join(dir, readmeFile), 'utf-8')) })\n writeToCache(packageName, version, cachedDocs)\n cacheChangelog()\n const source = dir === packageDir ? 'local README.md' : 'monorepo README.md'\n return { docsType: 'readme', docSource: source }\n }\n }\n\n cacheChangelog()\n return { docsType: 'readme', docSource: 'none' }\n}\n\nfunction cacheLocalChangelog(dir: string, packageName: string, version: string, monorepoRoot?: string): void {\n const candidates = ['CHANGELOG.md', 'changelog.md']\n const changelogFile = candidates.find(f => existsSync(join(dir, f)))\n || (monorepoRoot ? candidates.find(f => existsSync(join(monorepoRoot, f))) : undefined)\n const changelogDir = changelogFile && existsSync(join(dir, changelogFile)) ? dir : monorepoRoot\n if (changelogFile && changelogDir) {\n writeToCache(packageName, version, [{\n path: `releases/${changelogFile}`,\n content: sanitizeMarkdown(readFileSync(join(changelogDir, changelogFile), 'utf-8')),\n }])\n }\n}\n\n// ── Remote supplements ──\n\nasync function fetchRemoteSupplements(opts: {\n packageName: string\n version: string\n repoUrl?: string\n features: FeaturesConfig\n onProgress: (msg: string) => void\n}): Promise<{ hasIssues: boolean, hasDiscussions: boolean }> {\n const { packageName, version, repoUrl, features, onProgress } = opts\n\n if (!repoUrl || !isGhAvailable())\n return { hasIssues: false, hasDiscussions: false }\n\n const gh = parseGitHubUrl(repoUrl)\n if (!gh)\n return { hasIssues: false, hasDiscussions: false }\n\n const cacheDir = getCacheDir(packageName, version)\n\n let hasIssues = false\n const issuesDir = join(cacheDir, 'issues')\n if (features.issues && !existsSync(issuesDir)) {\n onProgress('Fetching issues via GitHub API')\n const issues = await fetchGitHubIssues(gh.owner, gh.repo, 30).catch(() => [])\n if (issues.length > 0) {\n onProgress(`Caching ${issues.length} issues`)\n writeToCache(packageName, version, issues.map(issue => ({\n path: `issues/issue-${issue.number}.md`,\n content: formatIssueAsMarkdown(issue),\n })))\n writeToCache(packageName, version, [{\n path: 'issues/_INDEX.md',\n content: generateIssueIndex(issues),\n }])\n hasIssues = true\n }\n }\n else {\n hasIssues = features.issues && existsSync(issuesDir)\n }\n\n let hasDiscussions = false\n const discussionsDir = join(cacheDir, 'discussions')\n if (features.discussions && !existsSync(discussionsDir)) {\n onProgress('Fetching discussions via GitHub API')\n const discussions = await fetchGitHubDiscussions(gh.owner, gh.repo, 20).catch(() => [])\n if (discussions.length > 0) {\n onProgress(`Caching ${discussions.length} discussions`)\n writeToCache(packageName, version, discussions.map(d => ({\n path: `discussions/discussion-${d.number}.md`,\n content: formatDiscussionAsMarkdown(d),\n })))\n writeToCache(packageName, version, [{\n path: 'discussions/_INDEX.md',\n content: generateDiscussionIndex(discussions),\n }])\n hasDiscussions = true\n }\n }\n else {\n hasDiscussions = features.discussions && existsSync(discussionsDir)\n }\n\n return { hasIssues, hasDiscussions }\n}\n\n// ── package.json patching ──\n\nexport function patchPackageJsonFiles(packageDir: string): void {\n const pkgPath = join(packageDir, 'package.json')\n if (!existsSync(pkgPath))\n return\n\n const wrote = patchPackageJson(pkgPath, (raw, pkg) => {\n if (!Array.isArray(pkg.files)) {\n p.log.warn('No `files` array in package.json. Add `\"skills\"` to your files array manually.')\n return null\n }\n\n if ((pkg.files as string[]).some((f: string) => f === 'skills' || f === 'skills/' || f === 'skills/**'))\n return null\n\n return appendToJsonArray(raw, ['files'], 'skills')\n })\n\n if (wrote)\n p.log.success('Added `\"skills\"` to package.json files array')\n}\n\n// ── Core author flow for a single package ──\n\nasync function authorSinglePackage(opts: {\n packageDir: string\n packageName: string\n version: string\n description?: string\n repoUrl?: string\n monorepoRoot?: string\n out?: string\n llmConfig?: LlmConfig | null\n force?: boolean\n debug?: boolean\n}): Promise<string | null> {\n const { packageDir, packageName, version } = opts\n const spin = timedSpinner()\n\n const sanitizedName = computeSkillDirName(packageName)\n const outDir = opts.out ? resolve(packageDir, opts.out) : join(packageDir, 'skills', sanitizedName)\n\n // Validate --out doesn't point at the package root or a parent\n if (opts.out) {\n const rel = relative(packageDir, outDir)\n if (!rel || rel === '.' || rel.startsWith('..')) {\n p.log.error('--out must point to a child directory, not the package root or a parent')\n return null\n }\n }\n\n if (existsSync(outDir))\n rmSync(outDir, { recursive: true, force: true })\n mkdirSync(outDir, { recursive: true })\n\n if (opts.force) {\n forceClearCache(packageName, version)\n }\n\n ensureCacheDir()\n const features = readConfig().features ?? defaultFeatures\n\n // Resolve local docs\n spin.start('Resolving local docs')\n const { docsType, docSource } = resolveLocalDocs(packageDir, packageName, version, opts.monorepoRoot)\n spin.stop(`Resolved docs: ${docSource}`)\n\n // Fetch remote supplements (issues/discussions)\n const supSpin = timedSpinner()\n supSpin.start('Checking remote supplements')\n const { hasIssues, hasDiscussions } = await fetchRemoteSupplements({\n packageName,\n version,\n repoUrl: opts.repoUrl,\n features,\n onProgress: msg => supSpin.message(msg),\n })\n const supParts: string[] = []\n if (hasIssues)\n supParts.push('issues')\n if (hasDiscussions)\n supParts.push('discussions')\n supSpin.stop(supParts.length > 0 ? `Fetched ${supParts.join(', ')}` : 'No remote supplements')\n\n // Create temporary .skilld/ symlinks (LLM needs these to read docs)\n linkAllReferences(outDir, packageName, packageDir, version, docsType, undefined, features)\n\n // Detect changelog + releases\n const cacheDir = getCacheDir(packageName, version)\n const hasChangelog = detectChangelog(packageDir, cacheDir)\n const hasReleases = existsSync(join(cacheDir, 'releases'))\n\n // Generate base SKILL.md\n writeGeneratedSkillMd(outDir, {\n name: packageName,\n version,\n description: opts.description,\n relatedSkills: [],\n hasIssues,\n hasDiscussions,\n hasReleases,\n hasChangelog,\n docsType,\n hasShippedDocs: false,\n pkgFiles: [],\n dirName: sanitizedName,\n repoUrl: opts.repoUrl,\n features,\n eject: true,\n })\n p.log.success(`Created base skill: ${relative(packageDir, outDir)}`)\n\n // LLM enhancement (config resolved by caller)\n const skilldDir = join(outDir, '.skilld')\n try {\n const llmConfig = opts.llmConfig\n if (llmConfig?.promptOnly) {\n writePromptFiles({\n packageName,\n skillDir: outDir,\n version,\n hasIssues,\n hasDiscussions,\n hasReleases,\n hasChangelog,\n docsType,\n hasShippedDocs: false,\n pkgFiles: [],\n sections: llmConfig.sections,\n customPrompt: llmConfig.customPrompt,\n features,\n })\n }\n else if (llmConfig) {\n p.log.step(getModelLabel(llmConfig.model))\n await enhanceSkillWithLLM({\n packageName,\n version,\n skillDir: outDir,\n dirName: sanitizedName,\n model: llmConfig.model,\n resolved: { repoUrl: opts.repoUrl },\n relatedSkills: [],\n hasIssues,\n hasDiscussions,\n hasReleases,\n hasChangelog,\n docsType,\n hasShippedDocs: false,\n pkgFiles: [],\n force: opts.force,\n debug: opts.debug,\n sections: llmConfig.sections,\n customPrompt: llmConfig.customPrompt,\n features,\n eject: true,\n })\n }\n\n ejectReferences(outDir, packageName, packageDir, version, docsType, features)\n }\n finally {\n // Always clean up .skilld/ symlinks, even if LLM enhancement fails\n if (existsSync(skilldDir))\n rmSync(skilldDir, { recursive: true, force: true })\n }\n\n // Only patch package.json when output is under skills/\n const relOut = relative(packageDir, outDir)\n if (relOut === 'skills' || relOut.startsWith('skills/'))\n patchPackageJsonFiles(packageDir)\n else if (opts.out)\n p.log.info('Output is outside skills/, skipping package.json patch. Add the path to \"files\" manually if publishing.')\n\n return outDir\n}\n\n// ── Main command ──\n\nasync function resolveLlmConfig(model?: OptimizeModel, yes?: boolean): Promise<LlmConfig | null | undefined> {\n const globalConfig = readConfig()\n if (globalConfig.skipLlm || (yes && !model))\n return undefined\n return selectLlmConfig(model, 'Generate skill sections')\n}\n\nasync function authorCommand(opts: {\n out?: string\n model?: OptimizeModel\n yes?: boolean\n force?: boolean\n debug?: boolean\n}): Promise<void> {\n const cwd = process.cwd()\n\n // Check for monorepo\n const monoPackages = detectMonorepoPackages(cwd)\n\n if (monoPackages && monoPackages.length > 0) {\n p.intro(`\\x1B[1m\\x1B[35mskilld\\x1B[0m author \\x1B[90m(monorepo: ${monoPackages.length} packages)\\x1B[0m`)\n\n if (opts.out) {\n p.log.error('--out is not supported in monorepo mode (each package gets its own skills/ directory)')\n return\n }\n\n const selected = guard(await p.multiselect({\n message: 'Which packages should ship skills?',\n options: monoPackages.map(pkg => ({\n label: pkg.name,\n value: pkg,\n hint: pkg.description,\n })),\n }))\n\n if (selected.length === 0)\n return\n\n // Resolve LLM config once for all packages\n const llmConfig = await resolveLlmConfig(opts.model, opts.yes)\n if (llmConfig === null) {\n p.cancel('Cancelled')\n return\n }\n\n // Resolve monorepo-level repoUrl for packages that lack their own\n const rootPkgResult = readPackageJsonSafe(join(cwd, 'package.json'))\n const rootPkg = rootPkgResult?.parsed as Record<string, any> | undefined\n const rootRepoUrl = typeof rootPkg?.repository === 'string'\n ? rootPkg.repository\n : rootPkg?.repository?.url?.replace(/^git\\+/, '').replace(/\\.git$/, '')\n\n const results: Array<{ name: string, outDir: string }> = []\n\n for (const pkg of selected) {\n p.log.step(`\\x1B[36m${pkg.name}\\x1B[0m@${pkg.version}`)\n const outDir = await authorSinglePackage({\n packageDir: pkg.dir,\n packageName: pkg.name,\n version: pkg.version,\n description: pkg.description,\n repoUrl: pkg.repoUrl || rootRepoUrl,\n monorepoRoot: cwd,\n llmConfig,\n force: opts.force,\n debug: opts.debug,\n })\n if (outDir)\n results.push({ name: pkg.name, outDir })\n }\n\n if (results.length > 0) {\n p.log.message('')\n for (const { name, outDir } of results)\n p.log.success(`${name} → ${relative(cwd, outDir)}`)\n\n printConsumerGuidance(results.map(r => r.name))\n }\n\n p.outro('Done')\n return\n }\n\n // Single package mode\n const pkgInfo = readLocalPackageInfo(cwd)\n if (!pkgInfo) {\n p.log.error('No package.json found in current directory')\n return\n }\n\n const { name: packageName, version, repoUrl } = pkgInfo\n\n p.intro(`\\x1B[1m\\x1B[35mskilld\\x1B[0m author \\x1B[36m${packageName}\\x1B[0m@${version}`)\n\n const llmConfig = await resolveLlmConfig(opts.model, opts.yes)\n if (llmConfig === null) {\n p.cancel('Cancelled')\n return\n }\n\n const outDir = await authorSinglePackage({\n packageDir: cwd,\n packageName,\n version,\n description: pkgInfo.description,\n repoUrl,\n out: opts.out,\n llmConfig,\n force: opts.force,\n debug: opts.debug,\n })\n\n if (outDir) {\n printConsumerGuidance([packageName])\n p.outro(`Authored skill to ${relative(cwd, outDir)}`)\n }\n}\n\nfunction printConsumerGuidance(packageNames: string[]): void {\n const names = packageNames.join(', ')\n p.log.info(\n `\\x1B[90mConsumers get ${packageNames.length > 1 ? 'these skills' : 'this skill'} automatically:\\x1B[0m\\n`\n + ` \\x1B[90m1. Install ${names} as a dependency\\x1B[0m\\n`\n + ` \\x1B[90m2. Run \\x1B[36mskilld prepare\\x1B[90m (or add to package.json: \\x1B[36m\"prepare\": \"skilld prepare\"\\x1B[90m)\\x1B[0m`,\n )\n}\n\nexport const authorCommandDef = defineCommand({\n meta: { name: 'package', description: 'Generate a package skill from documentation' },\n args: {\n out: {\n type: 'string',\n alias: 'o',\n description: 'Output directory (default: ./skills/<name>/)',\n },\n model: {\n type: 'string',\n alias: 'm',\n description: 'Enhancement model for SKILL.md generation',\n valueHint: 'id',\n },\n yes: {\n type: 'boolean',\n alias: 'y',\n description: 'Skip prompts, use defaults',\n default: false,\n },\n force: {\n type: 'boolean',\n alias: 'f',\n description: 'Clear cache and regenerate',\n default: false,\n },\n debug: {\n type: 'boolean',\n description: 'Save raw enhancement output to logs/',\n default: false,\n },\n },\n async run({ args }) {\n await authorCommand({\n out: args.out,\n model: args.model as OptimizeModel | undefined,\n yes: args.yes,\n force: args.force,\n debug: args.debug,\n })\n },\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"author.mjs","names":[],"sources":["../../src/commands/author.ts"],"sourcesContent":["import type { OptimizeModel } from '../agent/index.ts'\nimport type { ReferenceCache } from '../cache/index.ts'\nimport type { FeaturesConfig } from '../core/config.ts'\nimport type { LlmConfig } from './llm-prompts.ts'\nimport { existsSync, mkdirSync, readdirSync, readFileSync, rmSync } from 'node:fs'\nimport * as p from '@clack/prompts'\nimport { defineCommand } from 'citty'\nimport { join, relative, resolve } from 'pathe'\nimport {\n computeSkillDirName,\n getModelLabel,\n writeGeneratedSkillMd,\n} from '../agent/index.ts'\nimport { enhanceSkillWithLLM, writePromptFiles } from '../agent/skill-builder.ts'\nimport { createReferenceCache, ensureCacheDir } from '../cache/index.ts'\nimport { guard } from '../cli-helpers.ts'\nimport { defaultFeatures, readConfig } from '../core/config.ts'\nimport { timedSpinner } from '../core/formatting.ts'\nimport { detectMonorepoPackages } from '../core/monorepo.ts'\nimport { appendToJsonArray, patchPackageJson, readPackageJsonSafe } from '../core/package-json.ts'\nimport { skillInternalDir } from '../core/paths.ts'\nimport { sanitizeMarkdown } from '../core/sanitize.ts'\nimport {\n fetchGitHubDiscussions,\n fetchGitHubIssues,\n formatDiscussionAsMarkdown,\n formatIssueAsMarkdown,\n generateDiscussionIndex,\n generateIssueIndex,\n isGhAvailable,\n parseGitHubUrl,\n readLocalPackageInfo,\n} from '../sources/index.ts'\nimport { selectLlmConfig } from './llm-prompts.ts'\nimport { detectChangelog } from './sync-pipeline.ts'\n\n// ── Docs resolution ──\n\nfunction walkMarkdownFiles(dir: string, base = ''): Array<{ path: string, content: string }> {\n const results: Array<{ path: string, content: string }> = []\n if (!existsSync(dir))\n return results\n\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n const rel = base ? `${base}/${entry.name}` : entry.name\n const full = join(dir, entry.name)\n if (entry.isDirectory()) {\n results.push(...walkMarkdownFiles(full, rel))\n }\n else if (/\\.mdx?$/.test(entry.name)) {\n results.push({ path: rel, content: readFileSync(full, 'utf-8') })\n }\n }\n return results\n}\n\n/**\n * Resolve docs from local filesystem. Cascade:\n * 1. Package-level docs/ directory\n * 2. Monorepo-root docs/ directory (if monorepoRoot provided)\n * 3. Monorepo-root docs/content/ (Nuxt Content convention)\n * 4. llms.txt in package dir\n * 5. README.md in package dir\n */\nfunction resolveLocalDocs(\n cache: ReferenceCache,\n packageDir: string,\n monorepoRoot?: string,\n): { docsType: 'docs' | 'llms.txt' | 'readme', docSource: string } {\n const cachedDocs: Array<{ path: string, content: string }> = []\n\n const cacheChangelog = () => cacheLocalChangelog(cache, packageDir, monorepoRoot)\n\n // 1. Package-level docs/\n const docsDir = join(packageDir, 'docs')\n if (existsSync(docsDir)) {\n const mdFiles = walkMarkdownFiles(docsDir)\n if (mdFiles.length > 0) {\n for (const f of mdFiles)\n cachedDocs.push({ path: `docs/${f.path}`, content: sanitizeMarkdown(f.content) })\n cache.write(cachedDocs)\n cacheChangelog()\n return { docsType: 'docs', docSource: `local docs/ (${mdFiles.length} files)` }\n }\n }\n\n // 2. Monorepo-root docs/ or docs/content/\n if (monorepoRoot) {\n for (const candidate of ['docs/content', 'docs']) {\n const rootDocsDir = join(monorepoRoot, candidate)\n if (existsSync(rootDocsDir)) {\n const mdFiles = walkMarkdownFiles(rootDocsDir)\n if (mdFiles.length > 0) {\n for (const f of mdFiles)\n cachedDocs.push({ path: `docs/${f.path}`, content: sanitizeMarkdown(f.content) })\n cache.write(cachedDocs)\n cacheChangelog()\n return { docsType: 'docs', docSource: `monorepo ${candidate}/ (${mdFiles.length} files)` }\n }\n }\n }\n }\n\n // 3. llms.txt (package dir, then monorepo root)\n for (const dir of [packageDir, monorepoRoot].filter(Boolean) as string[]) {\n const llmsPath = join(dir, 'llms.txt')\n if (existsSync(llmsPath)) {\n cachedDocs.push({ path: 'llms.txt', content: sanitizeMarkdown(readFileSync(llmsPath, 'utf-8')) })\n cache.write(cachedDocs)\n cacheChangelog()\n const source = dir === packageDir ? 'local llms.txt' : 'monorepo llms.txt'\n return { docsType: 'llms.txt', docSource: source }\n }\n }\n\n // 4. README.md (package dir, then monorepo root)\n for (const dir of [packageDir, monorepoRoot].filter(Boolean) as string[]) {\n const readmeFile = readdirSync(dir).find(f => /^readme\\.md$/i.test(f))\n if (readmeFile) {\n cachedDocs.push({ path: 'docs/README.md', content: sanitizeMarkdown(readFileSync(join(dir, readmeFile), 'utf-8')) })\n cache.write(cachedDocs)\n cacheChangelog()\n const source = dir === packageDir ? 'local README.md' : 'monorepo README.md'\n return { docsType: 'readme', docSource: source }\n }\n }\n\n cacheChangelog()\n return { docsType: 'readme', docSource: 'none' }\n}\n\nfunction cacheLocalChangelog(cache: ReferenceCache, dir: string, monorepoRoot?: string): void {\n const candidates = ['CHANGELOG.md', 'changelog.md']\n const changelogFile = candidates.find(f => existsSync(join(dir, f)))\n || (monorepoRoot ? candidates.find(f => existsSync(join(monorepoRoot, f))) : undefined)\n const changelogDir = changelogFile && existsSync(join(dir, changelogFile)) ? dir : monorepoRoot\n if (changelogFile && changelogDir) {\n cache.write([{\n path: `releases/${changelogFile}`,\n content: sanitizeMarkdown(readFileSync(join(changelogDir, changelogFile), 'utf-8')),\n }])\n }\n}\n\n// ── Remote supplements ──\n\nasync function fetchRemoteSupplements(opts: {\n cache: ReferenceCache\n repoUrl?: string\n features: FeaturesConfig\n onProgress: (msg: string) => void\n}): Promise<{ hasIssues: boolean, hasDiscussions: boolean }> {\n const { cache, repoUrl, features, onProgress } = opts\n\n if (!repoUrl || !isGhAvailable())\n return { hasIssues: false, hasDiscussions: false }\n\n const gh = parseGitHubUrl(repoUrl)\n if (!gh)\n return { hasIssues: false, hasDiscussions: false }\n\n let hasIssues = false\n const issuesDir = join(cache.dir, 'issues')\n if (features.issues && !existsSync(issuesDir)) {\n onProgress('Fetching issues via GitHub API')\n const issues = await fetchGitHubIssues(gh.owner, gh.repo, 30).catch(() => [])\n if (issues.length > 0) {\n onProgress(`Caching ${issues.length} issues`)\n cache.write(issues.map(issue => ({\n path: `issues/issue-${issue.number}.md`,\n content: formatIssueAsMarkdown(issue),\n })))\n cache.write([{\n path: 'issues/_INDEX.md',\n content: generateIssueIndex(issues),\n }])\n hasIssues = true\n }\n }\n else {\n hasIssues = features.issues && existsSync(issuesDir)\n }\n\n let hasDiscussions = false\n const discussionsDir = join(cache.dir, 'discussions')\n if (features.discussions && !existsSync(discussionsDir)) {\n onProgress('Fetching discussions via GitHub API')\n const discussions = await fetchGitHubDiscussions(gh.owner, gh.repo, 20).catch(() => [])\n if (discussions.length > 0) {\n onProgress(`Caching ${discussions.length} discussions`)\n cache.write(discussions.map(d => ({\n path: `discussions/discussion-${d.number}.md`,\n content: formatDiscussionAsMarkdown(d),\n })))\n cache.write([{\n path: 'discussions/_INDEX.md',\n content: generateDiscussionIndex(discussions),\n }])\n hasDiscussions = true\n }\n }\n else {\n hasDiscussions = features.discussions && existsSync(discussionsDir)\n }\n\n return { hasIssues, hasDiscussions }\n}\n\n// ── package.json patching ──\n\nexport function patchPackageJsonFiles(packageDir: string): void {\n const pkgPath = join(packageDir, 'package.json')\n if (!existsSync(pkgPath))\n return\n\n const wrote = patchPackageJson(pkgPath, (raw, pkg) => {\n if (!Array.isArray(pkg.files)) {\n p.log.warn('No `files` array in package.json. Add `\"skills\"` to your files array manually.')\n return null\n }\n\n if ((pkg.files as string[]).some((f: string) => f === 'skills' || f === 'skills/' || f === 'skills/**'))\n return null\n\n return appendToJsonArray(raw, ['files'], 'skills')\n })\n\n if (wrote)\n p.log.success('Added `\"skills\"` to package.json files array')\n}\n\n// ── Core author flow for a single package ──\n\nasync function authorSinglePackage(opts: {\n packageDir: string\n packageName: string\n version: string\n description?: string\n repoUrl?: string\n monorepoRoot?: string\n out?: string\n llmConfig?: LlmConfig | null\n force?: boolean\n debug?: boolean\n}): Promise<string | null> {\n const { packageDir, packageName, version } = opts\n const spin = timedSpinner()\n\n const sanitizedName = computeSkillDirName(packageName)\n const outDir = opts.out ? resolve(packageDir, opts.out) : join(packageDir, 'skills', sanitizedName)\n\n // Validate --out doesn't point at the package root or a parent\n if (opts.out) {\n const rel = relative(packageDir, outDir)\n if (!rel || rel === '.' || rel.startsWith('..')) {\n p.log.error('--out must point to a child directory, not the package root or a parent')\n return null\n }\n }\n\n if (existsSync(outDir))\n rmSync(outDir, { recursive: true, force: true })\n mkdirSync(outDir, { recursive: true })\n\n const cache = createReferenceCache(packageName, version)\n\n if (opts.force) {\n cache.clearForce()\n }\n\n ensureCacheDir()\n const features = readConfig().features ?? defaultFeatures\n\n // Resolve local docs\n spin.start('Resolving local docs')\n const { docsType, docSource } = resolveLocalDocs(cache, packageDir, opts.monorepoRoot)\n spin.stop(`Resolved docs: ${docSource}`)\n\n // Fetch remote supplements (issues/discussions)\n const supSpin = timedSpinner()\n supSpin.start('Checking remote supplements')\n const { hasIssues, hasDiscussions } = await fetchRemoteSupplements({\n cache,\n repoUrl: opts.repoUrl,\n features,\n onProgress: msg => supSpin.message(msg),\n })\n const supParts: string[] = []\n if (hasIssues)\n supParts.push('issues')\n if (hasDiscussions)\n supParts.push('discussions')\n supSpin.stop(supParts.length > 0 ? `Fetched ${supParts.join(', ')}` : 'No remote supplements')\n\n // Create temporary .skilld/ symlinks (LLM needs these to read docs)\n cache.linkInto(outDir, packageDir, docsType, { features })\n\n // Detect changelog + releases\n const hasChangelog = detectChangelog(packageDir, cache.dir)\n const hasReleases = existsSync(join(cache.dir, 'releases'))\n\n // Generate base SKILL.md\n writeGeneratedSkillMd(outDir, {\n name: packageName,\n version,\n description: opts.description,\n relatedSkills: [],\n hasIssues,\n hasDiscussions,\n hasReleases,\n hasChangelog,\n docsType,\n hasShippedDocs: false,\n pkgFiles: [],\n dirName: sanitizedName,\n repoUrl: opts.repoUrl,\n features,\n eject: true,\n })\n p.log.success(`Created base skill: ${relative(packageDir, outDir)}`)\n\n // LLM enhancement (config resolved by caller)\n const skilldDir = skillInternalDir(outDir)\n try {\n const llmConfig = opts.llmConfig\n const baseCtx = {\n packageName,\n version,\n skillDir: outDir,\n dirName: sanitizedName,\n references: {\n docsType,\n hasShippedDocs: false,\n pkgFiles: [],\n hasIssues,\n hasDiscussions,\n hasReleases,\n hasChangelog,\n },\n resolved: { repoUrl: opts.repoUrl },\n relatedSkills: [],\n features,\n }\n if (llmConfig?.promptOnly) {\n writePromptFiles(baseCtx, {\n sections: llmConfig.sections,\n customPrompt: llmConfig.customPrompt,\n })\n }\n else if (llmConfig) {\n p.log.step(getModelLabel(llmConfig.model))\n await enhanceSkillWithLLM(baseCtx, {\n model: llmConfig.model,\n force: opts.force,\n debug: opts.debug,\n sections: llmConfig.sections,\n customPrompt: llmConfig.customPrompt,\n eject: true,\n })\n }\n\n cache.eject(outDir, packageDir, docsType, { features })\n }\n finally {\n // Always clean up .skilld/ symlinks, even if LLM enhancement fails\n if (existsSync(skilldDir))\n rmSync(skilldDir, { recursive: true, force: true })\n }\n\n // Only patch package.json when output is under skills/\n const relOut = relative(packageDir, outDir)\n if (relOut === 'skills' || relOut.startsWith('skills/'))\n patchPackageJsonFiles(packageDir)\n else if (opts.out)\n p.log.info('Output is outside skills/, skipping package.json patch. Add the path to \"files\" manually if publishing.')\n\n return outDir\n}\n\n// ── Main command ──\n\nasync function resolveLlmConfig(model?: OptimizeModel, yes?: boolean): Promise<LlmConfig | null | undefined> {\n const globalConfig = readConfig()\n if (globalConfig.skipLlm || (yes && !model))\n return undefined\n return selectLlmConfig(model, 'Generate skill sections')\n}\n\nasync function authorCommand(opts: {\n out?: string\n model?: OptimizeModel\n yes?: boolean\n force?: boolean\n debug?: boolean\n}): Promise<void> {\n const cwd = process.cwd()\n\n // Check for monorepo\n const monoPackages = detectMonorepoPackages(cwd)\n\n if (monoPackages && monoPackages.length > 0) {\n p.intro(`\\x1B[1m\\x1B[35mskilld\\x1B[0m author \\x1B[90m(monorepo: ${monoPackages.length} packages)\\x1B[0m`)\n\n if (opts.out) {\n p.log.error('--out is not supported in monorepo mode (each package gets its own skills/ directory)')\n return\n }\n\n const selected = guard(await p.multiselect({\n message: 'Which packages should ship skills?',\n options: monoPackages.map(pkg => ({\n label: pkg.name,\n value: pkg,\n hint: pkg.description,\n })),\n }))\n\n if (selected.length === 0)\n return\n\n // Resolve LLM config once for all packages\n const llmConfig = await resolveLlmConfig(opts.model, opts.yes)\n if (llmConfig === null) {\n p.cancel('Cancelled')\n return\n }\n\n // Resolve monorepo-level repoUrl for packages that lack their own\n const rootPkgResult = readPackageJsonSafe(join(cwd, 'package.json'))\n const rootPkg = rootPkgResult?.parsed as Record<string, any> | undefined\n const rootRepoUrl = typeof rootPkg?.repository === 'string'\n ? rootPkg.repository\n : rootPkg?.repository?.url?.replace(/^git\\+/, '').replace(/\\.git$/, '')\n\n const results: Array<{ name: string, outDir: string }> = []\n\n for (const pkg of selected) {\n p.log.step(`\\x1B[36m${pkg.name}\\x1B[0m@${pkg.version}`)\n const outDir = await authorSinglePackage({\n packageDir: pkg.dir,\n packageName: pkg.name,\n version: pkg.version,\n description: pkg.description,\n repoUrl: pkg.repoUrl || rootRepoUrl,\n monorepoRoot: cwd,\n llmConfig,\n force: opts.force,\n debug: opts.debug,\n })\n if (outDir)\n results.push({ name: pkg.name, outDir })\n }\n\n if (results.length > 0) {\n p.log.message('')\n for (const { name, outDir } of results)\n p.log.success(`${name} → ${relative(cwd, outDir)}`)\n\n printConsumerGuidance(results.map(r => r.name))\n }\n\n p.outro('Done')\n return\n }\n\n // Single package mode\n const pkgInfo = readLocalPackageInfo(cwd)\n if (!pkgInfo) {\n p.log.error('No package.json found in current directory')\n return\n }\n\n const { name: packageName, version, repoUrl } = pkgInfo\n\n p.intro(`\\x1B[1m\\x1B[35mskilld\\x1B[0m author \\x1B[36m${packageName}\\x1B[0m@${version}`)\n\n const llmConfig = await resolveLlmConfig(opts.model, opts.yes)\n if (llmConfig === null) {\n p.cancel('Cancelled')\n return\n }\n\n const outDir = await authorSinglePackage({\n packageDir: cwd,\n packageName,\n version,\n description: pkgInfo.description,\n repoUrl,\n out: opts.out,\n llmConfig,\n force: opts.force,\n debug: opts.debug,\n })\n\n if (outDir) {\n printConsumerGuidance([packageName])\n p.outro(`Authored skill to ${relative(cwd, outDir)}`)\n }\n}\n\nfunction printConsumerGuidance(packageNames: string[]): void {\n const names = packageNames.join(', ')\n p.log.info(\n `\\x1B[90mConsumers get ${packageNames.length > 1 ? 'these skills' : 'this skill'} automatically:\\x1B[0m\\n`\n + ` \\x1B[90m1. Install ${names} as a dependency\\x1B[0m\\n`\n + ` \\x1B[90m2. Run \\x1B[36mskilld prepare\\x1B[90m (or add to package.json: \\x1B[36m\"prepare\": \"skilld prepare\"\\x1B[90m)\\x1B[0m`,\n )\n}\n\nexport const authorCommandDef = defineCommand({\n meta: { name: 'package', description: 'Generate a package skill from documentation' },\n args: {\n out: {\n type: 'string',\n alias: 'o',\n description: 'Output directory (default: ./skills/<name>/)',\n },\n model: {\n type: 'string',\n alias: 'm',\n description: 'Enhancement model for SKILL.md generation',\n valueHint: 'id',\n },\n yes: {\n type: 'boolean',\n alias: 'y',\n description: 'Skip prompts, use defaults',\n default: false,\n },\n force: {\n type: 'boolean',\n alias: 'f',\n description: 'Clear cache and regenerate',\n default: false,\n },\n debug: {\n type: 'boolean',\n description: 'Save raw enhancement output to logs/',\n default: false,\n },\n },\n async run({ args }) {\n await authorCommand({\n out: args.out,\n model: args.model as OptimizeModel | undefined,\n yes: args.yes,\n force: args.force,\n debug: args.debug,\n })\n },\n})\n"],"mappings":"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"}