Browse Source

fix(skill-sync): report customized staging outcomes

Alvin Unreal 1 month ago
parent
commit
29a3e47a6c
3 changed files with 33 additions and 2 deletions
  1. 21 1
      src/cli/install.test.ts
  2. 5 0
      src/cli/install.ts
  3. 7 1
      src/hooks/auto-update-checker/skill-sync.ts

+ 21 - 1
src/cli/install.test.ts

@@ -46,6 +46,7 @@ let importCounter = 0;
 let mockFailedResult: string[] = [];
 let mockStagedResult: string[] = [];
 let mockAdoptedResult: string[] = [];
+let mockCustomizedResult: string[] = [];
 let enableInstallMocks = false;
 
 mock.module('../hooks/auto-update-checker/skill-sync', () => {
@@ -59,7 +60,7 @@ mock.module('../hooks/auto-update-checker/skill-sync', () => {
             failed: mockFailedResult,
             staged: mockStagedResult,
             adopted: mockAdoptedResult,
-            customized: [],
+            customized: mockCustomizedResult,
           }
         : originalSyncBundledSkillsFromPackage(packageRoot, options),
   };
@@ -193,6 +194,7 @@ describe('install skill synchronization error mapping', () => {
     mockFailedResult = [];
     mockStagedResult = [];
     mockAdoptedResult = [];
+    mockCustomizedResult = [];
     originalConsoleLog = console.log;
     logSpy = mock(() => {});
     console.log = logSpy;
@@ -321,4 +323,22 @@ describe('install skill synchronization error mapping', () => {
       calls.some((msg: string) => msg?.includes('Adopted: adopted-skill')),
     ).toBe(true);
   });
+
+  test('prints customized skills during sync', async () => {
+    mockCustomizedResult = ['customized-skill'];
+    const { install } = await import(`./install?test=${importCounter++}`);
+
+    await install({
+      skills: 'yes',
+      tui: false,
+      companion: 'no',
+    });
+
+    const calls = logSpy.mock.calls.map((call: any[]) => call[0] as string);
+    expect(
+      calls.some((msg: string) =>
+        msg?.includes('Customized: customized-skill'),
+      ),
+    ).toBe(true);
+  });
 });

+ 5 - 0
src/cli/install.ts

@@ -454,6 +454,11 @@ async function runInstall(config: InstallConfig): Promise<number> {
             printInfo(`Adopted: ${skill}`);
           }
         }
+        if (result.customized.length > 0) {
+          for (const skill of result.customized) {
+            printInfo(`Customized: ${skill}`);
+          }
+        }
 
         const realFailed = result.failed.filter(
           (skill) => skill !== '__lock__' && skill !== '__manifest__',

+ 7 - 1
src/hooks/auto-update-checker/skill-sync.ts

@@ -1024,8 +1024,11 @@ export function syncBundledSkillsFromPackage(
 
                   entry.stagedPath = stagedSkillDir;
                   entry.sourceHash = sourceHash;
+                  entry.packageVersion = packageVersion;
 
                   staged.push(skill.name);
+                  customized.push(skill.name);
+                  skippedExisting.push(skill.name);
                   log(
                     `[skill-sync] Staged new update for customized skill ${skill.name} at ${stagedSkillDir}`,
                   );
@@ -1034,9 +1037,12 @@ export function syncBundledSkillsFromPackage(
                     `[skill-sync] Failed to stage update for customized skill ${skill.name}:`,
                     err,
                   );
+                  failed.push(skill.name);
                 }
+              } else {
+                customized.push(skill.name);
+                skippedExisting.push(skill.name);
               }
-              skippedExisting.push(skill.name);
             }
           } else if (entry.status === 'deleted') {
             if (destHash === sourceHash) {