@infinitedusky/indusk-mcp 1.14.0 → 1.14.2
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.
|
@@ -115,7 +115,18 @@ export async function extensionsEnable(projectRoot, names) {
|
|
|
115
115
|
printMcpSetup(projectRoot, name);
|
|
116
116
|
continue;
|
|
117
117
|
}
|
|
118
|
-
|
|
118
|
+
// Try npm as last resort
|
|
119
|
+
console.info(` ${name}: not built-in, trying npm...`);
|
|
120
|
+
try {
|
|
121
|
+
await extensionsAdd(projectRoot, name, name);
|
|
122
|
+
if (isEnabled(projectRoot, name)) {
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
// npm lookup failed, fall through
|
|
128
|
+
}
|
|
129
|
+
console.info(` ${name}: not found as built-in or npm package — use 'extensions add ${name} --from <source>' for third-party`);
|
|
119
130
|
}
|
|
120
131
|
}
|
|
121
132
|
export async function extensionsDisable(projectRoot, names) {
|
|
@@ -190,13 +201,36 @@ export async function extensionsAdd(projectRoot, name, from) {
|
|
|
190
201
|
}
|
|
191
202
|
}
|
|
192
203
|
else {
|
|
193
|
-
// Local path
|
|
204
|
+
// Local path — or fall back to npm if file doesn't exist
|
|
194
205
|
if (existsSync(from)) {
|
|
195
206
|
manifestContent = readFileSync(from, "utf-8");
|
|
196
207
|
}
|
|
197
208
|
else {
|
|
198
|
-
|
|
199
|
-
|
|
209
|
+
// Try as npm package name
|
|
210
|
+
const pkg = from;
|
|
211
|
+
try {
|
|
212
|
+
const tmpDir = join(projectRoot, ".indusk/tmp");
|
|
213
|
+
mkdirSync(tmpDir, { recursive: true });
|
|
214
|
+
execSync(`npm pack ${pkg} --pack-destination "${tmpDir}"`, {
|
|
215
|
+
encoding: "utf-8",
|
|
216
|
+
timeout: 30000,
|
|
217
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
218
|
+
});
|
|
219
|
+
const tarballs = readdirSync(tmpDir).filter((f) => f.endsWith(".tgz"));
|
|
220
|
+
if (tarballs.length > 0) {
|
|
221
|
+
try {
|
|
222
|
+
manifestContent = execSync(`tar -xzf "${join(tmpDir, tarballs[tarballs.length - 1])}" -O package/indusk-extension.json`, { encoding: "utf-8", timeout: 10000 });
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
console.info(` ${name}: no indusk-extension.json found in npm package ${pkg}`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
rmSync(tmpDir, { recursive: true, force: true });
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
console.info(` ${name}: not found as local file or npm package: ${from}`);
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
200
234
|
}
|
|
201
235
|
}
|
|
202
236
|
if (!manifestContent)
|
|
@@ -99,7 +99,7 @@ export async function infraStart() {
|
|
|
99
99
|
if (!hasImage) {
|
|
100
100
|
console.error(`Docker image '${IMAGE_NAME}' not found.`);
|
|
101
101
|
console.error("");
|
|
102
|
-
console.error("Build it from the
|
|
102
|
+
console.error("Build it from the dusk repo:");
|
|
103
103
|
console.error(" docker build -f docker/Dockerfile.infra -t indusk-infra .");
|
|
104
104
|
console.error("");
|
|
105
105
|
console.error("Or pull from GHCR (when published):");
|
|
@@ -34,7 +34,7 @@ Every episode belongs to a group. Groups isolate knowledge:
|
|
|
34
34
|
|
|
35
35
|
| Group | Purpose | Example |
|
|
36
36
|
|-------|---------|---------|
|
|
37
|
-
| `{project-name}` | Project-specific knowledge | `
|
|
37
|
+
| `{project-name}` | Project-specific knowledge | `dusk`, `numero` |
|
|
38
38
|
| `shared` | Cross-project conventions | Developer preferences, universal patterns |
|
|
39
39
|
|
|
40
40
|
When searching, always include both the project group and `shared` to get the full picture. Use `getProjectGroupId(projectRoot)` (from `apps/indusk-mcp/src/lib/config.ts`) to get the project group consistently — it reads `.indusk/config.json` `graphiti.groupId` if set, otherwise falls back to the project directory basename.
|
|
@@ -112,7 +112,7 @@ After a plan retrospective surfaces a useful insight, the retrospective skill ca
|
|
|
112
112
|
mcp__graphiti__add_memory({
|
|
113
113
|
name: "retro-gate-enforcement-1",
|
|
114
114
|
episode_body: "Plan gates need hook-based enforcement, not just instructions. The agent skipped gates when they were advisory only. PreToolUse hooks that block phase transitions are the fix.",
|
|
115
|
-
group_id: "
|
|
115
|
+
group_id: "dusk",
|
|
116
116
|
source: "text",
|
|
117
117
|
source_description: "retrospective insight"
|
|
118
118
|
})
|