@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/README.md +12 -2
- package/dist/cli.js +24 -3
- package/dist/cli.js.map +1 -1
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +15 -4
- package/dist/doctor.js.map +1 -1
- package/dist/gitignore.d.ts +1 -1
- package/dist/gitignore.d.ts.map +1 -1
- package/dist/gitignore.js +3 -2
- package/dist/gitignore.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/package-manager.d.ts +2 -0
- package/dist/package-manager.d.ts.map +1 -1
- package/dist/package-manager.js +18 -1
- package/dist/package-manager.js.map +1 -1
- package/dist/setup.d.ts +3 -1
- package/dist/setup.d.ts.map +1 -1
- package/dist/setup.js +9 -4
- package/dist/setup.js.map +1 -1
- package/dist/skill.d.ts +16 -3
- package/dist/skill.d.ts.map +1 -1
- package/dist/skill.js +273 -16
- package/dist/skill.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/examples/document-evidence-benchmark/.ragmir/config.json +6 -0
- package/examples/sovereign-rag-demo/.ragmir/config.json +6 -0
- package/package.json +3 -3
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;
|
|
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;
|
|
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"}
|
package/dist/package-manager.js
CHANGED
|
@@ -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
|
|
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":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAA;AAG5B,MAAM,WAAW,GAAG,KAAK,CAAA;
|
|
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;
|
package/dist/setup.d.ts.map
CHANGED
|
@@ -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,
|
|
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 {
|
|
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
|
-
|
|
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
|
-
"
|
|
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":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAiC,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACnF,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,EAAuB,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtE,OAAO,EAAuC,wBAAwB,EAAE,MAAM,sBAAsB,CAAA;AACpG,OAAO,
|
|
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
|
package/dist/skill.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../src/skill.ts"],"names":[],"mappings":"
|
|
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 {
|
|
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(".
|
|
58
|
-
userDir: (homeDir) => path.join(homeDir, ".
|
|
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
|
|
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 | \`.
|
|
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
|
|