Browse Source

fix(skill-sync): align staged outcomes accounting

Alvin Unreal 1 month ago
parent
commit
aca697ce8f

+ 12 - 7
src/cli/install.test.ts

@@ -233,8 +233,9 @@ describe('install skill synchronization error mapping', () => {
       msg?.includes('Skill synchronization complete'),
     );
     expect(summaryMsg).toBeDefined();
-    expect(summaryMsg).not.toContain('Processed');
-    expect(summaryMsg).toContain('0 failed.');
+    expect(summaryMsg).toContain(
+      '0 staged, 0 adopted, 0 customized, 0 failed.',
+    );
   });
 
   test('maps __manifest__ to manifest write failure', async () => {
@@ -263,8 +264,9 @@ describe('install skill synchronization error mapping', () => {
       msg?.includes('Skill synchronization complete'),
     );
     expect(summaryMsg).toBeDefined();
-    expect(summaryMsg).not.toContain('Processed');
-    expect(summaryMsg).toContain('0 failed.');
+    expect(summaryMsg).toContain(
+      '0 staged, 0 adopted, 0 customized, 0 failed.',
+    );
   });
 
   test('keeps normal skill names prefix as Failed: <name>', async () => {
@@ -288,8 +290,9 @@ describe('install skill synchronization error mapping', () => {
       msg?.includes('Skill synchronization complete'),
     );
     expect(summaryMsg).toBeDefined();
-    expect(summaryMsg).not.toContain('Processed');
-    expect(summaryMsg).toContain('1 failed.');
+    expect(summaryMsg).toContain(
+      '0 staged, 0 adopted, 0 customized, 1 failed.',
+    );
   });
 
   test('prints staged skills during sync', async () => {
@@ -378,6 +381,8 @@ describe('install skill synchronization error mapping', () => {
       msg?.includes('Skill synchronization complete'),
     );
     expect(summaryMsg).toBeDefined();
-    expect(summaryMsg).toContain('0 skipped/preserved');
+    expect(summaryMsg).toContain(
+      '0 skipped/preserved, 1 staged, 1 adopted, 1 customized, 0 failed.',
+    );
   });
 });

+ 3 - 0
src/cli/install.ts

@@ -475,6 +475,9 @@ async function runInstall(config: InstallConfig): Promise<number> {
           `Skill synchronization complete: ` +
             `${result.installed.length} installed/updated, ` +
             `${preservedSkills.length} skipped/preserved, ` +
+            `${result.staged.length} staged, ` +
+            `${result.adopted.length} adopted, ` +
+            `${result.customized.length} customized, ` +
             `${realFailed.length} failed.`,
         );
       } catch (err) {

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

@@ -1023,7 +1023,12 @@ describe('syncBundledSkillsFromPackage', () => {
     const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
     expect(manifest.skills[skillName].status).toBe('customized');
     expect(manifest.skills[skillName].packageVersion).toBe('1.2.3');
-    expect(manifest.skills[skillName].sourceHash).toBe('');
+    const { computeDirectoryHash } = await import(
+      `./skill-sync?test=${importCounter++}`
+    );
+    expect(manifest.skills[skillName].sourceHash).toBe(
+      computeDirectoryHash(skillSrcDir),
+    );
     const stagedPath = manifest.skills[skillName].stagedPath as string;
     expect(stagedPath).toBeDefined();
     expect(fs.existsSync(stagedPath)).toBe(true);

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

@@ -1080,7 +1080,7 @@ export function syncBundledSkillsFromPackage(
 
                 entry.status = 'customized';
                 entry.packageVersion = packageVersion;
-                entry.sourceHash = '';
+                entry.sourceHash = sourceHash;
                 entry.lastManagedHash = sourceHash;
                 entry.lastSeenHash = destHash;
                 entry.stagedPath = stagedSkillDir;
@@ -1140,7 +1140,7 @@ export function syncBundledSkillsFromPackage(
 
                 entry.status = 'customized';
                 entry.packageVersion = packageVersion;
-                entry.sourceHash = '';
+                entry.sourceHash = sourceHash;
                 entry.lastManagedHash = sourceHash;
                 entry.lastSeenHash = destHash;
                 entry.stagedPath = stagedSkillDir;