@vibe-agent-toolkit/cli 0.1.37 → 0.1.39-rc.1
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/README.md +7 -4
- package/dist/bin/vat +10 -5
- package/dist/bin/vat.js +10 -5
- package/dist/bin/vat.js.map +1 -1
- package/dist/commands/agent/build.d.ts.map +1 -1
- package/dist/commands/agent/build.js +3 -0
- package/dist/commands/agent/build.js.map +1 -1
- package/dist/commands/agent/index.d.ts.map +1 -1
- package/dist/commands/agent/index.js +25 -1
- package/dist/commands/agent/index.js.map +1 -1
- package/dist/commands/agent/run.d.ts.map +1 -1
- package/dist/commands/agent/run.js +5 -0
- package/dist/commands/agent/run.js.map +1 -1
- package/dist/commands/agent/validate.d.ts.map +1 -1
- package/dist/commands/agent/validate.js +3 -0
- package/dist/commands/agent/validate.js.map +1 -1
- package/dist/commands/audit/hierarchical-output.d.ts +2 -1
- package/dist/commands/audit/hierarchical-output.d.ts.map +1 -1
- package/dist/commands/audit/hierarchical-output.js.map +1 -1
- package/dist/commands/audit.d.ts.map +1 -1
- package/dist/commands/audit.js +20 -9
- package/dist/commands/audit.js.map +1 -1
- package/dist/commands/build.d.ts.map +1 -1
- package/dist/commands/build.js +9 -0
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/claude/claude-config.d.ts.map +1 -1
- package/dist/commands/claude/claude-config.js +4 -2
- package/dist/commands/claude/claude-config.js.map +1 -1
- package/dist/commands/claude/marketplace/git-publish.d.ts +5 -12
- package/dist/commands/claude/marketplace/git-publish.d.ts.map +1 -1
- package/dist/commands/claude/marketplace/git-publish.js +7 -80
- package/dist/commands/claude/marketplace/git-publish.js.map +1 -1
- package/dist/commands/claude/marketplace/publish-tree.d.ts +12 -4
- package/dist/commands/claude/marketplace/publish-tree.d.ts.map +1 -1
- package/dist/commands/claude/marketplace/publish-tree.js +54 -24
- package/dist/commands/claude/marketplace/publish-tree.js.map +1 -1
- package/dist/commands/claude/marketplace/publish.d.ts.map +1 -1
- package/dist/commands/claude/marketplace/publish.js +14 -39
- package/dist/commands/claude/marketplace/publish.js.map +1 -1
- package/dist/commands/claude/marketplace/validate.js.map +1 -1
- package/dist/commands/claude/plugin/install.js +2 -2
- package/dist/commands/claude/plugin/install.js.map +1 -1
- package/dist/commands/corpus/index.d.ts.map +1 -1
- package/dist/commands/corpus/index.js +6 -0
- package/dist/commands/corpus/index.js.map +1 -1
- package/dist/commands/corpus/report.js +2 -2
- package/dist/commands/corpus/report.js.map +1 -1
- package/dist/commands/corpus/runner.js +3 -3
- package/dist/commands/corpus/runner.js.map +1 -1
- package/dist/commands/corpus/scan.d.ts.map +1 -1
- package/dist/commands/corpus/scan.js +4 -0
- package/dist/commands/corpus/scan.js.map +1 -1
- package/dist/commands/corpus/seed.d.ts +24 -0
- package/dist/commands/corpus/seed.d.ts.map +1 -1
- package/dist/commands/corpus/seed.js +7 -3
- package/dist/commands/corpus/seed.js.map +1 -1
- package/dist/commands/doctor.d.ts +4 -2
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +24 -34
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/rag/command-helpers.d.ts +7 -2
- package/dist/commands/rag/command-helpers.d.ts.map +1 -1
- package/dist/commands/rag/command-helpers.js +10 -5
- package/dist/commands/rag/command-helpers.js.map +1 -1
- package/dist/commands/rag/index-command.d.ts.map +1 -1
- package/dist/commands/rag/index-command.js +11 -3
- package/dist/commands/rag/index-command.js.map +1 -1
- package/dist/commands/rag/index.d.ts.map +1 -1
- package/dist/commands/rag/index.js +24 -0
- package/dist/commands/rag/index.js.map +1 -1
- package/dist/commands/resources/index.d.ts.map +1 -1
- package/dist/commands/resources/index.js +16 -1
- package/dist/commands/resources/index.js.map +1 -1
- package/dist/commands/resources/scan.d.ts.map +1 -1
- package/dist/commands/resources/scan.js +4 -1
- package/dist/commands/resources/scan.js.map +1 -1
- package/dist/commands/resources/validate.d.ts.map +1 -1
- package/dist/commands/resources/validate.js +162 -117
- package/dist/commands/resources/validate.js.map +1 -1
- package/dist/commands/skill/review.d.ts.map +1 -1
- package/dist/commands/skill/review.js +14 -2
- package/dist/commands/skill/review.js.map +1 -1
- package/dist/commands/skills/build.d.ts.map +1 -1
- package/dist/commands/skills/build.js +12 -0
- package/dist/commands/skills/build.js.map +1 -1
- package/dist/commands/skills/index.js +6 -0
- package/dist/commands/skills/index.js.map +1 -1
- package/dist/commands/skills/package.d.ts.map +1 -1
- package/dist/commands/skills/package.js +10 -0
- package/dist/commands/skills/package.js.map +1 -1
- package/dist/commands/skills/skill-discovery.d.ts +9 -2
- package/dist/commands/skills/skill-discovery.d.ts.map +1 -1
- package/dist/commands/skills/skill-discovery.js +83 -18
- package/dist/commands/skills/skill-discovery.js.map +1 -1
- package/dist/commands/skills/validate-command.d.ts.map +1 -1
- package/dist/commands/skills/validate-command.js +6 -0
- package/dist/commands/skills/validate-command.js.map +1 -1
- package/dist/commands/skills/validate.d.ts.map +1 -1
- package/dist/commands/skills/validate.js +15 -3
- package/dist/commands/skills/validate.js.map +1 -1
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +9 -0
- package/dist/commands/verify.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/utils/agent-discovery.d.ts.map +1 -1
- package/dist/utils/agent-discovery.js +2 -3
- package/dist/utils/agent-discovery.js.map +1 -1
- package/dist/utils/config-loader.d.ts +11 -24
- package/dist/utils/config-loader.d.ts.map +1 -1
- package/dist/utils/config-loader.js +34 -68
- package/dist/utils/config-loader.js.map +1 -1
- package/dist/utils/logger.d.ts +1 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +3 -0
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/output.js +3 -3
- package/dist/utils/output.js.map +1 -1
- package/dist/utils/project-root-policy.d.ts +33 -0
- package/dist/utils/project-root-policy.d.ts.map +1 -0
- package/dist/utils/project-root-policy.js +49 -0
- package/dist/utils/project-root-policy.js.map +1 -0
- package/dist/utils/resource-loader.d.ts +9 -4
- package/dist/utils/resource-loader.d.ts.map +1 -1
- package/dist/utils/resource-loader.js +24 -28
- package/dist/utils/resource-loader.js.map +1 -1
- package/dist/utils/verdict-helpers.d.ts +2 -1
- package/dist/utils/verdict-helpers.d.ts.map +1 -1
- package/dist/utils/verdict-helpers.js +1 -1
- package/dist/utils/verdict-helpers.js.map +1 -1
- package/docs/agent.md +25 -0
- package/docs/audit.md +25 -0
- package/docs/doctor.md +13 -0
- package/docs/index.md +19 -0
- package/docs/mcp.md +16 -0
- package/docs/rag.md +18 -0
- package/docs/resources.md +45 -3
- package/docs/skills.md +61 -3
- package/package.json +12 -13
- package/dist/commands/claude/marketplace/tag-utils.d.ts +0 -11
- package/dist/commands/claude/marketplace/tag-utils.d.ts.map +0 -1
- package/dist/commands/claude/marketplace/tag-utils.js +0 -17
- package/dist/commands/claude/marketplace/tag-utils.js.map +0 -1
- package/dist/utils/project-root.d.ts +0 -30
- package/dist/utils/project-root.d.ts.map +0 -1
- package/dist/utils/project-root.js +0 -59
- package/dist/utils/project-root.js.map +0 -1
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import fs from 'node:fs/promises';
|
|
5
5
|
import { safePath } from '@vibe-agent-toolkit/utils';
|
|
6
|
-
import * as yaml from '
|
|
6
|
+
import * as yaml from 'yaml';
|
|
7
7
|
/**
|
|
8
8
|
* Discover all agents in common locations
|
|
9
9
|
*/
|
|
@@ -57,8 +57,7 @@ async function parseAgentManifest(manifestPath, agentDir) {
|
|
|
57
57
|
try {
|
|
58
58
|
// eslint-disable-next-line security/detect-non-literal-fs-filename -- manifestPath from findManifest, trusted
|
|
59
59
|
const content = await fs.readFile(manifestPath, 'utf-8');
|
|
60
|
-
|
|
61
|
-
const data = yaml.load(content, { schema: yaml.CORE_SCHEMA });
|
|
60
|
+
const data = yaml.parse(content);
|
|
62
61
|
if (data?.metadata?.name && data?.metadata?.version) {
|
|
63
62
|
return {
|
|
64
63
|
name: data.metadata.name,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-discovery.js","sourceRoot":"","sources":["../../src/utils/agent-discovery.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAElC,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,KAAK,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"agent-discovery.js","sourceRoot":"","sources":["../../src/utils/agent-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,12 +5,6 @@
|
|
|
5
5
|
* - VAT_TEST_CONFIG: Override config file path for testing (absolute path)
|
|
6
6
|
*/
|
|
7
7
|
import { type ProjectConfig } from '@vibe-agent-toolkit/resources';
|
|
8
|
-
/**
|
|
9
|
-
* Find configuration file by walking up directory tree
|
|
10
|
-
* @param startDir - Starting directory (defaults to cwd)
|
|
11
|
-
* @returns Path to config file, or null if not found
|
|
12
|
-
*/
|
|
13
|
-
export declare function findConfigPath(startDir?: string): string | null;
|
|
14
8
|
/**
|
|
15
9
|
* Load and validate project configuration
|
|
16
10
|
*
|
|
@@ -38,26 +32,19 @@ export declare function loadConfig(projectRoot: string): ProjectConfig | undefin
|
|
|
38
32
|
*/
|
|
39
33
|
export declare function getConfigDir(configPath: string): string;
|
|
40
34
|
/**
|
|
41
|
-
* Reset the
|
|
42
|
-
*
|
|
43
|
-
*
|
|
35
|
+
* Reset the cache used by {@link loadConfigCached}.
|
|
36
|
+
*
|
|
37
|
+
* Call at the start of each independent CLI invocation (e.g. `vat audit`) so
|
|
38
|
+
* in-process callers don't observe stale config data across runs.
|
|
44
39
|
*/
|
|
45
|
-
export declare function
|
|
40
|
+
export declare function resetLoadedConfigCache(): void;
|
|
46
41
|
/**
|
|
47
|
-
*
|
|
48
|
-
* `vibe-agent-toolkit.config.yaml`. Loads and caches the config on first hit.
|
|
49
|
-
*
|
|
50
|
-
* Returns the parsed config plus the `configRoot` (directory that contained the
|
|
51
|
-
* yaml), or `null` if no config is found anywhere up the tree.
|
|
42
|
+
* Cached variant of {@link loadConfig} keyed by `projectRoot`.
|
|
52
43
|
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
* state — the audit CLI entrypoint already does this via `resetAuditCaches()`.
|
|
44
|
+
* Both successful loads and parse failures are cached (failures as `null`)
|
|
45
|
+
* so a broken config doesn't re-parse on every skill in the same scan. A
|
|
46
|
+
* test that edits a broken config into a good one between calls must invoke
|
|
47
|
+
* {@link resetLoadedConfigCache} (audit's `resetAuditCaches()` does this).
|
|
58
48
|
*/
|
|
59
|
-
export declare function
|
|
60
|
-
config: ProjectConfig;
|
|
61
|
-
configRoot: string;
|
|
62
|
-
} | null;
|
|
49
|
+
export declare function loadConfigCached(projectRoot: string): ProjectConfig | undefined;
|
|
63
50
|
//# sourceMappingURL=config-loader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAMxF
|
|
1
|
+
{"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAMxF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CA8BzE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEvD;AAgBD;;;;;GAKG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAY/E"}
|
|
@@ -5,32 +5,11 @@
|
|
|
5
5
|
* - VAT_TEST_CONFIG: Override config file path for testing (absolute path)
|
|
6
6
|
*/
|
|
7
7
|
import { readFileSync, existsSync } from 'node:fs';
|
|
8
|
-
import { dirname
|
|
8
|
+
import { dirname } from 'node:path';
|
|
9
9
|
import { ProjectConfigSchema } from '@vibe-agent-toolkit/resources';
|
|
10
10
|
import { safePath } from '@vibe-agent-toolkit/utils';
|
|
11
|
-
import * as yaml from '
|
|
11
|
+
import * as yaml from 'yaml';
|
|
12
12
|
const CONFIG_FILENAME = 'vibe-agent-toolkit.config.yaml';
|
|
13
|
-
/**
|
|
14
|
-
* Find configuration file by walking up directory tree
|
|
15
|
-
* @param startDir - Starting directory (defaults to cwd)
|
|
16
|
-
* @returns Path to config file, or null if not found
|
|
17
|
-
*/
|
|
18
|
-
export function findConfigPath(startDir) {
|
|
19
|
-
let currentDir = safePath.resolve(startDir ?? process.cwd());
|
|
20
|
-
const root = parse(currentDir).root;
|
|
21
|
-
while (currentDir !== root) {
|
|
22
|
-
const configPath = safePath.join(currentDir, CONFIG_FILENAME);
|
|
23
|
-
// eslint-disable-next-line security/detect-non-literal-fs-filename -- Dynamic path walking is required for config file search
|
|
24
|
-
if (existsSync(configPath)) {
|
|
25
|
-
return configPath;
|
|
26
|
-
}
|
|
27
|
-
const parent = dirname(currentDir);
|
|
28
|
-
if (parent === currentDir)
|
|
29
|
-
break; // safety: at filesystem root
|
|
30
|
-
currentDir = parent;
|
|
31
|
-
}
|
|
32
|
-
return null;
|
|
33
|
-
}
|
|
34
13
|
/**
|
|
35
14
|
* Load and validate project configuration
|
|
36
15
|
*
|
|
@@ -62,10 +41,7 @@ export function loadConfig(projectRoot) {
|
|
|
62
41
|
try {
|
|
63
42
|
// eslint-disable-next-line security/detect-non-literal-fs-filename -- configPath is derived from projectRoot parameter
|
|
64
43
|
const content = readFileSync(configPath, 'utf-8');
|
|
65
|
-
|
|
66
|
-
// from auto-promoting unquoted ISO dates to JS Date objects (a YAML 1.1
|
|
67
|
-
// tag). See packages/resources/src/link-parser.ts for the full rationale.
|
|
68
|
-
const parsed = yaml.load(content, { schema: yaml.CORE_SCHEMA });
|
|
44
|
+
const parsed = yaml.parse(content);
|
|
69
45
|
// Validate with canonical schema from resources package
|
|
70
46
|
const result = ProjectConfigSchema.safeParse(parsed);
|
|
71
47
|
if (!result.success) {
|
|
@@ -87,58 +63,48 @@ export function getConfigDir(configPath) {
|
|
|
87
63
|
return dirname(configPath);
|
|
88
64
|
}
|
|
89
65
|
/**
|
|
90
|
-
*
|
|
91
|
-
*
|
|
92
|
-
*
|
|
66
|
+
* Layer 2 cache for {@link loadConfigCached}.
|
|
67
|
+
*
|
|
68
|
+
* Keyed by `projectRoot` → parsed {@link ProjectConfig} (or `null` if the
|
|
69
|
+
* file failed to load). Avoids re-parsing the same config yaml repeatedly
|
|
70
|
+
* when audit walks up from many sibling skills sharing one governing config.
|
|
71
|
+
*
|
|
72
|
+
* Tests that mutate fixtures between runs must call
|
|
73
|
+
* {@link resetLoadedConfigCache} to invalidate this cache.
|
|
93
74
|
*
|
|
94
|
-
*
|
|
95
|
-
* to invalidate this cache.
|
|
75
|
+
* See spec docs/superpowers/specs/2026-05-17-root-model-and-leading-slash-design.md §8.
|
|
96
76
|
*/
|
|
97
|
-
const
|
|
77
|
+
const loadedConfigCache = new Map();
|
|
98
78
|
/**
|
|
99
|
-
* Reset the
|
|
100
|
-
*
|
|
101
|
-
*
|
|
79
|
+
* Reset the cache used by {@link loadConfigCached}.
|
|
80
|
+
*
|
|
81
|
+
* Call at the start of each independent CLI invocation (e.g. `vat audit`) so
|
|
82
|
+
* in-process callers don't observe stale config data across runs.
|
|
102
83
|
*/
|
|
103
|
-
export function
|
|
104
|
-
|
|
84
|
+
export function resetLoadedConfigCache() {
|
|
85
|
+
loadedConfigCache.clear();
|
|
105
86
|
}
|
|
106
87
|
/**
|
|
107
|
-
*
|
|
108
|
-
* `vibe-agent-toolkit.config.yaml`. Loads and caches the config on first hit.
|
|
109
|
-
*
|
|
110
|
-
* Returns the parsed config plus the `configRoot` (directory that contained the
|
|
111
|
-
* yaml), or `null` if no config is found anywhere up the tree.
|
|
88
|
+
* Cached variant of {@link loadConfig} keyed by `projectRoot`.
|
|
112
89
|
*
|
|
113
|
-
*
|
|
114
|
-
*
|
|
115
|
-
*
|
|
116
|
-
*
|
|
117
|
-
* state — the audit CLI entrypoint already does this via `resetAuditCaches()`.
|
|
90
|
+
* Both successful loads and parse failures are cached (failures as `null`)
|
|
91
|
+
* so a broken config doesn't re-parse on every skill in the same scan. A
|
|
92
|
+
* test that edits a broken config into a good one between calls must invoke
|
|
93
|
+
* {@link resetLoadedConfigCache} (audit's `resetAuditCaches()` does this).
|
|
118
94
|
*/
|
|
119
|
-
export function
|
|
120
|
-
const
|
|
121
|
-
if (
|
|
122
|
-
return
|
|
123
|
-
}
|
|
124
|
-
const configRoot = dirname(configPath);
|
|
125
|
-
const cached = governingConfigCache.get(configRoot);
|
|
126
|
-
if (cached !== undefined) {
|
|
127
|
-
return cached === null ? null : { config: cached, configRoot };
|
|
128
|
-
}
|
|
95
|
+
export function loadConfigCached(projectRoot) {
|
|
96
|
+
const cached = loadedConfigCache.get(projectRoot);
|
|
97
|
+
if (cached !== undefined)
|
|
98
|
+
return cached ?? undefined;
|
|
129
99
|
try {
|
|
130
|
-
const config = loadConfig(
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
return null;
|
|
134
|
-
}
|
|
135
|
-
governingConfigCache.set(configRoot, config);
|
|
136
|
-
return { config, configRoot };
|
|
100
|
+
const config = loadConfig(projectRoot);
|
|
101
|
+
loadedConfigCache.set(projectRoot, config ?? null);
|
|
102
|
+
return config;
|
|
137
103
|
}
|
|
138
104
|
catch {
|
|
139
|
-
//
|
|
140
|
-
|
|
141
|
-
return
|
|
105
|
+
// Cache failures as null so a broken config doesn't re-parse per skill.
|
|
106
|
+
loadedConfigCache.set(projectRoot, null);
|
|
107
|
+
return undefined;
|
|
142
108
|
}
|
|
143
109
|
}
|
|
144
110
|
//# sourceMappingURL=config-loader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,
|
|
1
|
+
{"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,mBAAmB,EAAsB,MAAM,+BAA+B,CAAC;AACxF,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,MAAM,eAAe,GAAG,gCAAgC,CAAC;AAEzD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,UAAU,CAAC,WAAmB;IAC5C,sEAAsE;IACtE,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;IAEjG,uIAAuI;IACvI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC;QACH,uHAAuH;QACvH,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEnC,wDAAwD;QACxD,MAAM,MAAM,GAAG,mBAAmB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAErD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CACb,+BAA+B,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CACtD,CAAC;QACJ,CAAC;QAED,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,UAAkB;IAC7C,OAAO,OAAO,CAAC,UAAU,CAAC,CAAC;AAC7B,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,iBAAiB,GAAsC,IAAI,GAAG,EAAE,CAAC;AAEvE;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB;IACpC,iBAAiB,CAAC,KAAK,EAAE,CAAC;AAC5B,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAClD,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAClD,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,IAAI,SAAS,CAAC;IACrD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;QACvC,iBAAiB,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,IAAI,IAAI,CAAC,CAAC;QACnD,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,wEAAwE;QACxE,iBAAiB,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QACzC,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
|
package/dist/utils/logger.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,YAAY,CAAC,OAAO,GAAE,aAAkB,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,YAAY,CAAC,OAAO,GAAE,aAAkB,GAAG,MAAM,CAmBhE"}
|
package/dist/utils/logger.js
CHANGED
package/dist/utils/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,MAAM,UAAU,YAAY,CAAC,UAAyB,EAAE;IACtD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC;IAErC,OAAO;QACL,IAAI,EAAE,CAAC,OAAe,EAAE,EAAE;YACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;QACvC,CAAC;QACD,IAAI,EAAE,CAAC,OAAe,EAAE,EAAE;YACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;QACvC,CAAC;QACD,KAAK,EAAE,CAAC,OAAe,EAAE,EAAE;YACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;QACvC,CAAC;QACD,KAAK,EAAE,CAAC,OAAe,EAAE,EAAE;YACzB,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,OAAO,IAAI,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/utils/output.js
CHANGED
|
@@ -2,17 +2,17 @@
|
|
|
2
2
|
* Output utilities for structured data
|
|
3
3
|
* YAML output on stdout, logs on stderr
|
|
4
4
|
*/
|
|
5
|
-
import * as yaml from '
|
|
5
|
+
import * as yaml from 'yaml';
|
|
6
6
|
/**
|
|
7
7
|
* Write YAML output to stdout with document markers
|
|
8
8
|
* @param data - Data to serialize as YAML
|
|
9
9
|
*/
|
|
10
10
|
export function writeYamlOutput(data) {
|
|
11
11
|
process.stdout.write('---\n');
|
|
12
|
-
process.stdout.write(yaml.
|
|
12
|
+
process.stdout.write(yaml.stringify(data, {
|
|
13
13
|
indent: 2,
|
|
14
14
|
lineWidth: 120,
|
|
15
|
-
|
|
15
|
+
aliasDuplicateObjects: false,
|
|
16
16
|
}));
|
|
17
17
|
process.stdout.write('---\n');
|
|
18
18
|
}
|
package/dist/utils/output.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,IAAa;IAC3C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;QACxC,MAAM,EAAE,CAAC;QACT,SAAS,EAAE,GAAG;QACd,qBAAqB,EAAE,KAAK;KAC7B,CAAC,CAAC,CAAC;IACJ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QACnC,IAAI,OAAO,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;YACrC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAY,EACZ,IAAY,EACZ,MAAc,EACd,OAAe;IAEf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,IAAI,IAAI,MAAM,KAAK,OAAO,IAAI,CAAC,CAAC;AAClE,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI-boundary policy helpers for projectRoot resolution.
|
|
3
|
+
*
|
|
4
|
+
* Per docs/superpowers/specs/2026-05-17-root-model-and-leading-slash-design.md §7,
|
|
5
|
+
* each command picks one of these to fulfill its declared policy:
|
|
6
|
+
*
|
|
7
|
+
* - `required` → {@link requireProjectRoot} — fails fast with a clear message.
|
|
8
|
+
* - `loud-cwd` → {@link projectRootOrLoudCwd} — falls back to cwd with a stderr warning.
|
|
9
|
+
* - `tolerate null`→ {@link projectRootOrNull} — returns null; caller handles it.
|
|
10
|
+
*
|
|
11
|
+
* These helpers MUST be invoked at the CLI dispatch boundary (top-level command
|
|
12
|
+
* `.action(...)` callbacks). Inner library functions should take the resolved
|
|
13
|
+
* root as a parameter — never call `findProjectRoot` themselves.
|
|
14
|
+
*/
|
|
15
|
+
import type { Logger } from './logger.js';
|
|
16
|
+
/**
|
|
17
|
+
* `required` policy — refuse to run if no projectRoot can be discovered.
|
|
18
|
+
*
|
|
19
|
+
* @throws Error with a clear "command requires a config or git ancestor" message.
|
|
20
|
+
*/
|
|
21
|
+
export declare function requireProjectRoot(startDir: string, commandName: string): string;
|
|
22
|
+
/**
|
|
23
|
+
* `loud-cwd` policy — fall back to cwd with an explicit stderr log message.
|
|
24
|
+
*
|
|
25
|
+
* The message format is documented in spec §7 and asserted by integration tests:
|
|
26
|
+
* `no vibe-agent-toolkit.config.yaml or .git/ ancestor found; using <cwd> as projectRoot`
|
|
27
|
+
*/
|
|
28
|
+
export declare function projectRootOrLoudCwd(startDir: string, logger: Logger): string;
|
|
29
|
+
/**
|
|
30
|
+
* `tolerate null` policy — return `string | null`; caller handles either case.
|
|
31
|
+
*/
|
|
32
|
+
export declare function projectRootOrNull(startDir: string): string | null;
|
|
33
|
+
//# sourceMappingURL=project-root-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-root-policy.d.ts","sourceRoot":"","sources":["../../src/utils/project-root-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAShF;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAQ7E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEjE"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI-boundary policy helpers for projectRoot resolution.
|
|
3
|
+
*
|
|
4
|
+
* Per docs/superpowers/specs/2026-05-17-root-model-and-leading-slash-design.md §7,
|
|
5
|
+
* each command picks one of these to fulfill its declared policy:
|
|
6
|
+
*
|
|
7
|
+
* - `required` → {@link requireProjectRoot} — fails fast with a clear message.
|
|
8
|
+
* - `loud-cwd` → {@link projectRootOrLoudCwd} — falls back to cwd with a stderr warning.
|
|
9
|
+
* - `tolerate null`→ {@link projectRootOrNull} — returns null; caller handles it.
|
|
10
|
+
*
|
|
11
|
+
* These helpers MUST be invoked at the CLI dispatch boundary (top-level command
|
|
12
|
+
* `.action(...)` callbacks). Inner library functions should take the resolved
|
|
13
|
+
* root as a parameter — never call `findProjectRoot` themselves.
|
|
14
|
+
*/
|
|
15
|
+
import { findProjectRoot, safePath } from '@vibe-agent-toolkit/utils';
|
|
16
|
+
/**
|
|
17
|
+
* `required` policy — refuse to run if no projectRoot can be discovered.
|
|
18
|
+
*
|
|
19
|
+
* @throws Error with a clear "command requires a config or git ancestor" message.
|
|
20
|
+
*/
|
|
21
|
+
export function requireProjectRoot(startDir, commandName) {
|
|
22
|
+
const root = findProjectRoot(startDir);
|
|
23
|
+
if (root === null) {
|
|
24
|
+
throw new Error(`${commandName} requires a vibe-agent-toolkit.config.yaml or .git/ ancestor. ` +
|
|
25
|
+
`Run from inside a VAT project or initialize one.`);
|
|
26
|
+
}
|
|
27
|
+
return root;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* `loud-cwd` policy — fall back to cwd with an explicit stderr log message.
|
|
31
|
+
*
|
|
32
|
+
* The message format is documented in spec §7 and asserted by integration tests:
|
|
33
|
+
* `no vibe-agent-toolkit.config.yaml or .git/ ancestor found; using <cwd> as projectRoot`
|
|
34
|
+
*/
|
|
35
|
+
export function projectRootOrLoudCwd(startDir, logger) {
|
|
36
|
+
const root = findProjectRoot(startDir);
|
|
37
|
+
if (root !== null)
|
|
38
|
+
return root;
|
|
39
|
+
const cwd = safePath.resolve(startDir);
|
|
40
|
+
logger.warn(`no vibe-agent-toolkit.config.yaml or .git/ ancestor found; using ${cwd} as projectRoot`);
|
|
41
|
+
return cwd;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* `tolerate null` policy — return `string | null`; caller handles either case.
|
|
45
|
+
*/
|
|
46
|
+
export function projectRootOrNull(startDir) {
|
|
47
|
+
return findProjectRoot(startDir);
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=project-root-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-root-policy.js","sourceRoot":"","sources":["../../src/utils/project-root-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAItE;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAgB,EAAE,WAAmB;IACtE,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CACb,GAAG,WAAW,gEAAgE;YAC5E,kDAAkD,CACrD,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAgB,EAAE,MAAc;IACnE,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC/B,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,CAAC,IAAI,CACT,oEAAoE,GAAG,iBAAiB,CACzF,CAAC;IACF,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,OAAO,eAAe,CAAC,QAAQ,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -6,7 +6,7 @@ import { GitTracker } from '@vibe-agent-toolkit/utils';
|
|
|
6
6
|
import type { Logger } from './logger.js';
|
|
7
7
|
export interface ResourceLoadResult {
|
|
8
8
|
scanPath: string;
|
|
9
|
-
projectRoot: string
|
|
9
|
+
projectRoot: string;
|
|
10
10
|
config: ProjectConfig | undefined;
|
|
11
11
|
registry: ResourceRegistry;
|
|
12
12
|
gitTracker: GitTracker | undefined;
|
|
@@ -16,16 +16,21 @@ export interface ResourceLoadResult {
|
|
|
16
16
|
*
|
|
17
17
|
* Common pattern for CLI commands that need to:
|
|
18
18
|
* 1. Determine scan path
|
|
19
|
-
* 2.
|
|
19
|
+
* 2. Load config from the pre-resolved project root
|
|
20
20
|
* 3. Create registry and crawl
|
|
21
21
|
*
|
|
22
22
|
* Behavior:
|
|
23
23
|
* - When path argument provided: use as baseDir, ignore config patterns (use defaults)
|
|
24
|
-
* - When no path argument: use project root
|
|
24
|
+
* - When no path argument: use project root as baseDir, apply config patterns
|
|
25
|
+
*
|
|
26
|
+
* Per CLI-boundary rule (spec §5): `projectRoot` MUST be resolved by the
|
|
27
|
+
* caller using one of the policy helpers in `project-root-policy.ts`. This
|
|
28
|
+
* function does not call `findProjectRoot` itself.
|
|
25
29
|
*
|
|
26
30
|
* @param pathArg - Path argument from CLI (optional)
|
|
31
|
+
* @param projectRoot - Pre-resolved project root from the CLI boundary
|
|
27
32
|
* @param logger - Logger instance
|
|
28
33
|
* @returns Resource load result with registry and metadata
|
|
29
34
|
*/
|
|
30
|
-
export declare function loadResourcesWithConfig(pathArg: string | undefined, logger: Logger): Promise<ResourceLoadResult>;
|
|
35
|
+
export declare function loadResourcesWithConfig(pathArg: string | undefined, projectRoot: string, logger: Logger): Promise<ResourceLoadResult>;
|
|
31
36
|
//# sourceMappingURL=resource-loader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-loader.d.ts","sourceRoot":"","sources":["../../src/utils/resource-loader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,gBAAgB,EAChB,KAAK,aAAa,EAEnB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAGvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"resource-loader.d.ts","sourceRoot":"","sources":["../../src/utils/resource-loader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,gBAAgB,EAChB,KAAK,aAAa,EAEnB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAGvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,aAAa,GAAG,SAAS,CAAC;IAClC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,UAAU,EAAE,UAAU,GAAG,SAAS,CAAC;CACpC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,kBAAkB,CAAC,CA2D7B"}
|
|
@@ -4,50 +4,47 @@
|
|
|
4
4
|
import { ResourceRegistry, } from '@vibe-agent-toolkit/resources';
|
|
5
5
|
import { GitTracker } from '@vibe-agent-toolkit/utils';
|
|
6
6
|
import { loadConfig } from './config-loader.js';
|
|
7
|
-
import { findProjectRoot } from './project-root.js';
|
|
8
7
|
/**
|
|
9
8
|
* Load resources from a path with config support
|
|
10
9
|
*
|
|
11
10
|
* Common pattern for CLI commands that need to:
|
|
12
11
|
* 1. Determine scan path
|
|
13
|
-
* 2.
|
|
12
|
+
* 2. Load config from the pre-resolved project root
|
|
14
13
|
* 3. Create registry and crawl
|
|
15
14
|
*
|
|
16
15
|
* Behavior:
|
|
17
16
|
* - When path argument provided: use as baseDir, ignore config patterns (use defaults)
|
|
18
|
-
* - When no path argument: use project root
|
|
17
|
+
* - When no path argument: use project root as baseDir, apply config patterns
|
|
18
|
+
*
|
|
19
|
+
* Per CLI-boundary rule (spec §5): `projectRoot` MUST be resolved by the
|
|
20
|
+
* caller using one of the policy helpers in `project-root-policy.ts`. This
|
|
21
|
+
* function does not call `findProjectRoot` itself.
|
|
19
22
|
*
|
|
20
23
|
* @param pathArg - Path argument from CLI (optional)
|
|
24
|
+
* @param projectRoot - Pre-resolved project root from the CLI boundary
|
|
21
25
|
* @param logger - Logger instance
|
|
22
26
|
* @returns Resource load result with registry and metadata
|
|
23
27
|
*/
|
|
24
|
-
export async function loadResourcesWithConfig(pathArg, logger) {
|
|
25
|
-
//
|
|
26
|
-
const
|
|
27
|
-
const config = projectRoot ? loadConfig(projectRoot) : undefined;
|
|
28
|
+
export async function loadResourcesWithConfig(pathArg, projectRoot, logger) {
|
|
29
|
+
// Config lookup is anchored at the resolved projectRoot.
|
|
30
|
+
const config = loadConfig(projectRoot);
|
|
28
31
|
if (config) {
|
|
29
|
-
logger.debug(`Loaded config from ${projectRoot
|
|
30
|
-
}
|
|
31
|
-
// Create and initialize GitTracker if we have a project root
|
|
32
|
-
let gitTracker;
|
|
33
|
-
if (projectRoot) {
|
|
34
|
-
gitTracker = new GitTracker(projectRoot);
|
|
35
|
-
await gitTracker.initialize();
|
|
36
|
-
const stats = gitTracker.getStats();
|
|
37
|
-
logger.debug(`GitTracker initialized with ${stats.cacheSize} tracked files`);
|
|
32
|
+
logger.debug(`Loaded config from ${projectRoot}`);
|
|
38
33
|
}
|
|
34
|
+
// Create and initialize GitTracker anchored at the resolved projectRoot.
|
|
35
|
+
const gitTracker = new GitTracker(projectRoot);
|
|
36
|
+
await gitTracker.initialize();
|
|
37
|
+
const stats = gitTracker.getStats();
|
|
38
|
+
logger.debug(`GitTracker initialized with ${stats.cacheSize} tracked files`);
|
|
39
39
|
// Create registry and crawl
|
|
40
40
|
// Build options conditionally to satisfy exactOptionalPropertyTypes
|
|
41
|
-
const registryOptions = {
|
|
41
|
+
const registryOptions = {
|
|
42
|
+
baseDir: projectRoot,
|
|
43
|
+
gitTracker,
|
|
44
|
+
};
|
|
42
45
|
if (config?.resources?.collections) {
|
|
43
46
|
registryOptions.config = config;
|
|
44
47
|
}
|
|
45
|
-
if (projectRoot) {
|
|
46
|
-
registryOptions.baseDir = projectRoot;
|
|
47
|
-
}
|
|
48
|
-
if (gitTracker) {
|
|
49
|
-
registryOptions.gitTracker = gitTracker;
|
|
50
|
-
}
|
|
51
48
|
const registry = new ResourceRegistry(registryOptions);
|
|
52
49
|
let crawlOptions;
|
|
53
50
|
if (pathArg) {
|
|
@@ -61,11 +58,10 @@ export async function loadResourcesWithConfig(pathArg, logger) {
|
|
|
61
58
|
};
|
|
62
59
|
}
|
|
63
60
|
else {
|
|
64
|
-
// No path argument: crawl from
|
|
65
|
-
|
|
66
|
-
logger.debug(`No path argument, using: ${scanPath}`);
|
|
61
|
+
// No path argument: crawl from projectRoot with config patterns
|
|
62
|
+
logger.debug(`No path argument, using: ${projectRoot}`);
|
|
67
63
|
crawlOptions = {
|
|
68
|
-
baseDir:
|
|
64
|
+
baseDir: projectRoot,
|
|
69
65
|
// Apply include patterns from config (if specified)
|
|
70
66
|
...(config?.resources?.include ? { include: config.resources.include } : {}),
|
|
71
67
|
// Apply exclude patterns from config (if specified)
|
|
@@ -74,7 +70,7 @@ export async function loadResourcesWithConfig(pathArg, logger) {
|
|
|
74
70
|
}
|
|
75
71
|
await registry.crawl(crawlOptions);
|
|
76
72
|
return {
|
|
77
|
-
scanPath: pathArg ??
|
|
73
|
+
scanPath: pathArg ?? projectRoot,
|
|
78
74
|
projectRoot,
|
|
79
75
|
config,
|
|
80
76
|
registry,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-loader.js","sourceRoot":"","sources":["../../src/utils/resource-loader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,gBAAgB,GAGjB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAEvD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"resource-loader.js","sourceRoot":"","sources":["../../src/utils/resource-loader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,gBAAgB,GAGjB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAEvD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAWhD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,OAA2B,EAC3B,WAAmB,EACnB,MAAc;IAEd,yDAAyD;IACzD,MAAM,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IAEvC,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,KAAK,CAAC,sBAAsB,WAAW,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,yEAAyE;IACzE,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC;IAC/C,MAAM,UAAU,CAAC,UAAU,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC;IACpC,MAAM,CAAC,KAAK,CAAC,+BAA+B,KAAK,CAAC,SAAS,gBAAgB,CAAC,CAAC;IAE7E,4BAA4B;IAC5B,oEAAoE;IACpE,MAAM,eAAe,GAA4B;QAC/C,OAAO,EAAE,WAAW;QACpB,UAAU;KACX,CAAC;IACF,IAAI,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;QACnC,eAAe,CAAC,MAAM,GAAG,MAAM,CAAC;IAClC,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,eAAe,CAAC,CAAC;IAEvD,IAAI,YAAY,CAAC;IAEjB,IAAI,OAAO,EAAE,CAAC;QACZ,0EAA0E;QAC1E,kEAAkE;QAClE,MAAM,CAAC,KAAK,CAAC,2BAA2B,OAAO,EAAE,CAAC,CAAC;QACnD,MAAM,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAEzD,YAAY,GAAG;YACb,OAAO,EAAE,OAAO;YAChB,8DAA8D;SAC/D,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,gEAAgE;QAChE,MAAM,CAAC,KAAK,CAAC,4BAA4B,WAAW,EAAE,CAAC,CAAC;QAExD,YAAY,GAAG;YACb,OAAO,EAAE,WAAW;YACpB,oDAAoD;YACpD,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5E,oDAAoD;YACpD,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7E,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAEnC,OAAO;QACL,QAAQ,EAAE,OAAO,IAAI,WAAW;QAChC,WAAW;QACX,MAAM;QACN,QAAQ;QACR,UAAU;KACX,CAAC;AACJ,CAAC"}
|
|
@@ -12,7 +12,8 @@
|
|
|
12
12
|
* nor in marketplace (which knows nothing about config-level packaging
|
|
13
13
|
* options).
|
|
14
14
|
*/
|
|
15
|
-
import { type
|
|
15
|
+
import { type ValidationIssue } from '@vibe-agent-toolkit/agent-schema';
|
|
16
|
+
import { type Observation, type PackagingValidationResult } from '@vibe-agent-toolkit/agent-skills';
|
|
16
17
|
import { type Target, type Verdict } from '@vibe-agent-toolkit/claude-marketplace';
|
|
17
18
|
/**
|
|
18
19
|
* Convert a verdict into a ValidationIssue using CODE_REGISTRY for severity,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verdict-helpers.d.ts","sourceRoot":"","sources":["../../src/utils/verdict-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"verdict-helpers.d.ts","sourceRoot":"","sources":["../../src/utils/verdict-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAiB,KAAK,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACvF,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,yBAAyB,EAC/B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAGL,KAAK,MAAM,EACX,KAAK,OAAO,EACb,MAAM,wCAAwC,CAAC;AAEhD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,eAAe,CAUlF;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,SAAS,WAAW,EAAE,EACpC,aAAa,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,SAAS,EAChD,QAAQ,EAAE,MAAM,GACf,eAAe,EAAE,CAiBnB;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,yBAAyB,EACjC,aAAa,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,SAAS,EAChD,eAAe,EAAE,MAAM,GACtB,IAAI,CAgBN"}
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* nor in marketplace (which knows nothing about config-level packaging
|
|
13
13
|
* options).
|
|
14
14
|
*/
|
|
15
|
-
import { CODE_REGISTRY
|
|
15
|
+
import { CODE_REGISTRY } from '@vibe-agent-toolkit/agent-schema';
|
|
16
16
|
import { computeVerdicts, resolveEffectiveTargets, } from '@vibe-agent-toolkit/claude-marketplace';
|
|
17
17
|
/**
|
|
18
18
|
* Convert a verdict into a ValidationIssue using CODE_REGISTRY for severity,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verdict-helpers.js","sourceRoot":"","sources":["../../src/utils/verdict-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"verdict-helpers.js","sourceRoot":"","sources":["../../src/utils/verdict-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,aAAa,EAAwB,MAAM,kCAAkC,CAAC;AAKvF,OAAO,EACL,eAAe,EACf,uBAAuB,GAGxB,MAAM,wCAAwC,CAAC;AAEhD;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,OAAgB,EAAE,QAAgB;IAC/D,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,OAAO;QACL,QAAQ,EAAE,KAAK,CAAC,eAAe;QAC/B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,QAAQ;QACR,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,SAAS,EAAE,KAAK,CAAC,SAAS;KAC3B,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CACnC,YAAoC,EACpC,aAAgD,EAChD,QAAgB;IAEhB,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;QAC/C,aAAa,EAAE,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC;QAC3E,aAAa,EAAE,SAAS;QACxB,kBAAkB,EAAE,SAAS;KAC9B,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,eAAe,CAAC;QAC/B,YAAY,EAAE,CAAC,GAAG,YAAY,CAAC;QAC/B,OAAO,EAAE,gBAAgB;KAC1B,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;AACxD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAiC,EACjC,aAAgD,EAChD,eAAuB;IAEvB,MAAM,aAAa,GAAG,qBAAqB,CAAC,MAAM,CAAC,YAAY,EAAE,aAAa,EAAE,eAAe,CAAC,CAAC;IACjG,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO;IACT,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;QAClC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,KAAK,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YAC/B,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;aAAM,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACxC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC;IAC1B,CAAC;AACH,CAAC"}
|
package/docs/agent.md
CHANGED
|
@@ -93,6 +93,31 @@ vat agent validate ./my-custom-agent/agent.yaml
|
|
|
93
93
|
- `OPENAI_API_KEY` - API key for OpenAI
|
|
94
94
|
- `GOOGLE_API_KEY` - API key for Google (Gemini)
|
|
95
95
|
|
|
96
|
+
## Requirements
|
|
97
|
+
|
|
98
|
+
Each `vat agent` subcommand declares its own `projectRoot` and config policy:
|
|
99
|
+
|
|
100
|
+
| Subcommand | `projectRoot` | Config |
|
|
101
|
+
|---|---|---|
|
|
102
|
+
| `vat agent list` | optional (tolerates absence) | not used |
|
|
103
|
+
| `vat agent installed` | N/A | not used |
|
|
104
|
+
| `vat agent build <pathOrName>` | required (errors without `vibe-agent-toolkit.config.yaml` or `.git/` ancestor) | required file with `agents.*` fields populated |
|
|
105
|
+
| `vat agent run <pathOrName> <input>` | optional (path-explicit; tolerates absence) | optional (uses defaults if absent) |
|
|
106
|
+
| `vat agent validate <pathOrName>` | required | optional (uses defaults if absent) |
|
|
107
|
+
| `vat agent import <skillPath>` | N/A | not used |
|
|
108
|
+
| `vat agent install <agentName>` | N/A | not used |
|
|
109
|
+
| `vat agent uninstall <agentName>` | N/A | not used |
|
|
110
|
+
|
|
111
|
+
**Why `build` and `validate` require `projectRoot`:** both are explicit-adoption
|
|
112
|
+
operations. Building or source-validating an agent without an authoring
|
|
113
|
+
boundary would silently accept arbitrary trees as "the project" and would not
|
|
114
|
+
participate in the unified validation framework. `vat agent run` is
|
|
115
|
+
path-explicit and runs from anywhere; `vat agent list` discovers without
|
|
116
|
+
needing a project context.
|
|
117
|
+
|
|
118
|
+
See [Roots and Config — Canonical Concepts](../../../docs/concepts/roots-and-config.md)
|
|
119
|
+
for terminology.
|
|
120
|
+
|
|
96
121
|
## See Also
|
|
97
122
|
|
|
98
123
|
- [@vibe-agent-toolkit/agent-schema](../../agent-schema/README.md) - Schema reference
|