@jcode.labs/ragmir 2.11.0 → 2.13.0

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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EACL,uBAAuB,EACvB,6BAA6B,GAC9B,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAC5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AACrD,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AACpF,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAUnC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAEzE,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACjG,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACrF,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAA;AAE/D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAYzC,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACZ,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,YAAY,CAAA;AAMnB,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAgDlE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EACL,uBAAuB,EACvB,6BAA6B,GAC9B,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAC5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AACrD,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AACpF,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAUnC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAEzE,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACjG,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACrF,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAA;AAE/D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAczC,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,kBAAkB,EAClB,YAAY,EACZ,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,YAAY,CAAA;AAMnB,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAgDlE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA"}
@@ -1,4 +1,6 @@
1
1
  export type PackageManager = "pnpm" | "npm" | "yarn" | "bun";
2
+ export declare const RGR_RUNNER_FILENAME = "run.cjs";
3
+ export declare const RGR_RUNNER_PROBE_ARG = "--ragmir-runner-probe";
2
4
  export interface RagmirCommand {
3
5
  packageManager: PackageManager;
4
6
  command: string;
@@ -1 +1 @@
1
- {"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../src/package-manager.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAAA;AAG5D,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,cAAc,CAAA;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,wBAAsB,oBAAoB,CAAC,GAAG,SAAgB,GAAG,OAAO,CAAC,cAAc,CAAC,CAsBvF;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CASpF;AAED,eAAO,MAAM,aAAa,mBAAa,CAAA;AACvC,eAAO,MAAM,SAAS,mBAAa,CAAA"}
1
+ {"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../src/package-manager.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAAA;AAE5D,eAAO,MAAM,mBAAmB,YAAY,CAAA;AAC5C,eAAO,MAAM,oBAAoB,0BAA0B,CAAA;AAE3D,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,cAAc,CAAA;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,wBAAsB,oBAAoB,CAAC,GAAG,SAAgB,GAAG,OAAO,CAAC,cAAc,CAAC,CAsBvF;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAmBpF;AAQD,eAAO,MAAM,aAAa,mBAAa,CAAA;AACvC,eAAO,MAAM,SAAS,mBAAa,CAAA"}
@@ -2,6 +2,8 @@ import { existsSync } from "node:fs";
2
2
  import { readFile } from "node:fs/promises";
3
3
  import path from "node:path";
4
4
  const RGR_CLI_BIN = "rgr";
5
+ export const RGR_RUNNER_FILENAME = "run.cjs";
6
+ export const RGR_RUNNER_PROBE_ARG = "--ragmir-runner-probe";
5
7
  export async function detectPackageManager(cwd = process.cwd()) {
6
8
  const root = path.resolve(cwd);
7
9
  const packageManager = await packageJsonManager(root);
@@ -24,7 +26,17 @@ export async function detectPackageManager(cwd = process.cwd()) {
24
26
  return "pnpm";
25
27
  }
26
28
  export async function rgrCommand(cwd, args) {
27
- const packageManager = await detectPackageManager(cwd);
29
+ const root = path.resolve(cwd);
30
+ const packageManager = await detectPackageManager(root);
31
+ const runnerPath = path.join(root, ".ragmir", RGR_RUNNER_FILENAME);
32
+ if (existsSync(runnerPath)) {
33
+ return {
34
+ packageManager,
35
+ command: "node",
36
+ args: [runnerPath, ...args],
37
+ display: displayRunnerCommand(root, runnerPath, args),
38
+ };
39
+ }
28
40
  const commandArgs = commandArgsFor(packageManager, args);
29
41
  return {
30
42
  packageManager,
@@ -33,6 +45,11 @@ export async function rgrCommand(cwd, args) {
33
45
  display: displayCommand(packageManager, args),
34
46
  };
35
47
  }
48
+ function displayRunnerCommand(root, runnerPath, args) {
49
+ const relativeRunner = path.relative(root, runnerPath) || runnerPath;
50
+ const suffix = [relativeRunner, ...args].map(formatArg).join(" ");
51
+ return `node ${suffix}`;
52
+ }
36
53
  export const ragmirCommand = rgrCommand;
37
54
  export const kbCommand = rgrCommand;
38
55
  async function packageJsonManager(root) {
@@ -1 +1 @@
1
- {"version":3,"file":"package-manager.js","sourceRoot":"","sources":["../src/package-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"package-manager.js","sourceRoot":"","sources":["../src/package-manager.ts"],"names":[],"mappings":"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"}
package/dist/setup.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { type PullEmbeddingModelResult } from "./embeddings.js";
2
2
  import { type PackageManager } from "./package-manager.js";
3
3
  import { type EnableSemanticEmbeddingsResult } from "./semantic-config.js";
4
- import { type AgentTarget, type InstallSkillResult } from "./skill.js";
4
+ import { type AgentSkillInstallation, type AgentTarget, type InstallSkillResult } from "./skill.js";
5
5
  import type { DoctorReport, IngestResult } from "./types.js";
6
6
  export interface SetupOptions {
7
7
  cwd?: string;
@@ -12,6 +12,7 @@ export interface SetupOptions {
12
12
  mcpServerName?: string;
13
13
  mcpCommand?: string;
14
14
  mcpArgs?: readonly string[];
15
+ forceAgentSkills?: boolean;
15
16
  }
16
17
  export interface SetupSemanticResult {
17
18
  model: PullEmbeddingModelResult;
@@ -23,6 +24,7 @@ export interface SetupResult {
23
24
  runCommand: string;
24
25
  created: string[];
25
26
  agentKit: InstallSkillResult;
27
+ agentInstallations: AgentSkillInstallation[];
26
28
  semantic: SetupSemanticResult | null;
27
29
  ingested: IngestResult | null;
28
30
  doctor: DoctorReport;
@@ -1 +1 @@
1
- {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,wBAAwB,EAAsB,MAAM,iBAAiB,CAAA;AAGnF,OAAO,EAAE,KAAK,cAAc,EAAc,MAAM,sBAAsB,CAAA;AACtE,OAAO,EAAE,KAAK,8BAA8B,EAA4B,MAAM,sBAAsB,CAAA;AACpG,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,kBAAkB,EAAgB,MAAM,YAAY,CAAA;AACpF,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE5D,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,SAAS,WAAW,EAAE,CAAA;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC5B;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,wBAAwB,CAAA;IAC/B,MAAM,EAAE,8BAA8B,CAAA;CACvC;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,cAAc,CAAA;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,QAAQ,EAAE,kBAAkB,CAAA;IAC5B,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CAAA;IACpC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAA;IAC7B,MAAM,EAAE,YAAY,CAAA;IACpB,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,mBAAmB,EAAE,MAAM,CAAA;CAC5B;AAiBD,wBAAsB,YAAY,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CA2CnF"}
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,wBAAwB,EAAsB,MAAM,iBAAiB,CAAA;AAGnF,OAAO,EAAE,KAAK,cAAc,EAAc,MAAM,sBAAsB,CAAA;AACtE,OAAO,EAAE,KAAK,8BAA8B,EAA4B,MAAM,sBAAsB,CAAA;AACpG,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,WAAW,EAEhB,KAAK,kBAAkB,EAExB,MAAM,YAAY,CAAA;AACnB,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE5D,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,SAAS,WAAW,EAAE,CAAA;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC3B,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,wBAAwB,CAAA;IAC/B,MAAM,EAAE,8BAA8B,CAAA;CACvC;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,cAAc,CAAA;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,QAAQ,EAAE,kBAAkB,CAAA;IAC5B,kBAAkB,EAAE,sBAAsB,EAAE,CAAA;IAC5C,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CAAA;IACpC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAA;IAC7B,MAAM,EAAE,YAAY,CAAA;IACpB,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,mBAAmB,EAAE,MAAM,CAAA;CAC5B;AAiBD,wBAAsB,YAAY,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CAgDnF"}
package/dist/setup.js CHANGED
@@ -6,7 +6,7 @@ import { ingest } from "./ingest.js";
6
6
  import { initProject } from "./init.js";
7
7
  import { rgrCommand } from "./package-manager.js";
8
8
  import { enableSemanticEmbeddings } from "./semantic-config.js";
9
- import { installSkill } from "./skill.js";
9
+ import { installAgentSkills, } from "./skill.js";
10
10
  const CONFIGURATION_PROMPT = `You are helping configure Ragmir for this repository.
11
11
 
12
12
  Work from the knowledge-base root where \`rgr setup\` was run. Your goal is to improve \`.ragmir/config.json\` so Ragmir indexes useful repository knowledge without indexing secrets, generated files, or noisy bulk data. In a monorepo with nested Ragmir bases, keep an app base scoped to that app; only the root base should index shared or cross-app knowledge.
@@ -24,7 +24,7 @@ Keep all proposed paths relative to the repository root. Do not add secrets or p
24
24
  export async function setupProject(options = {}) {
25
25
  const cwd = path.resolve(options.cwd ?? process.cwd());
26
26
  const created = await initProject(cwd);
27
- const installOptions = { cwd };
27
+ const installOptions = { cwd, scope: "project", mode: "link" };
28
28
  if (options.targetDir !== undefined) {
29
29
  installOptions.targetDir = options.targetDir;
30
30
  }
@@ -40,7 +40,11 @@ export async function setupProject(options = {}) {
40
40
  if (options.mcpArgs !== undefined) {
41
41
  installOptions.mcpArgs = options.mcpArgs;
42
42
  }
43
- const agentKit = await installSkill(installOptions);
43
+ if (options.forceAgentSkills !== undefined) {
44
+ installOptions.force = options.forceAgentSkills;
45
+ }
46
+ const agentSkills = await installAgentSkills(installOptions);
47
+ const agentKit = agentSkills.projectKit;
44
48
  const semantic = options.semantic ? await setupSemanticEmbeddings(cwd) : null;
45
49
  let report = await doctor(cwd);
46
50
  let ingested = null;
@@ -55,6 +59,7 @@ export async function setupProject(options = {}) {
55
59
  runCommand: command.display,
56
60
  created,
57
61
  agentKit,
62
+ agentInstallations: agentSkills.installations,
58
63
  semantic,
59
64
  ingested,
60
65
  doctor: report,
@@ -80,7 +85,7 @@ function setupNextSteps(report) {
80
85
  if (report.ready) {
81
86
  return [
82
87
  "Ask questions with the search or ask command shown by `rgr doctor`.",
83
- "Run `rgr install-agent --agents claude` or another targeted agent list for native skill discovery.",
88
+ "Restart or reload the selected agents so they discover the installed Ragmir skills.",
84
89
  "Wire the matching MCP helper from .ragmir/ when the agent should call Ragmir tools directly.",
85
90
  ];
86
91
  }
package/dist/setup.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
package/dist/skill.d.ts CHANGED
@@ -22,19 +22,19 @@ export interface InstallSkillResult {
22
22
  clineConfigPath: string;
23
23
  agentSetupPath: string;
24
24
  readmePath: string;
25
+ runnerPath: string;
25
26
  agentHelpers: AgentHelperFile[];
26
27
  mcpServerName: string;
27
28
  mcpCommand: string;
28
29
  mcpArgs: string[];
29
30
  written: string[];
30
31
  }
31
- export interface InstallAgentSkillsOptions {
32
- cwd?: string;
33
- agents?: readonly AgentTarget[];
32
+ export interface InstallAgentSkillsOptions extends InstallSkillOptions {
34
33
  scope?: AgentInstallScope;
35
34
  mode?: AgentInstallMode;
36
35
  homeDir?: string;
37
36
  env?: Record<string, string | undefined>;
37
+ force?: boolean;
38
38
  }
39
39
  export interface AgentSkillInstallation {
40
40
  agent: AgentTarget;
@@ -54,6 +54,18 @@ export interface AgentHelperFile {
54
54
  label: string;
55
55
  path: string;
56
56
  }
57
+ export type RagmirRunnerMode = "local-bin" | "workspace" | "installed-package" | "npm-cache";
58
+ export interface AgentIntegrationReport {
59
+ runnerPath: string;
60
+ runnerReady: boolean;
61
+ runnerMode: RagmirRunnerMode | null;
62
+ runnerRequiresDownload: boolean;
63
+ projectAgents: AgentTarget[];
64
+ userAgents: AgentTarget[];
65
+ nativeAgents: AgentTarget[];
66
+ ready: boolean;
67
+ warnings: string[];
68
+ }
57
69
  export declare const SKILL_NAMES: readonly ["ragmir", "ragmir-audio-summary", "ragmir-markdown-report", "ragmir-legal-dossier"];
58
70
  export declare const MCP_CONFIG_FILENAME = "mcp.json";
59
71
  export declare const AGENT_SETUP_FILENAME = "agent-setup.md";
@@ -63,4 +75,5 @@ export declare function bundledSkillPath(skillName?: string): string;
63
75
  export declare function parseAgentTargets(value: string | readonly string[] | undefined): AgentTarget[];
64
76
  export declare function installSkill(options?: InstallSkillOptions): Promise<InstallSkillResult>;
65
77
  export declare function installAgentSkills(options?: InstallAgentSkillsOptions): Promise<InstallAgentSkillsResult>;
78
+ export declare function inspectAgentIntegration(cwd?: string, homeDir?: string, env?: Record<string, string | undefined>): AgentIntegrationReport;
66
79
  //# sourceMappingURL=skill.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../src/skill.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../src/skill.ts"],"names":[],"mappings":"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"}
package/dist/skill.js CHANGED
@@ -1,10 +1,13 @@
1
- import { cp, mkdir, rm, symlink, writeFile } from "node:fs/promises";
1
+ import { spawnSync } from "node:child_process";
2
+ import { existsSync } from "node:fs";
3
+ import { cp, lstat, mkdir, readFile, realpath, rm, symlink, writeFile } from "node:fs/promises";
2
4
  import path from "node:path";
3
5
  import { fileURLToPath } from "node:url";
4
6
  import { DEFAULT_SKILL_TARGET_DIR, RAGMIR_DIR, RAGMIR_PROJECT_ROOT_ENV } from "./defaults.js";
5
7
  import { ensureRagmirGitignore } from "./gitignore.js";
6
8
  import { knowledgeBaseIdentity } from "./knowledge-bases.js";
7
- import { rgrCommand } from "./package-manager.js";
9
+ import { RGR_RUNNER_FILENAME, RGR_RUNNER_PROBE_ARG, rgrCommand, } from "./package-manager.js";
10
+ import { VERSION } from "./version.js";
8
11
  const PACKAGE_ROOT = path.dirname(path.dirname(fileURLToPath(import.meta.url)));
9
12
  const PRIMARY_SKILL_NAME = "ragmir";
10
13
  const AUDIO_SKILL_NAME = "ragmir-audio-summary";
@@ -12,6 +15,7 @@ const REPORT_SKILL_NAME = "ragmir-markdown-report";
12
15
  const LEGAL_SKILL_NAME = "ragmir-legal-dossier";
13
16
  const DEFAULT_MCP_SERVER_NAME = "ragmir";
14
17
  const MCP_SERVER_NAME_PATTERN = /^[A-Za-z0-9_-]+$/u;
18
+ const MANAGED_SKILL_METADATA_FILENAME = ".ragmir-managed.json";
15
19
  export const SKILL_NAMES = [
16
20
  PRIMARY_SKILL_NAME,
17
21
  AUDIO_SKILL_NAME,
@@ -54,8 +58,8 @@ const AGENT_DESTINATIONS = {
54
58
  codex: {
55
59
  label: "Codex",
56
60
  env: "CODEX_SKILLS_DIR",
57
- projectDir: path.join(".codex", "skills"),
58
- userDir: (homeDir) => path.join(homeDir, ".codex", "skills"),
61
+ projectDir: path.join(".agents", "skills"),
62
+ userDir: (homeDir) => path.join(homeDir, ".agents", "skills"),
59
63
  },
60
64
  kimi: {
61
65
  label: "Kimi Code CLI",
@@ -127,9 +131,11 @@ export async function installSkill(options = {}) {
127
131
  const clineConfigPath = agentConfigPaths.cline;
128
132
  const agentSetupPath = path.join(ragmirDir, AGENT_SETUP_FILENAME);
129
133
  const readmePath = path.join(ragmirDir, "README.md");
134
+ const runnerPath = path.join(ragmirDir, RGR_RUNNER_FILENAME);
130
135
  await mkdir(targetDir, { recursive: true });
131
136
  await mkdir(ragmirDir, { recursive: true });
132
137
  await copyBundledSkills(targetDir);
138
+ await writeFile(runnerPath, ragmirRunnerSource(VERSION, path.join(PACKAGE_ROOT, "dist", "cli.js")), { encoding: "utf8", mode: 0o755 });
133
139
  const serveCommand = await resolveMcpCommand(cwd, options);
134
140
  const doctorCommand = await rgrCommand(cwd, ["doctor"]);
135
141
  const installAgentCommand = await rgrCommand(cwd, ["install-agent", "--agents", agents.join(",")]);
@@ -198,6 +204,7 @@ export async function installSkill(options = {}) {
198
204
  path.relative(cwd, audioSkillPath),
199
205
  path.relative(cwd, reportSkillPath),
200
206
  path.relative(cwd, legalSkillPath),
207
+ path.relative(cwd, runnerPath),
201
208
  path.relative(cwd, mcpConfigPath),
202
209
  ...agentHelpers.map((helper) => path.relative(cwd, helper.path)),
203
210
  path.relative(cwd, agentSetupPath),
@@ -219,6 +226,7 @@ export async function installSkill(options = {}) {
219
226
  clineConfigPath,
220
227
  agentSetupPath,
221
228
  readmePath,
229
+ runnerPath,
222
230
  agentHelpers,
223
231
  mcpServerName,
224
232
  mcpCommand: serveCommand.command,
@@ -233,7 +241,16 @@ export async function installAgentSkills(options = {}) {
233
241
  const homeDir = path.resolve(options.homeDir ?? process.env.HOME ?? process.cwd());
234
242
  const env = options.env ?? process.env;
235
243
  const agents = options.agents ?? SUPPORTED_AGENT_TARGETS;
236
- const projectKit = await installSkill({ cwd, agents });
244
+ const installOptions = { cwd, agents };
245
+ if (options.targetDir !== undefined)
246
+ installOptions.targetDir = options.targetDir;
247
+ if (options.mcpServerName !== undefined)
248
+ installOptions.mcpServerName = options.mcpServerName;
249
+ if (options.mcpCommand !== undefined)
250
+ installOptions.mcpCommand = options.mcpCommand;
251
+ if (options.mcpArgs !== undefined)
252
+ installOptions.mcpArgs = options.mcpArgs;
253
+ const projectKit = await installSkill(installOptions);
237
254
  const sourceDir = path.dirname(projectKit.skillPath);
238
255
  const installations = [];
239
256
  const written = [];
@@ -241,7 +258,7 @@ export async function installAgentSkills(options = {}) {
241
258
  const destination = AGENT_DESTINATIONS[agent];
242
259
  const targetDir = agentTargetDir(agent, scope, cwd, homeDir, env);
243
260
  await mkdir(targetDir, { recursive: true });
244
- const { mode, skillPaths } = await exposeAgentSkills(sourceDir, targetDir, requestedMode);
261
+ const { mode, skillPaths } = await exposeAgentSkills(sourceDir, targetDir, requestedMode, options.force ?? false);
245
262
  written.push(...skillPaths.map((skillPath) => displayPath(cwd, skillPath)));
246
263
  installations.push({
247
264
  agent,
@@ -252,6 +269,15 @@ export async function installAgentSkills(options = {}) {
252
269
  skillPaths,
253
270
  });
254
271
  }
272
+ if (scope === "project") {
273
+ const gitignoreEntries = installations.flatMap((installation) => installation.skillPaths.map((skillPath) => posixRelativePath(cwd, skillPath)));
274
+ if (await ensureRagmirGitignore(cwd, gitignoreEntries)) {
275
+ if (!projectKit.written.includes(".gitignore")) {
276
+ projectKit.written.push(".gitignore");
277
+ }
278
+ written.push(".gitignore");
279
+ }
280
+ }
255
281
  return {
256
282
  projectKit,
257
283
  installations,
@@ -341,45 +367,96 @@ async function copyBundledSkills(targetDir) {
341
367
  force: true,
342
368
  })));
343
369
  }
344
- async function exposeAgentSkills(sourceDir, targetDir, requestedMode) {
370
+ async function exposeAgentSkills(sourceDir, targetDir, requestedMode, force) {
345
371
  if (requestedMode === "copy") {
346
- return copyAgentSkills(sourceDir, targetDir);
372
+ return copyAgentSkills(sourceDir, targetDir, force);
347
373
  }
348
374
  try {
349
- return await linkAgentSkills(sourceDir, targetDir);
375
+ return await linkAgentSkills(sourceDir, targetDir, force);
350
376
  }
351
377
  catch {
352
- return copyAgentSkills(sourceDir, targetDir);
378
+ return copyAgentSkills(sourceDir, targetDir, force);
353
379
  }
354
380
  }
355
- async function linkAgentSkills(sourceDir, targetDir) {
381
+ async function linkAgentSkills(sourceDir, targetDir, force) {
356
382
  const skillPaths = [];
357
383
  for (const skillName of SKILL_NAMES) {
358
384
  const source = path.join(sourceDir, skillName);
359
385
  const target = path.join(targetDir, skillName);
360
- await replaceWithDirectorySymlink(source, target);
386
+ await replaceWithDirectorySymlink(source, target, skillName, force);
361
387
  skillPaths.push(target);
362
388
  }
363
389
  return { mode: "link", skillPaths };
364
390
  }
365
- async function copyAgentSkills(sourceDir, targetDir) {
391
+ async function copyAgentSkills(sourceDir, targetDir, force) {
366
392
  const skillPaths = [];
367
393
  for (const skillName of SKILL_NAMES) {
368
394
  const source = path.join(sourceDir, skillName);
369
395
  const target = path.join(targetDir, skillName);
396
+ await assertManagedSkillTarget(source, target, skillName, force);
370
397
  await rm(target, { recursive: true, force: true });
371
398
  await cp(source, target, { recursive: true, force: true });
399
+ await writeFile(path.join(target, MANAGED_SKILL_METADATA_FILENAME), `${JSON.stringify({ managedBy: "ragmir", skillName }, null, 2)}\n`, "utf8");
372
400
  skillPaths.push(target);
373
401
  }
374
402
  return { mode: "copy", skillPaths };
375
403
  }
376
- async function replaceWithDirectorySymlink(source, target) {
404
+ async function replaceWithDirectorySymlink(source, target, skillName, force) {
377
405
  if (path.resolve(source) === path.resolve(target)) {
378
406
  return;
379
407
  }
408
+ await assertManagedSkillTarget(source, target, skillName, force);
380
409
  await rm(target, { recursive: true, force: true });
381
410
  await symlink(source, target, process.platform === "win32" ? "junction" : "dir");
382
411
  }
412
+ async function assertManagedSkillTarget(source, target, skillName, force) {
413
+ let targetStats;
414
+ try {
415
+ targetStats = await lstat(target);
416
+ }
417
+ catch (error) {
418
+ if (hasErrorCode(error, "ENOENT"))
419
+ return;
420
+ throw error;
421
+ }
422
+ if (force)
423
+ return;
424
+ if (targetStats.isSymbolicLink()) {
425
+ try {
426
+ if ((await realpath(target)) === (await realpath(source)))
427
+ return;
428
+ }
429
+ catch {
430
+ // A broken or unreadable link is not safe to replace implicitly.
431
+ }
432
+ }
433
+ else if (targetStats.isDirectory()) {
434
+ const metadata = await readManagedSkillMetadata(target);
435
+ if (metadata?.managedBy === "ragmir" && metadata.skillName === skillName)
436
+ return;
437
+ }
438
+ throw new Error(`Refusing to replace unmanaged agent skill at ${target}. Move it, or rerun with --force after reviewing its contents.`);
439
+ }
440
+ async function readManagedSkillMetadata(target) {
441
+ try {
442
+ const value = JSON.parse(await readFile(path.join(target, MANAGED_SKILL_METADATA_FILENAME), "utf8"));
443
+ if (typeof value === "object" &&
444
+ value !== null &&
445
+ "managedBy" in value &&
446
+ typeof value.managedBy === "string" &&
447
+ "skillName" in value &&
448
+ typeof value.skillName === "string") {
449
+ return { managedBy: value.managedBy, skillName: value.skillName };
450
+ }
451
+ }
452
+ catch {
453
+ return null;
454
+ }
455
+ return null;
456
+ }
457
+ function hasErrorCode(error, code) {
458
+ return typeof error === "object" && error !== null && "code" in error && error.code === code;
459
+ }
383
460
  function agentTargetDir(agent, scope, cwd, homeDir, env) {
384
461
  const destination = AGENT_DESTINATIONS[agent];
385
462
  const override = env[destination.env];
@@ -407,6 +484,185 @@ function displayPath(cwd, filePath) {
407
484
  }
408
485
  return filePath;
409
486
  }
487
+ function posixRelativePath(cwd, filePath) {
488
+ return path.relative(cwd, filePath).split(path.sep).join("/");
489
+ }
490
+ export function inspectAgentIntegration(cwd = process.cwd(), homeDir = process.env.HOME ?? process.cwd(), env = process.env) {
491
+ const projectRoot = path.resolve(cwd);
492
+ const resolvedHome = path.resolve(homeDir);
493
+ const runnerPath = path.join(projectRoot, RAGMIR_DIR, RGR_RUNNER_FILENAME);
494
+ const probe = probeRagmirRunner(projectRoot, runnerPath);
495
+ const projectAgents = detectedAgentTargets("project", projectRoot, resolvedHome, env);
496
+ const userAgents = detectedAgentTargets("user", projectRoot, resolvedHome, env);
497
+ const nativeAgents = [...new Set([...projectAgents, ...userAgents])];
498
+ const warnings = [];
499
+ if (!existsSync(runnerPath)) {
500
+ warnings.push("The generated Ragmir runner is missing. Run `rgr setup` or `rgr doctor --fix`.");
501
+ }
502
+ else if (!probe.runnerReady) {
503
+ warnings.push("The generated Ragmir runner could not verify a local CLI. Install @jcode.labs/ragmir in the project or rebuild the workspace package.");
504
+ }
505
+ if (probe.runnerRequiresDownload) {
506
+ warnings.push("The runner will fall back to the pinned npm package and may need a network download before first use.");
507
+ }
508
+ if (nativeAgents.length === 0) {
509
+ warnings.push("No native agent skill exposure was detected. Run `rgr install-agent --agents <list>`.");
510
+ }
511
+ return {
512
+ runnerPath,
513
+ runnerReady: probe.runnerReady,
514
+ runnerMode: probe.runnerMode,
515
+ runnerRequiresDownload: probe.runnerRequiresDownload,
516
+ projectAgents,
517
+ userAgents,
518
+ nativeAgents,
519
+ ready: probe.runnerReady && nativeAgents.length > 0,
520
+ warnings,
521
+ };
522
+ }
523
+ function detectedAgentTargets(scope, projectRoot, homeDir, env) {
524
+ return SUPPORTED_AGENT_TARGETS.filter((agent) => {
525
+ const targetDir = agentTargetDir(agent, scope, projectRoot, homeDir, env);
526
+ return SKILL_NAMES.every((skillName) => existsSync(path.join(targetDir, skillName, "SKILL.md")));
527
+ });
528
+ }
529
+ function probeRagmirRunner(projectRoot, runnerPath) {
530
+ if (!existsSync(runnerPath)) {
531
+ return { runnerReady: false, runnerMode: null, runnerRequiresDownload: false };
532
+ }
533
+ const result = spawnSync(process.execPath, [runnerPath, RGR_RUNNER_PROBE_ARG], {
534
+ cwd: projectRoot,
535
+ encoding: "utf8",
536
+ timeout: 5_000,
537
+ env: { ...process.env, [RAGMIR_PROJECT_ROOT_ENV]: projectRoot },
538
+ });
539
+ if (result.status !== 0) {
540
+ return { runnerReady: false, runnerMode: null, runnerRequiresDownload: false };
541
+ }
542
+ try {
543
+ const value = JSON.parse(result.stdout.trim());
544
+ if (typeof value === "object" &&
545
+ value !== null &&
546
+ "verified" in value &&
547
+ typeof value.verified === "boolean" &&
548
+ "mode" in value &&
549
+ isRagmirRunnerMode(value.mode) &&
550
+ "requiresDownload" in value &&
551
+ typeof value.requiresDownload === "boolean") {
552
+ return {
553
+ runnerReady: value.verified,
554
+ runnerMode: value.mode,
555
+ runnerRequiresDownload: value.requiresDownload,
556
+ };
557
+ }
558
+ }
559
+ catch {
560
+ return { runnerReady: false, runnerMode: null, runnerRequiresDownload: false };
561
+ }
562
+ return { runnerReady: false, runnerMode: null, runnerRequiresDownload: false };
563
+ }
564
+ function isRagmirRunnerMode(value) {
565
+ return (value === "local-bin" ||
566
+ value === "workspace" ||
567
+ value === "installed-package" ||
568
+ value === "npm-cache");
569
+ }
570
+ function ragmirRunnerSource(version, installedCliPath) {
571
+ const packageSpec = `@jcode.labs/ragmir@${version}`;
572
+ return `#!/usr/bin/env node
573
+ const { spawnSync } = require("node:child_process")
574
+ const { existsSync, readFileSync } = require("node:fs")
575
+ const path = require("node:path")
576
+
577
+ const PACKAGE_SPEC = ${JSON.stringify(packageSpec)}
578
+ const INSTALLED_CLI = ${JSON.stringify(installedCliPath)}
579
+ const PROBE_ARG = ${JSON.stringify(RGR_RUNNER_PROBE_ARG)}
580
+ const projectRoot = path.resolve(process.env.${RAGMIR_PROJECT_ROOT_ENV} || process.cwd())
581
+
582
+ function isRagmirWorkspaceCli(cliPath) {
583
+ if (!existsSync(cliPath)) return false
584
+ try {
585
+ const manifestPath = path.join(path.dirname(path.dirname(cliPath)), "package.json")
586
+ const manifest = JSON.parse(readFileSync(manifestPath, "utf8"))
587
+ return manifest.name === "@jcode.labs/ragmir"
588
+ } catch {
589
+ return false
590
+ }
591
+ }
592
+
593
+ function resolveCommand() {
594
+ const localBin = path.join(
595
+ projectRoot,
596
+ "node_modules",
597
+ ".bin",
598
+ process.platform === "win32" ? "rgr.cmd" : "rgr",
599
+ )
600
+ if (existsSync(localBin)) {
601
+ return { mode: "local-bin", command: localBin, args: [], requiresDownload: false }
602
+ }
603
+
604
+ const workspaceCli = path.join(projectRoot, "packages", "ragmir-core", "dist", "cli.js")
605
+ if (isRagmirWorkspaceCli(workspaceCli)) {
606
+ return {
607
+ mode: "workspace",
608
+ command: process.execPath,
609
+ args: [workspaceCli],
610
+ requiresDownload: false,
611
+ }
612
+ }
613
+
614
+ if (isRagmirWorkspaceCli(INSTALLED_CLI)) {
615
+ return {
616
+ mode: "installed-package",
617
+ command: process.execPath,
618
+ args: [INSTALLED_CLI],
619
+ requiresDownload: false,
620
+ }
621
+ }
622
+
623
+ return {
624
+ mode: "npm-cache",
625
+ command: process.platform === "win32" ? "npx.cmd" : "npx",
626
+ args: ["--yes", "--package", PACKAGE_SPEC, "rgr"],
627
+ requiresDownload: true,
628
+ }
629
+ }
630
+
631
+ const selected = resolveCommand()
632
+ const commandArgs = process.argv.slice(2)
633
+
634
+ if (commandArgs[0] === PROBE_ARG) {
635
+ const probeArgs = selected.mode === "npm-cache" ? ["--version"] : [...selected.args, "--version"]
636
+ const probe = spawnSync(selected.command, probeArgs, {
637
+ cwd: projectRoot,
638
+ stdio: "ignore",
639
+ env: { ...process.env, ${RAGMIR_PROJECT_ROOT_ENV}: projectRoot },
640
+ })
641
+ const available = probe.status === 0
642
+ console.log(
643
+ JSON.stringify({
644
+ available,
645
+ verified: available && selected.mode !== "npm-cache",
646
+ mode: selected.mode,
647
+ requiresDownload: selected.requiresDownload,
648
+ }),
649
+ )
650
+ process.exitCode = available ? 0 : 1
651
+ } else {
652
+ const result = spawnSync(selected.command, [...selected.args, ...commandArgs], {
653
+ cwd: projectRoot,
654
+ stdio: "inherit",
655
+ env: { ...process.env, ${RAGMIR_PROJECT_ROOT_ENV}: projectRoot },
656
+ })
657
+ if (result.error) {
658
+ console.error(result.error.message)
659
+ process.exitCode = 1
660
+ } else {
661
+ process.exitCode = result.status ?? 1
662
+ }
663
+ }
664
+ `;
665
+ }
410
666
  function mcpConfig(cwd, serveCommand, env, serverName = DEFAULT_MCP_SERVER_NAME) {
411
667
  const serverConfig = {
412
668
  command: serveCommand.command,
@@ -658,7 +914,7 @@ Default project-scope targets:
658
914
  | Agent | Project skill directory | User skill directory |
659
915
  | --- | --- | --- |
660
916
  | Claude Code | \`.claude/skills/\` | \`~/.claude/skills/\` |
661
- | Codex | \`.codex/skills/\` | \`~/.codex/skills/\` |
917
+ | Codex | \`.agents/skills/\` | \`~/.agents/skills/\` |
662
918
  | Kimi Code CLI | \`.kimi/skills/\` | \`~/.kimi/skills/\` |
663
919
  | OpenCode | \`.opencode/skills/\` | \`~/.config/opencode/skills/\` |
664
920
  | Cline | \`.cline/skills/\` | \`~/.cline/skills/\` |
@@ -667,7 +923,8 @@ Override paths with \`CLAUDE_SKILLS_DIR\`, \`CODEX_SKILLS_DIR\`, \`KIMI_SKILLS_D
667
923
  \`OPENCODE_SKILLS_DIR\`, or \`CLINE_SKILLS_DIR\`.
668
924
 
669
925
  Use \`--mode copy\` only when an agent runtime does not follow symlinked skill directories. When using
670
- copy mode, rerun \`install-agent\` after refreshing \`.ragmir/skills/\`.
926
+ copy mode, rerun \`install-agent\` after refreshing \`.ragmir/skills/\`. Ragmir refuses to replace
927
+ an unmanaged same-name skill by default; use \`--force\` only after reviewing that existing folder.
671
928
 
672
929
  ## Skill Folders
673
930