@uzysjung/agent-harness 26.148.0 → 26.148.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/dist/index.js CHANGED
@@ -741,7 +741,7 @@ var cac = (name = "") => new CAC(name);
741
741
  // package.json
742
742
  var package_default = {
743
743
  name: "@uzysjung/agent-harness",
744
- version: "26.148.0",
744
+ version: "26.148.1",
745
745
  description: "Curate vetted AI-coding skills & plugins by your tech stack \u2014 install only what you need, across Claude Code, Codex, OpenCode & Antigravity",
746
746
  type: "module",
747
747
  publishConfig: {
@@ -776,6 +776,7 @@ var package_default = {
776
776
  "cost:report": "npm run build && node scripts/context-cost-report.mjs",
777
777
  "cost:baseline": "npm run build && node scripts/context-cost-baseline.mjs",
778
778
  "assets:history": "bash scripts/asset-history.sh",
779
+ "release:audit": "node scripts/release-audit.mjs",
779
780
  security: "npm audit --omit=dev --audit-level=high && npx --yes ecc-agentshield@1.4.0 scan --baseline security-baseline.json --gate",
780
781
  "security:baseline": "npx --yes ecc-agentshield@1.4.0 scan --save-baseline security-baseline.json"
781
782
  },
@@ -1890,6 +1891,45 @@ var SKILLS_CLI_VERSION = "1.5.11";
1890
1891
  function skillsCliSpec() {
1891
1892
  return `skills@${SKILLS_CLI_VERSION}`;
1892
1893
  }
1894
+ function refreshExternalSkills(projectDir, deps = {}) {
1895
+ const none = { attempted: 0, refreshed: 0, failed: [], notInCatalog: [] };
1896
+ const log = (deps.readLog ?? readInstallLog)(projectDir);
1897
+ if (!log) {
1898
+ return { ...none, unknown: true };
1899
+ }
1900
+ const installedIds = new Set(log.assets.filter((a) => a.method === "skill").map((a) => a.id));
1901
+ const catalog = deps.assets ?? EXTERNAL_ASSETS;
1902
+ const targets = catalog.filter((a) => a.method.kind === "skill" && installedIds.has(a.id));
1903
+ const inCatalog = new Set(targets.map((a) => a.id));
1904
+ const notInCatalog = [...installedIds].filter((id) => !inCatalog.has(id));
1905
+ if (targets.length === 0) {
1906
+ return { ...none, notInCatalog, unknown: false };
1907
+ }
1908
+ const report = (deps.run ?? runExternalInstall)(
1909
+ {
1910
+ tracks: log.spec.tracks,
1911
+ // `forceInclude` 가 조건 판정을 앞지르므로 옵션 값은 결과에 영향을 주지 않는다.
1912
+ options: DEFAULT_OPTIONS,
1913
+ cli: log.spec.cli,
1914
+ userOverride: { forceInclude: [...installedIds], forceExclude: [] },
1915
+ scope: log.scope,
1916
+ projectDir
1917
+ },
1918
+ {
1919
+ assets: targets,
1920
+ ...deps.spawn ? { spawn: deps.spawn } : {},
1921
+ ...deps.log ? { log: deps.log } : {},
1922
+ ...deps.warn ? { warn: deps.warn } : {}
1923
+ }
1924
+ );
1925
+ return {
1926
+ attempted: report.attempted.length,
1927
+ refreshed: report.succeeded,
1928
+ failed: report.attempted.filter((r) => !r.ok).map((r) => ({ id: r.asset.id, message: r.message ?? "failed" })),
1929
+ notInCatalog,
1930
+ unknown: false
1931
+ };
1932
+ }
1893
1933
  function buildSkillArgs(method, cli2, scope) {
1894
1934
  const args = [skillsCliSpec(), "add", method.source];
1895
1935
  if (method.skill) {
@@ -1899,6 +1939,7 @@ function buildSkillArgs(method, cli2, scope) {
1899
1939
  for (const c3 of cli2) {
1900
1940
  args.push("--agent", SKILLS_CLI_AGENT_MAP[c3] ?? c3);
1901
1941
  }
1942
+ args.push("--copy");
1902
1943
  }
1903
1944
  if (scope === "global") {
1904
1945
  args.push("-g");
@@ -2119,10 +2160,11 @@ function buildUpdateSpec(projectDir, tracks) {
2119
2160
  tracks: [...tracks],
2120
2161
  options: DEFAULT_OPTIONS,
2121
2162
  cli: ["claude"],
2122
- projectDir
2163
+ projectDir,
2164
+ scope: readInstallLog(projectDir)?.scope ?? "project"
2123
2165
  };
2124
2166
  }
2125
- function runUpdateMode(projectDir, templatesDir, harnessRoot) {
2167
+ function runUpdateMode(projectDir, templatesDir, harnessRoot, deps = {}) {
2126
2168
  const claudeDir = join11(projectDir, ".claude");
2127
2169
  const report = {
2128
2170
  updated: {},
@@ -2137,6 +2179,10 @@ function runUpdateMode(projectDir, templatesDir, harnessRoot) {
2137
2179
  policyBackedUp: [],
2138
2180
  externalUpdated: 0,
2139
2181
  externalBackedUp: [],
2182
+ externalSkillsRefreshed: 0,
2183
+ externalSkillsFailed: [],
2184
+ externalSkillsNotInCatalog: [],
2185
+ externalSkillsUnknown: false,
2140
2186
  foreignOwned: [],
2141
2187
  installedNew: [],
2142
2188
  restored: [],
@@ -2192,6 +2238,11 @@ function runUpdateMode(projectDir, templatesDir, harnessRoot) {
2192
2238
  if (!saidBySlotRow.has(f) && !merged.includes(f)) merged.push(f);
2193
2239
  }
2194
2240
  report.foreignOwned = merged;
2241
+ const skillRefresh = (deps.refreshSkills ?? refreshExternalSkills)(projectDir);
2242
+ report.externalSkillsRefreshed = skillRefresh.refreshed;
2243
+ report.externalSkillsFailed = skillRefresh.failed;
2244
+ report.externalSkillsNotInCatalog = skillRefresh.notInCatalog;
2245
+ report.externalSkillsUnknown = skillRefresh.unknown;
2195
2246
  return report;
2196
2247
  }
2197
2248
  function installNewAssets(projectDir, templatesDir) {
@@ -3350,6 +3401,39 @@ function renderPhase1Rows(log, baseline, verbose = false, withEcc = false, claud
3350
3401
  )
3351
3402
  );
3352
3403
  }
3404
+ if (baseline.updateMode.externalSkillsRefreshed > 0) {
3405
+ log(
3406
+ assetRow(
3407
+ "success",
3408
+ "external skills",
3409
+ `${baseline.updateMode.externalSkillsRefreshed} refreshed from upstream`
3410
+ )
3411
+ );
3412
+ }
3413
+ if (baseline.updateMode.externalSkillsFailed.length > 0) {
3414
+ const failed = baseline.updateMode.externalSkillsFailed;
3415
+ const head = failed[0];
3416
+ const meta = failed.length === 1 ? `${head.id}: ${head.message}` : `${failed.map((f) => f.id).join(", ")} (${failed.length}\uAC74) \xB7 \uC608: ${head.message}`;
3417
+ log(assetRow("skip", "external skills", `${meta} \xB7 \uB2E4\uC74C update \uC5D0\uC11C \uB2E4\uC2DC \uC2DC\uB3C4\uD55C\uB2E4`));
3418
+ }
3419
+ if (baseline.updateMode.externalSkillsNotInCatalog.length > 0) {
3420
+ log(
3421
+ assetRow(
3422
+ "skip",
3423
+ "external skills",
3424
+ `${baseline.updateMode.externalSkillsNotInCatalog.join(", ")} \xB7 \uCE74\uD0C8\uB85C\uADF8\uC5D0 \uC5C6\uC5B4 \uAC31\uC2E0 \uB300\uC0C1\uC774 \uC544\uB2C8\uB2E4`
3425
+ )
3426
+ );
3427
+ }
3428
+ if (baseline.updateMode.externalSkillsUnknown) {
3429
+ log(
3430
+ assetRow(
3431
+ "skip",
3432
+ "external skills",
3433
+ "\uC124\uCE58 \uAE30\uB85D\uC774 \uC5C6\uC5B4 \uAC31\uC2E0 \uB300\uC0C1\uC744 \uD310\uC815\uD560 \uC218 \uC5C6\uB2E4 \xB7 `agent-harness install` \uB85C \uB2E4\uC2DC \uAE54\uBA74 \uAE30\uB85D\uB41C\uB2E4"
3434
+ )
3435
+ );
3436
+ }
3353
3437
  return;
3354
3438
  }
3355
3439
  if (baseline.backups) {