@uzysjung/agent-harness 26.147.1 → 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
@@ -56,7 +56,7 @@ import {
56
56
  summarizeContextCost,
57
57
  upsertHarnessImport,
58
58
  writeInstallLog
59
- } from "./chunk-B27AJIWG.js";
59
+ } from "./chunk-PTUM2NI3.js";
60
60
 
61
61
  // node_modules/sisteransi/src/index.js
62
62
  var require_src = __commonJS({
@@ -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.147.1",
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: {
@@ -775,6 +775,8 @@ var package_default = {
775
775
  prepare: "[ -d dist ] || npm run build",
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
+ "assets:history": "bash scripts/asset-history.sh",
779
+ "release:audit": "node scripts/release-audit.mjs",
778
780
  security: "npm audit --omit=dev --audit-level=high && npx --yes ecc-agentshield@1.4.0 scan --baseline security-baseline.json --gate",
779
781
  "security:baseline": "npx --yes ecc-agentshield@1.4.0 scan --save-baseline security-baseline.json"
780
782
  },
@@ -1889,6 +1891,45 @@ var SKILLS_CLI_VERSION = "1.5.11";
1889
1891
  function skillsCliSpec() {
1890
1892
  return `skills@${SKILLS_CLI_VERSION}`;
1891
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
+ }
1892
1933
  function buildSkillArgs(method, cli2, scope) {
1893
1934
  const args = [skillsCliSpec(), "add", method.source];
1894
1935
  if (method.skill) {
@@ -1898,6 +1939,7 @@ function buildSkillArgs(method, cli2, scope) {
1898
1939
  for (const c3 of cli2) {
1899
1940
  args.push("--agent", SKILLS_CLI_AGENT_MAP[c3] ?? c3);
1900
1941
  }
1942
+ args.push("--copy");
1901
1943
  }
1902
1944
  if (scope === "global") {
1903
1945
  args.push("-g");
@@ -2118,10 +2160,11 @@ function buildUpdateSpec(projectDir, tracks) {
2118
2160
  tracks: [...tracks],
2119
2161
  options: DEFAULT_OPTIONS,
2120
2162
  cli: ["claude"],
2121
- projectDir
2163
+ projectDir,
2164
+ scope: readInstallLog(projectDir)?.scope ?? "project"
2122
2165
  };
2123
2166
  }
2124
- function runUpdateMode(projectDir, templatesDir, harnessRoot) {
2167
+ function runUpdateMode(projectDir, templatesDir, harnessRoot, deps = {}) {
2125
2168
  const claudeDir = join11(projectDir, ".claude");
2126
2169
  const report = {
2127
2170
  updated: {},
@@ -2136,6 +2179,10 @@ function runUpdateMode(projectDir, templatesDir, harnessRoot) {
2136
2179
  policyBackedUp: [],
2137
2180
  externalUpdated: 0,
2138
2181
  externalBackedUp: [],
2182
+ externalSkillsRefreshed: 0,
2183
+ externalSkillsFailed: [],
2184
+ externalSkillsNotInCatalog: [],
2185
+ externalSkillsUnknown: false,
2139
2186
  foreignOwned: [],
2140
2187
  installedNew: [],
2141
2188
  restored: [],
@@ -2191,6 +2238,11 @@ function runUpdateMode(projectDir, templatesDir, harnessRoot) {
2191
2238
  if (!saidBySlotRow.has(f) && !merged.includes(f)) merged.push(f);
2192
2239
  }
2193
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;
2194
2246
  return report;
2195
2247
  }
2196
2248
  function installNewAssets(projectDir, templatesDir) {
@@ -3349,6 +3401,39 @@ function renderPhase1Rows(log, baseline, verbose = false, withEcc = false, claud
3349
3401
  )
3350
3402
  );
3351
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
+ }
3352
3437
  return;
3353
3438
  }
3354
3439
  if (baseline.backups) {