@tanstack/intent 0.0.39 → 0.0.41

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 (55) hide show
  1. package/dist/artifact-coverage-CbZALe7Q.mjs +3 -0
  2. package/dist/{cli-support-Dmpj1iyQ.mjs → cli-support-BHoEb9y1.mjs} +6 -6
  3. package/dist/{cli-support-OrWuIzI3.mjs → cli-support-BxF1HIpw.mjs} +4 -4
  4. package/dist/cli.mjs +11 -11
  5. package/dist/command-runner-DJTliSTc.mjs +16 -0
  6. package/dist/{core-0H8zUKIh.mjs → core-DEiRgUqe.mjs} +50 -34
  7. package/dist/core.d.mts +5 -1
  8. package/dist/core.mjs +7 -7
  9. package/dist/{display-CVeoAwBd.mjs → display-BPM-AJGc.mjs} +12 -2
  10. package/dist/display-lWCJg5Bo.mjs +5 -0
  11. package/dist/index.d.mts +2 -2
  12. package/dist/index.mjs +11 -11
  13. package/dist/{install-7BAmUZFB.mjs → install-DCiBBx55.mjs} +14 -10
  14. package/dist/install-EVdqAy8f.mjs +7 -0
  15. package/dist/intent-library.mjs +8 -8
  16. package/dist/{library-scanner-CHepLJQJ.mjs → library-scanner-BpEuR__1.mjs} +2 -2
  17. package/dist/library-scanner.d.mts +1 -1
  18. package/dist/library-scanner.mjs +3 -3
  19. package/dist/{list-DNPHxYpR.mjs → list-CpOcnLWv.mjs} +19 -11
  20. package/dist/{load-CK7vr50h.mjs → load-BxmN8f0E.mjs} +12 -10
  21. package/dist/{meta-CYV9EzM8.mjs → meta-Dstclm2x.mjs} +2 -2
  22. package/dist/package-manager-DDZck142.mjs +48 -0
  23. package/dist/{project-context-Dx6XIJJo.mjs → project-context-D4mFnCs7.mjs} +1 -1
  24. package/dist/{resolver-CP0S8UjZ.mjs → resolver-B36uOK8c.mjs} +3 -3
  25. package/dist/{scanner-BaOA18pn.mjs → scanner-B6nnctK4.mjs} +139 -89
  26. package/dist/scanner-BWd4mS25.mjs +6 -0
  27. package/dist/{setup-kvWN4xCr.mjs → setup-J4A9UfBB.mjs} +2 -2
  28. package/dist/setup.d.mts +1 -1
  29. package/dist/setup.mjs +4 -4
  30. package/dist/{skill-paths-DNOHrvL5.mjs → skill-paths-4kQXfQXo.mjs} +1 -1
  31. package/dist/{stale-flPZnWfI.mjs → stale-BD77r7KR.mjs} +1 -1
  32. package/dist/{staleness-V-nwqFUh.mjs → staleness-DChVhbCN.mjs} +2 -2
  33. package/dist/staleness-Dm4laJFc.mjs +5 -0
  34. package/dist/{types-S2zpibHp.d.mts → types-DU_Z0qNT.d.mts} +8 -2
  35. package/dist/{utils-mdb4i6VA.mjs → utils-Chn-30vI.mjs} +70 -4
  36. package/dist/utils-Ctlz_JG-.mjs +3 -0
  37. package/dist/{validate-BYUd0qb8.mjs → validate-CTSG3eDc.mjs} +6 -6
  38. package/dist/{workflow-review-CIdJXmKP.mjs → workflow-review-DcFipeG0.mjs} +1 -1
  39. package/dist/{workspace-patterns-BZLEaMcS.mjs → workspace-patterns-C5O4Dfpl.mjs} +1 -1
  40. package/dist/{workspace-patterns-BWMz7TsI.mjs → workspace-patterns-CA-UGM5C.mjs} +2 -2
  41. package/package.json +1 -1
  42. package/dist/artifact-coverage-DA26utB1.mjs +0 -3
  43. package/dist/display-COlw5FaB.mjs +0 -5
  44. package/dist/install-Brf5PORN.mjs +0 -7
  45. package/dist/scanner-BoB20xOF.mjs +0 -6
  46. package/dist/staleness-IIyVmUxU.mjs +0 -5
  47. package/dist/utils-BHzSyNeJ.mjs +0 -3
  48. /package/dist/{artifact-coverage-DgWuVqUp.mjs → artifact-coverage-Cqphhpfo.mjs} +0 -0
  49. /package/dist/{cli-error-BrMXlbtx.mjs → cli-error-DOO5bLIG.mjs} +0 -0
  50. /package/dist/{edit-package-json-CzWlMXOf.mjs → edit-package-json-cPClxVZZ.mjs} +0 -0
  51. /package/dist/{scaffold-D2vwv9ls.mjs → scaffold-CaShIIUY.mjs} +0 -0
  52. /package/dist/{setup-2SE9zYJk.d.mts → setup-DL7qX_F-.d.mts} +0 -0
  53. /package/dist/{setup-github-actions-emXSyGy3.mjs → setup-github-actions-zzLUbyAL.mjs} +0 -0
  54. /package/dist/{skill-use-umYvZl94.mjs → skill-use-C0q2MEEX.mjs} +0 -0
  55. /package/dist/{workflow-review-CwcR2ge4.mjs → workflow-review--Gc_yplP.mjs} +0 -0
@@ -0,0 +1,3 @@
1
+ import { t as readIntentArtifacts } from "./artifact-coverage-Cqphhpfo.mjs";
2
+
3
+ export { readIntentArtifacts };
@@ -1,5 +1,5 @@
1
- import { t as resolveProjectContext } from "./project-context-Dx6XIJJo.mjs";
2
- import { t as fail } from "./cli-error-BrMXlbtx.mjs";
1
+ import { t as resolveProjectContext } from "./project-context-D4mFnCs7.mjs";
2
+ import { t as fail } from "./cli-error-DOO5bLIG.mjs";
3
3
  import { existsSync, readFileSync } from "node:fs";
4
4
  import { dirname, join, relative, resolve } from "node:path";
5
5
  import { fileURLToPath } from "node:url";
@@ -31,7 +31,7 @@ function getCheckSkillsWorkflowAdvisories(root) {
31
31
  return [`Intent workflow update available: run \`npx @tanstack/intent@latest setup\` to refresh ${relative(process.cwd(), workflowPath) || workflowPath}.`];
32
32
  }
33
33
  async function scanIntentsOrFail(options) {
34
- const { scanForIntents } = await import("./scanner-BoB20xOF.mjs");
34
+ const { scanForIntents } = await import("./scanner-BWd4mS25.mjs");
35
35
  try {
36
36
  return scanForIntents(void 0, options);
37
37
  } catch (err) {
@@ -68,18 +68,18 @@ async function resolveStaleTargets(targetDir) {
68
68
  targetPath: targetDir
69
69
  });
70
70
  const workflowAdvisories = getCheckSkillsWorkflowAdvisories(context.workspaceRoot ?? context.packageRoot ?? resolvedRoot);
71
- const { buildWorkspaceCoverageSignals, checkStaleness, readPackageName } = await import("./staleness-IIyVmUxU.mjs");
71
+ const { buildWorkspaceCoverageSignals, checkStaleness, readPackageName } = await import("./staleness-Dm4laJFc.mjs");
72
72
  const isWorkspaceRootTarget = context.workspaceRoot !== null && resolvedRoot === context.workspaceRoot;
73
73
  if (context.packageRoot && !isWorkspaceRootTarget && (context.targetSkillsDir !== null || context.workspaceRoot === null)) return {
74
74
  reports: [await checkStaleness(context.packageRoot, readPackageName(context.packageRoot), context.workspaceRoot ?? context.packageRoot)],
75
75
  workflowAdvisories
76
76
  };
77
- const { findWorkspaceRoot, getWorkspaceInfo } = await import("./workspace-patterns-BWMz7TsI.mjs");
77
+ const { findWorkspaceRoot, getWorkspaceInfo } = await import("./workspace-patterns-CA-UGM5C.mjs");
78
78
  const workspaceRoot = findWorkspaceRoot(resolvedRoot);
79
79
  const workspaceInfo = workspaceRoot ? getWorkspaceInfo(workspaceRoot) : null;
80
80
  if (workspaceInfo) {
81
81
  const reports = await Promise.all(workspaceInfo.packageDirsWithSkills.map((packageDir) => checkStaleness(packageDir, readPackageName(packageDir), workspaceInfo.root)));
82
- const { readIntentArtifacts } = await import("./artifact-coverage-DA26utB1.mjs");
82
+ const { readIntentArtifacts } = await import("./artifact-coverage-CbZALe7Q.mjs");
83
83
  const artifacts = existsSync(join(workspaceInfo.root, "_artifacts")) ? readIntentArtifacts(workspaceInfo.root) : null;
84
84
  const coverageSignals = buildWorkspaceCoverageSignals({
85
85
  artifactRoot: workspaceInfo.root,
@@ -1,6 +1,6 @@
1
- import "./utils-mdb4i6VA.mjs";
2
- import "./workspace-patterns-BZLEaMcS.mjs";
3
- import "./project-context-Dx6XIJJo.mjs";
4
- import { a as printDebugInfo, c as scanOptionsFromGlobalFlags, i as getMetaDir, l as printWarnings, n as coreOptionsFromGlobalFlags, o as resolveStaleTargets, r as getCheckSkillsWorkflowAdvisories, s as scanIntentsOrFail, t as INTENT_CHECK_SKILLS_WORKFLOW_VERSION } from "./cli-support-Dmpj1iyQ.mjs";
1
+ import "./utils-Chn-30vI.mjs";
2
+ import "./workspace-patterns-C5O4Dfpl.mjs";
3
+ import "./project-context-D4mFnCs7.mjs";
4
+ import { a as printDebugInfo, c as scanOptionsFromGlobalFlags, i as getMetaDir, l as printWarnings, n as coreOptionsFromGlobalFlags, o as resolveStaleTargets, r as getCheckSkillsWorkflowAdvisories, s as scanIntentsOrFail, t as INTENT_CHECK_SKILLS_WORKFLOW_VERSION } from "./cli-support-BHoEb9y1.mjs";
5
5
 
6
6
  export { INTENT_CHECK_SKILLS_WORKFLOW_VERSION, coreOptionsFromGlobalFlags, getCheckSkillsWorkflowAdvisories, getMetaDir, printDebugInfo, printWarnings, resolveStaleTargets, scanIntentsOrFail, scanOptionsFromGlobalFlags };
package/dist/cli.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { n as isCliFailure, t as fail } from "./cli-error-BrMXlbtx.mjs";
2
+ import { n as isCliFailure, t as fail } from "./cli-error-DOO5bLIG.mjs";
3
3
  import { realpathSync } from "node:fs";
4
4
  import { fileURLToPath } from "node:url";
5
5
  import { cac } from "cac";
@@ -9,43 +9,43 @@ function createCli() {
9
9
  const cli = cac("intent");
10
10
  cli.usage("<command> [options]");
11
11
  cli.command("list", "Discover intent-enabled packages from the project or workspace").usage("list [--json] [--debug] [--exclude <pattern>] [--global] [--global-only]").option("--json", "Output JSON").option("--debug", "Print discovery debug details to stderr").option("--exclude <pattern>", "Exclude package name glob").option("--global", "Include global packages after project packages").option("--global-only", "List global packages only").example("list").example("list --json").example("list --global").action(async (options) => {
12
- const { runListCommand } = await import("./list-DNPHxYpR.mjs");
12
+ const { runListCommand } = await import("./list-CpOcnLWv.mjs");
13
13
  await runListCommand(options);
14
14
  });
15
15
  cli.command("load [use]", "Load a compact skill use and print its SKILL.md").usage("load <use> [--path] [--json] [--debug] [--exclude <pattern>] [--global] [--global-only]").option("--path", "Print the resolved skill path instead of file content").option("--json", "Output JSON").option("--debug", "Print resolution debug details to stderr").option("--exclude <pattern>", "Exclude package name glob").option("--global", "Load from project packages, then global packages").option("--global-only", "Load from global packages only").example("load @tanstack/query#core").example("load @tanstack/query#core --path").action(async (use, options) => {
16
- const { runLoadCommand } = await import("./load-CK7vr50h.mjs");
16
+ const { runLoadCommand } = await import("./load-BxmN8f0E.mjs");
17
17
  await runLoadCommand(use, options);
18
18
  });
19
19
  cli.command("meta [name]", "List meta-skills, or print one by name").usage("meta [name]").example("meta").example("meta domain-discovery").action(async (name) => {
20
- const [{ getMetaDir }, { runMetaCommand }] = await Promise.all([import("./cli-support-OrWuIzI3.mjs"), import("./meta-CYV9EzM8.mjs")]);
20
+ const [{ getMetaDir }, { runMetaCommand }] = await Promise.all([import("./cli-support-BxF1HIpw.mjs"), import("./meta-Dstclm2x.mjs")]);
21
21
  await runMetaCommand(name, getMetaDir());
22
22
  });
23
23
  cli.command("validate [dir]", "Validate skill files").usage("validate [dir] [--github-summary]").option("--github-summary", "Write a GitHub Actions step summary").example("validate").example("validate packages/query/skills").action(async (dir, options) => {
24
- const { runValidateCommand } = await import("./validate-BYUd0qb8.mjs");
24
+ const { runValidateCommand } = await import("./validate-CTSG3eDc.mjs");
25
25
  await runValidateCommand(dir, options);
26
26
  });
27
27
  cli.command("install", "Create or update skill loading guidance in an agent config file").usage("install [--map] [--dry-run] [--print-prompt] [--global] [--global-only]").option("--map", "Write explicit skill-to-task mappings").option("--dry-run", "Print the generated block without writing").option("--print-prompt", "Print the legacy agent setup prompt instead of writing").option("--global", "Include global packages after project packages").option("--global-only", "Install mappings from global packages only").example("install").example("install --map").example("install --dry-run").example("install --print-prompt").example("install --global").action(async (options) => {
28
- const [{ scanIntentsOrFail }, { runInstallCommand }] = await Promise.all([import("./cli-support-OrWuIzI3.mjs"), import("./install-Brf5PORN.mjs")]);
28
+ const [{ scanIntentsOrFail }, { runInstallCommand }] = await Promise.all([import("./cli-support-BxF1HIpw.mjs"), import("./install-EVdqAy8f.mjs")]);
29
29
  await runInstallCommand(options, scanIntentsOrFail);
30
30
  });
31
31
  cli.command("scaffold", "Print maintainer scaffold prompt").usage("scaffold").action(async () => {
32
- const [{ getMetaDir }, { runScaffoldCommand }] = await Promise.all([import("./cli-support-OrWuIzI3.mjs"), import("./scaffold-D2vwv9ls.mjs")]);
32
+ const [{ getMetaDir }, { runScaffoldCommand }] = await Promise.all([import("./cli-support-BxF1HIpw.mjs"), import("./scaffold-CaShIIUY.mjs")]);
33
33
  runScaffoldCommand(getMetaDir());
34
34
  });
35
35
  cli.command("stale [dir]", "Check skills for staleness in the current package or workspace").usage("stale [dir] [--json] [--github-review]").option("--json", "Output JSON").option("--github-review", "Write GitHub Actions review PR files").option("--package-label <label>", "Fallback package label for review PRs").example("stale").example("stale packages/query").example("stale --json").action(async (targetDir, options) => {
36
- const [{ resolveStaleTargets }, { runStaleCommand }] = await Promise.all([import("./cli-support-OrWuIzI3.mjs"), import("./stale-flPZnWfI.mjs")]);
36
+ const [{ resolveStaleTargets }, { runStaleCommand }] = await Promise.all([import("./cli-support-BxF1HIpw.mjs"), import("./stale-BD77r7KR.mjs")]);
37
37
  await runStaleCommand(targetDir, options, resolveStaleTargets);
38
38
  });
39
39
  cli.command("edit-package-json", "Update package.json files so skills are published").usage("edit-package-json").action(async () => {
40
- const { runEditPackageJsonCommand } = await import("./edit-package-json-CzWlMXOf.mjs");
40
+ const { runEditPackageJsonCommand } = await import("./edit-package-json-cPClxVZZ.mjs");
41
41
  await runEditPackageJsonCommand(process.cwd());
42
42
  });
43
43
  cli.command("setup", "Copy Intent CI workflow templates into .github/workflows/").usage("setup").action(async () => {
44
- const [{ getMetaDir }, { runSetupGithubActionsCommand }] = await Promise.all([import("./cli-support-OrWuIzI3.mjs"), import("./setup-github-actions-emXSyGy3.mjs")]);
44
+ const [{ getMetaDir }, { runSetupGithubActionsCommand }] = await Promise.all([import("./cli-support-BxF1HIpw.mjs"), import("./setup-github-actions-zzLUbyAL.mjs")]);
45
45
  await runSetupGithubActionsCommand(process.cwd(), getMetaDir());
46
46
  });
47
47
  cli.command("setup-github-actions", "Copy Intent CI workflow templates into .github/workflows/").usage("setup-github-actions").action(async () => {
48
- const [{ getMetaDir }, { runSetupGithubActionsCommand }] = await Promise.all([import("./cli-support-OrWuIzI3.mjs"), import("./setup-github-actions-emXSyGy3.mjs")]);
48
+ const [{ getMetaDir }, { runSetupGithubActionsCommand }] = await Promise.all([import("./cli-support-BxF1HIpw.mjs"), import("./setup-github-actions-zzLUbyAL.mjs")]);
49
49
  await runSetupGithubActionsCommand(process.cwd(), getMetaDir());
50
50
  });
51
51
  cli.command("help [command]", "Display help for a command").action((commandName) => {
@@ -0,0 +1,16 @@
1
+ //#region src/command-runner.ts
2
+ const runnerByPackageManager = {
3
+ bun: "bunx @tanstack/intent@latest",
4
+ npm: "npx @tanstack/intent@latest",
5
+ pnpm: "pnpm dlx @tanstack/intent@latest",
6
+ unknown: "npx @tanstack/intent@latest",
7
+ yarn: "yarn dlx @tanstack/intent@latest"
8
+ };
9
+ function formatIntentCommand(packageManager, args) {
10
+ const command = runnerByPackageManager[packageManager];
11
+ const trimmedArgs = args.trim();
12
+ return trimmedArgs ? `${command} ${trimmedArgs}` : command;
13
+ }
14
+
15
+ //#endregion
16
+ export { formatIntentCommand as t };
@@ -1,9 +1,9 @@
1
- import { o as resolveDepDir, r as getDeps, s as toPosixPath } from "./utils-mdb4i6VA.mjs";
2
- import { n as scanIntentPackageAtRoot, t as scanForIntents } from "./scanner-BaOA18pn.mjs";
3
- import { o as resolveWorkspacePackages } from "./workspace-patterns-BZLEaMcS.mjs";
4
- import { i as parseSkillUse, n as formatSkillUse } from "./skill-use-umYvZl94.mjs";
5
- import { t as resolveProjectContext } from "./project-context-Dx6XIJJo.mjs";
6
- import { a as compileExcludePatterns, c as warningMentionsPackage, i as resolveSkillUse, l as readPackageJson, o as getEffectiveExcludePatterns, r as resolveSkillEntry, s as isPackageExcluded, t as ResolveSkillUseError } from "./resolver-CP0S8UjZ.mjs";
1
+ import { c as resolveDepDir, i as getDeps, l as toPosixPath } from "./utils-Chn-30vI.mjs";
2
+ import { n as scanIntentPackageAtRoot, r as createIntentFsCache, t as scanForIntents } from "./scanner-B6nnctK4.mjs";
3
+ import { n as findWorkspacePackages } from "./workspace-patterns-C5O4Dfpl.mjs";
4
+ import { i as parseSkillUse, n as formatSkillUse } from "./skill-use-C0q2MEEX.mjs";
5
+ import { t as resolveProjectContext } from "./project-context-D4mFnCs7.mjs";
6
+ import { a as compileExcludePatterns, c as warningMentionsPackage, i as resolveSkillUse, o as getEffectiveExcludePatterns, r as resolveSkillEntry, s as isPackageExcluded, t as ResolveSkillUseError } from "./resolver-B36uOK8c.mjs";
7
7
  import { existsSync, readFileSync, realpathSync } from "node:fs";
8
8
  import { dirname, isAbsolute, join, relative, resolve } from "node:path";
9
9
 
@@ -213,15 +213,15 @@ function rewriteLoadedSkillMarkdownDestinations({ content, cwd, packageRoot, ski
213
213
 
214
214
  //#endregion
215
215
  //#region src/core/load-resolution.ts
216
- function readWorkspacePackageInfos(context) {
216
+ function readWorkspacePackageInfos(context, fsCache) {
217
217
  const dirs = /* @__PURE__ */ new Set();
218
218
  if (context.packageRoot) dirs.add(context.packageRoot);
219
219
  if (context.workspaceRoot) {
220
220
  dirs.add(context.workspaceRoot);
221
- for (const dir of resolveWorkspacePackages(context.workspaceRoot, context.workspacePatterns)) dirs.add(dir);
221
+ for (const dir of findWorkspacePackages(context.workspaceRoot)) dirs.add(dir);
222
222
  }
223
223
  return [...dirs].flatMap((dir) => {
224
- const packageJson = readPackageJson(dir);
224
+ const packageJson = fsCache.readPackageJson(dir);
225
225
  if (!packageJson) return [];
226
226
  return [{
227
227
  dir,
@@ -270,10 +270,10 @@ function getDirectLoadFastPathCandidateDirs(packageName, context, cwd) {
270
270
  if (context.workspaceRoot && context.workspaceRoot !== context.packageRoot) addCandidateDir(candidates, seen, resolveDependencyPackageDir(packageName, context.workspaceRoot));
271
271
  return candidates;
272
272
  }
273
- function getWorkspaceLoadFastPathCandidateDirs(packageName, context) {
273
+ function getWorkspaceLoadFastPathCandidateDirs(packageName, context, fsCache) {
274
274
  const candidates = [];
275
275
  const seen = /* @__PURE__ */ new Set();
276
- const workspacePackages = readWorkspacePackageInfos(context);
276
+ const workspacePackages = readWorkspacePackageInfos(context, fsCache);
277
277
  for (const pkg of workspacePackages) if (pkg.name === packageName) addCandidateDir(candidates, seen, pkg.dir);
278
278
  for (const pkg of workspacePackages) {
279
279
  if (!workspacePackageDeclaresDependency(pkg.packageJson, packageName)) continue;
@@ -297,10 +297,11 @@ function resolveScannedPackageSkill(scanned, parsedUse) {
297
297
  conflict: null
298
298
  };
299
299
  }
300
- function resolveFromPackageRoots(packageRoots, parsedUse, cwd) {
300
+ function resolveFromPackageRoots(packageRoots, parsedUse, cwd, fsCache) {
301
301
  for (const packageRoot of packageRoots) {
302
302
  const scanned = scanIntentPackageAtRoot(packageRoot, {
303
303
  fallbackName: parsedUse.packageName,
304
+ fsCache,
304
305
  projectRoot: cwd,
305
306
  skillNameHint: parsedUse.skillName
306
307
  });
@@ -309,6 +310,7 @@ function resolveFromPackageRoots(packageRoots, parsedUse, cwd) {
309
310
  if (scanned.package?.name === parsedUse.packageName) {
310
311
  const fallbackResolved = resolveScannedPackageSkill(scanIntentPackageAtRoot(packageRoot, {
311
312
  fallbackName: parsedUse.packageName,
313
+ fsCache,
312
314
  projectRoot: cwd
313
315
  }), parsedUse);
314
316
  if (fallbackResolved) return fallbackResolved;
@@ -316,13 +318,13 @@ function resolveFromPackageRoots(packageRoots, parsedUse, cwd) {
316
318
  }
317
319
  return null;
318
320
  }
319
- function resolveSkillUseFastPath(parsedUse, options, context = resolveProjectContext({ cwd: process.cwd() }), cwd = context.cwd) {
321
+ function resolveSkillUseFastPath(parsedUse, options, context = resolveProjectContext({ cwd: process.cwd() }), cwd = context.cwd, fsCache = createIntentFsCache()) {
320
322
  if (options.globalOnly) return null;
321
323
  if (shouldSkipFastPathForYarnPnp(context, cwd)) return null;
322
- const directResolved = resolveFromPackageRoots(getDirectLoadFastPathCandidateDirs(parsedUse.packageName, context, cwd), parsedUse, cwd);
324
+ const directResolved = resolveFromPackageRoots(getDirectLoadFastPathCandidateDirs(parsedUse.packageName, context, cwd), parsedUse, cwd, fsCache);
323
325
  if (directResolved) return directResolved;
324
326
  if (!context.workspaceRoot) return null;
325
- return resolveFromPackageRoots(getWorkspaceLoadFastPathCandidateDirs(parsedUse.packageName, context), parsedUse, cwd);
327
+ return resolveFromPackageRoots(getWorkspaceLoadFastPathCandidateDirs(parsedUse.packageName, context, fsCache), parsedUse, cwd, fsCache);
326
328
  }
327
329
 
328
330
  //#endregion
@@ -344,32 +346,41 @@ function toScanOptions(options) {
344
346
  function getScanScope(options) {
345
347
  return options.scope ?? (options.includeGlobal ? "local-and-global" : "local");
346
348
  }
349
+ function withFsCache(options, fsCache) {
350
+ return {
351
+ ...options,
352
+ fsCache
353
+ };
354
+ }
347
355
  function resolveCoreCwd(options) {
348
356
  return resolve(process.cwd(), options.cwd ?? process.cwd());
349
357
  }
350
358
  function listIntentSkills(options = {}) {
351
359
  const cwd = resolveCoreCwd(options);
352
360
  const scanOptions = toScanOptions(options);
361
+ const fsCache = createIntentFsCache();
353
362
  const projectContext = resolveProjectContext({ cwd });
354
- const scanResult = scanForIntents(cwd, scanOptions);
363
+ const scanResult = scanForIntents(cwd, withFsCache(scanOptions, fsCache));
355
364
  const excludePatterns = getEffectiveExcludePatterns(options, projectContext);
356
365
  const excludeMatchers = compileExcludePatterns(excludePatterns);
357
366
  const excludedPackages = scanResult.packages.filter((pkg) => isPackageExcluded(pkg.name, excludeMatchers)).map((pkg) => pkg.name);
358
367
  const packages = scanResult.packages.filter((pkg) => !isPackageExcluded(pkg.name, excludeMatchers));
368
+ const skills = packages.flatMap((pkg) => pkg.skills.map((skill) => {
369
+ return {
370
+ use: formatSkillUse(pkg.name, skill.name),
371
+ packageName: pkg.name,
372
+ packageRoot: pkg.packageRoot,
373
+ packageVersion: pkg.version,
374
+ packageSource: pkg.source,
375
+ skillName: skill.name,
376
+ description: skill.description,
377
+ type: skill.type,
378
+ framework: skill.framework
379
+ };
380
+ }));
359
381
  const result = {
360
- skills: packages.flatMap((pkg) => pkg.skills.map((skill) => {
361
- return {
362
- use: formatSkillUse(pkg.name, skill.name),
363
- packageName: pkg.name,
364
- packageRoot: pkg.packageRoot,
365
- packageVersion: pkg.version,
366
- packageSource: pkg.source,
367
- skillName: skill.name,
368
- description: skill.description,
369
- type: skill.type,
370
- framework: skill.framework
371
- };
372
- })),
382
+ packageManager: scanResult.packageManager,
383
+ skills,
373
384
  packages: packages.map((pkg) => ({
374
385
  name: pkg.name,
375
386
  version: pkg.version,
@@ -387,7 +398,8 @@ function listIntentSkills(options = {}) {
387
398
  packageCount: result.packages.length,
388
399
  skillCount: result.skills.length,
389
400
  warningCount: result.warnings.length,
390
- conflictCount: result.conflicts.length
401
+ conflictCount: result.conflicts.length,
402
+ scan: scanResult.stats ?? fsCache.getStats()
391
403
  };
392
404
  return result;
393
405
  }
@@ -424,7 +436,7 @@ function toResolvedIntentSkill(cwd, use, resolved, debug) {
424
436
  result
425
437
  };
426
438
  }
427
- function createLoadedSkillDebug({ cwd, excludes, resolution, resolved, scope }) {
439
+ function createLoadedSkillDebug({ cwd, excludes, scan, resolution, resolved, scope }) {
428
440
  return {
429
441
  cwd,
430
442
  scope,
@@ -435,7 +447,8 @@ function createLoadedSkillDebug({ cwd, excludes, resolution, resolved, scope })
435
447
  version: resolved.version,
436
448
  source: resolved.source,
437
449
  path: resolved.path,
438
- warningCount: resolved.warnings.length
450
+ warningCount: resolved.warnings.length,
451
+ scan
439
452
  };
440
453
  }
441
454
  function resolveIntentSkillInCwd(cwd, use, options = {}) {
@@ -445,21 +458,23 @@ function resolveIntentSkillInCwd(cwd, use, options = {}) {
445
458
  } catch (err) {
446
459
  throw new IntentCoreError("invalid-skill-use", err instanceof Error ? err.message : String(err));
447
460
  }
461
+ const fsCache = createIntentFsCache();
448
462
  const projectContext = resolveProjectContext({ cwd });
449
463
  const excludePatterns = getEffectiveExcludePatterns(options, projectContext);
450
464
  const excludeMatchers = compileExcludePatterns(excludePatterns);
451
465
  if (isPackageExcluded(parsedUse.packageName, excludeMatchers)) throw new IntentCoreError("package-excluded", `Cannot load skill use "${use}": package "${parsedUse.packageName}" is excluded by Intent configuration.`);
452
466
  const scanOptions = toScanOptions(options);
453
467
  const scope = getScanScope(scanOptions);
454
- const fastPathResolved = resolveSkillUseFastPath(parsedUse, options, projectContext, cwd);
468
+ const fastPathResolved = resolveSkillUseFastPath(parsedUse, options, projectContext, cwd, fsCache);
455
469
  if (fastPathResolved) return toResolvedIntentSkill(cwd, use, fastPathResolved, options.debug ? createLoadedSkillDebug({
456
470
  cwd,
457
471
  excludes: excludePatterns,
458
472
  resolution: "fast-path",
459
473
  resolved: fastPathResolved,
474
+ scan: fsCache.getStats(),
460
475
  scope
461
476
  }) : void 0);
462
- const scanResult = scanForIntents(cwd, scanOptions);
477
+ const scanResult = scanForIntents(cwd, withFsCache(scanOptions, fsCache));
463
478
  let resolved;
464
479
  try {
465
480
  resolved = resolveSkillUse(use, scanResult);
@@ -472,6 +487,7 @@ function resolveIntentSkillInCwd(cwd, use, options = {}) {
472
487
  excludes: excludePatterns,
473
488
  resolution: "full-scan",
474
489
  resolved,
490
+ scan: scanResult.stats ?? fsCache.getStats(),
475
491
  scope
476
492
  }) : void 0);
477
493
  }
package/dist/core.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { b as VersionConflict, h as ScanScope, l as IntentPackage } from "./types-S2zpibHp.mjs";
1
+ import { S as VersionConflict, _ as ScanStats, g as ScanScope, l as IntentPackage, p as PackageManager } from "./types-DU_Z0qNT.mjs";
2
2
 
3
3
  //#region src/core/types.d.ts
4
4
  interface IntentCoreOptions {
@@ -27,6 +27,7 @@ interface IntentPackageSummary {
27
27
  skillCount: number;
28
28
  }
29
29
  interface IntentSkillList {
30
+ packageManager: PackageManager;
30
31
  skills: Array<IntentSkillSummary>;
31
32
  packages: Array<IntentPackageSummary>;
32
33
  warnings: Array<string>;
@@ -55,6 +56,7 @@ interface IntentSkillListDebug {
55
56
  skillCount: number;
56
57
  warningCount: number;
57
58
  conflictCount: number;
59
+ scan: IntentScanDebugStats;
58
60
  }
59
61
  interface LoadedIntentSkillDebug {
60
62
  cwd: string;
@@ -67,7 +69,9 @@ interface LoadedIntentSkillDebug {
67
69
  source: IntentPackage['source'];
68
70
  path: string;
69
71
  warningCount: number;
72
+ scan: IntentScanDebugStats;
70
73
  }
74
+ interface IntentScanDebugStats extends ScanStats {}
71
75
  type IntentCoreErrorCode = 'invalid-options' | 'invalid-skill-use' | 'package-not-found' | 'package-excluded' | 'skill-not-found' | 'skill-path-outside-package' | 'skill-file-not-found';
72
76
  //#endregion
73
77
  //#region src/core.d.ts
package/dist/core.mjs CHANGED
@@ -1,9 +1,9 @@
1
- import "./utils-mdb4i6VA.mjs";
2
- import "./skill-paths-DNOHrvL5.mjs";
3
- import "./scanner-BaOA18pn.mjs";
4
- import "./workspace-patterns-BZLEaMcS.mjs";
5
- import "./project-context-Dx6XIJJo.mjs";
6
- import "./resolver-CP0S8UjZ.mjs";
7
- import { i as resolveIntentSkill, n as listIntentSkills, r as loadIntentSkill, t as IntentCoreError } from "./core-0H8zUKIh.mjs";
1
+ import "./utils-Chn-30vI.mjs";
2
+ import "./skill-paths-4kQXfQXo.mjs";
3
+ import "./scanner-B6nnctK4.mjs";
4
+ import "./workspace-patterns-C5O4Dfpl.mjs";
5
+ import "./project-context-D4mFnCs7.mjs";
6
+ import "./resolver-B36uOK8c.mjs";
7
+ import { i as resolveIntentSkill, n as listIntentSkills, r as loadIntentSkill, t as IntentCoreError } from "./core-DEiRgUqe.mjs";
8
8
 
9
9
  export { IntentCoreError, listIntentSkills, loadIntentSkill, resolveIntentSkill };
@@ -1,4 +1,4 @@
1
- import { n as isStableLoadPath, t as formatRuntimeSkillLookupHint } from "./skill-paths-DNOHrvL5.mjs";
1
+ import { n as isStableLoadPath, t as formatRuntimeSkillLookupHint } from "./skill-paths-4kQXfQXo.mjs";
2
2
 
3
3
  //#region src/display.ts
4
4
  function padColumn(text, width) {
@@ -17,6 +17,7 @@ function printSkillLine(displayName, skill, indent, opts) {
17
17
  const padding = " ".repeat(Math.max(2, opts.nameWidth - nameStr.length));
18
18
  const typeCol = opts.showTypes ? (skill.type ? `[${skill.type}]` : "").padEnd(14) : "";
19
19
  console.log(`${nameStr}${padding}${typeCol}${skill.description}`);
20
+ if (skill.loadCommand) console.log(`${" ".repeat(indent + 2)}Load: ${skill.loadCommand}`);
20
21
  if (skill.path) {
21
22
  const pathIndent = " ".repeat(indent + 2);
22
23
  if (isStableLoadPath(skill.path)) console.log(`${pathIndent}${skill.path}`);
@@ -29,6 +30,7 @@ function printSkillLine(displayName, skill, indent, opts) {
29
30
  function printSkillTree(skills, opts) {
30
31
  const roots = [];
31
32
  const children = /* @__PURE__ */ new Map();
33
+ const printedSkills = /* @__PURE__ */ new Set();
32
34
  for (const skill of skills) {
33
35
  const slashIdx = skill.name.indexOf("/");
34
36
  if (slashIdx === -1) roots.push(skill.name);
@@ -45,7 +47,15 @@ function printSkillTree(skills, opts) {
45
47
  const rootSkill = skills.find((s) => s.name === rootName);
46
48
  if (!rootSkill) continue;
47
49
  printSkillLine(rootName, rootSkill, 4, opts);
48
- for (const sub of children.get(rootName) ?? []) printSkillLine(sub.name.slice(sub.name.indexOf("/") + 1), sub, 6, opts);
50
+ printedSkills.add(rootSkill.name);
51
+ for (const sub of children.get(rootName) ?? []) {
52
+ printSkillLine(sub.name.slice(sub.name.indexOf("/") + 1), sub, 6, opts);
53
+ printedSkills.add(sub.name);
54
+ }
55
+ }
56
+ for (const skill of skills) {
57
+ if (printedSkills.has(skill.name)) continue;
58
+ printSkillLine(skill.name, skill, 4, opts);
49
59
  }
50
60
  }
51
61
  function computeSkillNameWidth(allPackageSkills) {
@@ -0,0 +1,5 @@
1
+ import "./utils-Chn-30vI.mjs";
2
+ import "./skill-paths-4kQXfQXo.mjs";
3
+ import { n as printSkillTree, r as printTable, t as computeSkillNameWidth } from "./display-BPM-AJGc.mjs";
4
+
5
+ export { computeSkillNameWidth, printSkillTree, printTable };
package/dist/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
- import { _ as SkillStaleness, a as IntentArtifactSet, b as VersionConflict, c as IntentConfig, d as MetaFeedbackPayload, f as MetaSkillName, g as SkillEntry, i as IntentArtifactFile, l as IntentPackage, m as ScanResult, n as FeedbackPayload, o as IntentArtifactSkill, p as ScanOptions, r as IntentArtifactCoverageIgnore, s as IntentArtifactWarning, t as AgentName, u as IntentProjectConfig, v as StalenessReport, y as StalenessSignal } from "./types-S2zpibHp.mjs";
2
- import { i as runEditPackageJson, o as runSetupGithubActions, r as SetupGithubActionsResult, t as EditPackageJsonResult } from "./setup-2SE9zYJk.mjs";
1
+ import { S as VersionConflict, a as IntentArtifactSet, b as StalenessReport, c as IntentConfig, d as MetaFeedbackPayload, f as MetaSkillName, h as ScanResult, i as IntentArtifactFile, l as IntentPackage, m as ScanOptions, n as FeedbackPayload, o as IntentArtifactSkill, r as IntentArtifactCoverageIgnore, s as IntentArtifactWarning, t as AgentName, u as IntentProjectConfig, v as SkillEntry, x as StalenessSignal, y as SkillStaleness } from "./types-DU_Z0qNT.mjs";
2
+ import { i as runEditPackageJson, o as runSetupGithubActions, r as SetupGithubActionsResult, t as EditPackageJsonResult } from "./setup-DL7qX_F-.mjs";
3
3
 
4
4
  //#region src/scanner.d.ts
5
5
  declare function scanForIntents(root?: string, options?: ScanOptions): ScanResult;
package/dist/index.mjs CHANGED
@@ -1,14 +1,14 @@
1
- import { a as parseFrontmatter, n as findSkillFiles, o as resolveDepDir, r as getDeps } from "./utils-mdb4i6VA.mjs";
2
- import "./skill-paths-DNOHrvL5.mjs";
3
- import { t as scanForIntents } from "./scanner-BaOA18pn.mjs";
4
- import "./workspace-patterns-BZLEaMcS.mjs";
5
- import { t as readIntentArtifacts } from "./artifact-coverage-DgWuVqUp.mjs";
6
- import { n as checkStaleness } from "./staleness-V-nwqFUh.mjs";
7
- import { n as collectStaleReviewItems, r as createFailedStaleReviewItem, t as buildStaleReviewBody } from "./workflow-review-CwcR2ge4.mjs";
8
- import { i as parseSkillUse, n as formatSkillUse, r as isSkillUseParseError, t as SkillUseParseError } from "./skill-use-umYvZl94.mjs";
9
- import "./project-context-Dx6XIJJo.mjs";
10
- import { i as resolveSkillUse, n as isResolveSkillUseError, t as ResolveSkillUseError } from "./resolver-CP0S8UjZ.mjs";
11
- import { r as runSetupGithubActions, t as runEditPackageJson } from "./setup-kvWN4xCr.mjs";
1
+ import { c as resolveDepDir, i as getDeps, r as findSkillFiles, s as parseFrontmatter } from "./utils-Chn-30vI.mjs";
2
+ import "./skill-paths-4kQXfQXo.mjs";
3
+ import { t as scanForIntents } from "./scanner-B6nnctK4.mjs";
4
+ import "./workspace-patterns-C5O4Dfpl.mjs";
5
+ import { t as readIntentArtifacts } from "./artifact-coverage-Cqphhpfo.mjs";
6
+ import { n as checkStaleness } from "./staleness-DChVhbCN.mjs";
7
+ import { n as collectStaleReviewItems, r as createFailedStaleReviewItem, t as buildStaleReviewBody } from "./workflow-review--Gc_yplP.mjs";
8
+ import { i as parseSkillUse, n as formatSkillUse, r as isSkillUseParseError, t as SkillUseParseError } from "./skill-use-C0q2MEEX.mjs";
9
+ import "./project-context-D4mFnCs7.mjs";
10
+ import { i as resolveSkillUse, n as isResolveSkillUseError, t as ResolveSkillUseError } from "./resolver-B36uOK8c.mjs";
11
+ import { r as runSetupGithubActions, t as runEditPackageJson } from "./setup-J4A9UfBB.mjs";
12
12
  import { readFileSync, writeFileSync } from "node:fs";
13
13
  import { join } from "node:path";
14
14
  import { execFileSync, execSync } from "node:child_process";
@@ -1,6 +1,8 @@
1
- import { i as parseSkillUse, n as formatSkillUse } from "./skill-use-umYvZl94.mjs";
2
- import { t as fail } from "./cli-error-BrMXlbtx.mjs";
3
- import { c as scanOptionsFromGlobalFlags, l as printWarnings } from "./cli-support-Dmpj1iyQ.mjs";
1
+ import { t as detectPackageManager } from "./package-manager-DDZck142.mjs";
2
+ import { i as parseSkillUse, n as formatSkillUse } from "./skill-use-C0q2MEEX.mjs";
3
+ import { t as fail } from "./cli-error-DOO5bLIG.mjs";
4
+ import { t as formatIntentCommand } from "./command-runner-DJTliSTc.mjs";
5
+ import { c as scanOptionsFromGlobalFlags, l as printWarnings } from "./cli-support-BHoEb9y1.mjs";
4
6
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
5
7
  import { dirname, join, relative } from "node:path";
6
8
  import { parse } from "yaml";
@@ -126,7 +128,7 @@ function formatWhen(packageName, skill) {
126
128
  function buildIntentSkillsBlock(scanResult) {
127
129
  const lines = [
128
130
  INTENT_SKILLS_START,
129
- "# Skill mappings - load `use` with `npx @tanstack/intent@latest load <use>`.",
131
+ `# Skill mappings - load \`use\` with \`${formatIntentCommand(scanResult.packageManager, "load <use>")}\`.`,
130
132
  "skills:"
131
133
  ];
132
134
  let mappingCount = 0;
@@ -143,15 +145,17 @@ function buildIntentSkillsBlock(scanResult) {
143
145
  mappingCount
144
146
  };
145
147
  }
146
- function buildIntentSkillGuidanceBlock() {
148
+ function buildIntentSkillGuidanceBlock(packageManager = "unknown") {
149
+ const listCommand = formatIntentCommand(packageManager, "list");
150
+ const loadCommand = formatIntentCommand(packageManager, "load <package>#<skill>");
147
151
  return {
148
152
  block: `${[
149
153
  INTENT_SKILLS_START,
150
154
  "## Skill Loading",
151
155
  "",
152
156
  "Before substantial work:",
153
- "- Skill check: run `npx @tanstack/intent@latest list`, or use skills already listed in context.",
154
- "- Skill guidance: if one local skill clearly matches the task, run `npx @tanstack/intent@latest load <package>#<skill>` and follow the returned `SKILL.md`.",
157
+ `- Skill check: run \`${listCommand}\`, or use skills already listed in context.`,
158
+ `- Skill guidance: if one local skill clearly matches the task, run \`${loadCommand}\` and follow the returned \`SKILL.md\`.`,
155
159
  "- Monorepos: when working across packages, run the skill check from the workspace root and prefer the local skill for the package being changed.",
156
160
  "- Multiple matches: prefer the most specific local skill for the package or concern you are changing; load additional skills only when the task spans multiple packages or concerns.",
157
161
  INTENT_SKILLS_END
@@ -376,9 +380,9 @@ async function runInstallCommand(options, scanIntentsOrFail) {
376
380
  console.log(INSTALL_PROMPT);
377
381
  return;
378
382
  }
379
- scanOptionsFromGlobalFlags(options);
383
+ const scanOptions = scanOptionsFromGlobalFlags(options);
380
384
  if (!options.map) {
381
- const generated$1 = buildIntentSkillGuidanceBlock();
385
+ const generated$1 = buildIntentSkillGuidanceBlock(detectPackageManager());
382
386
  if (options.dryRun) {
383
387
  const targetPath = resolveIntentSkillsBlockTargetPath(process.cwd(), 1);
384
388
  console.log(`Generated skill loading guidance for ${formatTargetPath(targetPath)}.`);
@@ -401,7 +405,7 @@ async function runInstallCommand(options, scanIntentsOrFail) {
401
405
  printPlacementTip(result$1.targetPath);
402
406
  return;
403
407
  }
404
- const scanResult = await scanIntentsOrFail(scanOptionsFromGlobalFlags(options));
408
+ const scanResult = await scanIntentsOrFail(scanOptions);
405
409
  const generated = buildIntentSkillsBlock(scanResult);
406
410
  if (options.dryRun) {
407
411
  const targetPath = resolveIntentSkillsBlockTargetPath(process.cwd(), generated.mappingCount);
@@ -0,0 +1,7 @@
1
+ import "./utils-Chn-30vI.mjs";
2
+ import "./workspace-patterns-C5O4Dfpl.mjs";
3
+ import "./project-context-D4mFnCs7.mjs";
4
+ import "./cli-support-BHoEb9y1.mjs";
5
+ import { n as runInstallCommand, t as INSTALL_PROMPT } from "./install-DCiBBx55.mjs";
6
+
7
+ export { INSTALL_PROMPT, runInstallCommand };
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
- import "./utils-mdb4i6VA.mjs";
3
- import "./skill-paths-DNOHrvL5.mjs";
4
- import "./workspace-patterns-BZLEaMcS.mjs";
5
- import "./project-context-Dx6XIJJo.mjs";
6
- import { n as printSkillTree, r as printTable, t as computeSkillNameWidth } from "./display-CVeoAwBd.mjs";
7
- import "./cli-support-Dmpj1iyQ.mjs";
8
- import { t as INSTALL_PROMPT } from "./install-7BAmUZFB.mjs";
9
- import { t as scanLibrary } from "./library-scanner-CHepLJQJ.mjs";
2
+ import "./utils-Chn-30vI.mjs";
3
+ import "./skill-paths-4kQXfQXo.mjs";
4
+ import "./workspace-patterns-C5O4Dfpl.mjs";
5
+ import "./project-context-D4mFnCs7.mjs";
6
+ import { n as printSkillTree, r as printTable, t as computeSkillNameWidth } from "./display-BPM-AJGc.mjs";
7
+ import "./cli-support-BHoEb9y1.mjs";
8
+ import { t as INSTALL_PROMPT } from "./install-DCiBBx55.mjs";
9
+ import { t as scanLibrary } from "./library-scanner-BpEuR__1.mjs";
10
10
 
11
11
  //#region src/intent-library.ts
12
12
  function cmdList() {
@@ -1,5 +1,5 @@
1
- import { a as parseFrontmatter, o as resolveDepDir, r as getDeps, s as toPosixPath } from "./utils-mdb4i6VA.mjs";
2
- import { r as rewriteSkillLoadPaths } from "./skill-paths-DNOHrvL5.mjs";
1
+ import { c as resolveDepDir, i as getDeps, l as toPosixPath, s as parseFrontmatter } from "./utils-Chn-30vI.mjs";
2
+ import { r as rewriteSkillLoadPaths } from "./skill-paths-4kQXfQXo.mjs";
3
3
  import { existsSync, readFileSync, readdirSync } from "node:fs";
4
4
  import { dirname, join, relative } from "node:path";
5
5
 
@@ -1,4 +1,4 @@
1
- import { g as SkillEntry } from "./types-S2zpibHp.mjs";
1
+ import { v as SkillEntry } from "./types-DU_Z0qNT.mjs";
2
2
 
3
3
  //#region src/library-scanner.d.ts
4
4
  interface LibraryPackage {
@@ -1,5 +1,5 @@
1
- import "./utils-mdb4i6VA.mjs";
2
- import "./skill-paths-DNOHrvL5.mjs";
3
- import { t as scanLibrary } from "./library-scanner-CHepLJQJ.mjs";
1
+ import "./utils-Chn-30vI.mjs";
2
+ import "./skill-paths-4kQXfQXo.mjs";
3
+ import { t as scanLibrary } from "./library-scanner-BpEuR__1.mjs";
4
4
 
5
5
  export { scanLibrary };