@farmslot/agent-runtime 0.2.0 → 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.
Files changed (43) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/bin/farmslot-agent.mjs +6 -0
  3. package/dist/execution-template/create.d.ts +7 -0
  4. package/dist/execution-template/create.d.ts.map +1 -0
  5. package/dist/execution-template/create.js +63 -0
  6. package/dist/execution-template/create.js.map +1 -0
  7. package/dist/execution-template/execution-template.test.d.ts +2 -0
  8. package/dist/execution-template/execution-template.test.d.ts.map +1 -0
  9. package/dist/execution-template/execution-template.test.js +340 -0
  10. package/dist/execution-template/execution-template.test.js.map +1 -0
  11. package/dist/execution-template/frontmatter.d.ts +16 -0
  12. package/dist/execution-template/frontmatter.d.ts.map +1 -0
  13. package/dist/execution-template/frontmatter.js +110 -0
  14. package/dist/execution-template/frontmatter.js.map +1 -0
  15. package/dist/execution-template/index.d.ts +7 -0
  16. package/dist/execution-template/index.d.ts.map +1 -0
  17. package/dist/execution-template/index.js +6 -0
  18. package/dist/execution-template/index.js.map +1 -0
  19. package/dist/execution-template/infer.d.ts +25 -0
  20. package/dist/execution-template/infer.d.ts.map +1 -0
  21. package/dist/execution-template/infer.js +122 -0
  22. package/dist/execution-template/infer.js.map +1 -0
  23. package/dist/execution-template/lint.d.ts +6 -0
  24. package/dist/execution-template/lint.d.ts.map +1 -0
  25. package/dist/execution-template/lint.js +203 -0
  26. package/dist/execution-template/lint.js.map +1 -0
  27. package/dist/execution-template/resolve.d.ts +12 -0
  28. package/dist/execution-template/resolve.d.ts.map +1 -0
  29. package/dist/execution-template/resolve.js +126 -0
  30. package/dist/execution-template/resolve.js.map +1 -0
  31. package/dist/execution-template/types.d.ts +66 -0
  32. package/dist/execution-template/types.d.ts.map +1 -0
  33. package/dist/execution-template/types.js +3 -0
  34. package/dist/execution-template/types.js.map +1 -0
  35. package/dist/index.d.ts +1 -0
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +1 -0
  38. package/dist/index.js.map +1 -1
  39. package/package.json +6 -4
  40. package/scripts/check-task-artifact-contract.mjs +208 -63
  41. package/scripts/execution-template-cli.mjs +203 -0
  42. package/scripts/mark-checklist-step.cjs +26 -8
  43. package/scripts/worker-terminal-contract.cjs +23 -21
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/execution-template/frontmatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export { createExecutionTemplate } from './create.js';
2
+ export { frontmatterPlatforms, frontmatterRunMode, normalizePlatforms, normalizeRunMode, parseMarkdownDocument, } from './frontmatter.js';
3
+ export { catalogRelativeId, FARMSLOT_FLOW_PREFIXES, humanizeBasename, inferFlowFromBasename, inferFlowFromPath, inferPlatformsFromBasename, inferRunModeFromBasename, inferTemplateMetadata, } from './infer.js';
4
+ export { lintExecutionTemplates, lintExecutionTemplateText } from './lint.js';
5
+ export { customTemplateSource, listExecutionTemplates, packageFlowTreeTemplateSource, projectWorkerTemplateSource, } from './resolve.js';
6
+ export type { CreateExecutionTemplateOptions, ExecutionRunMode, ExecutionTemplateEntry, ExecutionTemplateFrontmatter, ExecutionTemplateLayout, ExecutionTemplateSource, ExecutionTemplateSourceKind, LintExecutionTemplatesResult, LintIssue, ListExecutionTemplatesOptions, } from './types.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/execution-template/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,EACjB,0BAA0B,EAC1B,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AAC9E,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,6BAA6B,EAC7B,2BAA2B,GAC5B,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,8BAA8B,EAC9B,gBAAgB,EAChB,sBAAsB,EACtB,4BAA4B,EAC5B,uBAAuB,EACvB,uBAAuB,EACvB,2BAA2B,EAC3B,4BAA4B,EAC5B,SAAS,EACT,6BAA6B,GAC9B,MAAM,YAAY,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { createExecutionTemplate } from './create.js';
2
+ export { frontmatterPlatforms, frontmatterRunMode, normalizePlatforms, normalizeRunMode, parseMarkdownDocument, } from './frontmatter.js';
3
+ export { catalogRelativeId, FARMSLOT_FLOW_PREFIXES, humanizeBasename, inferFlowFromBasename, inferFlowFromPath, inferPlatformsFromBasename, inferRunModeFromBasename, inferTemplateMetadata, } from './infer.js';
4
+ export { lintExecutionTemplates, lintExecutionTemplateText } from './lint.js';
5
+ export { customTemplateSource, listExecutionTemplates, packageFlowTreeTemplateSource, projectWorkerTemplateSource, } from './resolve.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/execution-template/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,EACjB,0BAA0B,EAC1B,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AAC9E,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,6BAA6B,EAC7B,2BAA2B,GAC5B,MAAM,cAAc,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { ExecutionRunMode, ExecutionTemplateEntry, ExecutionTemplateLayout, ExecutionTemplateSource } from './types.js';
2
+ /** Longest-first so `fix-bug` / `pr-complete` / `self-review` win over shorter prefixes. */
3
+ export declare const FARMSLOT_FLOW_PREFIXES: readonly ["self-review-fix", "pr-complete", "fix-bug", "review-pr", "update-branch", "self-review", "validate-dep", "ci-fix", "dev"];
4
+ export declare function humanizeBasename(basename: string): string;
5
+ export declare function inferFlowFromBasename(basename: string): string | null;
6
+ /**
7
+ * Flow for a template PATH: worker-flat encodes it in the filename prefix,
8
+ * flow-tree in the parent directory name.
9
+ */
10
+ export declare function inferFlowFromPath(absolutePath: string): string | null;
11
+ export declare function inferRunModeFromBasename(basename: string): ExecutionRunMode | null;
12
+ export declare function inferPlatformsFromBasename(basename: string): string[] | null;
13
+ /**
14
+ * Canonical catalog id. Both layouts normalize to `<flow>/<variant>` so a
15
+ * project worker-flat `fix-bug.core.md` and a package flow-tree
16
+ * `fix-bug/core.md` collide — precedence/shadowing cannot work otherwise.
17
+ */
18
+ export declare function catalogRelativeId(relativePath: string, layout: ExecutionTemplateLayout): string;
19
+ export declare function inferTemplateMetadata(input: {
20
+ absolutePath: string;
21
+ relativePath: string;
22
+ source: ExecutionTemplateSource;
23
+ text: string;
24
+ }): Omit<ExecutionTemplateEntry, 'shadowedBy'>;
25
+ //# sourceMappingURL=infer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infer.d.ts","sourceRoot":"","sources":["../../src/execution-template/infer.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,gBAAgB,EAChB,sBAAsB,EAEtB,uBAAuB,EACvB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAEpB,4FAA4F;AAC5F,eAAO,MAAM,sBAAsB,sIAUzB,CAAC;AAIX,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMzD;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQrE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOrE;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAelF;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAM5E;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,uBAAuB,GAAG,MAAM,CAS/F;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC3C,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,uBAAuB,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,IAAI,CAAC,sBAAsB,EAAE,YAAY,CAAC,CA4C7C"}
@@ -0,0 +1,122 @@
1
+ import path from 'node:path';
2
+ import { frontmatterPlatforms, frontmatterRunMode, parseMarkdownDocument, } from './frontmatter.js';
3
+ /** Longest-first so `fix-bug` / `pr-complete` / `self-review` win over shorter prefixes. */
4
+ export const FARMSLOT_FLOW_PREFIXES = [
5
+ 'self-review-fix',
6
+ 'pr-complete',
7
+ 'fix-bug',
8
+ 'review-pr',
9
+ 'update-branch',
10
+ 'self-review',
11
+ 'validate-dep',
12
+ 'ci-fix',
13
+ 'dev',
14
+ ];
15
+ const PLATFORM_SUFFIXES = ['mobile', 'extension', 'core'];
16
+ export function humanizeBasename(basename) {
17
+ return basename
18
+ .replace(/\.md$/i, '')
19
+ .replace(/[._-]+/g, ' ')
20
+ .replace(/\b\w/g, (ch) => ch.toUpperCase())
21
+ .trim();
22
+ }
23
+ export function inferFlowFromBasename(basename) {
24
+ const stem = basename.replace(/\.md$/i, '').toLowerCase();
25
+ for (const flow of FARMSLOT_FLOW_PREFIXES) {
26
+ if (stem === flow || stem.startsWith(`${flow}-`) || stem.startsWith(`${flow}.`)) {
27
+ return flow;
28
+ }
29
+ }
30
+ return null;
31
+ }
32
+ /**
33
+ * Flow for a template PATH: worker-flat encodes it in the filename prefix,
34
+ * flow-tree in the parent directory name.
35
+ */
36
+ export function inferFlowFromPath(absolutePath) {
37
+ // Parent directory wins over the basename, matching catalog metadata
38
+ // (inferTemplateMetadata: frontmatter || flow dir || basename) — otherwise
39
+ // fix-bug/dev.md would create/lint as `dev` but catalog as `fix-bug`.
40
+ const parent = path.basename(path.dirname(absolutePath)).toLowerCase();
41
+ if (FARMSLOT_FLOW_PREFIXES.includes(parent))
42
+ return parent;
43
+ return inferFlowFromBasename(path.basename(absolutePath));
44
+ }
45
+ export function inferRunModeFromBasename(basename) {
46
+ const stem = basename.replace(/\.md$/i, '').toLowerCase();
47
+ if (/(?:^|[.-])interactive(?:[.-]|$)/.test(stem)) {
48
+ return 'interactive';
49
+ }
50
+ if (/(?:^|[.-])autonomous(?:[.-]|$)/.test(stem)) {
51
+ return 'autonomous';
52
+ }
53
+ if (/(?:^|[.-])validation(?:[.-]|$)/.test(stem)) {
54
+ return 'validation';
55
+ }
56
+ // A bare flow name encodes no mode: dispatch mode is a run property, and
57
+ // flows like review-pr run interactive as often as autonomous — defaulting
58
+ // here would misclassify them, so leave the mode unresolved.
59
+ return null;
60
+ }
61
+ export function inferPlatformsFromBasename(basename) {
62
+ const stem = basename.replace(/\.md$/i, '').toLowerCase();
63
+ for (const platform of PLATFORM_SUFFIXES) {
64
+ if (stem.endsWith(`.${platform}`))
65
+ return [platform];
66
+ }
67
+ return null;
68
+ }
69
+ /**
70
+ * Canonical catalog id. Both layouts normalize to `<flow>/<variant>` so a
71
+ * project worker-flat `fix-bug.core.md` and a package flow-tree
72
+ * `fix-bug/core.md` collide — precedence/shadowing cannot work otherwise.
73
+ */
74
+ export function catalogRelativeId(relativePath, layout) {
75
+ const normalized = relativePath.replace(/\\/g, '/').replace(/^\.\//, '');
76
+ const withoutExt = normalized.replace(/\.md$/i, '');
77
+ if (layout !== 'worker-flat')
78
+ return withoutExt;
79
+ const stem = path.basename(withoutExt);
80
+ const flow = inferFlowFromBasename(`${stem}.md`);
81
+ if (!flow)
82
+ return stem;
83
+ const variant = stem.slice(flow.length).replace(/^[._-]+/, '');
84
+ return `${flow}/${variant || 'default'}`;
85
+ }
86
+ export function inferTemplateMetadata(input) {
87
+ const basename = path.basename(input.absolutePath);
88
+ const parsed = parseMarkdownDocument(input.text);
89
+ const fm = parsed.frontmatter;
90
+ const flowFromFm = typeof fm?.flow === 'string' ? fm.flow.trim() : '';
91
+ const flowFromDir = input.source.layout === 'flow-tree'
92
+ ? input.relativePath.replace(/\\/g, '/').split('/')[0] || ''
93
+ : '';
94
+ const flow = flowFromFm || flowFromDir || inferFlowFromBasename(basename) || 'unknown';
95
+ const idFromFm = typeof fm?.id === 'string' ? fm.id.trim() : '';
96
+ const id = idFromFm || catalogRelativeId(input.relativePath, input.source.layout);
97
+ const titleFromFm = typeof fm?.title === 'string' ? fm.title.trim() : '';
98
+ const title = titleFromFm || parsed.heading || humanizeBasename(basename);
99
+ const versionRaw = fm?.version;
100
+ const version = versionRaw == null || versionRaw === '' ? '1' : String(versionRaw);
101
+ const runMode = frontmatterRunMode(fm) ?? inferRunModeFromBasename(basename);
102
+ const platforms = frontmatterPlatforms(fm) ?? inferPlatformsFromBasename(basename) ?? ['*'];
103
+ const labels = Array.isArray(fm?.labels)
104
+ ? fm.labels.filter((item) => typeof item === 'string')
105
+ : [];
106
+ return {
107
+ id,
108
+ title,
109
+ flow,
110
+ version,
111
+ runMode,
112
+ platforms,
113
+ labels,
114
+ path: input.absolutePath,
115
+ relativePath: input.relativePath.replace(/\\/g, '/'),
116
+ sourceId: input.source.id,
117
+ sourceKind: input.source.kind,
118
+ frontmatter: fm,
119
+ heading: parsed.heading,
120
+ };
121
+ }
122
+ //# sourceMappingURL=infer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infer.js","sourceRoot":"","sources":["../../src/execution-template/infer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { LintExecutionTemplatesResult, LintIssue } from './types.js';
2
+ /** Lint template TEXT under a (possibly virtual) path — used by `create` to validate before writing. */
3
+ export declare function lintExecutionTemplateText(filePath: string, text: string): LintIssue[];
4
+ /** Lint optional frontmatter and parseable checkbox structure for a file or directory. */
5
+ export declare function lintExecutionTemplates(target: string): LintExecutionTemplatesResult;
6
+ //# sourceMappingURL=lint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../src/execution-template/lint.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,4BAA4B,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AA2B1E,wGAAwG;AACxG,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,CA0HrF;AAMD,0FAA0F;AAC1F,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,4BAA4B,CAsDnF"}
@@ -0,0 +1,203 @@
1
+ import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { frontmatterPlatforms, frontmatterRunMode, parseMarkdownDocument } from './frontmatter.js';
4
+ import { catalogRelativeId, FARMSLOT_FLOW_PREFIXES, inferFlowFromBasename, inferFlowFromPath, inferRunModeFromBasename, } from './infer.js';
5
+ const CHECKBOX_RE = /^\s*[-*]\s+\[([ xX])\]\s+\S/;
6
+ function collectMarkdownTargets(target) {
7
+ if (!existsSync(target))
8
+ return [];
9
+ const st = statSync(target);
10
+ if (st.isFile())
11
+ return target.endsWith('.md') ? [target] : [];
12
+ if (!st.isDirectory())
13
+ return [];
14
+ const out = [];
15
+ const walk = (dir, depth) => {
16
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
17
+ const full = path.join(dir, entry.name);
18
+ if (entry.isDirectory()) {
19
+ if (depth < 3)
20
+ walk(full, depth + 1);
21
+ continue;
22
+ }
23
+ if (entry.isFile() && entry.name.endsWith('.md'))
24
+ out.push(full);
25
+ }
26
+ };
27
+ walk(target, 0);
28
+ return out.sort((a, b) => a.localeCompare(b));
29
+ }
30
+ const SAFE_ID_RE = /^[A-Za-z0-9][A-Za-z0-9._/-]*$/;
31
+ /** Lint template TEXT under a (possibly virtual) path — used by `create` to validate before writing. */
32
+ export function lintExecutionTemplateText(filePath, text) {
33
+ const issues = [];
34
+ const basename = path.basename(filePath);
35
+ const { frontmatter, body } = parseMarkdownDocument(text);
36
+ // The parser treats an unterminated frontmatter fence as body — surface it
37
+ // instead of silently linting metadata as prose.
38
+ if (/^\uFEFF?---\r?\n/.test(text) && frontmatter === null) {
39
+ issues.push({
40
+ path: filePath,
41
+ severity: 'error',
42
+ message: 'unterminated frontmatter block (opening --- without closing ---)',
43
+ });
44
+ }
45
+ const pathFlow = inferFlowFromPath(filePath);
46
+ if (!pathFlow) {
47
+ issues.push({
48
+ path: filePath,
49
+ severity: 'error',
50
+ message: `path must encode a Farmslot flow — flow-prefixed filename or flow directory (${FARMSLOT_FLOW_PREFIXES.join(', ')})`,
51
+ });
52
+ }
53
+ // fix-bug/dev.md would create under one flow and catalog under another —
54
+ // the parent directory wins, so a basename claiming a DIFFERENT flow is a
55
+ // misleading name.
56
+ const basenameFlow = inferFlowFromBasename(basename);
57
+ if (pathFlow && basenameFlow && pathFlow !== basenameFlow) {
58
+ issues.push({
59
+ path: filePath,
60
+ severity: 'error',
61
+ message: `filename flow '${basenameFlow}' contradicts the flow directory '${pathFlow}'`,
62
+ });
63
+ }
64
+ if (/fix-ticket/i.test(text)) {
65
+ issues.push({
66
+ path: filePath,
67
+ severity: 'error',
68
+ message: 'contains deprecated fix-ticket terminology; use fix-bug',
69
+ });
70
+ }
71
+ if (frontmatter) {
72
+ if (frontmatter.id != null) {
73
+ const id = frontmatter.id;
74
+ const unsafe = typeof id !== 'string' ||
75
+ !SAFE_ID_RE.test(id) ||
76
+ id.split('/').includes('..') ||
77
+ id.includes('\\');
78
+ if (unsafe) {
79
+ issues.push({
80
+ path: filePath,
81
+ severity: 'error',
82
+ message: 'frontmatter id must be a safe catalog id (alphanumeric start; letters, digits, ./_- only; no .. segments)',
83
+ });
84
+ }
85
+ }
86
+ const fmFlow = typeof frontmatter.flow === 'string' ? frontmatter.flow.trim() : null;
87
+ const fileFlow = inferFlowFromPath(filePath);
88
+ if (fmFlow && fileFlow && fmFlow !== fileFlow) {
89
+ issues.push({
90
+ path: filePath,
91
+ severity: 'error',
92
+ message: `frontmatter flow '${fmFlow}' contradicts the path's flow '${fileFlow}'`,
93
+ });
94
+ }
95
+ if (frontmatter.runMode != null || frontmatter.run_mode != null) {
96
+ if (!frontmatterRunMode(frontmatter)) {
97
+ issues.push({
98
+ path: filePath,
99
+ severity: 'error',
100
+ message: 'frontmatter runMode must be autonomous|interactive|validation',
101
+ });
102
+ }
103
+ }
104
+ if (frontmatter.platforms != null && !frontmatterPlatforms(frontmatter)) {
105
+ issues.push({
106
+ path: filePath,
107
+ severity: 'error',
108
+ message: 'frontmatter platforms must be a non-empty string array',
109
+ });
110
+ }
111
+ if (frontmatter.flow != null && typeof frontmatter.flow !== 'string') {
112
+ issues.push({
113
+ path: filePath,
114
+ severity: 'error',
115
+ message: 'frontmatter flow must be a string',
116
+ });
117
+ }
118
+ }
119
+ const lines = body.split(/\r?\n/);
120
+ let checkboxCount = 0;
121
+ for (let i = 0; i < lines.length; i += 1) {
122
+ const line = lines[i] ?? '';
123
+ if (!/^\s*[-*]\s+\[/.test(line))
124
+ continue;
125
+ if (CHECKBOX_RE.test(line)) {
126
+ checkboxCount += 1;
127
+ continue;
128
+ }
129
+ issues.push({
130
+ path: filePath,
131
+ severity: 'error',
132
+ message: `line ${i + 1}: checkbox must be '- [ ] text' or '- [x] text'`,
133
+ });
134
+ }
135
+ // Interactive templates are conversation-driven and legitimately have no
136
+ // checklist; only non-interactive templates must carry parseable checkboxes.
137
+ const runMode = frontmatterRunMode(frontmatter) ?? inferRunModeFromBasename(basename);
138
+ if (checkboxCount === 0 && runMode !== 'interactive') {
139
+ issues.push({
140
+ path: filePath,
141
+ severity: 'error',
142
+ message: 'no parseable checkbox lines (`- [ ]` / `- [x]`)',
143
+ });
144
+ }
145
+ return issues;
146
+ }
147
+ function lintOne(filePath) {
148
+ return lintExecutionTemplateText(filePath, readFileSync(filePath, 'utf8'));
149
+ }
150
+ /** Lint optional frontmatter and parseable checkbox structure for a file or directory. */
151
+ export function lintExecutionTemplates(target) {
152
+ const files = collectMarkdownTargets(path.resolve(target));
153
+ if (files.length === 0) {
154
+ return {
155
+ ok: false,
156
+ filesChecked: 0,
157
+ issues: [
158
+ {
159
+ path: path.resolve(target),
160
+ severity: 'error',
161
+ message: 'no Markdown templates found',
162
+ },
163
+ ],
164
+ };
165
+ }
166
+ const issues = files.flatMap(lintOne);
167
+ // Two files that canonicalize to the same catalog id (dev-interactive.md vs
168
+ // dev.interactive.md) would resolve by filename order silently — surface the
169
+ // collision at authoring time. Layout per file mirrors the resolver: a file
170
+ // under a flow-named directory is flow-tree, otherwise worker-flat.
171
+ const root = path.resolve(target);
172
+ const byId = new Map();
173
+ for (const file of files) {
174
+ // Mirror the resolver's id derivation exactly: an explicit frontmatter id
175
+ // wins over the path-derived catalog id — otherwise this check misses
176
+ // identical explicit ids and falsely flags path collisions whose explicit
177
+ // ids differ.
178
+ const { frontmatter: fm } = parseMarkdownDocument(readFileSync(file, 'utf8'));
179
+ const explicitId = typeof fm?.id === 'string' ? fm.id.trim() : '';
180
+ const parent = path.basename(path.dirname(file)).toLowerCase();
181
+ const layout = FARMSLOT_FLOW_PREFIXES.includes(parent)
182
+ ? 'flow-tree'
183
+ : 'worker-flat';
184
+ const rel = layout === 'flow-tree' ? path.join(parent, path.basename(file)) : path.basename(file);
185
+ const id = explicitId || catalogRelativeId(rel, layout);
186
+ byId.set(id, [...(byId.get(id) ?? []), file]);
187
+ }
188
+ for (const [id, paths] of byId) {
189
+ if (paths.length < 2)
190
+ continue;
191
+ issues.push({
192
+ path: root,
193
+ severity: 'error',
194
+ message: `duplicate catalog id '${id}' from: ${paths.map((f) => path.relative(root, f)).join(', ')}`,
195
+ });
196
+ }
197
+ return {
198
+ ok: issues.every((issue) => issue.severity !== 'error'),
199
+ filesChecked: files.length,
200
+ issues,
201
+ };
202
+ }
203
+ //# sourceMappingURL=lint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/execution-template/lint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { ExecutionTemplateEntry, ExecutionTemplateSource, ListExecutionTemplatesOptions } from './types.js';
2
+ /**
3
+ * List execution templates across sources.
4
+ * Higher-precedence kinds win when ids collide; losers are marked `shadowedBy`.
5
+ */
6
+ export declare function listExecutionTemplates(options: ListExecutionTemplatesOptions): ExecutionTemplateEntry[];
7
+ /** Convenience: build a project worker-flat source. */
8
+ export declare function projectWorkerTemplateSource(projectName: string, projectTemplatesDir: string): ExecutionTemplateSource;
9
+ /** Convenience: build a package flow-tree source (e.g. recipe-cook references/templates). */
10
+ export declare function packageFlowTreeTemplateSource(packageId: string, templatesRoot: string): ExecutionTemplateSource;
11
+ export declare function customTemplateSource(customId: string, root: string, layout?: ExecutionTemplateSource['layout']): ExecutionTemplateSource;
12
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/execution-template/resolve.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,sBAAsB,EACtB,uBAAuB,EACvB,6BAA6B,EAC9B,MAAM,YAAY,CAAC;AAkDpB;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,6BAA6B,GACrC,sBAAsB,EAAE,CA+C1B;AAED,uDAAuD;AACvD,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,MAAM,EACnB,mBAAmB,EAAE,MAAM,GAC1B,uBAAuB,CAOzB;AAED,6FAA6F;AAC7F,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GACpB,uBAAuB,CAOzB;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,uBAAuB,CAAC,QAAQ,CAAe,GACtD,uBAAuB,CAOzB"}
@@ -0,0 +1,126 @@
1
+ import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { inferTemplateMetadata } from './infer.js';
4
+ const SOURCE_KIND_RANK = {
5
+ custom: 0,
6
+ project: 1,
7
+ workspace: 2,
8
+ user: 3,
9
+ package: 4,
10
+ fallback: 5,
11
+ };
12
+ function listMarkdownFiles(root, layout) {
13
+ if (!existsSync(root) || !statSync(root).isDirectory())
14
+ return [];
15
+ const out = [];
16
+ if (layout === 'worker-flat') {
17
+ for (const entry of readdirSync(root, { withFileTypes: true })) {
18
+ if (entry.isFile() && entry.name.endsWith('.md')) {
19
+ out.push(path.join(root, entry.name));
20
+ }
21
+ }
22
+ return out.sort((a, b) => a.localeCompare(b));
23
+ }
24
+ // flow-tree: <root>/<flow>/*.md (one level under each flow dir)
25
+ for (const flowEntry of readdirSync(root, { withFileTypes: true })) {
26
+ if (!flowEntry.isDirectory())
27
+ continue;
28
+ const flowDir = path.join(root, flowEntry.name);
29
+ for (const fileEntry of readdirSync(flowDir, { withFileTypes: true })) {
30
+ if (fileEntry.isFile() && fileEntry.name.endsWith('.md')) {
31
+ out.push(path.join(flowDir, fileEntry.name));
32
+ }
33
+ }
34
+ }
35
+ return out.sort((a, b) => a.localeCompare(b));
36
+ }
37
+ function matchesFilters(entry, options) {
38
+ if (options.flow && entry.flow !== options.flow)
39
+ return false;
40
+ if (options.runMode && entry.runMode !== options.runMode)
41
+ return false;
42
+ if (options.platform) {
43
+ const platforms = entry.platforms;
44
+ if (!platforms.includes('*') && !platforms.includes(options.platform))
45
+ return false;
46
+ }
47
+ return true;
48
+ }
49
+ /**
50
+ * List execution templates across sources.
51
+ * Higher-precedence kinds win when ids collide; losers are marked `shadowedBy`.
52
+ */
53
+ export function listExecutionTemplates(options) {
54
+ const includeShadowed = options.includeShadowed !== false;
55
+ // Same-kind ties break by CALLER order (the order sources were provided),
56
+ // not alphabetical ids — the caller's ordering is the intent.
57
+ const sources = options.sources
58
+ .map((source, callerIndex) => ({ source, callerIndex }))
59
+ .sort((a, b) => {
60
+ const rank = SOURCE_KIND_RANK[a.source.kind] - SOURCE_KIND_RANK[b.source.kind];
61
+ if (rank !== 0)
62
+ return rank;
63
+ return a.callerIndex - b.callerIndex;
64
+ })
65
+ .map(({ source }) => source);
66
+ const winners = new Map();
67
+ const shadowed = [];
68
+ // Shadowing resolves BEFORE filters: a filtered-out winner must not let a
69
+ // lower-precedence duplicate become effective through the filter.
70
+ for (const source of sources) {
71
+ for (const absolutePath of listMarkdownFiles(source.root, source.layout)) {
72
+ const relativePath = path.relative(source.root, absolutePath);
73
+ const text = readFileSync(absolutePath, 'utf8');
74
+ const entry = inferTemplateMetadata({
75
+ absolutePath,
76
+ relativePath,
77
+ source,
78
+ text,
79
+ });
80
+ const existing = winners.get(entry.id);
81
+ if (!existing) {
82
+ winners.set(entry.id, entry);
83
+ continue;
84
+ }
85
+ shadowed.push({ ...entry, shadowedBy: existing.sourceId });
86
+ }
87
+ }
88
+ const result = [...winners.values()].filter((entry) => matchesFilters(entry, options));
89
+ if (includeShadowed) {
90
+ result.push(...shadowed.filter((entry) => matchesFilters(entry, options)));
91
+ }
92
+ return result.sort((a, b) => {
93
+ if (a.flow !== b.flow)
94
+ return a.flow.localeCompare(b.flow);
95
+ if (Boolean(a.shadowedBy) !== Boolean(b.shadowedBy))
96
+ return a.shadowedBy ? 1 : -1;
97
+ return a.id.localeCompare(b.id);
98
+ });
99
+ }
100
+ /** Convenience: build a project worker-flat source. */
101
+ export function projectWorkerTemplateSource(projectName, projectTemplatesDir) {
102
+ return {
103
+ id: `project:${projectName}`,
104
+ kind: 'project',
105
+ root: path.join(projectTemplatesDir, 'worker'),
106
+ layout: 'worker-flat',
107
+ };
108
+ }
109
+ /** Convenience: build a package flow-tree source (e.g. recipe-cook references/templates). */
110
+ export function packageFlowTreeTemplateSource(packageId, templatesRoot) {
111
+ return {
112
+ id: `package:${packageId}`,
113
+ kind: 'package',
114
+ root: templatesRoot,
115
+ layout: 'flow-tree',
116
+ };
117
+ }
118
+ export function customTemplateSource(customId, root, layout = 'flow-tree') {
119
+ return {
120
+ id: `custom:${customId}`,
121
+ kind: 'custom',
122
+ root,
123
+ layout,
124
+ };
125
+ }
126
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/execution-template/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAOnD,MAAM,gBAAgB,GAAoD;IACxE,MAAM,EAAE,CAAC;IACT,OAAO,EAAE,CAAC;IACV,SAAS,EAAE,CAAC;IACZ,IAAI,EAAE,CAAC;IACP,OAAO,EAAE,CAAC;IACV,QAAQ,EAAE,CAAC;CACZ,CAAC;AAEF,SAAS,iBAAiB,CAAC,IAAY,EAAE,MAAyC;IAChF,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE;QAAE,OAAO,EAAE,CAAC;IAClE,MAAM,GAAG,GAAa,EAAE,CAAC;IAEzB,IAAI,MAAM,KAAK,aAAa,EAAE,CAAC;QAC7B,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YAC/D,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACjD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,gEAAgE;IAChE,KAAK,MAAM,SAAS,IAAI,WAAW,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACnE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;YAAE,SAAS;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QAChD,KAAK,MAAM,SAAS,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACtE,IAAI,SAAS,CAAC,MAAM,EAAE,IAAI,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,cAAc,CACrB,KAA6B,EAC7B,OAAsC;IAEtC,IAAI,OAAO,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,IAAI,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IACvE,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QAClC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC;YAAE,OAAO,KAAK,CAAC;IACtF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CACpC,OAAsC;IAEtC,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,KAAK,KAAK,CAAC;IAC1D,0EAA0E;IAC1E,8DAA8D;IAC9D,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO;SAC5B,GAAG,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;SACvD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACb,MAAM,IAAI,GAAG,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC/E,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAC5B,OAAO,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC;IACvC,CAAC,CAAC;SACD,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;IAE/B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkC,CAAC;IAC1D,MAAM,QAAQ,GAA6B,EAAE,CAAC;IAE9C,0EAA0E;IAC1E,kEAAkE;IAClE,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,KAAK,MAAM,YAAY,IAAI,iBAAiB,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACzE,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;YAC9D,MAAM,IAAI,GAAG,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;YAChD,MAAM,KAAK,GAAG,qBAAqB,CAAC;gBAClC,YAAY;gBACZ,YAAY;gBACZ,MAAM;gBACN,IAAI;aACL,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACvC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;gBAC7B,SAAS;YACX,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IACvF,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC1B,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC3D,IAAI,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC;YAAE,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClF,OAAO,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,2BAA2B,CACzC,WAAmB,EACnB,mBAA2B;IAE3B,OAAO;QACL,EAAE,EAAE,WAAW,WAAW,EAAE;QAC5B,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,QAAQ,CAAC;QAC9C,MAAM,EAAE,aAAa;KACtB,CAAC;AACJ,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,6BAA6B,CAC3C,SAAiB,EACjB,aAAqB;IAErB,OAAO;QACL,EAAE,EAAE,WAAW,SAAS,EAAE;QAC1B,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,aAAa;QACnB,MAAM,EAAE,WAAW;KACpB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,QAAgB,EAChB,IAAY,EACZ,SAA4C,WAAW;IAEvD,OAAO;QACL,EAAE,EAAE,UAAU,QAAQ,EAAE;QACxB,IAAI,EAAE,QAAQ;QACd,IAAI;QACJ,MAAM;KACP,CAAC;AACJ,CAAC"}