@lousy-agents/mcp 5.13.0 → 5.13.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.
- package/dist/27.js +2 -2
- package/dist/653.js +1 -1
- package/dist/962.js +1 -1
- package/dist/mcp-server.js +93 -106
- package/package.json +2 -2
package/dist/27.js
CHANGED
|
@@ -7,10 +7,10 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
7
7
|
|
|
8
8
|
// EXPORTS
|
|
9
9
|
__webpack_require__.d(__webpack_exports__, {
|
|
10
|
+
FSWatcher: () => (/* binding */ FSWatcher),
|
|
10
11
|
WatchHelper: () => (/* binding */ WatchHelper),
|
|
11
12
|
"default": () => (/* binding */ chokidar),
|
|
12
|
-
watch: () => (/* binding */ watch)
|
|
13
|
-
FSWatcher: () => (/* binding */ FSWatcher)
|
|
13
|
+
watch: () => (/* binding */ watch)
|
|
14
14
|
});
|
|
15
15
|
|
|
16
16
|
// EXTERNAL MODULE: external "node:events"
|
package/dist/653.js
CHANGED
|
@@ -720,7 +720,7 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
720
720
|
downloadTemplate: () => (/* reexport */ downloadTemplate)
|
|
721
721
|
});
|
|
722
722
|
|
|
723
|
-
// UNUSED EXPORTS:
|
|
723
|
+
// UNUSED EXPORTS: registryProvider, startShell
|
|
724
724
|
|
|
725
725
|
// EXTERNAL MODULE: ../../node_modules/giget/dist/_chunks/libs/nypm.mjs
|
|
726
726
|
var nypm = __webpack_require__(292);
|
package/dist/962.js
CHANGED
|
@@ -8,7 +8,7 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
8
8
|
digest: () => (/* reexport */ node_digest)
|
|
9
9
|
});
|
|
10
10
|
|
|
11
|
-
// UNUSED EXPORTS: isEqual, serialize
|
|
11
|
+
// UNUSED EXPORTS: hash, isEqual, serialize
|
|
12
12
|
|
|
13
13
|
// EXTERNAL MODULE: external "node:crypto"
|
|
14
14
|
var external_node_crypto_ = __webpack_require__(7598);
|
package/dist/mcp-server.js
CHANGED
|
@@ -8374,7 +8374,7 @@ const safeDecodeAsync = /* @__PURE__*/ _safeDecodeAsync($ZodRealError);
|
|
|
8374
8374
|
const versions_version = {
|
|
8375
8375
|
major: 4,
|
|
8376
8376
|
minor: 4,
|
|
8377
|
-
patch:
|
|
8377
|
+
patch: 3,
|
|
8378
8378
|
};
|
|
8379
8379
|
|
|
8380
8380
|
;// CONCATENATED MODULE: ../../node_modules/zod/v4/core/schemas.js
|
|
@@ -10097,6 +10097,7 @@ const $ZodFile = /*@__PURE__*/ (/* unused pure expression or super */ null && (c
|
|
|
10097
10097
|
})));
|
|
10098
10098
|
const $ZodTransform = /*@__PURE__*/ $constructor("$ZodTransform", (inst, def) => {
|
|
10099
10099
|
$ZodType.init(inst, def);
|
|
10100
|
+
inst._zod.optin = "optional";
|
|
10100
10101
|
inst._zod.parse = (payload, ctx) => {
|
|
10101
10102
|
if (ctx.direction === "backward") {
|
|
10102
10103
|
throw new $ZodEncodeError(inst.constructor.name);
|
|
@@ -10106,6 +10107,7 @@ const $ZodTransform = /*@__PURE__*/ $constructor("$ZodTransform", (inst, def) =>
|
|
|
10106
10107
|
const output = _out instanceof Promise ? _out : Promise.resolve(_out);
|
|
10107
10108
|
return output.then((output) => {
|
|
10108
10109
|
payload.value = output;
|
|
10110
|
+
payload.fallback = true;
|
|
10109
10111
|
return payload;
|
|
10110
10112
|
});
|
|
10111
10113
|
}
|
|
@@ -10113,11 +10115,12 @@ const $ZodTransform = /*@__PURE__*/ $constructor("$ZodTransform", (inst, def) =>
|
|
|
10113
10115
|
throw new $ZodAsyncError();
|
|
10114
10116
|
}
|
|
10115
10117
|
payload.value = _out;
|
|
10118
|
+
payload.fallback = true;
|
|
10116
10119
|
return payload;
|
|
10117
10120
|
};
|
|
10118
10121
|
});
|
|
10119
10122
|
function handleOptionalResult(result, input) {
|
|
10120
|
-
if (result.issues.length
|
|
10123
|
+
if (input === undefined && (result.issues.length || result.fallback)) {
|
|
10121
10124
|
return { issues: [], value: undefined };
|
|
10122
10125
|
}
|
|
10123
10126
|
return result;
|
|
@@ -10135,10 +10138,11 @@ const $ZodOptional = /*@__PURE__*/ $constructor("$ZodOptional", (inst, def) => {
|
|
|
10135
10138
|
});
|
|
10136
10139
|
inst._zod.parse = (payload, ctx) => {
|
|
10137
10140
|
if (def.innerType._zod.optin === "optional") {
|
|
10141
|
+
const input = payload.value;
|
|
10138
10142
|
const result = def.innerType._zod.run(payload, ctx);
|
|
10139
10143
|
if (result instanceof Promise)
|
|
10140
|
-
return result.then((r) => handleOptionalResult(r,
|
|
10141
|
-
return handleOptionalResult(result,
|
|
10144
|
+
return result.then((r) => handleOptionalResult(r, input));
|
|
10145
|
+
return handleOptionalResult(result, input);
|
|
10142
10146
|
}
|
|
10143
10147
|
if (payload.value === undefined) {
|
|
10144
10148
|
return payload;
|
|
@@ -10265,7 +10269,7 @@ const $ZodSuccess = /*@__PURE__*/ (/* unused pure expression or super */ null &&
|
|
|
10265
10269
|
})));
|
|
10266
10270
|
const $ZodCatch = /*@__PURE__*/ $constructor("$ZodCatch", (inst, def) => {
|
|
10267
10271
|
$ZodType.init(inst, def);
|
|
10268
|
-
|
|
10272
|
+
inst._zod.optin = "optional";
|
|
10269
10273
|
defineLazy(inst._zod, "optout", () => def.innerType._zod.optout);
|
|
10270
10274
|
defineLazy(inst._zod, "values", () => def.innerType._zod.values);
|
|
10271
10275
|
inst._zod.parse = (payload, ctx) => {
|
|
@@ -10286,6 +10290,7 @@ const $ZodCatch = /*@__PURE__*/ $constructor("$ZodCatch", (inst, def) => {
|
|
|
10286
10290
|
input: payload.value,
|
|
10287
10291
|
});
|
|
10288
10292
|
payload.issues = [];
|
|
10293
|
+
payload.fallback = true;
|
|
10289
10294
|
}
|
|
10290
10295
|
return payload;
|
|
10291
10296
|
});
|
|
@@ -10300,6 +10305,7 @@ const $ZodCatch = /*@__PURE__*/ $constructor("$ZodCatch", (inst, def) => {
|
|
|
10300
10305
|
input: payload.value,
|
|
10301
10306
|
});
|
|
10302
10307
|
payload.issues = [];
|
|
10308
|
+
payload.fallback = true;
|
|
10303
10309
|
}
|
|
10304
10310
|
return payload;
|
|
10305
10311
|
};
|
|
@@ -10346,7 +10352,7 @@ function handlePipeResult(left, next, ctx) {
|
|
|
10346
10352
|
left.aborted = true;
|
|
10347
10353
|
return left;
|
|
10348
10354
|
}
|
|
10349
|
-
return next._zod.run({ value: left.value, issues: left.issues }, ctx);
|
|
10355
|
+
return next._zod.run({ value: left.value, issues: left.issues, fallback: left.fallback }, ctx);
|
|
10350
10356
|
}
|
|
10351
10357
|
const $ZodCodec = /*@__PURE__*/ (/* unused pure expression or super */ null && (core.$constructor("$ZodCodec", (inst, def) => {
|
|
10352
10358
|
$ZodType.init(inst, def);
|
|
@@ -10404,8 +10410,6 @@ function handleCodecTxResult(left, value, nextSchema, ctx) {
|
|
|
10404
10410
|
}
|
|
10405
10411
|
const $ZodPreprocess = /*@__PURE__*/ $constructor("$ZodPreprocess", (inst, def) => {
|
|
10406
10412
|
$ZodPipe.init(inst, def);
|
|
10407
|
-
defineLazy(inst._zod, "optin", () => def.out._zod.optin);
|
|
10408
|
-
defineLazy(inst._zod, "optout", () => def.out._zod.optout);
|
|
10409
10413
|
});
|
|
10410
10414
|
const $ZodReadonly = /*@__PURE__*/ $constructor("$ZodReadonly", (inst, def) => {
|
|
10411
10415
|
$ZodType.init(inst, def);
|
|
@@ -13992,10 +13996,12 @@ const ZodTransform = /*@__PURE__*/ $constructor("ZodTransform", (inst, def) => {
|
|
|
13992
13996
|
if (output instanceof Promise) {
|
|
13993
13997
|
return output.then((output) => {
|
|
13994
13998
|
payload.value = output;
|
|
13999
|
+
payload.fallback = true;
|
|
13995
14000
|
return payload;
|
|
13996
14001
|
});
|
|
13997
14002
|
}
|
|
13998
14003
|
payload.value = output;
|
|
14004
|
+
payload.fallback = true;
|
|
13999
14005
|
return payload;
|
|
14000
14006
|
};
|
|
14001
14007
|
});
|
|
@@ -29484,6 +29490,26 @@ var compat_ZodFirstPartyTypeKind;
|
|
|
29484
29490
|
setupActionPatterns: DEFAULT_SETUP_ACTION_PATTERNS,
|
|
29485
29491
|
packageManagers: DEFAULT_PACKAGE_MANAGERS
|
|
29486
29492
|
};
|
|
29493
|
+
/**
|
|
29494
|
+
* Gets a version type to action name mapping from config.
|
|
29495
|
+
* Returns a partial record as not all types may be configured.
|
|
29496
|
+
*/ function getVersionTypeToActionMap(config) {
|
|
29497
|
+
const map = {};
|
|
29498
|
+
for (const action of config.setupActions){
|
|
29499
|
+
map[action.type] = action.action;
|
|
29500
|
+
}
|
|
29501
|
+
return map;
|
|
29502
|
+
}
|
|
29503
|
+
/**
|
|
29504
|
+
* Gets a version file type to config key mapping from config.
|
|
29505
|
+
* Returns a partial record as not all types may be configured.
|
|
29506
|
+
*/ function getVersionFileConfigKeyMap(config) {
|
|
29507
|
+
const map = {};
|
|
29508
|
+
for (const action of config.setupActions){
|
|
29509
|
+
map[action.type] = action.versionFileKey;
|
|
29510
|
+
}
|
|
29511
|
+
return map;
|
|
29512
|
+
}
|
|
29487
29513
|
|
|
29488
29514
|
;// CONCATENATED MODULE: ../core/src/lib/copilot-setup-config.ts
|
|
29489
29515
|
/**
|
|
@@ -29611,29 +29637,8 @@ const CopilotSetupConfigSchema = schemas_object({
|
|
|
29611
29637
|
*
|
|
29612
29638
|
* This function is retained for backwards compatibility but is a no-op
|
|
29613
29639
|
* because configuration is no longer cached at module scope.
|
|
29614
|
-
*/ function resetCopilotSetupConfigCache() {
|
|
29615
|
-
|
|
29616
|
-
}
|
|
29617
|
-
/**
|
|
29618
|
-
* Gets a version file type to action mapping from config.
|
|
29619
|
-
* Returns a partial record as not all types may be configured.
|
|
29620
|
-
*/ function getVersionTypeToActionMap(config) {
|
|
29621
|
-
const map = {};
|
|
29622
|
-
for (const action of config.setupActions){
|
|
29623
|
-
map[action.type] = action.action;
|
|
29624
|
-
}
|
|
29625
|
-
return map;
|
|
29626
|
-
}
|
|
29627
|
-
/**
|
|
29628
|
-
* Gets a version file type to config key mapping from config.
|
|
29629
|
-
* Returns a partial record as not all types may be configured.
|
|
29630
|
-
*/ function getVersionFileConfigKeyMap(config) {
|
|
29631
|
-
const map = {};
|
|
29632
|
-
for (const action of config.setupActions){
|
|
29633
|
-
map[action.type] = action.versionFileKey;
|
|
29634
|
-
}
|
|
29635
|
-
return map;
|
|
29636
|
-
}
|
|
29640
|
+
*/ function resetCopilotSetupConfigCache() {}
|
|
29641
|
+
|
|
29637
29642
|
/**
|
|
29638
29643
|
* Gets a filename to version type mapping from config.
|
|
29639
29644
|
*/ function getVersionFilenameToTypeMap(config) {
|
|
@@ -29995,15 +30000,12 @@ function defaultExec(command, args, options) {
|
|
|
29995
30000
|
* File system implementation of instruction analysis gateway
|
|
29996
30001
|
*/ class FileSystemInstructionAnalysisGateway {
|
|
29997
30002
|
async analyzeCoverage(targetDir, scripts, tools) {
|
|
29998
|
-
// Find all instruction files
|
|
29999
30003
|
const instructionFiles = await this.findInstructionFiles(targetDir);
|
|
30000
|
-
// Read and search instruction content
|
|
30001
30004
|
const references = [];
|
|
30002
30005
|
const documentedTargets = new Set();
|
|
30003
30006
|
for (const file of instructionFiles){
|
|
30004
30007
|
const content = await (0,promises_.readFile)(file, "utf-8");
|
|
30005
30008
|
const lines = content.split("\n");
|
|
30006
|
-
// Check for script references (e.g., "npm test", "npm run build")
|
|
30007
30009
|
for (const script of scripts){
|
|
30008
30010
|
const scriptRefs = this.findReferencesInContent(script.name, content, lines, file, targetDir);
|
|
30009
30011
|
if (scriptRefs.length > 0) {
|
|
@@ -30011,7 +30013,6 @@ function defaultExec(command, args, options) {
|
|
|
30011
30013
|
documentedTargets.add(script.name);
|
|
30012
30014
|
}
|
|
30013
30015
|
}
|
|
30014
|
-
// Check for tool references (e.g., "mise run test", "biome check")
|
|
30015
30016
|
for (const tool of tools){
|
|
30016
30017
|
const toolRefs = this.findReferencesInContent(tool.name, content, lines, file, targetDir);
|
|
30017
30018
|
if (toolRefs.length > 0) {
|
|
@@ -30020,14 +30021,12 @@ function defaultExec(command, args, options) {
|
|
|
30020
30021
|
}
|
|
30021
30022
|
}
|
|
30022
30023
|
}
|
|
30023
|
-
// Filter mandatory scripts/tools
|
|
30024
30024
|
const mandatoryScripts = scripts.filter((s)=>s.isMandatory);
|
|
30025
30025
|
const mandatoryTools = tools.filter((t)=>t.isMandatory);
|
|
30026
30026
|
const allMandatory = [
|
|
30027
30027
|
...mandatoryScripts,
|
|
30028
30028
|
...mandatoryTools
|
|
30029
30029
|
];
|
|
30030
|
-
// Categorize as missing or documented
|
|
30031
30030
|
const missingInInstructions = allMandatory.filter((item)=>!documentedTargets.has(item.name));
|
|
30032
30031
|
const documentedInInstructions = allMandatory.filter((item)=>documentedTargets.has(item.name));
|
|
30033
30032
|
const totalMandatory = allMandatory.length;
|
|
@@ -30046,12 +30045,10 @@ function defaultExec(command, args, options) {
|
|
|
30046
30045
|
}
|
|
30047
30046
|
async findInstructionFiles(targetDir) {
|
|
30048
30047
|
const files = [];
|
|
30049
|
-
// Check for .github/copilot-instructions.md
|
|
30050
30048
|
const copilotInstructions = (0,external_node_path_.join)(targetDir, ".github", "copilot-instructions.md");
|
|
30051
30049
|
if (await file_system_utils_fileExists(copilotInstructions)) {
|
|
30052
30050
|
files.push(copilotInstructions);
|
|
30053
30051
|
}
|
|
30054
|
-
// Check for .github/instructions/*.md
|
|
30055
30052
|
const instructionsDir = (0,external_node_path_.join)(targetDir, ".github", "instructions");
|
|
30056
30053
|
if (await file_system_utils_fileExists(instructionsDir)) {
|
|
30057
30054
|
try {
|
|
@@ -30061,31 +30058,20 @@ function defaultExec(command, args, options) {
|
|
|
30061
30058
|
files.push((0,external_node_path_.join)(instructionsDir, file));
|
|
30062
30059
|
}
|
|
30063
30060
|
}
|
|
30064
|
-
} catch {
|
|
30065
|
-
// Skip directory if we can't read it (e.g., permissions issues)
|
|
30066
|
-
// Similar to how workflow parsing errors are handled
|
|
30067
|
-
}
|
|
30061
|
+
} catch {}
|
|
30068
30062
|
}
|
|
30069
30063
|
return files;
|
|
30070
30064
|
}
|
|
30071
30065
|
findReferencesInContent(target, content, lines, file, targetDir) {
|
|
30072
30066
|
const references = [];
|
|
30073
|
-
// Build a case-insensitive, word-boundary-aware pattern for the target.
|
|
30074
|
-
// This reduces false positives from simple substring matches like
|
|
30075
|
-
// "test" in "testing" or "latest", while still matching common
|
|
30076
|
-
// separators such as spaces, punctuation, etc.
|
|
30077
30067
|
const escapedTarget = target.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
30078
30068
|
const targetPattern = new RegExp(`(?:^|[^\\w])(${escapedTarget})(?=$|[^\\w])`, "i");
|
|
30079
|
-
// Fast path: skip line-by-line processing if the target pattern
|
|
30080
|
-
// never appears in the full content.
|
|
30081
30069
|
if (!targetPattern.test(content)) {
|
|
30082
30070
|
return references;
|
|
30083
30071
|
}
|
|
30084
|
-
// Find line numbers where target appears
|
|
30085
30072
|
for(let i = 0; i < lines.length; i++){
|
|
30086
30073
|
const line = lines[i];
|
|
30087
30074
|
if (targetPattern.test(line)) {
|
|
30088
|
-
// Get context (line before and after if available)
|
|
30089
30075
|
const contextLines = [];
|
|
30090
30076
|
if (i > 0) contextLines.push(lines[i - 1]);
|
|
30091
30077
|
contextLines.push(line);
|
|
@@ -31797,47 +31783,78 @@ const MAX_NPMRC_BYTES = (/* unused pure expression or super */ null && (64 * 102
|
|
|
31797
31783
|
|
|
31798
31784
|
|
|
31799
31785
|
|
|
31786
|
+
|
|
31787
|
+
// 1 MB — covers even the largest real-world manifests
|
|
31788
|
+
const MAX_PACKAGE_JSON_BYTES = 1024 * 1024;
|
|
31789
|
+
const PackageJsonSchema = schemas_object({
|
|
31790
|
+
scripts: record(schemas_string(), schemas_string()).optional()
|
|
31791
|
+
});
|
|
31800
31792
|
/**
|
|
31801
31793
|
* File system implementation of script discovery gateway
|
|
31802
31794
|
*/ class FileSystemScriptDiscoveryGateway {
|
|
31795
|
+
constructor(logger){
|
|
31796
|
+
this.logger = logger ?? dist_consola;
|
|
31797
|
+
}
|
|
31798
|
+
logger;
|
|
31803
31799
|
async discoverScripts(targetDir) {
|
|
31804
31800
|
const packageJsonPath = (0,external_node_path_.join)(targetDir, "package.json");
|
|
31805
|
-
|
|
31801
|
+
let content;
|
|
31802
|
+
try {
|
|
31803
|
+
content = await file_system_utils_readFileNoFollow(packageJsonPath, MAX_PACKAGE_JSON_BYTES);
|
|
31804
|
+
} catch (error) {
|
|
31805
|
+
const code = error instanceof Error && "code" in error ? error.code : undefined;
|
|
31806
|
+
if (code !== "ENOENT") {
|
|
31807
|
+
this.logger.warn(`script-discovery: could not read ${JSON.stringify(packageJsonPath)}: ${JSON.stringify(error instanceof Error ? error.message : String(error))}`);
|
|
31808
|
+
}
|
|
31806
31809
|
return [];
|
|
31807
31810
|
}
|
|
31811
|
+
let parsed;
|
|
31808
31812
|
try {
|
|
31809
|
-
|
|
31810
|
-
|
|
31811
|
-
if (
|
|
31813
|
+
parsed = JSON.parse(content);
|
|
31814
|
+
} catch (e) {
|
|
31815
|
+
if (e instanceof SyntaxError) {
|
|
31816
|
+
this.logger.warn(`script-discovery: ${JSON.stringify(packageJsonPath)} contains invalid JSON — ${JSON.stringify(e.message)}`);
|
|
31812
31817
|
return [];
|
|
31813
31818
|
}
|
|
31814
|
-
|
|
31815
|
-
|
|
31816
|
-
|
|
31817
|
-
|
|
31818
|
-
|
|
31819
|
-
name,
|
|
31820
|
-
command,
|
|
31821
|
-
phase,
|
|
31822
|
-
isMandatory
|
|
31823
|
-
});
|
|
31824
|
-
}
|
|
31825
|
-
return scripts;
|
|
31826
|
-
} catch {
|
|
31827
|
-
// If package.json is malformed or cannot be parsed, return empty array
|
|
31819
|
+
throw e;
|
|
31820
|
+
}
|
|
31821
|
+
const parseResult = PackageJsonSchema.safeParse(parsed);
|
|
31822
|
+
if (!parseResult.success) {
|
|
31823
|
+
this.logger.warn(`script-discovery: ${JSON.stringify(packageJsonPath)} has an unexpected structure — scripts field must be a record of strings`);
|
|
31828
31824
|
return [];
|
|
31829
31825
|
}
|
|
31826
|
+
if (!parseResult.data.scripts) {
|
|
31827
|
+
return [];
|
|
31828
|
+
}
|
|
31829
|
+
const scripts = [];
|
|
31830
|
+
for (const [name, command] of Object.entries(parseResult.data.scripts)){
|
|
31831
|
+
const phase = determineScriptPhase(name, command);
|
|
31832
|
+
const isMandatory = isScriptMandatory(phase);
|
|
31833
|
+
scripts.push({
|
|
31834
|
+
name,
|
|
31835
|
+
command,
|
|
31836
|
+
phase,
|
|
31837
|
+
isMandatory
|
|
31838
|
+
});
|
|
31839
|
+
}
|
|
31840
|
+
return scripts;
|
|
31830
31841
|
}
|
|
31831
31842
|
}
|
|
31832
31843
|
/**
|
|
31833
31844
|
* Creates and returns the default script discovery gateway
|
|
31834
|
-
*/ function createScriptDiscoveryGateway() {
|
|
31835
|
-
return new FileSystemScriptDiscoveryGateway();
|
|
31845
|
+
*/ function createScriptDiscoveryGateway(logger) {
|
|
31846
|
+
return new FileSystemScriptDiscoveryGateway(logger);
|
|
31836
31847
|
}
|
|
31837
31848
|
/**
|
|
31838
31849
|
* Creates a FeedbackLoopCommandsGateway that discovers mandatory commands from package.json scripts.
|
|
31839
|
-
|
|
31840
|
-
|
|
31850
|
+
*
|
|
31851
|
+
* @param scriptGateway - Optional gateway implementation. If omitted, a default
|
|
31852
|
+
* `FileSystemScriptDiscoveryGateway` is created using `logger`.
|
|
31853
|
+
* @param logger - Optional logger for the default gateway. Only used when
|
|
31854
|
+
* `scriptGateway` is omitted; if a custom `scriptGateway` is supplied, its
|
|
31855
|
+
* own logger configuration applies and this parameter is ignored.
|
|
31856
|
+
*/ function createFeedbackLoopCommandsGateway(scriptGateway, logger) {
|
|
31857
|
+
const gateway = scriptGateway ?? createScriptDiscoveryGateway(logger);
|
|
31841
31858
|
return {
|
|
31842
31859
|
async getMandatoryCommands (targetDir) {
|
|
31843
31860
|
const scripts = await gateway.discoverScripts(targetDir);
|
|
@@ -32056,9 +32073,7 @@ var yaml_dist = __webpack_require__(3519);
|
|
|
32056
32073
|
const workflow = (0,yaml_dist/* .parse */.qg)(content);
|
|
32057
32074
|
const tools = this.extractToolsFromWorkflow(workflow, file);
|
|
32058
32075
|
allTools.push(...tools);
|
|
32059
|
-
} catch {
|
|
32060
|
-
// Skip files that can't be parsed as valid YAML
|
|
32061
|
-
}
|
|
32076
|
+
} catch {}
|
|
32062
32077
|
}
|
|
32063
32078
|
return this.deduplicateTools(allTools);
|
|
32064
32079
|
}
|
|
@@ -32086,7 +32101,6 @@ var yaml_dist = __webpack_require__(3519);
|
|
|
32086
32101
|
const stepObj = step;
|
|
32087
32102
|
const run = stepObj.run;
|
|
32088
32103
|
if (typeof run === "string") {
|
|
32089
|
-
// Extract tools from run commands
|
|
32090
32104
|
const extractedTools = this.extractToolsFromRunCommand(run, sourceFile);
|
|
32091
32105
|
tools.push(...extractedTools);
|
|
32092
32106
|
}
|
|
@@ -32096,35 +32110,24 @@ var yaml_dist = __webpack_require__(3519);
|
|
|
32096
32110
|
}
|
|
32097
32111
|
extractToolsFromRunCommand(runCommand, sourceFile) {
|
|
32098
32112
|
const tools = [];
|
|
32099
|
-
// Split by newlines and pipe tokens with surrounding whitespace to handle
|
|
32100
|
-
// multi-line and piped commands without breaking on constructs like "cmd || true"
|
|
32101
32113
|
const commands = runCommand.split(/\n|\s\|\s/).map((c)=>c.trim()).filter((c)=>c.length > 0 && !c.startsWith("#"));
|
|
32102
32114
|
for (const command of commands){
|
|
32103
|
-
// Extract the base command (first word)
|
|
32104
32115
|
const parts = command.split(/\s+/);
|
|
32105
32116
|
const baseCommand = parts[0];
|
|
32106
|
-
// Skip shell built-ins and common utilities
|
|
32107
32117
|
if (this.isShellBuiltin(baseCommand)) {
|
|
32108
32118
|
continue;
|
|
32109
32119
|
}
|
|
32110
|
-
// Determine tool name and full command
|
|
32111
32120
|
let toolName;
|
|
32112
32121
|
const fullCommand = command;
|
|
32113
|
-
// Handle special cases like "npm run", "mise run", etc.
|
|
32114
32122
|
if (parts.length >= 2 && (baseCommand === "npm" || baseCommand === "mise") && parts[1] === "run") {
|
|
32115
32123
|
if (parts.length >= 3 && parts[2]) {
|
|
32116
|
-
// "npm run test" -> name: "npm run test"
|
|
32117
32124
|
toolName = parts.slice(0, 3).join(" ");
|
|
32118
32125
|
} else {
|
|
32119
|
-
// Handle commands like "npm run" without a script name
|
|
32120
32126
|
toolName = parts.slice(0, 2).join(" ");
|
|
32121
32127
|
}
|
|
32122
32128
|
} else if (parts.length >= 2) {
|
|
32123
|
-
// For most tools, include the subcommand for better specificity
|
|
32124
|
-
// e.g., "npm test", "npx biome", "pnpm lint"
|
|
32125
32129
|
toolName = parts.slice(0, 2).join(" ");
|
|
32126
32130
|
} else {
|
|
32127
|
-
// Fallback to the base command if no subcommand is present
|
|
32128
32131
|
toolName = baseCommand;
|
|
32129
32132
|
}
|
|
32130
32133
|
const phase = this.determineToolPhase(toolName, fullCommand);
|
|
@@ -32163,13 +32166,11 @@ var yaml_dist = __webpack_require__(3519);
|
|
|
32163
32166
|
return builtins.includes(command);
|
|
32164
32167
|
}
|
|
32165
32168
|
determineToolPhase(toolName, fullCommand) {
|
|
32166
|
-
// Use the same logic as script phase determination
|
|
32167
32169
|
return determineScriptPhase(toolName, fullCommand);
|
|
32168
32170
|
}
|
|
32169
32171
|
deduplicateTools(tools) {
|
|
32170
32172
|
const seen = new Map();
|
|
32171
32173
|
for (const tool of tools){
|
|
32172
|
-
// Use full command as key for deduplication
|
|
32173
32174
|
const key = tool.fullCommand;
|
|
32174
32175
|
if (!seen.has(key)) {
|
|
32175
32176
|
seen.set(key, tool);
|
|
@@ -32426,9 +32427,7 @@ class FileSystemWorkflowGateway {
|
|
|
32426
32427
|
const workflow = (0,yaml_dist/* .parse */.qg)(content);
|
|
32427
32428
|
const candidates = extractSetupStepsFromWorkflow(workflow, config.setupActionPatterns);
|
|
32428
32429
|
allCandidates.push(...candidates);
|
|
32429
|
-
} catch {
|
|
32430
|
-
// Skip unreadable or malformed YAML workflow files while continuing scan.
|
|
32431
|
-
}
|
|
32430
|
+
} catch {}
|
|
32432
32431
|
}
|
|
32433
32432
|
return deduplicateCandidates(allCandidates);
|
|
32434
32433
|
}
|
|
@@ -32465,8 +32464,7 @@ function createWorkflowGateway(cwd) {
|
|
|
32465
32464
|
;// CONCATENATED MODULE: ../core/src/gateways/workflow-gateway.ts
|
|
32466
32465
|
/**
|
|
32467
32466
|
* Gateway interface for GitHub Actions workflow operations.
|
|
32468
|
-
*/
|
|
32469
|
-
|
|
32467
|
+
*/
|
|
32470
32468
|
|
|
32471
32469
|
;// CONCATENATED MODULE: ../core/src/gateways/index.ts
|
|
32472
32470
|
/**
|
|
@@ -52775,7 +52773,6 @@ Example resolved format: actions/setup-node@1a2b3c4d5e6f # v4.0.0`;
|
|
|
52775
52773
|
* This module handles the logic of determining which GitHub Actions
|
|
52776
52774
|
* setup steps should be added based on detected version files and package managers.
|
|
52777
52775
|
*/
|
|
52778
|
-
|
|
52779
52776
|
/**
|
|
52780
52777
|
* Creates an ActionVersionPort backed by a static version map.
|
|
52781
52778
|
*/ function createActionVersionPort(versionMap) {
|
|
@@ -53649,11 +53646,8 @@ const workflow_generator_defaultActionVersionPort = createActionVersionPort(work
|
|
|
53649
53646
|
if (!input.targetDir) {
|
|
53650
53647
|
throw new Error("Target directory is required");
|
|
53651
53648
|
}
|
|
53652
|
-
// Discover scripts from package.json
|
|
53653
53649
|
const scripts = await this.scriptGateway.discoverScripts(input.targetDir);
|
|
53654
|
-
// Discover tools from GitHub Actions workflows
|
|
53655
53650
|
const tools = await this.toolGateway.discoverTools(input.targetDir);
|
|
53656
|
-
// Detect package manager
|
|
53657
53651
|
const packageManagers = await this.packageManagerGateway.detectPackageManagers(input.targetDir);
|
|
53658
53652
|
const primaryPackageManager = packageManagers.length > 0 ? packageManagers[0].type : undefined;
|
|
53659
53653
|
const feedbackLoops = {
|
|
@@ -53914,14 +53908,11 @@ const workflow_generator_defaultActionVersionPort = createActionVersionPort(work
|
|
|
53914
53908
|
if (!input.targetDir) {
|
|
53915
53909
|
throw new Error("Target directory is required");
|
|
53916
53910
|
}
|
|
53917
|
-
// First, discover all feedback loops
|
|
53918
53911
|
const discoveryResult = await this.discoverFeedbackLoops.execute({
|
|
53919
53912
|
targetDir: input.targetDir
|
|
53920
53913
|
});
|
|
53921
53914
|
const { scripts, tools, packageManager } = discoveryResult.feedbackLoops;
|
|
53922
|
-
// Analyze instruction coverage
|
|
53923
53915
|
const coverage = await this.instructionGateway.analyzeCoverage(input.targetDir, scripts, tools);
|
|
53924
|
-
// Generate suggestions for missing documentation
|
|
53925
53916
|
const suggestions = this.generateSuggestions(coverage, packageManager || "npm");
|
|
53926
53917
|
return {
|
|
53927
53918
|
coverage,
|
|
@@ -53937,22 +53928,18 @@ const workflow_generator_defaultActionVersionPort = createActionVersionPort(work
|
|
|
53937
53928
|
}
|
|
53938
53929
|
suggestions.push(`⚠️ ${coverage.missingInInstructions.length} mandatory feedback loop(s) are not documented:`);
|
|
53939
53930
|
suggestions.push("");
|
|
53940
|
-
// Group by phase
|
|
53941
53931
|
const byPhase = new Map();
|
|
53942
53932
|
for (const item of coverage.missingInInstructions){
|
|
53943
53933
|
const existing = byPhase.get(item.phase) || [];
|
|
53944
53934
|
existing.push(item);
|
|
53945
53935
|
byPhase.set(item.phase, existing);
|
|
53946
53936
|
}
|
|
53947
|
-
// Generate suggestions per phase
|
|
53948
53937
|
for (const [phase, items] of byPhase.entries()){
|
|
53949
53938
|
suggestions.push(`${phase.toUpperCase()} phase:`);
|
|
53950
53939
|
for (const item of items){
|
|
53951
53940
|
if ("command" in item) {
|
|
53952
|
-
// It's a script
|
|
53953
53941
|
suggestions.push(` - Document "${packageManager} run ${item.name}" (runs: ${item.command})`);
|
|
53954
53942
|
} else {
|
|
53955
|
-
// It's a tool
|
|
53956
53943
|
suggestions.push(` - Document "${item.fullCommand}"`);
|
|
53957
53944
|
}
|
|
53958
53945
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lousy-agents/mcp",
|
|
3
|
-
"version": "5.13.
|
|
3
|
+
"version": "5.13.2",
|
|
4
4
|
"description": "MCP server for lousy-agents - provides AI coding assistant tools via the Model Context Protocol",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": {
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"dependencies": {
|
|
39
39
|
"@modelcontextprotocol/sdk": "1.29.0",
|
|
40
40
|
"yaml": "2.8.4",
|
|
41
|
-
"zod": "4.4.
|
|
41
|
+
"zod": "4.4.3"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"@lousy-agents/core": "*"
|