@openreef/cli 0.1.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 +187 -0
- package/dist/commands/init.d.ts +8 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +61 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/inspect.d.ts +2 -0
- package/dist/commands/inspect.d.ts.map +1 -0
- package/dist/commands/inspect.js +120 -0
- package/dist/commands/inspect.js.map +1 -0
- package/dist/commands/pack.d.ts +5 -0
- package/dist/commands/pack.d.ts.map +1 -0
- package/dist/commands/pack.js +43 -0
- package/dist/commands/pack.js.map +1 -0
- package/dist/commands/validate.d.ts +7 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +77 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/core/manifest-loader.d.ts +7 -0
- package/dist/core/manifest-loader.d.ts.map +1 -0
- package/dist/core/manifest-loader.js +29 -0
- package/dist/core/manifest-loader.js.map +1 -0
- package/dist/core/packer.d.ts +6 -0
- package/dist/core/packer.d.ts.map +1 -0
- package/dist/core/packer.js +26 -0
- package/dist/core/packer.js.map +1 -0
- package/dist/core/schema-validator.d.ts +3 -0
- package/dist/core/schema-validator.d.ts.map +1 -0
- package/dist/core/schema-validator.js +35 -0
- package/dist/core/schema-validator.js.map +1 -0
- package/dist/core/structural-validator.d.ts +4 -0
- package/dist/core/structural-validator.d.ts.map +1 -0
- package/dist/core/structural-validator.js +134 -0
- package/dist/core/structural-validator.js.map +1 -0
- package/dist/core/template-interpolator.d.ts +2 -0
- package/dist/core/template-interpolator.d.ts.map +1 -0
- package/dist/core/template-interpolator.js +11 -0
- package/dist/core/template-interpolator.js.map +1 -0
- package/dist/core/variable-resolver.d.ts +12 -0
- package/dist/core/variable-resolver.d.ts.map +1 -0
- package/dist/core/variable-resolver.js +38 -0
- package/dist/core/variable-resolver.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +69 -0
- package/dist/index.js.map +1 -0
- package/dist/types/manifest.d.ts +75 -0
- package/dist/types/manifest.d.ts.map +1 -0
- package/dist/types/manifest.js +2 -0
- package/dist/types/manifest.js.map +1 -0
- package/dist/types/platform.d.ts +29 -0
- package/dist/types/platform.d.ts.map +1 -0
- package/dist/types/platform.js +2 -0
- package/dist/types/platform.js.map +1 -0
- package/dist/types/validation.d.ts +12 -0
- package/dist/types/validation.d.ts.map +1 -0
- package/dist/types/validation.js +2 -0
- package/dist/types/validation.js.map +1 -0
- package/dist/utils/fs.d.ts +5 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +60 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/output.d.ts +11 -0
- package/dist/utils/output.d.ts.map +1 -0
- package/dist/utils/output.js +31 -0
- package/dist/utils/output.js.map +1 -0
- package/dist/utils/paths.d.ts +3 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +14 -0
- package/dist/utils/paths.js.map +1 -0
- package/package.json +53 -0
- package/schema/reef.schema.json +306 -0
- package/template/.env.example +3 -0
- package/template/README.md +48 -0
- package/template/agents/manager/IDENTITY.md +6 -0
- package/template/agents/manager/SOUL.md +29 -0
- package/template/agents/manager/knowledge/dynamic/.gitkeep +0 -0
- package/template/agents/manager/knowledge/static/project-brief.md +17 -0
- package/template/agents/researcher/SOUL.md +30 -0
- package/template/agents/researcher/knowledge/dynamic/.gitkeep +0 -0
- package/template/agents/researcher/knowledge/static/.gitkeep +0 -0
- package/template/reef.json +88 -0
- package/template/reef.lock.json +4 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { create } from 'tar';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { stat } from 'node:fs/promises';
|
|
4
|
+
const EXCLUDE_PATTERNS = [
|
|
5
|
+
'.git',
|
|
6
|
+
'node_modules',
|
|
7
|
+
'.env',
|
|
8
|
+
'.reef',
|
|
9
|
+
'.DS_Store',
|
|
10
|
+
];
|
|
11
|
+
export async function pack(formationDir, name, version, outputDir) {
|
|
12
|
+
const filename = `${name}-${version}.reef.tar.gz`;
|
|
13
|
+
const outputPath = join(outputDir ?? formationDir, filename);
|
|
14
|
+
await create({
|
|
15
|
+
gzip: true,
|
|
16
|
+
file: outputPath,
|
|
17
|
+
cwd: formationDir,
|
|
18
|
+
filter: (path) => {
|
|
19
|
+
const parts = path.split('/');
|
|
20
|
+
return !parts.some((p) => EXCLUDE_PATTERNS.includes(p));
|
|
21
|
+
},
|
|
22
|
+
}, ['.']);
|
|
23
|
+
const info = await stat(outputPath);
|
|
24
|
+
return { outputPath, size: info.size };
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=packer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packer.js","sourceRoot":"","sources":["../../src/core/packer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAExC,MAAM,gBAAgB,GAAG;IACvB,MAAM;IACN,cAAc;IACd,MAAM;IACN,OAAO;IACP,WAAW;CACZ,CAAC;AAOF,MAAM,CAAC,KAAK,UAAU,IAAI,CACxB,YAAoB,EACpB,IAAY,EACZ,OAAe,EACf,SAAkB;IAElB,MAAM,QAAQ,GAAG,GAAG,IAAI,IAAI,OAAO,cAAc,CAAC;IAClD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,IAAI,YAAY,EAAE,QAAQ,CAAC,CAAC;IAE7D,MAAM,MAAM,CACV;QACE,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,UAAU;QAChB,GAAG,EAAE,YAAY;QACjB,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACf,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC9B,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,CAAC;KACF,EACD,CAAC,GAAG,CAAC,CACN,CAAC;IAEF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC;IACpC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-validator.d.ts","sourceRoot":"","sources":["../../src/core/schema-validator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAwB/D,wBAAsB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAiB7E"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { getSchemaPath } from '../utils/paths.js';
|
|
3
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
4
|
+
let validateFn = null;
|
|
5
|
+
async function getValidator() {
|
|
6
|
+
if (validateFn)
|
|
7
|
+
return validateFn;
|
|
8
|
+
// Dynamic imports to handle CJS/ESM interop cleanly
|
|
9
|
+
const ajvMod = await import('ajv/dist/2020.js');
|
|
10
|
+
const formatsMod = await import('ajv-formats');
|
|
11
|
+
const Ajv2020 = ajvMod.default?.default ?? ajvMod.default ?? ajvMod;
|
|
12
|
+
const addFormats = formatsMod.default?.default ?? formatsMod.default ?? formatsMod;
|
|
13
|
+
const ajv = new Ajv2020({ allErrors: true, strict: false });
|
|
14
|
+
addFormats(ajv);
|
|
15
|
+
const schemaPath = getSchemaPath();
|
|
16
|
+
const schema = JSON.parse(readFileSync(schemaPath, 'utf-8'));
|
|
17
|
+
validateFn = ajv.compile(schema);
|
|
18
|
+
return validateFn;
|
|
19
|
+
}
|
|
20
|
+
export async function validateSchema(data) {
|
|
21
|
+
const validate = await getValidator();
|
|
22
|
+
const valid = validate(data);
|
|
23
|
+
if (valid) {
|
|
24
|
+
return { valid: true, issues: [] };
|
|
25
|
+
}
|
|
26
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
27
|
+
const issues = (validate.errors ?? []).map((err) => ({
|
|
28
|
+
severity: 'error',
|
|
29
|
+
code: 'SCHEMA_ERROR',
|
|
30
|
+
message: `${err.instancePath || '/'} ${err.message ?? 'unknown error'}`,
|
|
31
|
+
path: err.instancePath || '/',
|
|
32
|
+
}));
|
|
33
|
+
return { valid: false, issues };
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=schema-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-validator.js","sourceRoot":"","sources":["../../src/core/schema-validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGlD,8DAA8D;AAC9D,IAAI,UAAU,GAAQ,IAAI,CAAC;AAE3B,KAAK,UAAU,YAAY;IACzB,IAAI,UAAU;QAAE,OAAO,UAAU,CAAC;IAElC,oDAAoD;IACpD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAChD,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IAE/C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,OAAO,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC;IACpE,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,EAAE,OAAO,IAAI,UAAU,CAAC,OAAO,IAAI,UAAU,CAAC;IAEnF,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5D,UAAU,CAAC,GAAG,CAAC,CAAC;IAEhB,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7D,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAa;IAChD,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAC;IACtC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAY,CAAC;IAExC,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACrC,CAAC;IAED,8DAA8D;IAC9D,MAAM,MAAM,GAAG,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC;QACxD,QAAQ,EAAE,OAAgB;QAC1B,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,GAAG,GAAG,CAAC,YAAY,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,IAAI,eAAe,EAAE;QACvE,IAAI,EAAE,GAAG,CAAC,YAAY,IAAI,GAAG;KAC9B,CAAC,CAAC,CAAC;IAEJ,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ReefManifest } from '../types/manifest.js';
|
|
2
|
+
import type { ValidationResult } from '../types/validation.js';
|
|
3
|
+
export declare function validateStructure(manifest: ReefManifest, formationDir: string): Promise<ValidationResult>;
|
|
4
|
+
//# sourceMappingURL=structural-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structural-validator.d.ts","sourceRoot":"","sources":["../../src/core/structural-validator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAmB,MAAM,wBAAwB,CAAC;AAIhF,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,YAAY,EACtB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,gBAAgB,CAAC,CAuI3B"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { isDirectory } from '../utils/fs.js';
|
|
3
|
+
import { scanVariableTokens } from '../utils/fs.js';
|
|
4
|
+
export async function validateStructure(manifest, formationDir) {
|
|
5
|
+
const issues = [];
|
|
6
|
+
const agentSlugs = Object.keys(manifest.agents);
|
|
7
|
+
// Check agent source directories and SOUL.md
|
|
8
|
+
for (const [slug, agent] of Object.entries(manifest.agents)) {
|
|
9
|
+
const agentDir = join(formationDir, agent.source);
|
|
10
|
+
if (!(await isDirectory(agentDir))) {
|
|
11
|
+
issues.push({
|
|
12
|
+
severity: 'error',
|
|
13
|
+
code: 'AGENT_DIR_MISSING',
|
|
14
|
+
message: `Agent "${slug}" source directory not found: ${agent.source}`,
|
|
15
|
+
path: `agents.${slug}.source`,
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
// Check for SOUL.md
|
|
20
|
+
try {
|
|
21
|
+
const { stat } = await import('node:fs/promises');
|
|
22
|
+
const soulPath = join(agentDir, 'SOUL.md');
|
|
23
|
+
await stat(soulPath);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
issues.push({
|
|
27
|
+
severity: 'error',
|
|
28
|
+
code: 'SOUL_MD_MISSING',
|
|
29
|
+
message: `Agent "${slug}" is missing required SOUL.md in ${agent.source}`,
|
|
30
|
+
path: `agents.${slug}.source`,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// Check agentToAgent references
|
|
36
|
+
if (manifest.agentToAgent) {
|
|
37
|
+
for (const [source, targets] of Object.entries(manifest.agentToAgent)) {
|
|
38
|
+
if (!agentSlugs.includes(source)) {
|
|
39
|
+
issues.push({
|
|
40
|
+
severity: 'error',
|
|
41
|
+
code: 'AGENT_REF_INVALID',
|
|
42
|
+
message: `agentToAgent source "${source}" is not a declared agent`,
|
|
43
|
+
path: `agentToAgent.${source}`,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
for (const target of targets) {
|
|
47
|
+
if (!agentSlugs.includes(target)) {
|
|
48
|
+
issues.push({
|
|
49
|
+
severity: 'error',
|
|
50
|
+
code: 'AGENT_REF_INVALID',
|
|
51
|
+
message: `agentToAgent target "${target}" (from "${source}") is not a declared agent`,
|
|
52
|
+
path: `agentToAgent.${source}`,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Check binding agent references
|
|
59
|
+
if (manifest.bindings) {
|
|
60
|
+
for (const binding of manifest.bindings) {
|
|
61
|
+
if (!agentSlugs.includes(binding.agent)) {
|
|
62
|
+
issues.push({
|
|
63
|
+
severity: 'error',
|
|
64
|
+
code: 'BINDING_REF_INVALID',
|
|
65
|
+
message: `Binding for channel "${binding.channel}" references unknown agent "${binding.agent}"`,
|
|
66
|
+
path: 'bindings',
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Check cron agent references
|
|
72
|
+
if (manifest.cron) {
|
|
73
|
+
for (const job of manifest.cron) {
|
|
74
|
+
if (!agentSlugs.includes(job.agent)) {
|
|
75
|
+
issues.push({
|
|
76
|
+
severity: 'error',
|
|
77
|
+
code: 'CRON_REF_INVALID',
|
|
78
|
+
message: `Cron job references unknown agent "${job.agent}"`,
|
|
79
|
+
path: 'cron',
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// Warning: type/agent-count mismatch
|
|
85
|
+
const agentCount = agentSlugs.length;
|
|
86
|
+
if (manifest.type === 'solo' && agentCount !== 1) {
|
|
87
|
+
issues.push({
|
|
88
|
+
severity: 'warning',
|
|
89
|
+
code: 'TYPE_COUNT_MISMATCH',
|
|
90
|
+
message: `Formation type is "solo" but has ${agentCount} agent(s) (expected 1)`,
|
|
91
|
+
path: 'type',
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
if (manifest.type === 'team' && (agentCount < 2 || agentCount > 5)) {
|
|
95
|
+
issues.push({
|
|
96
|
+
severity: 'warning',
|
|
97
|
+
code: 'TYPE_COUNT_MISMATCH',
|
|
98
|
+
message: `Formation type is "team" but has ${agentCount} agent(s) (expected 2-5)`,
|
|
99
|
+
path: 'type',
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
if (manifest.type === 'swarm' && agentCount < 6) {
|
|
103
|
+
issues.push({
|
|
104
|
+
severity: 'warning',
|
|
105
|
+
code: 'TYPE_COUNT_MISMATCH',
|
|
106
|
+
message: `Formation type is "swarm" but has ${agentCount} agent(s) (expected 6+)`,
|
|
107
|
+
path: 'type',
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
// Warning: undeclared variable tokens in .md files
|
|
111
|
+
const declaredVars = new Set(Object.keys(manifest.variables ?? {}));
|
|
112
|
+
const builtinVars = new Set(['namespace', 'tools']);
|
|
113
|
+
for (const [slug, agent] of Object.entries(manifest.agents)) {
|
|
114
|
+
const agentDir = join(formationDir, agent.source);
|
|
115
|
+
if (!(await isDirectory(agentDir)))
|
|
116
|
+
continue;
|
|
117
|
+
const tokens = await scanVariableTokens(agentDir);
|
|
118
|
+
for (const token of tokens) {
|
|
119
|
+
if (!declaredVars.has(token) && !builtinVars.has(token)) {
|
|
120
|
+
issues.push({
|
|
121
|
+
severity: 'warning',
|
|
122
|
+
code: 'UNDECLARED_VARIABLE',
|
|
123
|
+
message: `Agent "${slug}" references undeclared variable "{{${token}}}"`,
|
|
124
|
+
path: `agents.${slug}`,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return {
|
|
130
|
+
valid: issues.every((i) => i.severity !== 'error'),
|
|
131
|
+
issues,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=structural-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structural-validator.js","sourceRoot":"","sources":["../../src/core/structural-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-interpolator.d.ts","sourceRoot":"","sources":["../../src/core/template-interpolator.ts"],"names":[],"mappings":"AAEA,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,MAAM,CAQR"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
const TOKEN_PATTERN = /\{\{(\w+)\}\}/g;
|
|
2
|
+
export function interpolate(template, variables) {
|
|
3
|
+
return template.replace(TOKEN_PATTERN, (match, name) => {
|
|
4
|
+
if (name in variables) {
|
|
5
|
+
return variables[name];
|
|
6
|
+
}
|
|
7
|
+
// Leave undeclared tokens untouched per spec
|
|
8
|
+
return match;
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=template-interpolator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-interpolator.js","sourceRoot":"","sources":["../../src/core/template-interpolator.ts"],"names":[],"mappings":"AAAA,MAAM,aAAa,GAAG,gBAAgB,CAAC;AAEvC,MAAM,UAAU,WAAW,CACzB,QAAgB,EAChB,SAAiC;IAEjC,OAAO,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;QAC7D,IAAI,IAAI,IAAI,SAAS,EAAE,CAAC;YACtB,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QACD,6CAA6C;QAC7C,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Variable } from '../types/manifest.js';
|
|
2
|
+
export interface ResolveOptions {
|
|
3
|
+
cliOverrides?: Record<string, string>;
|
|
4
|
+
envFilePath?: string;
|
|
5
|
+
interactive?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface ResolveResult {
|
|
8
|
+
resolved: Record<string, string>;
|
|
9
|
+
missing: string[];
|
|
10
|
+
}
|
|
11
|
+
export declare function resolveVariables(variables: Record<string, Variable>, formationDir: string, options?: ResolveOptions): Promise<ResolveResult>;
|
|
12
|
+
//# sourceMappingURL=variable-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variable-resolver.d.ts","sourceRoot":"","sources":["../../src/core/variable-resolver.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,WAAW,cAAc;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,EACnC,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,aAAa,CAAC,CA+BxB"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { parse as parseDotenv } from 'dotenv';
|
|
4
|
+
export async function resolveVariables(variables, formationDir, options = {}) {
|
|
5
|
+
const resolved = {};
|
|
6
|
+
const missing = [];
|
|
7
|
+
// Load .env file if present
|
|
8
|
+
let envFileVars = {};
|
|
9
|
+
const envPath = options.envFilePath ?? join(formationDir, '.env');
|
|
10
|
+
try {
|
|
11
|
+
const envContent = await readFile(envPath, 'utf-8');
|
|
12
|
+
envFileVars = parseDotenv(Buffer.from(envContent));
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
// .env file not found — that's fine
|
|
16
|
+
}
|
|
17
|
+
for (const [name, config] of Object.entries(variables)) {
|
|
18
|
+
// Precedence: CLI > .env > env > defaults
|
|
19
|
+
if (options.cliOverrides?.[name] !== undefined) {
|
|
20
|
+
resolved[name] = options.cliOverrides[name];
|
|
21
|
+
}
|
|
22
|
+
else if (envFileVars[name] !== undefined) {
|
|
23
|
+
resolved[name] = envFileVars[name];
|
|
24
|
+
}
|
|
25
|
+
else if (process.env[name] !== undefined) {
|
|
26
|
+
resolved[name] = process.env[name];
|
|
27
|
+
}
|
|
28
|
+
else if (config.default !== undefined) {
|
|
29
|
+
resolved[name] = String(config.default);
|
|
30
|
+
}
|
|
31
|
+
else if (config.required) {
|
|
32
|
+
// Interactive prompting would go here for `reef install`
|
|
33
|
+
missing.push(name);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return { resolved, missing };
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=variable-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variable-resolver.js","sourceRoot":"","sources":["../../src/core/variable-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,QAAQ,CAAC;AAc9C,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,SAAmC,EACnC,YAAoB,EACpB,UAA0B,EAAE;IAE5B,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAC5C,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,4BAA4B;IAC5B,IAAI,WAAW,GAA2B,EAAE,CAAC;IAC7C,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAClE,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACpD,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,oCAAoC;IACtC,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACvD,0CAA0C;QAC1C,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YAC/C,QAAQ,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAC9C,CAAC;aAAM,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YAC3C,QAAQ,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC;aAAM,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YAC3C,QAAQ,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;QACtC,CAAC;aAAM,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YACxC,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC1C,CAAC;aAAM,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC3B,yDAAyD;YACzD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AAC/B,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import { inspect } from './commands/inspect.js';
|
|
4
|
+
import { validate } from './commands/validate.js';
|
|
5
|
+
import { init } from './commands/init.js';
|
|
6
|
+
import { pack } from './commands/pack.js';
|
|
7
|
+
const program = new Command();
|
|
8
|
+
program
|
|
9
|
+
.name('reef')
|
|
10
|
+
.description('OpenReef CLI — package and deploy multi-agent formations')
|
|
11
|
+
.version('0.1.0');
|
|
12
|
+
program
|
|
13
|
+
.command('init [name]')
|
|
14
|
+
.description('Scaffold a new formation from the bundled template')
|
|
15
|
+
.option('--name <name>', 'Formation name')
|
|
16
|
+
.option('--namespace <namespace>', 'Namespace prefix')
|
|
17
|
+
.option('--type <type>', 'Formation type (solo, team, swarm)', 'team')
|
|
18
|
+
.option('--yes', 'Skip confirmation prompts')
|
|
19
|
+
.action(async (name, options) => {
|
|
20
|
+
try {
|
|
21
|
+
await init(name, options);
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
console.error(err instanceof Error ? err.message : err);
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
program
|
|
29
|
+
.command('inspect <path>')
|
|
30
|
+
.description('Parse reef.json and pretty-print formation contents')
|
|
31
|
+
.action(async (path) => {
|
|
32
|
+
try {
|
|
33
|
+
await inspect(path);
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
console.error(err instanceof Error ? err.message : err);
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
program
|
|
41
|
+
.command('validate <path>')
|
|
42
|
+
.description('Run schema and structural validation on a formation')
|
|
43
|
+
.option('--quiet', 'Suppress output, exit code only')
|
|
44
|
+
.option('--json', 'Output results as JSON')
|
|
45
|
+
.action(async (path, options) => {
|
|
46
|
+
try {
|
|
47
|
+
const result = await validate(path, options);
|
|
48
|
+
process.exit(result.valid ? 0 : 1);
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
console.error(err instanceof Error ? err.message : err);
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
program
|
|
56
|
+
.command('pack <path>')
|
|
57
|
+
.description('Package a formation into a .tar.gz archive')
|
|
58
|
+
.option('--output <dir>', 'Output directory')
|
|
59
|
+
.action(async (path, options) => {
|
|
60
|
+
try {
|
|
61
|
+
await pack(path, options);
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
console.error(err instanceof Error ? err.message : err);
|
|
65
|
+
process.exit(1);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
program.parse();
|
|
69
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE1C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,MAAM,CAAC;KACZ,WAAW,CAAC,0DAA0D,CAAC;KACvE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,oDAAoD,CAAC;KACjE,MAAM,CAAC,eAAe,EAAE,gBAAgB,CAAC;KACzC,MAAM,CAAC,yBAAyB,EAAE,kBAAkB,CAAC;KACrD,MAAM,CAAC,eAAe,EAAE,oCAAoC,EAAE,MAAM,CAAC;KACrE,MAAM,CAAC,OAAO,EAAE,2BAA2B,CAAC;KAC5C,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;IAC9B,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,qDAAqD,CAAC;KAClE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,iBAAiB,CAAC;KAC1B,WAAW,CAAC,qDAAqD,CAAC;KAClE,MAAM,CAAC,SAAS,EAAE,iCAAiC,CAAC;KACpD,MAAM,CAAC,QAAQ,EAAE,wBAAwB,CAAC;KAC1C,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;IAC9B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,4CAA4C,CAAC;KACzD,MAAM,CAAC,gBAAgB,EAAE,kBAAkB,CAAC;KAC5C,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;IAC9B,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
export interface AgentTools {
|
|
2
|
+
allow?: string[];
|
|
3
|
+
}
|
|
4
|
+
export interface AgentSandbox {
|
|
5
|
+
network?: boolean;
|
|
6
|
+
filesystem?: 'full' | 'restricted' | 'none';
|
|
7
|
+
}
|
|
8
|
+
export interface Agent {
|
|
9
|
+
source: string;
|
|
10
|
+
description: string;
|
|
11
|
+
role?: string;
|
|
12
|
+
model?: string;
|
|
13
|
+
tools?: AgentTools;
|
|
14
|
+
sandbox?: AgentSandbox;
|
|
15
|
+
}
|
|
16
|
+
export interface Variable {
|
|
17
|
+
type: 'string' | 'number' | 'boolean';
|
|
18
|
+
description?: string;
|
|
19
|
+
default?: string | number | boolean;
|
|
20
|
+
required?: boolean;
|
|
21
|
+
sensitive?: boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface Binding {
|
|
24
|
+
channel: string;
|
|
25
|
+
agent: string;
|
|
26
|
+
direction?: 'inbound' | 'outbound' | 'bidirectional';
|
|
27
|
+
}
|
|
28
|
+
export interface CronJob {
|
|
29
|
+
schedule: string;
|
|
30
|
+
agent: string;
|
|
31
|
+
prompt: string;
|
|
32
|
+
timezone?: string;
|
|
33
|
+
}
|
|
34
|
+
export interface Service {
|
|
35
|
+
name: string;
|
|
36
|
+
url?: string;
|
|
37
|
+
required?: boolean;
|
|
38
|
+
description?: string;
|
|
39
|
+
}
|
|
40
|
+
export interface Dependencies {
|
|
41
|
+
skills?: Record<string, string>;
|
|
42
|
+
services?: Service[];
|
|
43
|
+
}
|
|
44
|
+
export interface ValidationConfig {
|
|
45
|
+
agent_exists?: boolean;
|
|
46
|
+
file_exists?: boolean;
|
|
47
|
+
binding_active?: boolean;
|
|
48
|
+
cron_exists?: boolean;
|
|
49
|
+
agent_responds?: {
|
|
50
|
+
enabled?: boolean;
|
|
51
|
+
timeout?: number;
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
export interface Compatibility {
|
|
55
|
+
openclaw?: string;
|
|
56
|
+
}
|
|
57
|
+
export interface ReefManifest {
|
|
58
|
+
reef: '1.0';
|
|
59
|
+
type: 'solo' | 'team' | 'swarm';
|
|
60
|
+
name: string;
|
|
61
|
+
version: string;
|
|
62
|
+
description: string;
|
|
63
|
+
author?: string;
|
|
64
|
+
license?: string;
|
|
65
|
+
compatibility?: Compatibility;
|
|
66
|
+
namespace: string;
|
|
67
|
+
variables?: Record<string, Variable>;
|
|
68
|
+
agents: Record<string, Agent>;
|
|
69
|
+
agentToAgent?: Record<string, string[]>;
|
|
70
|
+
bindings?: Binding[];
|
|
71
|
+
cron?: CronJob[];
|
|
72
|
+
dependencies?: Dependencies;
|
|
73
|
+
validation?: ValidationConfig;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/types/manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/types/manifest.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PlatformAdapter — architectural seam for OpenClaw Gateway RPC.
|
|
3
|
+
*
|
|
4
|
+
* The offline commands (init, inspect, validate, pack) operate directly on
|
|
5
|
+
* the filesystem via node:fs and don't need this adapter. It exists purely
|
|
6
|
+
* to establish the interface for when `reef install` is built later.
|
|
7
|
+
*/
|
|
8
|
+
export interface PlatformAdapter {
|
|
9
|
+
createAgent(id: string, config: Record<string, unknown>): Promise<void>;
|
|
10
|
+
getAgent(id: string): Promise<Record<string, unknown> | null>;
|
|
11
|
+
deleteAgent(id: string): Promise<void>;
|
|
12
|
+
listAgents(namespace: string): Promise<string[]>;
|
|
13
|
+
writeFile(agentId: string, path: string, content: string): Promise<void>;
|
|
14
|
+
readFile(agentId: string, path: string): Promise<string>;
|
|
15
|
+
fileExists(agentId: string, path: string): Promise<boolean>;
|
|
16
|
+
deleteFile(agentId: string, path: string): Promise<void>;
|
|
17
|
+
createBinding(agentId: string, binding: Record<string, unknown>): Promise<void>;
|
|
18
|
+
deleteBinding(agentId: string, bindingId: string): Promise<void>;
|
|
19
|
+
listBindings(agentId: string): Promise<Record<string, unknown>[]>;
|
|
20
|
+
isBindingActive(agentId: string, bindingId: string): Promise<boolean>;
|
|
21
|
+
createCron(agentId: string, cron: Record<string, unknown>): Promise<void>;
|
|
22
|
+
deleteCron(agentId: string, cronId: string): Promise<void>;
|
|
23
|
+
listCrons(agentId: string): Promise<Record<string, unknown>[]>;
|
|
24
|
+
sendPing(agentId: string): Promise<boolean>;
|
|
25
|
+
readState(key: string): Promise<string | null>;
|
|
26
|
+
writeState(key: string, value: string): Promise<void>;
|
|
27
|
+
deleteState(key: string): Promise<void>;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=platform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/types/platform.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAE9B,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxE,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9D,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAGjD,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzE,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACzD,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5D,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAGzD,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChF,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IAClE,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAGtE,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1E,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IAG/D,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAG5C,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC/C,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/types/platform.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type IssueSeverity = 'error' | 'warning' | 'info';
|
|
2
|
+
export interface ValidationIssue {
|
|
3
|
+
severity: IssueSeverity;
|
|
4
|
+
code: string;
|
|
5
|
+
message: string;
|
|
6
|
+
path?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface ValidationResult {
|
|
9
|
+
valid: boolean;
|
|
10
|
+
issues: ValidationIssue[];
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/types/validation.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAEzD,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,aAAa,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/types/validation.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function isDirectory(path: string): Promise<boolean>;
|
|
2
|
+
export declare function copyDir(src: string, dest: string, exclude?: string[]): Promise<void>;
|
|
3
|
+
export declare function listFiles(dir: string): Promise<string[]>;
|
|
4
|
+
export declare function scanVariableTokens(dir: string): Promise<string[]>;
|
|
5
|
+
//# sourceMappingURL=fs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../src/utils/fs.ts"],"names":[],"mappings":"AAGA,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOhE;AAED,wBAAsB,OAAO,CAC3B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAiB9D;AAED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAevE"}
|
package/dist/utils/fs.js
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { readdir, stat, mkdir, copyFile, readFile } from 'node:fs/promises';
|
|
2
|
+
import { join, relative } from 'node:path';
|
|
3
|
+
export async function isDirectory(path) {
|
|
4
|
+
try {
|
|
5
|
+
const s = await stat(path);
|
|
6
|
+
return s.isDirectory();
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export async function copyDir(src, dest, exclude) {
|
|
13
|
+
await mkdir(dest, { recursive: true });
|
|
14
|
+
const entries = await readdir(src, { withFileTypes: true });
|
|
15
|
+
for (const entry of entries) {
|
|
16
|
+
if (exclude?.includes(entry.name))
|
|
17
|
+
continue;
|
|
18
|
+
const srcPath = join(src, entry.name);
|
|
19
|
+
const destPath = join(dest, entry.name);
|
|
20
|
+
if (entry.isDirectory()) {
|
|
21
|
+
await copyDir(srcPath, destPath, exclude);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
await copyFile(srcPath, destPath);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export async function listFiles(dir) {
|
|
29
|
+
const results = [];
|
|
30
|
+
async function walk(current) {
|
|
31
|
+
const entries = await readdir(current, { withFileTypes: true });
|
|
32
|
+
for (const entry of entries) {
|
|
33
|
+
const fullPath = join(current, entry.name);
|
|
34
|
+
if (entry.isDirectory()) {
|
|
35
|
+
await walk(fullPath);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
results.push(relative(dir, fullPath));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
await walk(dir);
|
|
43
|
+
return results.sort();
|
|
44
|
+
}
|
|
45
|
+
export async function scanVariableTokens(dir) {
|
|
46
|
+
const tokens = new Set();
|
|
47
|
+
const files = await listFiles(dir);
|
|
48
|
+
const pattern = /\{\{(\w+)\}\}/g;
|
|
49
|
+
for (const file of files) {
|
|
50
|
+
if (!file.endsWith('.md'))
|
|
51
|
+
continue;
|
|
52
|
+
const content = await readFile(join(dir, file), 'utf-8');
|
|
53
|
+
let match;
|
|
54
|
+
while ((match = pattern.exec(content)) !== null) {
|
|
55
|
+
tokens.add(match[1]);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return [...tokens].sort();
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=fs.js.map
|