@protoboxai/codeloop 0.3.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/LICENSE +21 -0
- package/README.md +589 -0
- package/dist/commands/adopt.d.ts +2 -0
- package/dist/commands/adopt.js +26 -0
- package/dist/commands/adopt.js.map +1 -0
- package/dist/commands/brief.d.ts +2 -0
- package/dist/commands/brief.js +22 -0
- package/dist/commands/brief.js.map +1 -0
- package/dist/commands/card.d.ts +6 -0
- package/dist/commands/card.js +159 -0
- package/dist/commands/card.js.map +1 -0
- package/dist/commands/check.d.ts +4 -0
- package/dist/commands/check.js +76 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/cloud.d.ts +8 -0
- package/dist/commands/cloud.js +123 -0
- package/dist/commands/cloud.js.map +1 -0
- package/dist/commands/guard.d.ts +2 -0
- package/dist/commands/guard.js +26 -0
- package/dist/commands/guard.js.map +1 -0
- package/dist/commands/import.d.ts +2 -0
- package/dist/commands/import.js +24 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/inbox.d.ts +2 -0
- package/dist/commands/inbox.js +48 -0
- package/dist/commands/inbox.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.js +142 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/install.d.ts +2 -0
- package/dist/commands/install.js +125 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/lane.d.ts +2 -0
- package/dist/commands/lane.js +100 -0
- package/dist/commands/lane.js.map +1 -0
- package/dist/commands/list.d.ts +2 -0
- package/dist/commands/list.js +35 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/login.d.ts +2 -0
- package/dist/commands/login.js +77 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/mock.d.ts +3 -0
- package/dist/commands/mock.js +22 -0
- package/dist/commands/mock.js.map +1 -0
- package/dist/commands/pack.d.ts +2 -0
- package/dist/commands/pack.js +19 -0
- package/dist/commands/pack.js.map +1 -0
- package/dist/commands/publish.d.ts +2 -0
- package/dist/commands/publish.js +125 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/remove.d.ts +2 -0
- package/dist/commands/remove.js +31 -0
- package/dist/commands/remove.js.map +1 -0
- package/dist/commands/render.d.ts +5 -0
- package/dist/commands/render.js +47 -0
- package/dist/commands/render.js.map +1 -0
- package/dist/commands/run.d.ts +2 -0
- package/dist/commands/run.js +45 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/scan.d.ts +2 -0
- package/dist/commands/scan.js +26 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/schedule.d.ts +2 -0
- package/dist/commands/schedule.js +51 -0
- package/dist/commands/schedule.js.map +1 -0
- package/dist/commands/search.d.ts +2 -0
- package/dist/commands/search.js +85 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/serve.d.ts +7 -0
- package/dist/commands/serve.js +126 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/commands/spec.d.ts +3 -0
- package/dist/commands/spec.js +64 -0
- package/dist/commands/spec.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.js +251 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/update.d.ts +2 -0
- package/dist/commands/update.js +83 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/verify.d.ts +3 -0
- package/dist/commands/verify.js +75 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/commands/watch.d.ts +6 -0
- package/dist/commands/watch.js +111 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/commands/wiki.d.ts +3 -0
- package/dist/commands/wiki.js +85 -0
- package/dist/commands/wiki.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +86 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/agent.d.ts +27 -0
- package/dist/lib/agent.js +178 -0
- package/dist/lib/agent.js.map +1 -0
- package/dist/lib/board.d.ts +38 -0
- package/dist/lib/board.js +86 -0
- package/dist/lib/board.js.map +1 -0
- package/dist/lib/cards.d.ts +82 -0
- package/dist/lib/cards.js +107 -0
- package/dist/lib/cards.js.map +1 -0
- package/dist/lib/clock.d.ts +5 -0
- package/dist/lib/clock.js +14 -0
- package/dist/lib/clock.js.map +1 -0
- package/dist/lib/cloud.d.ts +122 -0
- package/dist/lib/cloud.js +580 -0
- package/dist/lib/cloud.js.map +1 -0
- package/dist/lib/competitors.d.ts +28 -0
- package/dist/lib/competitors.js +90 -0
- package/dist/lib/competitors.js.map +1 -0
- package/dist/lib/config.d.ts +7 -0
- package/dist/lib/config.js +25 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/cron.d.ts +5 -0
- package/dist/lib/cron.js +82 -0
- package/dist/lib/cron.js.map +1 -0
- package/dist/lib/detect.d.ts +13 -0
- package/dist/lib/detect.js +60 -0
- package/dist/lib/detect.js.map +1 -0
- package/dist/lib/engine.d.ts +88 -0
- package/dist/lib/engine.js +435 -0
- package/dist/lib/engine.js.map +1 -0
- package/dist/lib/flow.d.ts +44 -0
- package/dist/lib/flow.js +121 -0
- package/dist/lib/flow.js.map +1 -0
- package/dist/lib/glob.d.ts +2 -0
- package/dist/lib/glob.js +10 -0
- package/dist/lib/glob.js.map +1 -0
- package/dist/lib/import.d.ts +13 -0
- package/dist/lib/import.js +127 -0
- package/dist/lib/import.js.map +1 -0
- package/dist/lib/inbox.d.ts +42 -0
- package/dist/lib/inbox.js +65 -0
- package/dist/lib/inbox.js.map +1 -0
- package/dist/lib/lane.d.ts +71 -0
- package/dist/lib/lane.js +105 -0
- package/dist/lib/lane.js.map +1 -0
- package/dist/lib/lock.d.ts +6 -0
- package/dist/lib/lock.js +64 -0
- package/dist/lib/lock.js.map +1 -0
- package/dist/lib/mcp.d.ts +2 -0
- package/dist/lib/mcp.js +57 -0
- package/dist/lib/mcp.js.map +1 -0
- package/dist/lib/mock.d.ts +17 -0
- package/dist/lib/mock.js +137 -0
- package/dist/lib/mock.js.map +1 -0
- package/dist/lib/pack.d.ts +24 -0
- package/dist/lib/pack.js +77 -0
- package/dist/lib/pack.js.map +1 -0
- package/dist/lib/proposals.d.ts +48 -0
- package/dist/lib/proposals.js +240 -0
- package/dist/lib/proposals.js.map +1 -0
- package/dist/lib/render.d.ts +7 -0
- package/dist/lib/render.js +84 -0
- package/dist/lib/render.js.map +1 -0
- package/dist/lib/research.d.ts +8 -0
- package/dist/lib/research.js +39 -0
- package/dist/lib/research.js.map +1 -0
- package/dist/lib/run.d.ts +38 -0
- package/dist/lib/run.js +215 -0
- package/dist/lib/run.js.map +1 -0
- package/dist/lib/scaffold.d.ts +16 -0
- package/dist/lib/scaffold.js +175 -0
- package/dist/lib/scaffold.js.map +1 -0
- package/dist/lib/scan.d.ts +22 -0
- package/dist/lib/scan.js +85 -0
- package/dist/lib/scan.js.map +1 -0
- package/dist/lib/schedule.d.ts +20 -0
- package/dist/lib/schedule.js +66 -0
- package/dist/lib/schedule.js.map +1 -0
- package/dist/lib/server.d.ts +68 -0
- package/dist/lib/server.js +235 -0
- package/dist/lib/server.js.map +1 -0
- package/dist/lib/shell.d.ts +1 -0
- package/dist/lib/shell.js +25 -0
- package/dist/lib/shell.js.map +1 -0
- package/dist/lib/skills.d.ts +20 -0
- package/dist/lib/skills.js +92 -0
- package/dist/lib/skills.js.map +1 -0
- package/dist/lib/spec.d.ts +24 -0
- package/dist/lib/spec.js +102 -0
- package/dist/lib/spec.js.map +1 -0
- package/dist/lib/stats.d.ts +13 -0
- package/dist/lib/stats.js +43 -0
- package/dist/lib/stats.js.map +1 -0
- package/dist/lib/verify.d.ts +25 -0
- package/dist/lib/verify.js +135 -0
- package/dist/lib/verify.js.map +1 -0
- package/dist/lib/version.d.ts +10 -0
- package/dist/lib/version.js +27 -0
- package/dist/lib/version.js.map +1 -0
- package/dist/lib/wiki.d.ts +51 -0
- package/dist/lib/wiki.js +164 -0
- package/dist/lib/wiki.js.map +1 -0
- package/dist/registry/index.d.ts +7 -0
- package/dist/registry/index.js +8 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/installer.d.ts +30 -0
- package/dist/registry/installer.js +133 -0
- package/dist/registry/installer.js.map +1 -0
- package/dist/registry/local-index.d.ts +32 -0
- package/dist/registry/local-index.js +58 -0
- package/dist/registry/local-index.js.map +1 -0
- package/dist/registry/lockfile.d.ts +40 -0
- package/dist/registry/lockfile.js +85 -0
- package/dist/registry/lockfile.js.map +1 -0
- package/dist/registry/security.d.ts +25 -0
- package/dist/registry/security.js +100 -0
- package/dist/registry/security.js.map +1 -0
- package/dist/registry/skill-schema.d.ts +30 -0
- package/dist/registry/skill-schema.js +95 -0
- package/dist/registry/skill-schema.js.map +1 -0
- package/dist/ui/404.html +1 -0
- package/dist/ui/_next/static/6wzGE5sCtbYkSyhMWxL32/_buildManifest.js +1 -0
- package/dist/ui/_next/static/6wzGE5sCtbYkSyhMWxL32/_ssgManifest.js +1 -0
- package/dist/ui/_next/static/chunks/255-54d3085ce94738a4.js +1 -0
- package/dist/ui/_next/static/chunks/423-bb541b7ae2733575.js +1 -0
- package/dist/ui/_next/static/chunks/4bd1b696-c023c6e3521b1417.js +1 -0
- package/dist/ui/_next/static/chunks/app/_not-found/page-d6bc774f7acb716e.js +1 -0
- package/dist/ui/_next/static/chunks/app/layout-e5fc8e78e1c8da95.js +1 -0
- package/dist/ui/_next/static/chunks/app/page-0c34b6e119cef236.js +1 -0
- package/dist/ui/_next/static/chunks/framework-de98b93a850cfc71.js +1 -0
- package/dist/ui/_next/static/chunks/main-49fd204fc9037ea3.js +1 -0
- package/dist/ui/_next/static/chunks/main-app-c46afa2f48f3aaef.js +1 -0
- package/dist/ui/_next/static/chunks/pages/_app-7d307437aca18ad4.js +1 -0
- package/dist/ui/_next/static/chunks/pages/_error-cb2a52f75f2162e2.js +1 -0
- package/dist/ui/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- package/dist/ui/_next/static/chunks/webpack-4a462cecab786e93.js +1 -0
- package/dist/ui/_next/static/css/1bf01240dbfd6088.css +1 -0
- package/dist/ui/index.html +1 -0
- package/dist/ui/index.txt +19 -0
- package/dist/watch/index.d.ts +21 -0
- package/dist/watch/index.js +88 -0
- package/dist/watch/index.js.map +1 -0
- package/dist/watch/reporter.d.ts +11 -0
- package/dist/watch/reporter.js +44 -0
- package/dist/watch/reporter.js.map +1 -0
- package/dist/watch/signals.d.ts +38 -0
- package/dist/watch/signals.js +119 -0
- package/dist/watch/signals.js.map +1 -0
- package/dist/watch/triggers.d.ts +10 -0
- package/dist/watch/triggers.js +67 -0
- package/dist/watch/triggers.js.map +1 -0
- package/package.json +64 -0
- package/registry/index.json +106 -0
- package/starters/generic.yaml +95 -0
- package/starters/go.yaml +99 -0
- package/starters/node-typescript.yaml +108 -0
- package/starters/python.yaml +105 -0
- package/templates/ci/codeloop-pr.yml +29 -0
- package/templates/ci/codeloop-prod.yml +27 -0
- package/templates/ci/codeloop-staging.yml +34 -0
- package/templates/codeloop/board.json +5 -0
- package/templates/codeloop/gotchas.md +13 -0
- package/templates/codeloop/patterns.md +15 -0
- package/templates/codeloop/principles.md +49 -0
- package/templates/codeloop/rules.md +23 -0
- package/templates/commands/commit.md +255 -0
- package/templates/commands/debug.md +142 -0
- package/templates/commands/deploy.md +144 -0
- package/templates/commands/design.md +102 -0
- package/templates/commands/manage.md +77 -0
- package/templates/commands/plan.md +84 -0
- package/templates/commands/qa.md +155 -0
- package/templates/commands/reflect.md +93 -0
- package/templates/commands/ship.md +187 -0
- package/templates/commands/test.md +133 -0
- package/templates/hooks/commit-msg +8 -0
- package/templates/lanes/analyze.yaml +25 -0
- package/templates/lanes/build.yaml +45 -0
- package/templates/lanes/deploy.yaml +24 -0
- package/templates/lanes/learn.yaml +20 -0
- package/templates/lanes/market.yaml +25 -0
- package/templates/lanes/plan.yaml +24 -0
- package/templates/lanes/scan.yaml +11 -0
- package/templates/lanes/triage.yaml +24 -0
- package/templates/mock/template.html +82 -0
- package/templates/seeds/go-gotchas.md +28 -0
- package/templates/seeds/go-patterns.md +22 -0
- package/templates/seeds/node-typescript-gotchas.md +30 -0
- package/templates/seeds/node-typescript-patterns.md +27 -0
- package/templates/seeds/python-gotchas.md +30 -0
- package/templates/seeds/python-patterns.md +19 -0
- package/templates/seeds/universal-gotchas.md +11 -0
- package/templates/seeds/universal-patterns.md +11 -0
- package/templates/spec/plan.md +7 -0
- package/templates/spec/research.md +19 -0
- package/templates/spec/spec.md +14 -0
- package/templates/spec/tasks.md +10 -0
- package/templates/tasks/todo.md +3 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wiki.js","sourceRoot":"","sources":["../../src/lib/wiki.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry module — re-exports all registry components.
|
|
3
|
+
*/
|
|
4
|
+
export { parseSkillFile, type SkillManifest, type ParsedSkill, SkillValidationError } from './skill-schema.js';
|
|
5
|
+
export { validateSecurity, validateTotalSize, type SecurityFinding, type SecurityResult } from './security.js';
|
|
6
|
+
export { loadLockfile, saveLockfile, lockSkill, unlockSkill, computeIntegrity, verifyIntegrity, type Lockfile, type LockedSkill } from './lockfile.js';
|
|
7
|
+
export { loadLocalIndex, searchLocalIndex, findInLocalIndex, type LocalIndex, type IndexEntry } from './local-index.js';
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry module — re-exports all registry components.
|
|
3
|
+
*/
|
|
4
|
+
export { parseSkillFile, SkillValidationError } from './skill-schema.js';
|
|
5
|
+
export { validateSecurity, validateTotalSize } from './security.js';
|
|
6
|
+
export { loadLockfile, saveLockfile, lockSkill, unlockSkill, computeIntegrity, verifyIntegrity } from './lockfile.js';
|
|
7
|
+
export { loadLocalIndex, searchLocalIndex, findInLocalIndex } from './local-index.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/registry/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAwC,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC/G,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAA6C,MAAM,eAAe,CAAC;AAC/G,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,gBAAgB,EAAE,eAAe,EAAmC,MAAM,eAAe,CAAC;AACvJ,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,gBAAgB,EAAoC,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill installer — downloads, validates, and scaffolds skills into the project.
|
|
3
|
+
*/
|
|
4
|
+
import { type LockedSkill } from './lockfile.js';
|
|
5
|
+
export interface InstallResult {
|
|
6
|
+
success: boolean;
|
|
7
|
+
name: string;
|
|
8
|
+
version: string;
|
|
9
|
+
files: string[];
|
|
10
|
+
error?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Install a skill from a local file path.
|
|
14
|
+
*/
|
|
15
|
+
export declare function installFromLocal(projectDir: string, sourcePath: string): InstallResult;
|
|
16
|
+
/**
|
|
17
|
+
* Install a skill from its raw content string.
|
|
18
|
+
*/
|
|
19
|
+
export declare function installFromContent(projectDir: string, content: string, source: string, tier?: LockedSkill['tier']): InstallResult;
|
|
20
|
+
/**
|
|
21
|
+
* Install a built-in skill from the package templates.
|
|
22
|
+
*/
|
|
23
|
+
export declare function installBuiltin(projectDir: string, name: string): InstallResult;
|
|
24
|
+
/**
|
|
25
|
+
* Uninstall a skill — remove files and lockfile entry.
|
|
26
|
+
*/
|
|
27
|
+
export declare function uninstallSkill(projectDir: string, name: string): {
|
|
28
|
+
success: boolean;
|
|
29
|
+
removed: string[];
|
|
30
|
+
};
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill installer — downloads, validates, and scaffolds skills into the project.
|
|
3
|
+
*/
|
|
4
|
+
import fse from 'fs-extra';
|
|
5
|
+
import { join, dirname } from 'path';
|
|
6
|
+
import { fileURLToPath } from 'url';
|
|
7
|
+
import { validateSecurity } from './security.js';
|
|
8
|
+
import { parseSkillFile } from './skill-schema.js';
|
|
9
|
+
import { loadLockfile, saveLockfile, lockSkill, computeIntegrity } from './lockfile.js';
|
|
10
|
+
import { detectTools } from '../lib/detect.js';
|
|
11
|
+
const { existsSync, readFileSync, writeFileSync, ensureDirSync, copySync } = fse;
|
|
12
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
13
|
+
const __dirname = dirname(__filename);
|
|
14
|
+
const PACKAGE_ROOT = join(__dirname, '..', '..');
|
|
15
|
+
/**
|
|
16
|
+
* Get tool-specific destination paths for a skill.
|
|
17
|
+
*/
|
|
18
|
+
function getSkillDestinations(name, tools) {
|
|
19
|
+
const destinations = [];
|
|
20
|
+
if (tools.includes('claude')) {
|
|
21
|
+
destinations.push(`.claude/commands/${name}.md`);
|
|
22
|
+
}
|
|
23
|
+
if (tools.includes('cursor')) {
|
|
24
|
+
destinations.push(`.cursor/commands/${name}.md`);
|
|
25
|
+
}
|
|
26
|
+
if (tools.includes('codex')) {
|
|
27
|
+
destinations.push(`.agents/skills/${name}/SKILL.md`);
|
|
28
|
+
}
|
|
29
|
+
return destinations;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Install a skill from a local file path.
|
|
33
|
+
*/
|
|
34
|
+
export function installFromLocal(projectDir, sourcePath) {
|
|
35
|
+
if (!existsSync(sourcePath)) {
|
|
36
|
+
return { success: false, name: '', version: '', files: [], error: `File not found: ${sourcePath}` };
|
|
37
|
+
}
|
|
38
|
+
const content = readFileSync(sourcePath, 'utf-8');
|
|
39
|
+
return installFromContent(projectDir, content, `local:${sourcePath}`);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Install a skill from its raw content string.
|
|
43
|
+
*/
|
|
44
|
+
export function installFromContent(projectDir, content, source, tier = 'unreviewed') {
|
|
45
|
+
// 1. Parse the skill
|
|
46
|
+
let parsed;
|
|
47
|
+
try {
|
|
48
|
+
parsed = parseSkillFile(content);
|
|
49
|
+
}
|
|
50
|
+
catch (e) {
|
|
51
|
+
return { success: false, name: '', version: '', files: [], error: e.message };
|
|
52
|
+
}
|
|
53
|
+
// 2. Security validation (always re-validate locally)
|
|
54
|
+
const security = validateSecurity(content);
|
|
55
|
+
if (!security.passed) {
|
|
56
|
+
const blocked = security.findings.filter(f => f.severity === 'block');
|
|
57
|
+
const messages = blocked.map(f => ` Line ${f.line}: ${f.message}`).join('\n');
|
|
58
|
+
return {
|
|
59
|
+
success: false,
|
|
60
|
+
name: parsed.manifest.name,
|
|
61
|
+
version: parsed.manifest.version,
|
|
62
|
+
files: [],
|
|
63
|
+
error: `Security validation failed:\n${messages}`,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
// 3. Detect installed tools
|
|
67
|
+
const tools = detectTools(projectDir);
|
|
68
|
+
if (tools.length === 0) {
|
|
69
|
+
// Default to claude if no tools detected
|
|
70
|
+
tools.push('claude');
|
|
71
|
+
}
|
|
72
|
+
// 4. Copy to tool-specific destinations
|
|
73
|
+
const destinations = getSkillDestinations(parsed.manifest.name, tools);
|
|
74
|
+
const installedFiles = [];
|
|
75
|
+
for (const dest of destinations) {
|
|
76
|
+
const fullPath = join(projectDir, dest);
|
|
77
|
+
ensureDirSync(dirname(fullPath));
|
|
78
|
+
writeFileSync(fullPath, content, 'utf-8');
|
|
79
|
+
installedFiles.push(dest);
|
|
80
|
+
}
|
|
81
|
+
// 5. Update lockfile
|
|
82
|
+
const lockfile = loadLockfile(projectDir);
|
|
83
|
+
const integrity = computeIntegrity(content);
|
|
84
|
+
const updated = lockSkill(lockfile, parsed.manifest.name, {
|
|
85
|
+
version: parsed.manifest.version,
|
|
86
|
+
source,
|
|
87
|
+
tier,
|
|
88
|
+
installed: new Date().toISOString().split('T')[0],
|
|
89
|
+
integrity,
|
|
90
|
+
files: installedFiles,
|
|
91
|
+
});
|
|
92
|
+
saveLockfile(projectDir, updated);
|
|
93
|
+
return {
|
|
94
|
+
success: true,
|
|
95
|
+
name: parsed.manifest.name,
|
|
96
|
+
version: parsed.manifest.version,
|
|
97
|
+
files: installedFiles,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Install a built-in skill from the package templates.
|
|
102
|
+
*/
|
|
103
|
+
export function installBuiltin(projectDir, name) {
|
|
104
|
+
const templatePath = join(PACKAGE_ROOT, `templates/commands/${name}.md`);
|
|
105
|
+
if (!existsSync(templatePath)) {
|
|
106
|
+
return { success: false, name, version: '', files: [], error: `Built-in skill not found: ${name}` };
|
|
107
|
+
}
|
|
108
|
+
const content = readFileSync(templatePath, 'utf-8');
|
|
109
|
+
return installFromContent(projectDir, content, `builtin:${name}`, 'trusted');
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Uninstall a skill — remove files and lockfile entry.
|
|
113
|
+
*/
|
|
114
|
+
export function uninstallSkill(projectDir, name) {
|
|
115
|
+
const lockfile = loadLockfile(projectDir);
|
|
116
|
+
const entry = lockfile.installed[name];
|
|
117
|
+
if (!entry) {
|
|
118
|
+
return { success: false, removed: [] };
|
|
119
|
+
}
|
|
120
|
+
const removed = [];
|
|
121
|
+
for (const filePath of entry.files) {
|
|
122
|
+
const fullPath = join(projectDir, filePath);
|
|
123
|
+
if (existsSync(fullPath)) {
|
|
124
|
+
fse.removeSync(fullPath);
|
|
125
|
+
removed.push(filePath);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// Remove from lockfile
|
|
129
|
+
const { [name]: _, ...rest } = lockfile.installed;
|
|
130
|
+
saveLockfile(projectDir, { installed: rest });
|
|
131
|
+
return { success: true, removed };
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/registry/installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local skill index — shipped with the npm package.
|
|
3
|
+
* Provides offline skill discovery without needing the registry API.
|
|
4
|
+
*/
|
|
5
|
+
export interface IndexEntry {
|
|
6
|
+
name: string;
|
|
7
|
+
version: string;
|
|
8
|
+
description: string;
|
|
9
|
+
author: string;
|
|
10
|
+
tags: string[];
|
|
11
|
+
stack: string;
|
|
12
|
+
tier: 'trusted' | 'community' | 'unreviewed';
|
|
13
|
+
source: 'builtin' | 'registry';
|
|
14
|
+
}
|
|
15
|
+
export interface LocalIndex {
|
|
16
|
+
version: number;
|
|
17
|
+
updatedAt: string;
|
|
18
|
+
skills: IndexEntry[];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Load the local index from the package.
|
|
22
|
+
*/
|
|
23
|
+
export declare function loadLocalIndex(): LocalIndex;
|
|
24
|
+
/**
|
|
25
|
+
* Search the local index by keyword.
|
|
26
|
+
* Matches against name, description, and tags.
|
|
27
|
+
*/
|
|
28
|
+
export declare function searchLocalIndex(index: LocalIndex, query: string): IndexEntry[];
|
|
29
|
+
/**
|
|
30
|
+
* Find a skill by exact name in the local index.
|
|
31
|
+
*/
|
|
32
|
+
export declare function findInLocalIndex(index: LocalIndex, name: string): IndexEntry | undefined;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local skill index — shipped with the npm package.
|
|
3
|
+
* Provides offline skill discovery without needing the registry API.
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync, readFileSync } from 'fs';
|
|
6
|
+
import { join, dirname } from 'path';
|
|
7
|
+
import { fileURLToPath } from 'url';
|
|
8
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
9
|
+
const __dirname = dirname(__filename);
|
|
10
|
+
const PACKAGE_ROOT = join(__dirname, '..', '..');
|
|
11
|
+
/**
|
|
12
|
+
* Load the local index from the package.
|
|
13
|
+
*/
|
|
14
|
+
export function loadLocalIndex() {
|
|
15
|
+
const indexPath = join(PACKAGE_ROOT, 'registry', 'index.json');
|
|
16
|
+
if (!existsSync(indexPath)) {
|
|
17
|
+
return { version: 1, updatedAt: new Date().toISOString(), skills: [] };
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
const content = readFileSync(indexPath, 'utf-8');
|
|
21
|
+
return JSON.parse(content);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return { version: 1, updatedAt: new Date().toISOString(), skills: [] };
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Search the local index by keyword.
|
|
29
|
+
* Matches against name, description, and tags.
|
|
30
|
+
*/
|
|
31
|
+
export function searchLocalIndex(index, query) {
|
|
32
|
+
const lower = query.toLowerCase();
|
|
33
|
+
const terms = lower.split(/\s+/).filter(Boolean);
|
|
34
|
+
return index.skills
|
|
35
|
+
.map(skill => {
|
|
36
|
+
let score = 0;
|
|
37
|
+
const searchable = `${skill.name} ${skill.description} ${skill.tags.join(' ')}`.toLowerCase();
|
|
38
|
+
for (const term of terms) {
|
|
39
|
+
if (skill.name.includes(term))
|
|
40
|
+
score += 3; // Name match is strongest
|
|
41
|
+
if (skill.tags.some(t => t.includes(term)))
|
|
42
|
+
score += 2; // Tag match
|
|
43
|
+
if (searchable.includes(term))
|
|
44
|
+
score += 1; // Description match
|
|
45
|
+
}
|
|
46
|
+
return { skill, score };
|
|
47
|
+
})
|
|
48
|
+
.filter(({ score }) => score > 0)
|
|
49
|
+
.sort((a, b) => b.score - a.score)
|
|
50
|
+
.map(({ skill }) => skill);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Find a skill by exact name in the local index.
|
|
54
|
+
*/
|
|
55
|
+
export function findInLocalIndex(index, name) {
|
|
56
|
+
return index.skills.find(s => s.name === name);
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=local-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-index.js","sourceRoot":"","sources":["../../src/registry/local-index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAmBjD;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;IAC/D,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACzE,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAe,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACzE,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAiB,EAAE,KAAa;IAC/D,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAClC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEjD,OAAO,KAAK,CAAC,MAAM;SAChB,GAAG,CAAC,KAAK,CAAC,EAAE;QACX,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,MAAM,UAAU,GAAG,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;QAE9F,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAE,KAAK,IAAI,CAAC,CAAC,CAAS,0BAA0B;YAC7E,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAAE,KAAK,IAAI,CAAC,CAAC,CAAE,YAAY;YACrE,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAE,KAAK,IAAI,CAAC,CAAC,CAAU,oBAAoB;QAC1E,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC1B,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC;SAChC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;SACjC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAiB,EAAE,IAAY;IAC9D,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lockfile management for installed skills.
|
|
3
|
+
* Tracks installed skills with versions, sources, and integrity hashes.
|
|
4
|
+
*/
|
|
5
|
+
export interface LockedSkill {
|
|
6
|
+
version: string;
|
|
7
|
+
source: string;
|
|
8
|
+
tier: 'trusted' | 'community' | 'unreviewed';
|
|
9
|
+
installed: string;
|
|
10
|
+
integrity: string;
|
|
11
|
+
files: string[];
|
|
12
|
+
}
|
|
13
|
+
export interface Lockfile {
|
|
14
|
+
installed: Record<string, LockedSkill>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Compute sha256 integrity hash for skill content.
|
|
18
|
+
*/
|
|
19
|
+
export declare function computeIntegrity(content: string): string;
|
|
20
|
+
/**
|
|
21
|
+
* Load the lockfile from the project directory.
|
|
22
|
+
* Returns an empty lockfile if it doesn't exist.
|
|
23
|
+
*/
|
|
24
|
+
export declare function loadLockfile(projectDir: string): Lockfile;
|
|
25
|
+
/**
|
|
26
|
+
* Save the lockfile to the project directory.
|
|
27
|
+
*/
|
|
28
|
+
export declare function saveLockfile(projectDir: string, lockfile: Lockfile): void;
|
|
29
|
+
/**
|
|
30
|
+
* Add or update a skill in the lockfile.
|
|
31
|
+
*/
|
|
32
|
+
export declare function lockSkill(lockfile: Lockfile, name: string, entry: LockedSkill): Lockfile;
|
|
33
|
+
/**
|
|
34
|
+
* Remove a skill from the lockfile.
|
|
35
|
+
*/
|
|
36
|
+
export declare function unlockSkill(lockfile: Lockfile, name: string): Lockfile;
|
|
37
|
+
/**
|
|
38
|
+
* Check if a skill's installed files match their integrity hash.
|
|
39
|
+
*/
|
|
40
|
+
export declare function verifyIntegrity(projectDir: string, name: string, lockfile: Lockfile): boolean;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lockfile management for installed skills.
|
|
3
|
+
* Tracks installed skills with versions, sources, and integrity hashes.
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
|
|
6
|
+
import { join, dirname } from 'path';
|
|
7
|
+
import { createHash } from 'crypto';
|
|
8
|
+
import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';
|
|
9
|
+
const LOCKFILE_PATH = '.codeloop/skills.lock';
|
|
10
|
+
/**
|
|
11
|
+
* Compute sha256 integrity hash for skill content.
|
|
12
|
+
*/
|
|
13
|
+
export function computeIntegrity(content) {
|
|
14
|
+
return `sha256-${createHash('sha256').update(content, 'utf-8').digest('hex').slice(0, 12)}`;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Load the lockfile from the project directory.
|
|
18
|
+
* Returns an empty lockfile if it doesn't exist.
|
|
19
|
+
*/
|
|
20
|
+
export function loadLockfile(projectDir) {
|
|
21
|
+
const lockPath = join(projectDir, LOCKFILE_PATH);
|
|
22
|
+
if (!existsSync(lockPath)) {
|
|
23
|
+
return { installed: {} };
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
const content = readFileSync(lockPath, 'utf-8');
|
|
27
|
+
const parsed = parseYaml(content);
|
|
28
|
+
return {
|
|
29
|
+
installed: parsed?.installed ?? {},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return { installed: {} };
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Save the lockfile to the project directory.
|
|
38
|
+
*/
|
|
39
|
+
export function saveLockfile(projectDir, lockfile) {
|
|
40
|
+
const lockPath = join(projectDir, LOCKFILE_PATH);
|
|
41
|
+
const lockDir = dirname(lockPath);
|
|
42
|
+
if (!existsSync(lockDir)) {
|
|
43
|
+
mkdirSync(lockDir, { recursive: true });
|
|
44
|
+
}
|
|
45
|
+
const content = stringifyYaml(lockfile, { lineWidth: 120 });
|
|
46
|
+
writeFileSync(lockPath, content, 'utf-8');
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Add or update a skill in the lockfile.
|
|
50
|
+
*/
|
|
51
|
+
export function lockSkill(lockfile, name, entry) {
|
|
52
|
+
return {
|
|
53
|
+
installed: {
|
|
54
|
+
...lockfile.installed,
|
|
55
|
+
[name]: entry,
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Remove a skill from the lockfile.
|
|
61
|
+
*/
|
|
62
|
+
export function unlockSkill(lockfile, name) {
|
|
63
|
+
const { [name]: _, ...rest } = lockfile.installed;
|
|
64
|
+
return { installed: rest };
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Check if a skill's installed files match their integrity hash.
|
|
68
|
+
*/
|
|
69
|
+
export function verifyIntegrity(projectDir, name, lockfile) {
|
|
70
|
+
const entry = lockfile.installed[name];
|
|
71
|
+
if (!entry)
|
|
72
|
+
return false;
|
|
73
|
+
// Check that at least one installed file exists and matches
|
|
74
|
+
for (const filePath of entry.files) {
|
|
75
|
+
const fullPath = join(projectDir, filePath);
|
|
76
|
+
if (!existsSync(fullPath))
|
|
77
|
+
return false;
|
|
78
|
+
const content = readFileSync(fullPath, 'utf-8');
|
|
79
|
+
const hash = computeIntegrity(content);
|
|
80
|
+
if (hash !== entry.integrity)
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=lockfile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lockfile.js","sourceRoot":"","sources":["../../src/registry/lockfile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security validator for skill files.
|
|
3
|
+
* Checks for dangerous patterns that could compromise the user's system.
|
|
4
|
+
*/
|
|
5
|
+
export interface SecurityFinding {
|
|
6
|
+
pattern: string;
|
|
7
|
+
message: string;
|
|
8
|
+
line: number;
|
|
9
|
+
severity: 'block' | 'warn';
|
|
10
|
+
}
|
|
11
|
+
export interface SecurityResult {
|
|
12
|
+
passed: boolean;
|
|
13
|
+
findings: SecurityFinding[];
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Validate a skill file's content for security issues.
|
|
17
|
+
*/
|
|
18
|
+
export declare function validateSecurity(content: string, filename?: string): SecurityResult;
|
|
19
|
+
/**
|
|
20
|
+
* Validate a collection of skill files for total size.
|
|
21
|
+
*/
|
|
22
|
+
export declare function validateTotalSize(files: Array<{
|
|
23
|
+
name: string;
|
|
24
|
+
content: string;
|
|
25
|
+
}>): SecurityFinding | null;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security validator for skill files.
|
|
3
|
+
* Checks for dangerous patterns that could compromise the user's system.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Patterns that BLOCK skill installation (hard gates).
|
|
7
|
+
*/
|
|
8
|
+
const BLOCKED_PATTERNS = [
|
|
9
|
+
// Arbitrary code execution
|
|
10
|
+
{ regex: /\bexec\s*\(/, message: 'Arbitrary code execution via exec()' },
|
|
11
|
+
{ regex: /\bspawn\s*\(/, message: 'Arbitrary code execution via spawn()' },
|
|
12
|
+
{ regex: /\beval\s*\(/, message: 'Arbitrary code execution via eval()' },
|
|
13
|
+
{ regex: /\bnew\s+Function\s*\(/, message: 'Arbitrary code execution via Function constructor' },
|
|
14
|
+
// Remote code injection
|
|
15
|
+
{ regex: /curl\s+.*\|\s*sh/, message: 'Pipe-to-shell attack (curl | sh)' },
|
|
16
|
+
{ regex: /curl\s+.*\|\s*bash/, message: 'Pipe-to-shell attack (curl | bash)' },
|
|
17
|
+
{ regex: /wget\s+.*\|\s*sh/, message: 'Pipe-to-shell attack (wget | sh)' },
|
|
18
|
+
{ regex: /wget\s+.*\|\s*bash/, message: 'Pipe-to-shell attack (wget | bash)' },
|
|
19
|
+
// Destructive system operations
|
|
20
|
+
{ regex: /rm\s+-rf\s+\//, message: 'Destructive system operation (rm -rf /)' },
|
|
21
|
+
{ regex: /rm\s+-rf\s+~/, message: 'Destructive operation on home directory' },
|
|
22
|
+
{ regex: /\bchmod\s+777/, message: 'Insecure permission change (chmod 777)' },
|
|
23
|
+
// Credential access
|
|
24
|
+
{ regex: /~\/\.ssh/, message: 'SSH credential access' },
|
|
25
|
+
{ regex: /~\/\.aws/, message: 'AWS credential access' },
|
|
26
|
+
{ regex: /~\/\.config\/gcloud/, message: 'GCloud credential access' },
|
|
27
|
+
{ regex: /~\/\.npmrc/, message: 'npm credential access' },
|
|
28
|
+
// Environment leakage (reading env vars beyond project)
|
|
29
|
+
{ regex: /process\.env\.(AWS_|GITHUB_TOKEN|NPM_TOKEN|SECRET)/, message: 'Sensitive environment variable access' },
|
|
30
|
+
// Directory traversal
|
|
31
|
+
{ regex: /\.\.\/(\.\.\/){2,}/, message: 'Deep directory traversal (potential escape)' },
|
|
32
|
+
];
|
|
33
|
+
/**
|
|
34
|
+
* Patterns that produce warnings (non-blocking).
|
|
35
|
+
*/
|
|
36
|
+
const WARNING_PATTERNS = [
|
|
37
|
+
{ regex: /process\.env\./, message: 'Environment variable access (verify scope is project-local)' },
|
|
38
|
+
{ regex: /\bfetch\s*\(/, message: 'Network request (verify URL is safe)' },
|
|
39
|
+
{ regex: /https?:\/\/[^\s"'`]+\.(sh|py|js|ts)\b/, message: 'URL to executable script' },
|
|
40
|
+
];
|
|
41
|
+
/**
|
|
42
|
+
* Size limits for skill files.
|
|
43
|
+
*/
|
|
44
|
+
const MAX_FILE_SIZE = 50 * 1024; // 50KB per file
|
|
45
|
+
const MAX_TOTAL_SIZE = 200 * 1024; // 200KB total
|
|
46
|
+
/**
|
|
47
|
+
* Validate a skill file's content for security issues.
|
|
48
|
+
*/
|
|
49
|
+
export function validateSecurity(content, filename) {
|
|
50
|
+
const findings = [];
|
|
51
|
+
const lines = content.split('\n');
|
|
52
|
+
// Size check
|
|
53
|
+
if (content.length > MAX_FILE_SIZE) {
|
|
54
|
+
findings.push({
|
|
55
|
+
pattern: 'size',
|
|
56
|
+
message: `File exceeds ${MAX_FILE_SIZE / 1024}KB limit (${Math.round(content.length / 1024)}KB)`,
|
|
57
|
+
line: 0,
|
|
58
|
+
severity: 'block',
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
// Pattern checks
|
|
62
|
+
for (let i = 0; i < lines.length; i++) {
|
|
63
|
+
const line = lines[i];
|
|
64
|
+
// Skip markdown code fence labels (```bash, ```yaml, etc.)
|
|
65
|
+
// but DO check content inside code blocks
|
|
66
|
+
if (/^```\w*$/.test(line.trim()))
|
|
67
|
+
continue;
|
|
68
|
+
for (const { regex, message } of BLOCKED_PATTERNS) {
|
|
69
|
+
if (regex.test(line)) {
|
|
70
|
+
findings.push({ pattern: regex.source, message, line: i + 1, severity: 'block' });
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
for (const { regex, message } of WARNING_PATTERNS) {
|
|
74
|
+
if (regex.test(line)) {
|
|
75
|
+
findings.push({ pattern: regex.source, message, line: i + 1, severity: 'warn' });
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
const blocked = findings.some(f => f.severity === 'block');
|
|
80
|
+
return {
|
|
81
|
+
passed: !blocked,
|
|
82
|
+
findings,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Validate a collection of skill files for total size.
|
|
87
|
+
*/
|
|
88
|
+
export function validateTotalSize(files) {
|
|
89
|
+
const totalSize = files.reduce((sum, f) => sum + f.content.length, 0);
|
|
90
|
+
if (totalSize > MAX_TOTAL_SIZE) {
|
|
91
|
+
return {
|
|
92
|
+
pattern: 'total_size',
|
|
93
|
+
message: `Total size exceeds ${MAX_TOTAL_SIZE / 1024}KB limit (${Math.round(totalSize / 1024)}KB)`,
|
|
94
|
+
line: 0,
|
|
95
|
+
severity: 'block',
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=security.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/registry/security.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SKILL.md schema — defines the format for publishable skills.
|
|
3
|
+
*
|
|
4
|
+
* A SKILL.md file has YAML frontmatter with required and optional fields,
|
|
5
|
+
* followed by the skill content in markdown.
|
|
6
|
+
*/
|
|
7
|
+
export interface SkillManifest {
|
|
8
|
+
name: string;
|
|
9
|
+
version: string;
|
|
10
|
+
description: string;
|
|
11
|
+
author: string;
|
|
12
|
+
tags: string[];
|
|
13
|
+
stack: string;
|
|
14
|
+
tools: string[];
|
|
15
|
+
'allowed-tools'?: string;
|
|
16
|
+
'argument-hint'?: string;
|
|
17
|
+
license?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface ParsedSkill {
|
|
20
|
+
manifest: SkillManifest;
|
|
21
|
+
content: string;
|
|
22
|
+
raw: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Parse a SKILL.md file into its manifest and content.
|
|
26
|
+
*/
|
|
27
|
+
export declare function parseSkillFile(raw: string): ParsedSkill;
|
|
28
|
+
export declare class SkillValidationError extends Error {
|
|
29
|
+
constructor(message: string);
|
|
30
|
+
}
|