@fyuld/snitch 2.3.10 → 3.0.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/assets/json-schemas/policy.schema.json +8 -1
- package/assets/json-schemas/third-party-tool.schema.json +8 -1
- package/dist/commands/firstRun.d.ts.map +1 -1
- package/dist/commands/firstRun.js +46 -18
- package/dist/commands/firstRun.js.map +1 -1
- package/dist/commands/init.d.ts +3 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +37 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/prepare.d.ts +3 -0
- package/dist/commands/prepare.d.ts.map +1 -1
- package/dist/commands/prepare.js +110 -17
- package/dist/commands/prepare.js.map +1 -1
- package/dist/datamodel/snitch-configuration.d.ts +2 -0
- package/dist/datamodel/snitch-configuration.d.ts.map +1 -1
- package/dist/datamodel/snitch-configuration.js.map +1 -1
- package/dist/utils/third-party-tools.d.ts +19 -0
- package/dist/utils/third-party-tools.d.ts.map +1 -0
- package/dist/utils/third-party-tools.js +207 -0
- package/dist/utils/third-party-tools.js.map +1 -0
- package/package.json +1 -1
- package/dist/utils/enforcement-software.d.ts +0 -3
- package/dist/utils/enforcement-software.d.ts.map +0 -1
- package/dist/utils/enforcement-software.js +0 -133
- package/dist/utils/enforcement-software.js.map +0 -1
|
@@ -14,9 +14,16 @@
|
|
|
14
14
|
"items": {
|
|
15
15
|
"$ref": "#/definitions/ViolationRule"
|
|
16
16
|
}
|
|
17
|
+
},
|
|
18
|
+
"instructions": {
|
|
19
|
+
"type": "array",
|
|
20
|
+
"description": "List of instruction file URLs for AI agents",
|
|
21
|
+
"items": {
|
|
22
|
+
"type": "string"
|
|
23
|
+
}
|
|
17
24
|
}
|
|
18
25
|
},
|
|
19
|
-
"required": ["title", "violations"],
|
|
26
|
+
"required": ["title", "violations", "instructions"],
|
|
20
27
|
"additionalProperties": false,
|
|
21
28
|
"definitions": {
|
|
22
29
|
"ViolationRule": {
|
|
@@ -60,6 +60,13 @@
|
|
|
60
60
|
}
|
|
61
61
|
]
|
|
62
62
|
},
|
|
63
|
+
"instructions": {
|
|
64
|
+
"type": "array",
|
|
65
|
+
"description": "List of instruction file URLs for AI agents",
|
|
66
|
+
"items": {
|
|
67
|
+
"type": "string"
|
|
68
|
+
}
|
|
69
|
+
},
|
|
63
70
|
"sideEffects": {
|
|
64
71
|
"type": "object",
|
|
65
72
|
"description": "Side effects to apply to project files",
|
|
@@ -72,6 +79,6 @@
|
|
|
72
79
|
"additionalProperties": false
|
|
73
80
|
}
|
|
74
81
|
},
|
|
75
|
-
"required": ["title", "description", "id", "purpose", "configFilename", "software", "configuration"],
|
|
82
|
+
"required": ["title", "description", "id", "purpose", "configFilename", "software", "configuration", "instructions"],
|
|
76
83
|
"additionalProperties": false
|
|
77
84
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"firstRun.d.ts","sourceRoot":"","sources":["../../src/commands/firstRun.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"firstRun.d.ts","sourceRoot":"","sources":["../../src/commands/firstRun.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAInD,wBAAsB,eAAe,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAqD7F"}
|
|
@@ -36,27 +36,55 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
36
36
|
exports.firstRunCommand = firstRunCommand;
|
|
37
37
|
const fs = __importStar(require("fs"));
|
|
38
38
|
const path = __importStar(require("path"));
|
|
39
|
+
const child_process_1 = require("child_process");
|
|
39
40
|
const init_1 = require("./init");
|
|
40
|
-
const
|
|
41
|
+
const json_merge_1 = require("../utils/json-merge");
|
|
41
42
|
async function firstRunCommand(projectName, maybeUrl) {
|
|
43
|
+
const result = await (0, init_1.init)(projectName, maybeUrl);
|
|
44
|
+
for (const file of result.files) {
|
|
45
|
+
fs.writeFileSync(path.resolve(file.path), file.content, 'utf-8');
|
|
46
|
+
console.log(`Created ${file.path}`);
|
|
47
|
+
}
|
|
42
48
|
const packageJsonPath = path.resolve('package.json');
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
49
|
+
let finalPackageJson;
|
|
50
|
+
for (const update of result.packageJsonUpdates) {
|
|
51
|
+
const currentPackageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
|
|
52
|
+
const mergedPackageJson = (0, json_merge_1.mergeJson)(currentPackageJson, update.updates);
|
|
53
|
+
fs.writeFileSync(packageJsonPath, JSON.stringify(mergedPackageJson, null, 2), 'utf-8');
|
|
54
|
+
console.log('Updated package.json with side effects');
|
|
55
|
+
finalPackageJson = mergedPackageJson;
|
|
56
|
+
}
|
|
57
|
+
const createdDirs = [];
|
|
58
|
+
for (const dir of result.directories) {
|
|
59
|
+
const resolvedPath = path.resolve(dir.path);
|
|
60
|
+
if (!fs.existsSync(resolvedPath)) {
|
|
61
|
+
fs.mkdirSync(resolvedPath, { recursive: true });
|
|
62
|
+
createdDirs.push(dir.path);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (createdDirs.length > 0) {
|
|
66
|
+
console.log('Created directories:');
|
|
67
|
+
createdDirs.forEach((dir) => console.log(` - ${dir}`));
|
|
68
|
+
}
|
|
69
|
+
console.log('Created .snitchconfig.json in current directory');
|
|
70
|
+
console.log(` Location: ${path.resolve('.snitchconfig.json')}`);
|
|
71
|
+
console.log('\nYou can now customize the configuration for your project.');
|
|
72
|
+
if (result.npmInstallRequired) {
|
|
73
|
+
console.log('Running npm install to install packages from package.json...');
|
|
74
|
+
(0, child_process_1.execSync)('npm install', { stdio: 'inherit' });
|
|
75
|
+
console.log('Installed all packages');
|
|
76
|
+
}
|
|
77
|
+
if (finalPackageJson && finalPackageJson.scripts) {
|
|
78
|
+
const scripts = Object.keys(finalPackageJson.scripts).filter((script) => script !== 'test');
|
|
79
|
+
for (const script of scripts) {
|
|
80
|
+
console.log(`Running npm run ${script}...`);
|
|
81
|
+
try {
|
|
82
|
+
(0, child_process_1.execSync)(`npm run ${script}`, { stdio: 'inherit' });
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
console.log(`Failed to run npm run ${script}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
58
88
|
}
|
|
59
|
-
await (0, init_1.initCommand)(maybeUrl);
|
|
60
|
-
await (0, prepare_1.prepareCommand)();
|
|
61
89
|
}
|
|
62
90
|
//# sourceMappingURL=firstRun.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"firstRun.js","sourceRoot":"","sources":["../../src/commands/firstRun.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"firstRun.js","sourceRoot":"","sources":["../../src/commands/firstRun.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,0CAqDC;AA5DD,uCAAwB;AACxB,2CAA4B;AAC5B,iDAAwC;AAExC,iCAA6B;AAC7B,oDAA+C;AAExC,KAAK,UAAU,eAAe,CAAC,WAAwB,EAAE,QAAc;IAC5E,MAAM,MAAM,GAAG,MAAM,IAAA,WAAI,EAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;IAEhD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QAChE,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;IACrC,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAA;IACpD,IAAI,gBAAqB,CAAA;IACzB,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,kBAAkB,EAAE,CAAC;QAC/C,MAAM,kBAAkB,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAA;QAChF,MAAM,iBAAiB,GAAG,IAAA,sBAAS,EAAC,kBAAkB,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;QACvE,EAAE,CAAC,aAAa,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;QACtF,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAA;QACrD,gBAAgB,GAAG,iBAAiB,CAAA;IACtC,CAAC;IAED,MAAM,WAAW,GAAa,EAAE,CAAA;IAChC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAC3C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACjC,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;YAC/C,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAC5B,CAAC;IACH,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAA;QACnC,WAAW,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,CAAA;IACzD,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAA;IAC9D,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAA;IAChE,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAA;IAE1E,IAAI,MAAM,CAAC,kBAAkB,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAA;QAC3E,IAAA,wBAAQ,EAAC,aAAa,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAA;QAC7C,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAA;IACvC,CAAC;IAED,IAAI,gBAAgB,IAAI,gBAAgB,CAAC,OAAO,EAAE,CAAC;QACjD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,MAAM,CAAC,CAAA;QAC3F,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,KAAK,CAAC,CAAA;YAC3C,IAAI,CAAC;gBACH,IAAA,wBAAQ,EAAC,WAAW,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAA;YACrD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,yBAAyB,MAAM,EAAE,CAAC,CAAA;YAChD,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
|
package/dist/commands/init.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
-
import { Uri } from '../datamodel/uri';
|
|
1
|
+
import { Uri, ProjectName } from '../datamodel/uri';
|
|
2
|
+
import { PrepareResult } from '../utils/third-party-tools';
|
|
3
|
+
export declare function init(projectName: ProjectName, uri?: Uri): Promise<PrepareResult>;
|
|
2
4
|
export declare function initCommand(uri?: Uri): Promise<void>;
|
|
3
5
|
//# sourceMappingURL=init.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAInD,OAAO,EAAE,aAAa,EAAgB,MAAM,4BAA4B,CAAA;AAGxE,wBAAsB,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC,CAsCtF;AAED,wBAAsB,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAyB1D"}
|
package/dist/commands/init.js
CHANGED
|
@@ -33,11 +33,48 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.init = init;
|
|
36
37
|
exports.initCommand = initCommand;
|
|
37
38
|
const path = __importStar(require("path"));
|
|
38
39
|
const fs = __importStar(require("fs"));
|
|
39
40
|
const defaultConfigInit_1 = require("./init/defaultConfigInit");
|
|
40
41
|
const downloadedConfigInit_1 = require("./init/downloadedConfigInit");
|
|
42
|
+
const prepare_1 = require("./prepare");
|
|
43
|
+
async function init(projectName, uri) {
|
|
44
|
+
let configContent;
|
|
45
|
+
if (uri) {
|
|
46
|
+
configContent = await (0, downloadedConfigInit_1.downloadConfig)(uri);
|
|
47
|
+
(0, downloadedConfigInit_1.validateConfig)(configContent, uri);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
configContent = (0, defaultConfigInit_1.getBundledConfig)();
|
|
51
|
+
}
|
|
52
|
+
const config = JSON.parse(configContent);
|
|
53
|
+
const prepareResult = await (0, prepare_1.prepare)(config);
|
|
54
|
+
const packageJson = {
|
|
55
|
+
name: projectName,
|
|
56
|
+
version: '0.0.1',
|
|
57
|
+
description: '',
|
|
58
|
+
main: 'index.js',
|
|
59
|
+
scripts: {
|
|
60
|
+
test: 'echo "Error: no test specified" && exit 1',
|
|
61
|
+
},
|
|
62
|
+
keywords: [],
|
|
63
|
+
author: '',
|
|
64
|
+
license: 'UNLICENSED',
|
|
65
|
+
};
|
|
66
|
+
const allFiles = [
|
|
67
|
+
{ path: 'package.json', content: JSON.stringify(packageJson, null, 2) },
|
|
68
|
+
{ path: '.snitchconfig.json', content: configContent },
|
|
69
|
+
...prepareResult.files,
|
|
70
|
+
];
|
|
71
|
+
return {
|
|
72
|
+
files: allFiles,
|
|
73
|
+
directories: prepareResult.directories,
|
|
74
|
+
packageJsonUpdates: prepareResult.packageJsonUpdates,
|
|
75
|
+
npmInstallRequired: prepareResult.npmInstallRequired,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
41
78
|
async function initCommand(uri) {
|
|
42
79
|
const targetPath = path.resolve('.snitchconfig.json');
|
|
43
80
|
if (fs.existsSync(targetPath)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,oBAsCC;AAED,kCAyBC;AA1ED,2CAA4B;AAC5B,uCAAwB;AAExB,gEAA2D;AAC3D,sEAA4E;AAC5E,uCAAmC;AAI5B,KAAK,UAAU,IAAI,CAAC,WAAwB,EAAE,GAAS;IAC5D,IAAI,aAAqB,CAAA;IAEzB,IAAI,GAAG,EAAE,CAAC;QACR,aAAa,GAAG,MAAM,IAAA,qCAAc,EAAC,GAAG,CAAC,CAAA;QACzC,IAAA,qCAAc,EAAC,aAAa,EAAE,GAAG,CAAC,CAAA;IACpC,CAAC;SAAM,CAAC;QACN,aAAa,GAAG,IAAA,oCAAgB,GAAE,CAAA;IACpC,CAAC;IAED,MAAM,MAAM,GAAwB,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;IAC7D,MAAM,aAAa,GAAG,MAAM,IAAA,iBAAO,EAAC,MAAM,CAAC,CAAA;IAE3C,MAAM,WAAW,GAAG;QAClB,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,EAAE;QACf,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE;YACP,IAAI,EAAE,2CAA2C;SAClD;QACD,QAAQ,EAAE,EAAE;QACZ,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,YAAY;KACtB,CAAA;IAED,MAAM,QAAQ,GAAmB;QAC/B,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;QACvE,EAAE,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,aAAa,EAAE;QACtD,GAAG,aAAa,CAAC,KAAK;KACvB,CAAA;IAED,OAAO;QACL,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,aAAa,CAAC,WAAW;QACtC,kBAAkB,EAAE,aAAa,CAAC,kBAAkB;QACpD,kBAAkB,EAAE,aAAa,CAAC,kBAAkB;KACrD,CAAA;AACH,CAAC;AAEM,KAAK,UAAU,WAAW,CAAC,GAAS;IACzC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAA;IAErD,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAA;QACrE,OAAO,CAAC,GAAG,CAAC,gBAAgB,UAAU,EAAE,CAAC,CAAA;QACzC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAA;QACjC,OAAM;IACR,CAAC;IAED,IAAI,aAAqB,CAAA;IAEzB,IAAI,GAAG,EAAE,CAAC;QACR,OAAO,CAAC,GAAG,CAAC,4BAA4B,GAAG,EAAE,CAAC,CAAA;QAC9C,aAAa,GAAG,MAAM,IAAA,qCAAc,EAAC,GAAG,CAAC,CAAA;QACzC,IAAA,qCAAc,EAAC,aAAa,EAAE,GAAG,CAAC,CAAA;IACpC,CAAC;SAAM,CAAC;QACN,aAAa,GAAG,IAAA,oCAAgB,GAAE,CAAA;IACpC,CAAC;IAED,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,aAAa,EAAE,OAAO,CAAC,CAAA;IAEpD,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAA;IAC9D,OAAO,CAAC,GAAG,CAAC,eAAe,UAAU,EAAE,CAAC,CAAA;IACxC,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAA;AAC5E,CAAC"}
|
|
@@ -1,2 +1,5 @@
|
|
|
1
|
+
import { PrepareResult } from '../utils/third-party-tools';
|
|
2
|
+
import { SnitchConfiguration } from '../datamodel/snitch-configuration';
|
|
3
|
+
export declare function prepare(config: SnitchConfiguration): Promise<PrepareResult>;
|
|
1
4
|
export declare function prepareCommand(): Promise<void>;
|
|
2
5
|
//# sourceMappingURL=prepare.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepare.d.ts","sourceRoot":"","sources":["../../src/commands/prepare.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"prepare.d.ts","sourceRoot":"","sources":["../../src/commands/prepare.ts"],"names":[],"mappings":"AAMA,OAAO,EAA0B,aAAa,EAAmC,MAAM,4BAA4B,CAAA;AACnH,OAAO,EAGL,mBAAmB,EAEpB,MAAM,mCAAmC,CAAA;AAI1C,wBAAsB,OAAO,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,CAwDjF;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CA0CpD"}
|
package/dist/commands/prepare.js
CHANGED
|
@@ -36,13 +36,63 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
36
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.prepare = prepare;
|
|
39
40
|
exports.prepareCommand = prepareCommand;
|
|
40
41
|
const fs = __importStar(require("fs"));
|
|
41
42
|
const path = __importStar(require("path"));
|
|
42
43
|
const https = __importStar(require("https"));
|
|
43
44
|
const ajv_1 = __importDefault(require("ajv"));
|
|
45
|
+
const child_process_1 = require("child_process");
|
|
44
46
|
const SnitchConfigManager_1 = require("../SnitchConfigManager");
|
|
45
|
-
const
|
|
47
|
+
const third_party_tools_1 = require("../utils/third-party-tools");
|
|
48
|
+
const json_merge_1 = require("../utils/json-merge");
|
|
49
|
+
async function prepare(config) {
|
|
50
|
+
const resolvedTools = [];
|
|
51
|
+
if (config.thirdPartyTools && config.thirdPartyTools.length > 0) {
|
|
52
|
+
for (const toolEntry of config.thirdPartyTools) {
|
|
53
|
+
const resolvedTool = await resolveThirdPartyTool(toolEntry);
|
|
54
|
+
resolvedTools.push(resolvedTool);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const toolsResult = resolvedTools.length > 0
|
|
58
|
+
? await (0, third_party_tools_1.prepareThirdPartyTools)(resolvedTools)
|
|
59
|
+
: { files: [], directories: [], packageJsonUpdates: [], npmInstallRequired: false };
|
|
60
|
+
const policyInstructionFiles = [];
|
|
61
|
+
for (const policyEntry of Object.values(config.policies)) {
|
|
62
|
+
const policy = await resolvePolicy(policyEntry);
|
|
63
|
+
for (const instructionUrl of policy.instructions) {
|
|
64
|
+
const { filename, content } = await downloadPolicyInstruction(instructionUrl);
|
|
65
|
+
policyInstructionFiles.push({
|
|
66
|
+
path: `.snitch/instructions/${filename}`,
|
|
67
|
+
content,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
const allInstructionFiles = [
|
|
72
|
+
...toolsResult.files.filter((f) => f.path.startsWith('.snitch/instructions/')),
|
|
73
|
+
...policyInstructionFiles,
|
|
74
|
+
];
|
|
75
|
+
const aggregatedInstructions = {
|
|
76
|
+
path: '.claude/INSTRUCTIONS.md',
|
|
77
|
+
content: aggregatePolicyInstructions(allInstructionFiles),
|
|
78
|
+
};
|
|
79
|
+
const allFiles = [
|
|
80
|
+
...toolsResult.files.filter((f) => !f.path.startsWith('.snitch/instructions/') && f.path !== '.claude/INSTRUCTIONS.md'),
|
|
81
|
+
...policyInstructionFiles,
|
|
82
|
+
aggregatedInstructions,
|
|
83
|
+
];
|
|
84
|
+
const directories = [
|
|
85
|
+
{ path: config.sourceDirectory },
|
|
86
|
+
{ path: config.testsDirectory },
|
|
87
|
+
...toolsResult.directories,
|
|
88
|
+
];
|
|
89
|
+
return {
|
|
90
|
+
files: allFiles,
|
|
91
|
+
directories,
|
|
92
|
+
packageJsonUpdates: toolsResult.packageJsonUpdates,
|
|
93
|
+
npmInstallRequired: toolsResult.npmInstallRequired,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
46
96
|
async function prepareCommand() {
|
|
47
97
|
const config = SnitchConfigManager_1.SnitchConfigManager.loadConfig();
|
|
48
98
|
const packageJsonPath = path.resolve('package.json');
|
|
@@ -50,29 +100,34 @@ async function prepareCommand() {
|
|
|
50
100
|
console.log('No package.json found. Please run "npm init" first.');
|
|
51
101
|
return;
|
|
52
102
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
resolvedTools.push(resolvedTool);
|
|
58
|
-
}
|
|
59
|
-
await (0, enforcement_software_1.setupThirdPartyTools)(resolvedTools);
|
|
103
|
+
const result = await prepare(config);
|
|
104
|
+
for (const file of result.files) {
|
|
105
|
+
fs.writeFileSync(path.resolve(file.path), file.content, 'utf-8');
|
|
106
|
+
console.log(`Created ${file.path}`);
|
|
60
107
|
}
|
|
61
|
-
const
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
createdDirs.push(config.sourceDirectory);
|
|
108
|
+
for (const update of result.packageJsonUpdates) {
|
|
109
|
+
const currentPackageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
|
|
110
|
+
const mergedPackageJson = (0, json_merge_1.mergeJson)(currentPackageJson, update.updates);
|
|
111
|
+
fs.writeFileSync(packageJsonPath, JSON.stringify(mergedPackageJson, null, 2), 'utf-8');
|
|
112
|
+
console.log('Updated package.json with side effects');
|
|
67
113
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
114
|
+
const createdDirs = [];
|
|
115
|
+
for (const dir of result.directories) {
|
|
116
|
+
const resolvedPath = path.resolve(dir.path);
|
|
117
|
+
if (!fs.existsSync(resolvedPath)) {
|
|
118
|
+
fs.mkdirSync(resolvedPath, { recursive: true });
|
|
119
|
+
createdDirs.push(dir.path);
|
|
120
|
+
}
|
|
71
121
|
}
|
|
72
122
|
if (createdDirs.length > 0) {
|
|
73
123
|
console.log('Created directories:');
|
|
74
124
|
createdDirs.forEach((dir) => console.log(` - ${dir}`));
|
|
75
125
|
}
|
|
126
|
+
if (result.npmInstallRequired) {
|
|
127
|
+
console.log('Running npm install to install packages from package.json...');
|
|
128
|
+
(0, child_process_1.execSync)('npm install', { stdio: 'inherit' });
|
|
129
|
+
console.log('Installed all packages');
|
|
130
|
+
}
|
|
76
131
|
}
|
|
77
132
|
async function resolveThirdPartyTool(entry) {
|
|
78
133
|
if ('$ref' in entry) {
|
|
@@ -121,4 +176,42 @@ async function fetchUrl(url) {
|
|
|
121
176
|
});
|
|
122
177
|
});
|
|
123
178
|
}
|
|
179
|
+
async function resolvePolicy(entry) {
|
|
180
|
+
if ('$ref' in entry) {
|
|
181
|
+
const url = entry.$ref;
|
|
182
|
+
const content = await fetchUrl(url);
|
|
183
|
+
return JSON.parse(content);
|
|
184
|
+
}
|
|
185
|
+
if ('_extends' in entry) {
|
|
186
|
+
throw new Error('_extends is not yet supported for PolicyConfig');
|
|
187
|
+
}
|
|
188
|
+
return entry;
|
|
189
|
+
}
|
|
190
|
+
async function downloadPolicyInstruction(url) {
|
|
191
|
+
const filename = url.substring(url.lastIndexOf('/') + 1);
|
|
192
|
+
const content = await fetchUrl(url);
|
|
193
|
+
const header = `Version: 1.0.0
|
|
194
|
+
Source: ${url}
|
|
195
|
+
Last Updated: ${new Date().toISOString().split('T')[0]}
|
|
196
|
+
Check for Updates: ${url}
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
`;
|
|
201
|
+
return {
|
|
202
|
+
filename,
|
|
203
|
+
content: header + content,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
function aggregatePolicyInstructions(instructionFiles) {
|
|
207
|
+
const header = `# Project Instructions
|
|
208
|
+
|
|
209
|
+
This file is auto-generated from .snitch/instructions/
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
`;
|
|
214
|
+
const sections = instructionFiles.map((file) => file.content).join('\n\n---\n\n');
|
|
215
|
+
return header + sections;
|
|
216
|
+
}
|
|
124
217
|
//# sourceMappingURL=prepare.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepare.js","sourceRoot":"","sources":["../../src/commands/prepare.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"prepare.js","sourceRoot":"","sources":["../../src/commands/prepare.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBA,0BAwDC;AAED,wCA0CC;AApHD,uCAAwB;AACxB,2CAA4B;AAC5B,6CAA8B;AAC9B,8CAAqB;AACrB,iDAAwC;AACxC,gEAA4D;AAC5D,kEAAmH;AAOnH,oDAA+C;AAGxC,KAAK,UAAU,OAAO,CAAC,MAA2B;IACvD,MAAM,aAAa,GAAqB,EAAE,CAAA;IAE1C,IAAI,MAAM,CAAC,eAAe,IAAI,MAAM,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChE,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;YAC/C,MAAM,YAAY,GAAG,MAAM,qBAAqB,CAAC,SAAS,CAAC,CAAA;YAC3D,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAClC,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GACf,aAAa,CAAC,MAAM,GAAG,CAAC;QACtB,CAAC,CAAC,MAAM,IAAA,0CAAsB,EAAC,aAAa,CAAC;QAC7C,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,kBAAkB,EAAE,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAA;IAEvF,MAAM,sBAAsB,GAAmB,EAAE,CAAA;IACjD,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,CAAA;QAC/C,KAAK,MAAM,cAAc,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YACjD,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,yBAAyB,CAAC,cAAc,CAAC,CAAA;YAC7E,sBAAsB,CAAC,IAAI,CAAC;gBAC1B,IAAI,EAAE,wBAAwB,QAAQ,EAAE;gBACxC,OAAO;aACR,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,MAAM,mBAAmB,GAAG;QAC1B,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,uBAAuB,CAAC,CAAC;QAC9E,GAAG,sBAAsB;KAC1B,CAAA;IACD,MAAM,sBAAsB,GAAiB;QAC3C,IAAI,EAAE,yBAAyB;QAC/B,OAAO,EAAE,2BAA2B,CAAC,mBAAmB,CAAC;KAC1D,CAAA;IAED,MAAM,QAAQ,GAAG;QACf,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CACzB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,yBAAyB,CAC3F;QACD,GAAG,sBAAsB;QACzB,sBAAsB;KACvB,CAAA;IAED,MAAM,WAAW,GAAwB;QACvC,EAAE,IAAI,EAAE,MAAM,CAAC,eAAe,EAAE;QAChC,EAAE,IAAI,EAAE,MAAM,CAAC,cAAc,EAAE;QAC/B,GAAG,WAAW,CAAC,WAAW;KAC3B,CAAA;IAED,OAAO;QACL,KAAK,EAAE,QAAQ;QACf,WAAW;QACX,kBAAkB,EAAE,WAAW,CAAC,kBAAkB;QAClD,kBAAkB,EAAE,WAAW,CAAC,kBAAkB;KACnD,CAAA;AACH,CAAC;AAEM,KAAK,UAAU,cAAc;IAClC,MAAM,MAAM,GAAG,yCAAmB,CAAC,UAAU,EAAE,CAAA;IAE/C,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAA;IACpD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAA;QAClE,OAAM;IACR,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,CAAA;IAEpC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QAChE,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;IACrC,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,kBAAkB,EAAE,CAAC;QAC/C,MAAM,kBAAkB,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAA;QAChF,MAAM,iBAAiB,GAAG,IAAA,sBAAS,EAAC,kBAAkB,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;QACvE,EAAE,CAAC,aAAa,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;QACtF,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAA;IACvD,CAAC;IAED,MAAM,WAAW,GAAa,EAAE,CAAA;IAChC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAC3C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACjC,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;YAC/C,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAC5B,CAAC;IACH,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAA;QACnC,WAAW,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,CAAA;IACzD,CAAC;IAED,IAAI,MAAM,CAAC,kBAAkB,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAA;QAC3E,IAAA,wBAAQ,EAAC,aAAa,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAA;QAC7C,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAA;IACvC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,KAA6C;IAChF,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAA;QACtB,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;QACxD,OAAO,CAAC,GAAG,CAAC,2BAA2B,QAAQ,SAAS,GAAG,EAAE,CAAC,CAAA;QAC9D,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAA;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAClC,sBAAsB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QACxC,OAAO,MAAwB,CAAA;IACjC,CAAC;IAED,IAAI,UAAU,IAAI,KAAK,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAA;IACrE,CAAC;IAED,OAAO,KAAuB,CAAA;AAChC,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAa,EAAE,MAAc;IAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,wDAAwD,CAAC,CAAA;IACpG,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAA;IAE/D,MAAM,GAAG,GAAG,IAAI,aAAG,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;IACvD,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IAEpC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,MAAM,MAAM,GACV,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,YAAY,IAAI,QAAQ,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAC7F,0BAA0B,CAAA;QAC5B,MAAM,IAAI,KAAK,CAAC,6CAA6C,MAAM,MAAM,MAAM,EAAE,CAAC,CAAA;IACpF,CAAC;AACH,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,GAAW;IACjC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,KAAK;aACF,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE;YAChB,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;gBAC3B,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,GAAG,UAAU,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAA;gBACnE,OAAM;YACR,CAAC;YACD,IAAI,IAAI,GAAG,EAAE,CAAA;YACb,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;gBACvB,IAAI,IAAI,KAAK,CAAA;YACf,CAAC,CAAC,CAAA;YACF,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACjB,OAAO,CAAC,IAAI,CAAC,CAAA;YACf,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC;aACD,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACnB,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,GAAG,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;QAC7D,CAAC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,KAA2C;IACtE,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAA;QACtB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAA;QACnC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAiB,CAAA;IAC5C,CAAC;IAED,IAAI,UAAU,IAAI,KAAK,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAA;IACnE,CAAC;IAED,OAAO,KAAqB,CAAA;AAC9B,CAAC;AAED,KAAK,UAAU,yBAAyB,CAAC,GAAQ;IAC/C,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;IAExD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAA;IAEnC,MAAM,MAAM,GAAG;UACP,GAAG;gBACG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;qBACjC,GAAG;;;;CAIvB,CAAA;IAEC,OAAO;QACL,QAAQ;QACR,OAAO,EAAE,MAAM,GAAG,OAAO;KAC1B,CAAA;AACH,CAAC;AAED,SAAS,2BAA2B,CAAC,gBAAgC;IACnE,MAAM,MAAM,GAAG;;;;;;CAMhB,CAAA;IAEC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IAEjF,OAAO,MAAM,GAAG,QAAQ,CAAA;AAC1B,CAAC"}
|
|
@@ -5,6 +5,7 @@ import { Uri } from './uri';
|
|
|
5
5
|
export type PolicyConfig = {
|
|
6
6
|
title: string;
|
|
7
7
|
violations: ViolationRule[];
|
|
8
|
+
instructions: Uri[];
|
|
8
9
|
};
|
|
9
10
|
export type JsonConfigurationEntry<Type> = Type | {
|
|
10
11
|
$ref: string;
|
|
@@ -23,6 +24,7 @@ export type ThirdPartyTool = {
|
|
|
23
24
|
version?: string;
|
|
24
25
|
};
|
|
25
26
|
configuration: Uri | object;
|
|
27
|
+
instructions: Uri[];
|
|
26
28
|
sideEffects?: {
|
|
27
29
|
'package.json'?: object;
|
|
28
30
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snitch-configuration.d.ts","sourceRoot":"","sources":["../../src/datamodel/snitch-configuration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACvD,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAE3B,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,aAAa,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"snitch-configuration.d.ts","sourceRoot":"","sources":["../../src/datamodel/snitch-configuration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACvD,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAE3B,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,aAAa,EAAE,CAAA;IAC3B,YAAY,EAAE,GAAG,EAAE,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,sBAAsB,CAAC,IAAI,IAAI,IAAI,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;AAE3G,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,cAAc,EAAE,MAAM,CAAA;IACtB,QAAQ,EAAE;QACR,EAAE,EAAE,KAAK,CAAA;QACT,IAAI,EAAE,MAAM,CAAA;QACZ,OAAO,CAAC,EAAE,MAAM,CAAA;KACjB,CAAA;IACD,aAAa,EAAE,GAAG,GAAG,MAAM,CAAA;IAC3B,YAAY,EAAE,GAAG,EAAE,CAAA;IACnB,WAAW,CAAC,EAAE;QACZ,cAAc,CAAC,EAAE,MAAM,CAAA;KACxB,CAAA;CACF,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,eAAe,EAAE,MAAM,CAAA;IACvB,cAAc,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAA;IAC9C,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,YAAY,CAAC,CAAC,CAAA;IAC9D,eAAe,CAAC,EAAE,sBAAsB,CAAC,cAAc,CAAC,EAAE,CAAA;CAC3D,CAAA;AAED,eAAO,MAAM,yBAAyB,EAAE,UAAU,CAAC,mBAAmB,CAgCrE,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snitch-configuration.js","sourceRoot":"","sources":["../../src/datamodel/snitch-configuration.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"snitch-configuration.js","sourceRoot":"","sources":["../../src/datamodel/snitch-configuration.ts"],"names":[],"mappings":";;;AAwCa,QAAA,yBAAyB,GAAoC;IACxE,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,OAAO,EAAE;YACP,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,IAAI;SACf;QACD,eAAe,EAAE;YACf,IAAI,EAAE,QAAQ;SACf;QACD,cAAc,EAAE;YACd,IAAI,EAAE,QAAQ;SACf;QACD,QAAQ,EAAE;YACR,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,EAAE;YACZ,oBAAoB,EAAE,IAAI;YAC1B,QAAQ,EAAE,IAAI;SACf;QACD,QAAQ,EAAE;YACR,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,EAAE;YACZ,oBAAoB,EAAE,IAAI;SAC3B;QACD,eAAe,EAAE;YACf,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,EAAS;YAChB,QAAQ,EAAE,IAAI;SACf;KACF;IACD,QAAQ,EAAE,CAAC,iBAAiB,EAAE,gBAAgB,EAAE,UAAU,CAAC;IAC3D,oBAAoB,EAAE,KAAK;CAC5B,CAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ThirdPartyTool } from '../datamodel/snitch-configuration';
|
|
2
|
+
export type FileToCreate = {
|
|
3
|
+
path: string;
|
|
4
|
+
content: string;
|
|
5
|
+
};
|
|
6
|
+
export type DirectoryToCreate = {
|
|
7
|
+
path: string;
|
|
8
|
+
};
|
|
9
|
+
export type PackageJsonUpdate = {
|
|
10
|
+
updates: object;
|
|
11
|
+
};
|
|
12
|
+
export type PrepareResult = {
|
|
13
|
+
files: FileToCreate[];
|
|
14
|
+
directories: DirectoryToCreate[];
|
|
15
|
+
packageJsonUpdates: PackageJsonUpdate[];
|
|
16
|
+
npmInstallRequired: boolean;
|
|
17
|
+
};
|
|
18
|
+
export declare function prepareThirdPartyTools(tools: ThirdPartyTool[]): Promise<PrepareResult>;
|
|
19
|
+
//# sourceMappingURL=third-party-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"third-party-tools.d.ts","sourceRoot":"","sources":["../../src/utils/third-party-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAA;AAIlE,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,YAAY,EAAE,CAAA;IACrB,WAAW,EAAE,iBAAiB,EAAE,CAAA;IAChC,kBAAkB,EAAE,iBAAiB,EAAE,CAAA;IACvC,kBAAkB,EAAE,OAAO,CAAA;CAC5B,CAAA;AAYD,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CA6F5F"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.prepareThirdPartyTools = prepareThirdPartyTools;
|
|
37
|
+
const https = __importStar(require("https"));
|
|
38
|
+
async function prepareThirdPartyTools(tools) {
|
|
39
|
+
const preparedTools = [];
|
|
40
|
+
const seenFilenames = new Set();
|
|
41
|
+
const instructionFiles = [];
|
|
42
|
+
for (const tool of tools) {
|
|
43
|
+
const { configFilename, configuration, sideEffects, title, software, instructions } = tool;
|
|
44
|
+
if (seenFilenames.has(configFilename)) {
|
|
45
|
+
throw new Error(`Duplicate config filename detected: ${configFilename}. Multiple tools are trying to create the same file.`);
|
|
46
|
+
}
|
|
47
|
+
seenFilenames.add(configFilename);
|
|
48
|
+
const configObject = await resolveConfiguration(configuration);
|
|
49
|
+
const configContent = formatConfigContent(configObject, configFilename, title);
|
|
50
|
+
preparedTools.push({
|
|
51
|
+
configFilename,
|
|
52
|
+
configContent,
|
|
53
|
+
software,
|
|
54
|
+
sideEffects,
|
|
55
|
+
});
|
|
56
|
+
for (const instructionUrl of instructions) {
|
|
57
|
+
const { filename, content } = await downloadInstructionFile(instructionUrl);
|
|
58
|
+
instructionFiles.push({
|
|
59
|
+
path: `.snitch/instructions/${filename}`,
|
|
60
|
+
content,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const configFiles = preparedTools.map((prepared) => ({
|
|
65
|
+
path: `configs/${prepared.configFilename}`,
|
|
66
|
+
content: prepared.configContent,
|
|
67
|
+
}));
|
|
68
|
+
const aggregatedInstructions = {
|
|
69
|
+
path: '.claude/INSTRUCTIONS.md',
|
|
70
|
+
content: aggregateInstructions(instructionFiles),
|
|
71
|
+
};
|
|
72
|
+
const files = [...configFiles, ...instructionFiles, aggregatedInstructions];
|
|
73
|
+
const packageJsonUpdates = preparedTools.flatMap((prepared) => {
|
|
74
|
+
const updates = [];
|
|
75
|
+
const packageName = prepared.software.name;
|
|
76
|
+
const packageVersion = prepared.software.version || 'latest';
|
|
77
|
+
updates.push({
|
|
78
|
+
updates: {
|
|
79
|
+
devDependencies: {
|
|
80
|
+
[packageName]: packageVersion,
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
if (prepared.sideEffects && prepared.sideEffects['package.json']) {
|
|
85
|
+
const sideEffects = prepared.sideEffects['package.json'];
|
|
86
|
+
if (sideEffects.scripts) {
|
|
87
|
+
const updatedScripts = {};
|
|
88
|
+
for (const [scriptName, scriptCommand] of Object.entries(sideEffects.scripts)) {
|
|
89
|
+
updatedScripts[scriptName] = updateScriptWithConfigPath(scriptCommand, `configs/${prepared.configFilename}`, packageName);
|
|
90
|
+
}
|
|
91
|
+
updates.push({
|
|
92
|
+
updates: {
|
|
93
|
+
...sideEffects,
|
|
94
|
+
scripts: updatedScripts,
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
updates.push({
|
|
100
|
+
updates: sideEffects,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return updates;
|
|
105
|
+
});
|
|
106
|
+
return {
|
|
107
|
+
files,
|
|
108
|
+
directories: [{ path: 'configs' }, { path: '.snitch/instructions' }, { path: '.claude' }],
|
|
109
|
+
packageJsonUpdates,
|
|
110
|
+
npmInstallRequired: true,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
async function resolveConfiguration(source) {
|
|
114
|
+
if (typeof source === 'object') {
|
|
115
|
+
return source;
|
|
116
|
+
}
|
|
117
|
+
return new Promise((resolve, reject) => {
|
|
118
|
+
https
|
|
119
|
+
.get(source, (res) => {
|
|
120
|
+
if (res.statusCode !== 200) {
|
|
121
|
+
reject(new Error(`Failed to download config: HTTP ${res.statusCode}`));
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
let data = '';
|
|
125
|
+
res.on('data', (chunk) => {
|
|
126
|
+
data += chunk;
|
|
127
|
+
});
|
|
128
|
+
res.on('end', () => {
|
|
129
|
+
resolve(JSON.parse(data));
|
|
130
|
+
});
|
|
131
|
+
})
|
|
132
|
+
.on('error', (err) => {
|
|
133
|
+
reject(new Error(`Failed to download config: ${err.message}`));
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
async function downloadInstructionFile(url) {
|
|
138
|
+
const filename = url.substring(url.lastIndexOf('/') + 1);
|
|
139
|
+
const content = await new Promise((resolve, reject) => {
|
|
140
|
+
https
|
|
141
|
+
.get(url, (res) => {
|
|
142
|
+
if (res.statusCode !== 200) {
|
|
143
|
+
reject(new Error(`Failed to download instruction: HTTP ${res.statusCode}`));
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
let data = '';
|
|
147
|
+
res.on('data', (chunk) => {
|
|
148
|
+
data += chunk;
|
|
149
|
+
});
|
|
150
|
+
res.on('end', () => {
|
|
151
|
+
resolve(data);
|
|
152
|
+
});
|
|
153
|
+
})
|
|
154
|
+
.on('error', (err) => {
|
|
155
|
+
reject(new Error(`Failed to download instruction: ${err.message}`));
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
const header = `Version: 1.0.0
|
|
159
|
+
Source: ${url}
|
|
160
|
+
Last Updated: ${new Date().toISOString().split('T')[0]}
|
|
161
|
+
Check for Updates: ${url}
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
`;
|
|
166
|
+
return {
|
|
167
|
+
filename,
|
|
168
|
+
content: header + content,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
function formatConfigContent(content, filename, toolTitle) {
|
|
172
|
+
const ext = filename.substring(filename.lastIndexOf('.'));
|
|
173
|
+
const basename = filename.substring(filename.lastIndexOf('/') + 1);
|
|
174
|
+
if (ext === '.js') {
|
|
175
|
+
return `module.exports = ${JSON.stringify(content, null, 2)}\n`;
|
|
176
|
+
}
|
|
177
|
+
if (ext === '.json' || basename === '.prettierrc') {
|
|
178
|
+
return JSON.stringify(content, null, 2);
|
|
179
|
+
}
|
|
180
|
+
throw new Error(`Unsupported config file extension for tool "${toolTitle}": filename="${filename}", extension="${ext}". See supported formats at TODO://link-to-supported-files`);
|
|
181
|
+
}
|
|
182
|
+
function updateScriptWithConfigPath(script, configPath, toolName) {
|
|
183
|
+
const configFlagMap = {
|
|
184
|
+
prettier: '--config',
|
|
185
|
+
biome: '--config-path',
|
|
186
|
+
typescript: '--project',
|
|
187
|
+
tsc: '--project',
|
|
188
|
+
jest: '--config',
|
|
189
|
+
};
|
|
190
|
+
const flag = configFlagMap[toolName];
|
|
191
|
+
if (flag) {
|
|
192
|
+
return `${script} ${flag} ${configPath}`;
|
|
193
|
+
}
|
|
194
|
+
return script;
|
|
195
|
+
}
|
|
196
|
+
function aggregateInstructions(instructionFiles) {
|
|
197
|
+
const header = `# Project Instructions
|
|
198
|
+
|
|
199
|
+
This file is auto-generated from .snitch/instructions/
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
`;
|
|
204
|
+
const sections = instructionFiles.map((file) => file.content).join('\n\n---\n\n');
|
|
205
|
+
return header + sections;
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=third-party-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"third-party-tools.js","sourceRoot":"","sources":["../../src/utils/third-party-tools.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"enforcement-software.d.ts","sourceRoot":"","sources":["../../src/utils/enforcement-software.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAA;AAkBlE,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAwDjF"}
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.setupThirdPartyTools = setupThirdPartyTools;
|
|
37
|
-
const fs = __importStar(require("fs"));
|
|
38
|
-
const path = __importStar(require("path"));
|
|
39
|
-
const child_process_1 = require("child_process");
|
|
40
|
-
const https = __importStar(require("https"));
|
|
41
|
-
const json_merge_1 = require("./json-merge");
|
|
42
|
-
async function setupThirdPartyTools(tools) {
|
|
43
|
-
// Phase 1: Download and prepare all configs (no file creation yet)
|
|
44
|
-
const preparedTools = [];
|
|
45
|
-
const seenFilenames = new Set();
|
|
46
|
-
for (const tool of tools) {
|
|
47
|
-
const { configFilename, configuration, sideEffects, title, software } = tool;
|
|
48
|
-
// Check for duplicate filenames
|
|
49
|
-
if (seenFilenames.has(configFilename)) {
|
|
50
|
-
throw new Error(`Duplicate config filename detected: ${configFilename}. Multiple tools are trying to create the same file.`);
|
|
51
|
-
}
|
|
52
|
-
seenFilenames.add(configFilename);
|
|
53
|
-
// Download and format config
|
|
54
|
-
const configObject = await resolveConfiguration(configuration);
|
|
55
|
-
const configContent = formatConfigContent(configObject, configFilename, title);
|
|
56
|
-
preparedTools.push({
|
|
57
|
-
configFilename,
|
|
58
|
-
configContent,
|
|
59
|
-
software,
|
|
60
|
-
sideEffects,
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
// Phase 2: All validations passed, now create files
|
|
64
|
-
for (const prepared of preparedTools) {
|
|
65
|
-
fs.writeFileSync(path.resolve(prepared.configFilename), prepared.configContent, 'utf-8');
|
|
66
|
-
console.log(`Created ${prepared.configFilename}`);
|
|
67
|
-
}
|
|
68
|
-
// Phase 3: Apply side effects to package.json
|
|
69
|
-
for (const prepared of preparedTools) {
|
|
70
|
-
const packageName = prepared.software.name;
|
|
71
|
-
const packageVersion = prepared.software.version || 'latest';
|
|
72
|
-
const devDependencyUpdate = {
|
|
73
|
-
'package.json': {
|
|
74
|
-
devDependencies: {
|
|
75
|
-
[packageName]: packageVersion,
|
|
76
|
-
},
|
|
77
|
-
},
|
|
78
|
-
};
|
|
79
|
-
applySideEffects(devDependencyUpdate);
|
|
80
|
-
if (prepared.sideEffects) {
|
|
81
|
-
applySideEffects(prepared.sideEffects);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
// Phase 4: Run npm install
|
|
85
|
-
console.log('Running npm install to install packages from package.json...');
|
|
86
|
-
(0, child_process_1.execSync)('npm install', { stdio: 'inherit' });
|
|
87
|
-
console.log('Installed all packages');
|
|
88
|
-
}
|
|
89
|
-
async function resolveConfiguration(source) {
|
|
90
|
-
if (typeof source === 'object') {
|
|
91
|
-
return source;
|
|
92
|
-
}
|
|
93
|
-
return new Promise((resolve, reject) => {
|
|
94
|
-
https
|
|
95
|
-
.get(source, (res) => {
|
|
96
|
-
if (res.statusCode !== 200) {
|
|
97
|
-
reject(new Error(`Failed to download config: HTTP ${res.statusCode}`));
|
|
98
|
-
return;
|
|
99
|
-
}
|
|
100
|
-
let data = '';
|
|
101
|
-
res.on('data', (chunk) => {
|
|
102
|
-
data += chunk;
|
|
103
|
-
});
|
|
104
|
-
res.on('end', () => {
|
|
105
|
-
resolve(JSON.parse(data));
|
|
106
|
-
});
|
|
107
|
-
})
|
|
108
|
-
.on('error', (err) => {
|
|
109
|
-
reject(new Error(`Failed to download config: ${err.message}`));
|
|
110
|
-
});
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
function formatConfigContent(content, filename, toolTitle) {
|
|
114
|
-
const ext = path.extname(filename);
|
|
115
|
-
const basename = path.basename(filename);
|
|
116
|
-
if (ext === '.js') {
|
|
117
|
-
return `module.exports = ${JSON.stringify(content, null, 2)}\n`;
|
|
118
|
-
}
|
|
119
|
-
if (ext === '.json' || basename === '.prettierrc') {
|
|
120
|
-
return JSON.stringify(content, null, 2);
|
|
121
|
-
}
|
|
122
|
-
throw new Error(`Unsupported config file extension for tool "${toolTitle}": filename="${filename}", extension="${ext}". Only .js and .json extensions are supported.`);
|
|
123
|
-
}
|
|
124
|
-
function applySideEffects(sideEffects) {
|
|
125
|
-
if (sideEffects['package.json']) {
|
|
126
|
-
const packageJsonPath = path.resolve('package.json');
|
|
127
|
-
const currentPackageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
|
|
128
|
-
const mergedPackageJson = (0, json_merge_1.mergeJson)(currentPackageJson, sideEffects['package.json']);
|
|
129
|
-
fs.writeFileSync(packageJsonPath, JSON.stringify(mergedPackageJson, null, 2), 'utf-8');
|
|
130
|
-
console.log('Updated package.json with side effects');
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
//# sourceMappingURL=enforcement-software.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"enforcement-software.js","sourceRoot":"","sources":["../../src/utils/enforcement-software.ts"],"names":[],"mappings":"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"}
|