@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.
Files changed (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +187 -0
  3. package/dist/commands/init.d.ts +8 -0
  4. package/dist/commands/init.d.ts.map +1 -0
  5. package/dist/commands/init.js +61 -0
  6. package/dist/commands/init.js.map +1 -0
  7. package/dist/commands/inspect.d.ts +2 -0
  8. package/dist/commands/inspect.d.ts.map +1 -0
  9. package/dist/commands/inspect.js +120 -0
  10. package/dist/commands/inspect.js.map +1 -0
  11. package/dist/commands/pack.d.ts +5 -0
  12. package/dist/commands/pack.d.ts.map +1 -0
  13. package/dist/commands/pack.js +43 -0
  14. package/dist/commands/pack.js.map +1 -0
  15. package/dist/commands/validate.d.ts +7 -0
  16. package/dist/commands/validate.d.ts.map +1 -0
  17. package/dist/commands/validate.js +77 -0
  18. package/dist/commands/validate.js.map +1 -0
  19. package/dist/core/manifest-loader.d.ts +7 -0
  20. package/dist/core/manifest-loader.d.ts.map +1 -0
  21. package/dist/core/manifest-loader.js +29 -0
  22. package/dist/core/manifest-loader.js.map +1 -0
  23. package/dist/core/packer.d.ts +6 -0
  24. package/dist/core/packer.d.ts.map +1 -0
  25. package/dist/core/packer.js +26 -0
  26. package/dist/core/packer.js.map +1 -0
  27. package/dist/core/schema-validator.d.ts +3 -0
  28. package/dist/core/schema-validator.d.ts.map +1 -0
  29. package/dist/core/schema-validator.js +35 -0
  30. package/dist/core/schema-validator.js.map +1 -0
  31. package/dist/core/structural-validator.d.ts +4 -0
  32. package/dist/core/structural-validator.d.ts.map +1 -0
  33. package/dist/core/structural-validator.js +134 -0
  34. package/dist/core/structural-validator.js.map +1 -0
  35. package/dist/core/template-interpolator.d.ts +2 -0
  36. package/dist/core/template-interpolator.d.ts.map +1 -0
  37. package/dist/core/template-interpolator.js +11 -0
  38. package/dist/core/template-interpolator.js.map +1 -0
  39. package/dist/core/variable-resolver.d.ts +12 -0
  40. package/dist/core/variable-resolver.d.ts.map +1 -0
  41. package/dist/core/variable-resolver.js +38 -0
  42. package/dist/core/variable-resolver.js.map +1 -0
  43. package/dist/index.d.ts +3 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +69 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/types/manifest.d.ts +75 -0
  48. package/dist/types/manifest.d.ts.map +1 -0
  49. package/dist/types/manifest.js +2 -0
  50. package/dist/types/manifest.js.map +1 -0
  51. package/dist/types/platform.d.ts +29 -0
  52. package/dist/types/platform.d.ts.map +1 -0
  53. package/dist/types/platform.js +2 -0
  54. package/dist/types/platform.js.map +1 -0
  55. package/dist/types/validation.d.ts +12 -0
  56. package/dist/types/validation.d.ts.map +1 -0
  57. package/dist/types/validation.js +2 -0
  58. package/dist/types/validation.js.map +1 -0
  59. package/dist/utils/fs.d.ts +5 -0
  60. package/dist/utils/fs.d.ts.map +1 -0
  61. package/dist/utils/fs.js +60 -0
  62. package/dist/utils/fs.js.map +1 -0
  63. package/dist/utils/output.d.ts +11 -0
  64. package/dist/utils/output.d.ts.map +1 -0
  65. package/dist/utils/output.js +31 -0
  66. package/dist/utils/output.js.map +1 -0
  67. package/dist/utils/paths.d.ts +3 -0
  68. package/dist/utils/paths.d.ts.map +1 -0
  69. package/dist/utils/paths.js +14 -0
  70. package/dist/utils/paths.js.map +1 -0
  71. package/package.json +53 -0
  72. package/schema/reef.schema.json +306 -0
  73. package/template/.env.example +3 -0
  74. package/template/README.md +48 -0
  75. package/template/agents/manager/IDENTITY.md +6 -0
  76. package/template/agents/manager/SOUL.md +29 -0
  77. package/template/agents/manager/knowledge/dynamic/.gitkeep +0 -0
  78. package/template/agents/manager/knowledge/static/project-brief.md +17 -0
  79. package/template/agents/researcher/SOUL.md +30 -0
  80. package/template/agents/researcher/knowledge/dynamic/.gitkeep +0 -0
  81. package/template/agents/researcher/knowledge/static/.gitkeep +0 -0
  82. package/template/reef.json +88 -0
  83. 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,3 @@
1
+ import type { ValidationResult } from '../types/validation.js';
2
+ export declare function validateSchema(data: unknown): Promise<ValidationResult>;
3
+ //# sourceMappingURL=schema-validator.d.ts.map
@@ -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,2 @@
1
+ export declare function interpolate(template: string, variables: Record<string, string>): string;
2
+ //# sourceMappingURL=template-interpolator.d.ts.map
@@ -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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=manifest.js.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=platform.js.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=validation.js.map
@@ -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"}
@@ -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