@1aboveio/skills 0.21.0 → 0.21.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 CHANGED
@@ -101,11 +101,13 @@ non-interactively.
101
101
  Declined skills are never uninstalled by the coordinator and stay out of the remembered acceptance,
102
102
  so the next update asks again.
103
103
 
104
- When a selected group still has a leftover retired skill (from prior acceptance or still
105
- installed), `install` and `update` archive it by default through the same pinned native Skills CLI,
106
- only after the declared replacement is installed or already current. An interactive prompt defaults
107
- to Yes; non-interactive runs archive without `--yes`. Declined or failed archival remains in
108
- selection memory so a later run offers it again.
104
+ Every `install` and `update` scans the managed global root for exact manifest-declared retired
105
+ skills. A selected former group may first make the replacement current; outside the selection, a
106
+ leftover is eligible only when its replacement was already installed and matches this release.
107
+ For each eligible leftover, the coordinator will archive it by default through the pinned
108
+ native Skills CLI. An interactive prompt defaults to Yes; non-interactive runs archive without
109
+ `--yes`. Missing or modified unselected
110
+ replacements stay untouched. Declined or failed archival remains available for a later run.
109
111
 
110
112
  Install and update are best-effort per member over bulk source commands: they continue after a
111
113
  member failure except for skills whose required dependency is unavailable, summarize
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@1aboveio/skills",
3
- "version": "0.21.0",
3
+ "version": "0.21.1",
4
4
  "description": "Install the 1AboveIO first-party skill groups through the native Skills CLI.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -24,7 +24,7 @@
24
24
  "id": "first-party",
25
25
  "type": "first-party",
26
26
  "package": "@1aboveio/skills",
27
- "version": "0.21.0",
27
+ "version": "0.21.1",
28
28
  "updatePolicy": "pinned-npm-version",
29
29
  "members": [
30
30
  {
@@ -293,7 +293,7 @@
293
293
  "sourceId": "first-party",
294
294
  "sourceType": "first-party",
295
295
  "package": "@1aboveio/skills",
296
- "version": "0.21.0",
296
+ "version": "0.21.1",
297
297
  "installPath": null,
298
298
  "members": [
299
299
  "harness-runtime",
@@ -327,7 +327,7 @@
327
327
  "sourceId": "first-party",
328
328
  "sourceType": "first-party",
329
329
  "package": "@1aboveio/skills",
330
- "version": "0.21.0",
330
+ "version": "0.21.1",
331
331
  "installPath": null,
332
332
  "members": [
333
333
  "harness-runtime",
@@ -371,7 +371,7 @@
371
371
  "sourceId": "first-party",
372
372
  "sourceType": "first-party",
373
373
  "package": "@1aboveio/skills",
374
- "version": "0.21.0",
374
+ "version": "0.21.1",
375
375
  "installPath": null,
376
376
  "members": [
377
377
  "harness-runtime",
@@ -404,7 +404,7 @@
404
404
  "sourceId": "first-party",
405
405
  "sourceType": "first-party",
406
406
  "package": "@1aboveio/skills",
407
- "version": "0.21.0",
407
+ "version": "0.21.1",
408
408
  "installPath": null,
409
409
  "members": [
410
410
  "harness-runtime",
@@ -447,7 +447,7 @@
447
447
  "sourceId": "first-party",
448
448
  "sourceType": "first-party",
449
449
  "package": "@1aboveio/skills",
450
- "version": "0.21.0",
450
+ "version": "0.21.1",
451
451
  "installPath": null,
452
452
  "members": [
453
453
  "harness-runtime",
@@ -475,7 +475,7 @@
475
475
  "sourceId": "first-party",
476
476
  "sourceType": "first-party",
477
477
  "package": "@1aboveio/skills",
478
- "version": "0.21.0",
478
+ "version": "0.21.1",
479
479
  "installPath": null,
480
480
  "members": [
481
481
  "harness-runtime",
@@ -513,7 +513,7 @@
513
513
  "sourceId": "first-party",
514
514
  "sourceType": "first-party",
515
515
  "package": "@1aboveio/skills",
516
- "version": "0.21.0",
516
+ "version": "0.21.1",
517
517
  "installPath": null,
518
518
  "members": [
519
519
  "harness-runtime",
@@ -541,7 +541,7 @@
541
541
  "sourceId": "first-party",
542
542
  "sourceType": "first-party",
543
543
  "package": "@1aboveio/skills",
544
- "version": "0.21.0",
544
+ "version": "0.21.1",
545
545
  "installPath": null,
546
546
  "members": [
547
547
  "harness-runtime",
@@ -579,7 +579,7 @@
579
579
  "sourceId": "first-party",
580
580
  "sourceType": "first-party",
581
581
  "package": "@1aboveio/skills",
582
- "version": "0.21.0",
582
+ "version": "0.21.1",
583
583
  "installPath": null,
584
584
  "members": [
585
585
  "harness-runtime",
@@ -609,7 +609,7 @@
609
609
  "sourceId": "first-party",
610
610
  "sourceType": "first-party",
611
611
  "package": "@1aboveio/skills",
612
- "version": "0.21.0",
612
+ "version": "0.21.1",
613
613
  "installPath": null,
614
614
  "members": [
615
615
  "harness-runtime",
@@ -649,7 +649,7 @@
649
649
  "sourceId": "first-party",
650
650
  "sourceType": "first-party",
651
651
  "package": "@1aboveio/skills",
652
- "version": "0.21.0",
652
+ "version": "0.21.1",
653
653
  "installPath": null,
654
654
  "members": [
655
655
  "harness-runtime",
@@ -677,7 +677,7 @@
677
677
  "sourceId": "first-party",
678
678
  "sourceType": "first-party",
679
679
  "package": "@1aboveio/skills",
680
- "version": "0.21.0",
680
+ "version": "0.21.1",
681
681
  "installPath": null,
682
682
  "members": [
683
683
  "harness-runtime",
@@ -715,7 +715,7 @@
715
715
  "sourceId": "first-party",
716
716
  "sourceType": "first-party",
717
717
  "package": "@1aboveio/skills",
718
- "version": "0.21.0",
718
+ "version": "0.21.1",
719
719
  "installPath": null,
720
720
  "members": [
721
721
  "harness-runtime",
@@ -745,7 +745,7 @@
745
745
  "sourceId": "first-party",
746
746
  "sourceType": "first-party",
747
747
  "package": "@1aboveio/skills",
748
- "version": "0.21.0",
748
+ "version": "0.21.1",
749
749
  "installPath": null,
750
750
  "members": [
751
751
  "harness-runtime",
@@ -785,7 +785,7 @@
785
785
  "sourceId": "first-party",
786
786
  "sourceType": "first-party",
787
787
  "package": "@1aboveio/skills",
788
- "version": "0.21.0",
788
+ "version": "0.21.1",
789
789
  "installPath": null,
790
790
  "members": [
791
791
  "harness-runtime",
@@ -816,7 +816,7 @@
816
816
  "sourceId": "first-party",
817
817
  "sourceType": "first-party",
818
818
  "package": "@1aboveio/skills",
819
- "version": "0.21.0",
819
+ "version": "0.21.1",
820
820
  "installPath": null,
821
821
  "members": [
822
822
  "harness-runtime",
@@ -857,7 +857,7 @@
857
857
  "sourceId": "first-party",
858
858
  "sourceType": "first-party",
859
859
  "package": "@1aboveio/skills",
860
- "version": "0.21.0",
860
+ "version": "0.21.1",
861
861
  "installPath": null,
862
862
  "members": [
863
863
  "harness-runtime",
@@ -889,7 +889,7 @@
889
889
  "sourceId": "first-party",
890
890
  "sourceType": "first-party",
891
891
  "package": "@1aboveio/skills",
892
- "version": "0.21.0",
892
+ "version": "0.21.1",
893
893
  "installPath": null,
894
894
  "members": [
895
895
  "harness-runtime",
@@ -929,7 +929,7 @@
929
929
  "sourceId": "first-party",
930
930
  "sourceType": "first-party",
931
931
  "package": "@1aboveio/skills",
932
- "version": "0.21.0",
932
+ "version": "0.21.1",
933
933
  "installPath": null,
934
934
  "members": [
935
935
  "harness-runtime"
@@ -955,7 +955,7 @@
955
955
  "sourceId": "first-party",
956
956
  "sourceType": "first-party",
957
957
  "package": "@1aboveio/skills",
958
- "version": "0.21.0",
958
+ "version": "0.21.1",
959
959
  "installPath": null,
960
960
  "members": [
961
961
  "harness-runtime"
@@ -987,7 +987,7 @@
987
987
  "sourceId": "first-party",
988
988
  "sourceType": "first-party",
989
989
  "package": "@1aboveio/skills",
990
- "version": "0.21.0",
990
+ "version": "0.21.1",
991
991
  "installPath": null,
992
992
  "members": [
993
993
  "harness-runtime",
@@ -1052,7 +1052,7 @@
1052
1052
  "sourceId": "first-party",
1053
1053
  "sourceType": "first-party",
1054
1054
  "package": "@1aboveio/skills",
1055
- "version": "0.21.0",
1055
+ "version": "0.21.1",
1056
1056
  "installPath": null,
1057
1057
  "members": [
1058
1058
  "harness-runtime",
@@ -204,13 +204,14 @@ export function newMemberCandidates(action, groupIds, priorState, transport = {}
204
204
  return candidates;
205
205
  }
206
206
 
207
- // Archived members of a selected group are offered when they were previously accepted or are
208
- // still installed. Presence of a named leftover is not group inference: the group is already
209
- // selected. A successful removal drops the old acceptance; a decline or failure preserves it so a
210
- // later run offers the archive again.
207
+ // A selected former group may retire its accepted or installed leftovers because this run can make
208
+ // the replacement ready. An unrelated group may retire an installed leftover only when the
209
+ // replacement already matches this release: global cleanup must never install an unselected group
210
+ // or turn a missing/modified replacement into an unrelated run failure.
211
211
  export function archivedMemberCandidates(action, groupIds, priorState, transport = {}) {
212
212
  if (!ACTIONS.has(action)) return [];
213
- const recipes = readRecipes(resolveBundleTransport(transport).recipesPath);
213
+ const { recipesPath, localRoot } = resolveBundleTransport(transport);
214
+ const recipes = readRecipes(recipesPath);
214
215
  const selected = new Set(groupIds);
215
216
  const acceptedByGroup = new Map((priorState?.groups ?? [])
216
217
  .map((group) => [group.id, new Set(group.acceptedMembers)]));
@@ -218,8 +219,30 @@ export function archivedMemberCandidates(action, groupIds, priorState, transport
218
219
  transport.skillsRoot
219
220
  && statSync(join(transport.skillsRoot, name), { throwIfNoEntry: false }),
220
221
  );
221
- return (recipes.archives ?? []).filter((archive) => selected.has(archive.formerGroupId)
222
- && (acceptedByGroup.get(archive.formerGroupId)?.has(archive.installName) || leftover(archive.installName)));
222
+ const membersByName = new Map((recipes.sources ?? []).flatMap((source) => (
223
+ (source.members ?? []).map((member) => [member.installName, { source, member }])
224
+ )));
225
+ return (recipes.archives ?? []).flatMap((archive) => {
226
+ if (selected.has(archive.formerGroupId)) {
227
+ return (acceptedByGroup.get(archive.formerGroupId)?.has(archive.installName)
228
+ || leftover(archive.installName)) ? [archive] : [];
229
+ }
230
+ if (!leftover(archive.installName)) return [];
231
+ const replacement = membersByName.get(archive.replacement);
232
+ if (!replacement) return [];
233
+ try {
234
+ if (classifyInstalledMember(replacement.source, replacement.member, {
235
+ enableTdd: transport.enableTdd,
236
+ localRoot,
237
+ skillsRoot: transport.skillsRoot,
238
+ }).status !== 'unchanged') return [];
239
+ } catch {
240
+ // A scoped transport may declare an archive without carrying an unselected replacement's
241
+ // source bytes. Without an expected digest this cleanup is ineligible, never presence-based.
242
+ return [];
243
+ }
244
+ return [{ ...archive, replacementAlreadyCurrent: true }];
245
+ });
223
246
  }
224
247
 
225
248
  // Prior acceptance for the new-member consent delta on explicit selections (picker, --group,
@@ -690,8 +713,9 @@ install without --group/--all opens the interactive picker; update without them
690
713
  remembered selection (\${XDG_STATE_HOME:-~/.local/state}/1aboveio-skills/selection.json).
691
714
  When a remembered group's current recipe declares members you have not accepted yet, each new skill
692
715
  is offered individually and defaults to No; --yes accepts them all, --dry-run lists them without
693
- prompting. Retired leftovers in a selected group are archived by default through the native Skills
694
- CLI after their replacement is current; decline interactively to keep them. TDD implicit model invocation is enabled by default; --disable-tdd makes TDD explicit-only,
716
+ prompting. Every run archives exact retired leftovers from the managed global root by default when
717
+ their replacement is current; it never installs an unselected replacement. Decline interactively to
718
+ keep them. TDD implicit model invocation is enabled by default; --disable-tdd makes TDD explicit-only,
695
719
  and --enable-tdd restores implicit invocation. --manual-tdd remains a compatibility alias for
696
720
  --disable-tdd.
697
721
  `;
@@ -995,6 +1019,7 @@ export async function runCli(args, {
995
1019
  const skillsRoot = join(env.HOME || homedir(), '.agents', 'skills');
996
1020
  const archiveCandidates = archivedMemberCandidates(parsed.action, groupIds, priorState, {
997
1021
  ...transport,
1022
+ enableTdd,
998
1023
  skillsRoot,
999
1024
  });
1000
1025
  let declinedArchives = new Set();
@@ -1070,6 +1095,9 @@ export async function runCli(args, {
1070
1095
  const readyMembers = new Set([
1071
1096
  ...succeeded.map((planned) => planned.member),
1072
1097
  ...(buckets?.unchanged.map((entry) => entry.member) ?? []),
1098
+ ...archiveCandidates
1099
+ .filter((candidate) => candidate.replacementAlreadyCurrent)
1100
+ .map((candidate) => candidate.replacement),
1073
1101
  ]);
1074
1102
  failed.push(...enforceReadyDependencies(
1075
1103
  readyMembers,
@@ -86,7 +86,7 @@ export const WORKFLOW_TRUSTED_SOURCES = deepFreeze({
86
86
  id: 'first-party',
87
87
  type: 'first-party',
88
88
  package: '@1aboveio/skills',
89
- version: '0.21.0',
89
+ version: '0.21.1',
90
90
  },
91
91
  matt: {
92
92
  id: 'matt-pocock',
@@ -342,7 +342,7 @@
342
342
  "id": "first-party",
343
343
  "type": "first-party",
344
344
  "package": "@1aboveio/skills",
345
- "version": "0.21.0"
345
+ "version": "0.21.1"
346
346
  },
347
347
  "contentDigest": "eff6c7b5931bce5b2265a619bccddd371a89df6ce7bc2edc74f11d00060a71dd",
348
348
  "digestExcludes": []
@@ -355,7 +355,7 @@
355
355
  "id": "first-party",
356
356
  "type": "first-party",
357
357
  "package": "@1aboveio/skills",
358
- "version": "0.21.0"
358
+ "version": "0.21.1"
359
359
  },
360
360
  "contentDigest": "d97abeff7bdc5ae2e4be2f631d09dba46d4753ce1e67334793364329af59f066",
361
361
  "digestExcludes": []
@@ -368,7 +368,7 @@
368
368
  "id": "first-party",
369
369
  "type": "first-party",
370
370
  "package": "@1aboveio/skills",
371
- "version": "0.21.0"
371
+ "version": "0.21.1"
372
372
  },
373
373
  "contentDigest": "fe2ec3bae2bfec2dbef19db30ab0272391d7c1d9b6893341a76a9f339adefc57",
374
374
  "digestExcludes": []
@@ -381,7 +381,7 @@
381
381
  "id": "first-party",
382
382
  "type": "first-party",
383
383
  "package": "@1aboveio/skills",
384
- "version": "0.21.0"
384
+ "version": "0.21.1"
385
385
  },
386
386
  "contentDigest": "58b0556228a9271cf9e33727a05fc08a4fdfd29512ec0936b169f0a55d60e6ef",
387
387
  "digestExcludes": []
@@ -394,7 +394,7 @@
394
394
  "id": "first-party",
395
395
  "type": "first-party",
396
396
  "package": "@1aboveio/skills",
397
- "version": "0.21.0"
397
+ "version": "0.21.1"
398
398
  },
399
399
  "contentDigest": "d28dd4d3c4394df0cc7e6b48d0e5daa7d2277701ea459e39fba99acf1d8ff670",
400
400
  "digestExcludes": []
@@ -407,7 +407,7 @@
407
407
  "id": "first-party",
408
408
  "type": "first-party",
409
409
  "package": "@1aboveio/skills",
410
- "version": "0.21.0"
410
+ "version": "0.21.1"
411
411
  },
412
412
  "contentDigest": "56fb5843788c9073b0d5a65ffa72bd7d2fa80dc6a1ff06fb0e19fab513c51502",
413
413
  "digestExcludes": []
@@ -420,7 +420,7 @@
420
420
  "id": "first-party",
421
421
  "type": "first-party",
422
422
  "package": "@1aboveio/skills",
423
- "version": "0.21.0"
423
+ "version": "0.21.1"
424
424
  },
425
425
  "contentDigest": "f048fd00c69f2dc666fc7a3096cfeee6dfba73933bfb69602f3f0e26159798cc",
426
426
  "digestExcludes": []
@@ -433,7 +433,7 @@
433
433
  "id": "first-party",
434
434
  "type": "first-party",
435
435
  "package": "@1aboveio/skills",
436
- "version": "0.21.0"
436
+ "version": "0.21.1"
437
437
  },
438
438
  "contentDigest": "d533684db4483cfc90be2aa7161980b6548057ef18a4b54f0cdbcd53c79dd46d",
439
439
  "digestExcludes": []
@@ -446,15 +446,15 @@
446
446
  "id": "first-party",
447
447
  "type": "first-party",
448
448
  "package": "@1aboveio/skills",
449
- "version": "0.21.0"
449
+ "version": "0.21.1"
450
450
  },
451
- "contentDigest": "e4a907bd6c3eec9fbfb1c03e785c0e58b81fbae6e2d739469ea24be2be748e45",
451
+ "contentDigest": "ec99877689de4bdfe8c5164bf3c518896eb1d3b0bdc990d9466e16f4cd73b88b",
452
452
  "digestExcludes": [
453
453
  "coherence/workflow.json"
454
454
  ]
455
455
  }
456
456
  ],
457
- "releaseIdentity": "d2ddb6d571f5b326aca54fbb7c11b5417f4ad23d09842ee629f0181138cd6d11",
457
+ "releaseIdentity": "54fba3d7b607050e20097a84fe7d7d02ff1b12de83cd9d004f544293d18534f5",
458
458
  "lifecycleAuthority": "native-skills-cli",
459
459
  "repairRecipe": {
460
460
  "id": "engineering-workflow-dependency-first",
@@ -512,7 +512,7 @@
512
512
  "sourceId": "first-party",
513
513
  "sourceType": "first-party",
514
514
  "package": "@1aboveio/skills",
515
- "version": "0.21.0",
515
+ "version": "0.21.1",
516
516
  "installPath": null,
517
517
  "members": [
518
518
  "harness-runtime",
@@ -528,7 +528,7 @@
528
528
  "commands": [
529
529
  {
530
530
  "transport": "npm",
531
- "command": "npx @1aboveio/skills@0.21.0 install --group engineering-workflow --yes"
531
+ "command": "npx @1aboveio/skills@0.21.1 install --group engineering-workflow --yes"
532
532
  }
533
533
  ],
534
534
  "onFailure": {
@@ -86,7 +86,7 @@ export const WORKFLOW_TRUSTED_SOURCES = deepFreeze({
86
86
  id: 'first-party',
87
87
  type: 'first-party',
88
88
  package: '@1aboveio/skills',
89
- version: '0.21.0',
89
+ version: '0.21.1',
90
90
  },
91
91
  matt: {
92
92
  id: 'matt-pocock',