@dusky-bluehour/agent-service 0.6.2 → 0.6.4

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.
@@ -84,6 +84,29 @@ async function validateCatalog() {
84
84
  }
85
85
  toolIdSet.add(tool.id);
86
86
 
87
+ if (typeof tool.install_root === 'string' && tool.install_root.trim()) {
88
+ const installRoot = tool.install_root.trim().replaceAll('\\', '/');
89
+ if (path.posix.isAbsolute(installRoot) || installRoot.split('/').includes('..')) {
90
+ fail(`[catalog] install_root 형식 오류: ${tool.id}/${tool.install_root}`);
91
+ }
92
+ }
93
+
94
+ const installRefs = Array.isArray(tool.install_root_reference) ? tool.install_root_reference : [];
95
+ for (const ref of installRefs) {
96
+ if (typeof ref !== 'string' || !ref.trim()) {
97
+ fail(`[catalog] install_root_reference 형식 오류: ${tool.id}`);
98
+ continue;
99
+ }
100
+ const normalizedRef = ref.trim();
101
+ const isUrl = normalizedRef.startsWith('https://') || normalizedRef.startsWith('http://');
102
+ if (isUrl) continue;
103
+
104
+ const refPath = path.join(rootDir, normalizedRef);
105
+ if (!(await exists(refPath))) {
106
+ fail(`[catalog] install_root_reference 경로 누락: ${tool.id}/${normalizedRef}`);
107
+ }
108
+ }
109
+
87
110
  const toolRootPath = path.join(rootDir, tool.root);
88
111
  if (!(await exists(toolRootPath))) {
89
112
  fail(`[catalog] tool root 누락: ${tool.root}`);
@@ -106,6 +129,13 @@ async function validateCatalog() {
106
129
  }
107
130
  componentIds.add(component.id);
108
131
 
132
+ if (typeof component.install_path === 'string' && component.install_path.trim()) {
133
+ const installPath = component.install_path.trim().replaceAll('\\', '/');
134
+ if (path.posix.isAbsolute(installPath) || installPath.split('/').includes('..')) {
135
+ fail(`[catalog] component install_path 형식 오류: ${tool.id}/${component.id}`);
136
+ }
137
+ }
138
+
109
139
  const compPath = path.join(rootDir, tool.root, component.path);
110
140
  if (!(await exists(compPath))) {
111
141
  fail(`[catalog] component 경로 누락: ${tool.id}/${component.path}`);
@@ -347,6 +377,12 @@ async function validateWorkflowCatalog(toolName, commandIds) {
347
377
  if (!wf.id || !wf.name) {
348
378
  fail(`[${toolName}] workflow id/name 누락`);
349
379
  }
380
+ if (!wf.summary) {
381
+ fail(`[${toolName}] workflow summary 누락: ${wf.id ?? 'unknown'}`);
382
+ }
383
+ if (!wf.when_to_use) {
384
+ fail(`[${toolName}] workflow when_to_use 누락: ${wf.id ?? 'unknown'}`);
385
+ }
350
386
 
351
387
  if (!Array.isArray(wf.stages) || wf.stages.length === 0) {
352
388
  fail(`[${toolName}] stage 누락: ${wf.id ?? 'unknown'}`);
@@ -496,6 +532,30 @@ async function runCliSmokeTests() {
496
532
  fail(`[cli] install dry-run 실행 실패: ${error.message}`);
497
533
  }
498
534
 
535
+ try {
536
+ await execFileAsync(
537
+ nodeBin,
538
+ [
539
+ cliPath,
540
+ 'install',
541
+ '--tool',
542
+ 'antigravity',
543
+ '--components',
544
+ 'skills,workflows',
545
+ '--install-root',
546
+ 'antigravity=.agent-custom',
547
+ '--target',
548
+ '/tmp/tri-agent-manager-validate',
549
+ '--dry-run',
550
+ '--yes',
551
+ '--non-interactive'
552
+ ],
553
+ { cwd: rootDir }
554
+ );
555
+ } catch (error) {
556
+ fail(`[cli] install --install-root dry-run 실행 실패: ${error.message}`);
557
+ }
558
+
499
559
  try {
500
560
  await execFileAsync(
501
561
  nodeBin,