harnessbrew 0.5.2 → 0.6.0

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.
Files changed (81) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +88 -9
  3. package/dist/cli.d.ts +17 -0
  4. package/dist/cli.d.ts.map +1 -1
  5. package/dist/cli.js +184 -26
  6. package/dist/cli.js.map +1 -1
  7. package/dist/core/adapter-plugins.d.ts +12 -0
  8. package/dist/core/adapter-plugins.d.ts.map +1 -0
  9. package/dist/core/adapter-plugins.js +151 -0
  10. package/dist/core/adapter-plugins.js.map +1 -0
  11. package/dist/core/bundle.d.ts +33 -5
  12. package/dist/core/bundle.d.ts.map +1 -1
  13. package/dist/core/bundle.js +329 -60
  14. package/dist/core/bundle.js.map +1 -1
  15. package/dist/core/doctor.d.ts +2 -2
  16. package/dist/core/doctor.d.ts.map +1 -1
  17. package/dist/core/doctor.js +2 -0
  18. package/dist/core/doctor.js.map +1 -1
  19. package/dist/core/git.d.ts +1 -0
  20. package/dist/core/git.d.ts.map +1 -1
  21. package/dist/core/git.js +17 -0
  22. package/dist/core/git.js.map +1 -1
  23. package/dist/core/installations.d.ts +1 -0
  24. package/dist/core/installations.d.ts.map +1 -1
  25. package/dist/core/installations.js +135 -14
  26. package/dist/core/installations.js.map +1 -1
  27. package/dist/core/journal.d.ts +26 -0
  28. package/dist/core/journal.d.ts.map +1 -0
  29. package/dist/core/journal.js +363 -0
  30. package/dist/core/journal.js.map +1 -0
  31. package/dist/core/locks.d.ts +10 -0
  32. package/dist/core/locks.d.ts.map +1 -0
  33. package/dist/core/locks.js +90 -0
  34. package/dist/core/locks.js.map +1 -0
  35. package/dist/core/paths.d.ts +1 -0
  36. package/dist/core/paths.d.ts.map +1 -1
  37. package/dist/core/paths.js +3 -0
  38. package/dist/core/paths.js.map +1 -1
  39. package/dist/core/state.d.ts +2 -0
  40. package/dist/core/state.d.ts.map +1 -1
  41. package/dist/core/state.js +21 -2
  42. package/dist/core/state.js.map +1 -1
  43. package/dist/core/taps.d.ts +7 -1
  44. package/dist/core/taps.d.ts.map +1 -1
  45. package/dist/core/taps.js +74 -16
  46. package/dist/core/taps.js.map +1 -1
  47. package/dist/core/targets/claude-code.d.ts.map +1 -1
  48. package/dist/core/targets/claude-code.js +11 -1
  49. package/dist/core/targets/claude-code.js.map +1 -1
  50. package/dist/core/targets/codex.d.ts.map +1 -1
  51. package/dist/core/targets/codex.js +11 -1
  52. package/dist/core/targets/codex.js.map +1 -1
  53. package/dist/core/targets/planner.d.ts +2 -3
  54. package/dist/core/targets/planner.d.ts.map +1 -1
  55. package/dist/core/targets/planner.js +43 -3
  56. package/dist/core/targets/planner.js.map +1 -1
  57. package/dist/core/targets/registry.d.ts +7 -3
  58. package/dist/core/targets/registry.d.ts.map +1 -1
  59. package/dist/core/targets/registry.js +55 -0
  60. package/dist/core/targets/registry.js.map +1 -1
  61. package/dist/core/targets/transaction.d.ts.map +1 -1
  62. package/dist/core/targets/transaction.js +46 -10
  63. package/dist/core/targets/transaction.js.map +1 -1
  64. package/dist/core/targets/types.d.ts +8 -4
  65. package/dist/core/targets/types.d.ts.map +1 -1
  66. package/dist/core/targets/types.js +1 -1
  67. package/dist/core/targets/types.js.map +1 -1
  68. package/dist/core/targets.d.ts +6 -7
  69. package/dist/core/targets.d.ts.map +1 -1
  70. package/dist/core/targets.js +33 -22
  71. package/dist/core/targets.js.map +1 -1
  72. package/dist/core/upgrades.d.ts.map +1 -1
  73. package/dist/core/upgrades.js +10 -1
  74. package/dist/core/upgrades.js.map +1 -1
  75. package/dist/index.d.ts +13 -5
  76. package/dist/index.d.ts.map +1 -1
  77. package/dist/index.js +6 -2
  78. package/dist/index.js.map +1 -1
  79. package/dist/version.d.ts +1 -1
  80. package/dist/version.js +1 -1
  81. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"taps.d.ts","sourceRoot":"","sources":["../../src/core/taps.ts"],"names":[],"mappings":"AAMA,OAAO,EAAa,KAAK,SAAS,EAAc,MAAM,YAAY,CAAC;AAEnE,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAGjE;AAED,wBAAsB,MAAM,CAC1B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,SAAS,CAAC,CAmCpB;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CA4B3F;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAY9E;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAehG"}
1
+ {"version":3,"file":"taps.d.ts","sourceRoot":"","sources":["../../src/core/taps.ts"],"names":[],"mappings":"AAMA,OAAO,EAAa,KAAK,SAAS,EAAc,MAAM,YAAY,CAAC;AAGnE,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAGjE;AAED,wBAAsB,MAAM,CAC1B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,SAAS,CAAC,CAuCpB;AAED,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EACZ,aAAa,CAAC,EAAE,MAAM,EACtB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,SAAS,EAAE,CAAC,CAiDtB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAUlG;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMhF;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAc9E;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAqBhG"}
package/dist/core/taps.js CHANGED
@@ -1,10 +1,11 @@
1
1
  import { mkdir, rm } from "node:fs/promises";
2
2
  import path from "node:path";
3
3
  import { HarnessBrewError } from "./errors.js";
4
- import { resolveGitCommit, runGit } from "./git.js";
4
+ import { isGitAncestor, resolveGitCommit, runGit } from "./git.js";
5
5
  import { validateTapRepository } from "./formulas.js";
6
6
  import { assertTapName, resolveTapPath } from "./paths.js";
7
7
  import { readState, writeState } from "./state.js";
8
+ import { captureMissingParents, captureTransactionPath } from "./journal.js";
8
9
  export async function listTaps(home) {
9
10
  const state = await readState(home);
10
11
  return Object.values(state.taps).sort((left, right) => left.name.localeCompare(right.name));
@@ -19,6 +20,8 @@ export async function addTap(home, name, url, options = {}) {
19
20
  throw new HarnessBrewError(`Tap already exists: ${name}`);
20
21
  }
21
22
  const destination = resolveTapPath(home, name);
23
+ await captureMissingParents(destination);
24
+ await captureTransactionPath(destination);
22
25
  await mkdir(path.dirname(destination), { recursive: true });
23
26
  try {
24
27
  await runGit(["clone", "--quiet", "--", url, destination]);
@@ -32,6 +35,8 @@ export async function addTap(home, name, url, options = {}) {
32
35
  commit,
33
36
  addedAt: timestamp,
34
37
  updatedAt: timestamp,
38
+ trusted: options.trust ?? false,
39
+ ...(options.trust === true ? { trustedAt: timestamp } : {}),
35
40
  ...(options.ref === undefined ? {} : { ref: options.ref })
36
41
  };
37
42
  state.taps[name] = record;
@@ -43,7 +48,7 @@ export async function addTap(home, name, url, options = {}) {
43
48
  throw error;
44
49
  }
45
50
  }
46
- export async function updateTaps(home, requestedName) {
51
+ export async function updateTaps(home, requestedName, options = {}) {
47
52
  if (requestedName !== undefined) {
48
53
  assertTapName(requestedName);
49
54
  }
@@ -55,19 +60,63 @@ export async function updateTaps(home, requestedName) {
55
60
  throw new HarnessBrewError(`Tap not found: ${requestedName}`);
56
61
  }
57
62
  const updates = [];
58
- for (const record of records.sort((left, right) => left.name.localeCompare(right.name))) {
59
- const repositoryPath = resolveTapPath(home, record.name);
60
- await runGit(["fetch", "--quiet", "--prune", "--tags", "origin"], repositoryPath);
61
- const commit = await resolveGitCommit(repositoryPath, record.ref);
62
- await runGit(["checkout", "--quiet", "--detach", commit], repositoryPath);
63
- await validateTapRepository(repositoryPath);
64
- const before = record.commit;
65
- record.commit = commit;
66
- record.updatedAt = new Date().toISOString();
67
- updates.push({ name: record.name, before, after: commit, changed: before !== commit });
63
+ const applied = [];
64
+ try {
65
+ for (const record of records.sort((left, right) => left.name.localeCompare(right.name))) {
66
+ const repositoryPath = resolveTapPath(home, record.name);
67
+ await captureTransactionPath(repositoryPath);
68
+ await runGit(["fetch", "--quiet", "--prune", "--tags", "origin"], repositoryPath);
69
+ const commit = await resolveGitCommit(repositoryPath, record.ref);
70
+ const before = record.commit;
71
+ if (commit !== before && options.allowRewind !== true && !await isGitAncestor(repositoryPath, before, commit)) {
72
+ throw new HarnessBrewError(`Tap update is not a fast-forward: ${record.name} ${before.slice(0, 12)} -> ${commit.slice(0, 12)}. Use --allow-rewind.`);
73
+ }
74
+ try {
75
+ await runGit(["checkout", "--quiet", "--detach", commit], repositoryPath);
76
+ await validateTapRepository(repositoryPath);
77
+ }
78
+ catch (error) {
79
+ await runGit(["checkout", "--quiet", "--detach", before], repositoryPath).catch(() => undefined);
80
+ throw error;
81
+ }
82
+ applied.push({ record, before, updatedAt: record.updatedAt });
83
+ record.commit = commit;
84
+ record.updatedAt = new Date().toISOString();
85
+ updates.push({ name: record.name, before, after: commit, changed: before !== commit });
86
+ }
87
+ await writeState(home, state);
88
+ return updates;
89
+ }
90
+ catch (error) {
91
+ for (const item of applied.reverse()) {
92
+ await runGit(["checkout", "--quiet", "--detach", item.before], resolveTapPath(home, item.record.name)).catch(() => undefined);
93
+ item.record.commit = item.before;
94
+ item.record.updatedAt = item.updatedAt;
95
+ }
96
+ throw error;
68
97
  }
98
+ }
99
+ export async function setTapTrust(home, name, trusted) {
100
+ assertTapName(name);
101
+ const state = await readState(home);
102
+ const record = state.taps[name];
103
+ if (record === undefined)
104
+ throw new HarnessBrewError(`Tap not found: ${name}`);
105
+ record.trusted = trusted;
106
+ if (trusted)
107
+ record.trustedAt = new Date().toISOString();
108
+ else
109
+ delete record.trustedAt;
69
110
  await writeState(home, state);
70
- return updates;
111
+ return record;
112
+ }
113
+ export async function assertTapTrusted(home, name) {
114
+ const record = (await readState(home)).taps[name];
115
+ if (record === undefined)
116
+ throw new HarnessBrewError(`Tap not found: ${name}`);
117
+ if (!record.trusted) {
118
+ throw new HarnessBrewError(`Tap is not trusted for Target activation: ${name}. Run harnessbrew tap trust ${name}.`);
119
+ }
71
120
  }
72
121
  export async function removeTap(home, name) {
73
122
  assertTapName(name);
@@ -76,7 +125,9 @@ export async function removeTap(home, name) {
76
125
  if (record === undefined) {
77
126
  throw new HarnessBrewError(`Tap not found: ${name}`);
78
127
  }
79
- await rm(resolveTapPath(home, name), { recursive: true, force: true });
128
+ const repositoryPath = resolveTapPath(home, name);
129
+ await captureTransactionPath(repositoryPath);
130
+ await rm(repositoryPath, { recursive: true, force: true });
80
131
  delete state.taps[name];
81
132
  await writeState(home, state);
82
133
  return record;
@@ -90,10 +141,17 @@ export async function checkoutTap(home, name, commit) {
90
141
  if (record === undefined)
91
142
  throw new HarnessBrewError(`Tap not found: ${name}`);
92
143
  const repositoryPath = resolveTapPath(home, name);
144
+ await captureTransactionPath(repositoryPath);
93
145
  await runGit(["fetch", "--quiet", "--prune", "--tags", "origin"], repositoryPath);
94
146
  const resolved = await resolveGitCommit(repositoryPath, commit);
95
- await runGit(["checkout", "--quiet", "--detach", resolved], repositoryPath);
96
- await validateTapRepository(repositoryPath);
147
+ try {
148
+ await runGit(["checkout", "--quiet", "--detach", resolved], repositoryPath);
149
+ await validateTapRepository(repositoryPath);
150
+ }
151
+ catch (error) {
152
+ await runGit(["checkout", "--quiet", "--detach", record.commit], repositoryPath).catch(() => undefined);
153
+ throw error;
154
+ }
97
155
  record.commit = resolved;
98
156
  record.updatedAt = new Date().toISOString();
99
157
  await writeState(home, state);
@@ -1 +1 @@
1
- {"version":3,"file":"taps.js","sourceRoot":"","sources":["../../src/core/taps.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"taps.js","sourceRoot":"","sources":["../../src/core/taps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAkB,UAAU,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAkB7E,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAY;IACzC,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;IACpC,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AAC9F,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,IAAY,EACZ,IAAY,EACZ,GAAW,EACX,OAAO,GAAkB,EAAE;IAE3B,aAAa,CAAC,IAAI,CAAC,CAAC;IACpB,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACtB,MAAM,IAAI,gBAAgB,CAAC,gCAAgC,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;QACnC,MAAM,IAAI,gBAAgB,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC/C,MAAM,qBAAqB,CAAC,WAAW,CAAC,CAAC;IACzC,MAAM,sBAAsB,CAAC,WAAW,CAAC,CAAC;IAC1C,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5D,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QAChE,MAAM,MAAM,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC;QACvE,MAAM,qBAAqB,CAAC,WAAW,CAAC,CAAC;QACzC,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAc;YACxB,IAAI;YACJ,GAAG;YACH,MAAM;YACN,OAAO,EAAE,SAAS;YAClB,SAAS,EAAE,SAAS;YACpB,OAAO,EAAE,OAAO,CAAC,KAAK,IAAI,KAAK;YAC/B,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3D,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;SAC3D,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;QAC1B,MAAM,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC9B,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,EAAE,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAAY,EACZ,aAAsB,EACtB,OAAO,GAAqB,EAAE;IAE9B,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,aAAa,CAAC,aAAa,CAAC,CAAC;IAC/B,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,aAAa,KAAK,SAAS;QACzC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;QAC3B,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAuB,EAAE,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;IAE9F,IAAI,aAAa,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,gBAAgB,CAAC,kBAAkB,aAAa,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,OAAO,GAAgB,EAAE,CAAC;IAChC,MAAM,OAAO,GAAoE,EAAE,CAAC;IACpF,IAAI,CAAC;QACH,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YACxF,MAAM,cAAc,GAAG,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YACzD,MAAM,sBAAsB,CAAC,cAAc,CAAC,CAAC;YAC7C,MAAM,MAAM,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,cAAc,CAAC,CAAC;YAClF,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;YAClE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YAC7B,IAAI,MAAM,KAAK,MAAM,IAAI,OAAO,CAAC,WAAW,KAAK,IAAI,IAAI,CAAC,MAAM,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;gBAC9G,MAAM,IAAI,gBAAgB,CACxB,qCAAqC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,uBAAuB,CACzH,CAAC;YACJ,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,cAAc,CAAC,CAAC;gBAC1E,MAAM,qBAAqB,CAAC,cAAc,CAAC,CAAC;YAC9C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,MAAM,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,cAAc,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBACjG,MAAM,KAAK,CAAC;YACd,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;YAC9D,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;YACvB,MAAM,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC5C,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC,CAAC;QACzF,CAAC;QACD,MAAM,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC9B,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YACrC,MAAM,MAAM,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAC9H,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YACjC,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QACzC,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,IAAY,EAAE,OAAgB;IAC5E,aAAa,CAAC,IAAI,CAAC,CAAC;IACpB,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,MAAM,KAAK,SAAS;QAAE,MAAM,IAAI,gBAAgB,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC;IAC/E,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,IAAI,OAAO;QAAE,MAAM,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;;QACpD,OAAO,MAAM,CAAC,SAAS,CAAC;IAC7B,MAAM,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC9B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY,EAAE,IAAY;IAC/D,MAAM,MAAM,GAAG,CAAC,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClD,IAAI,MAAM,KAAK,SAAS;QAAE,MAAM,IAAI,gBAAgB,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC;IAC/E,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,gBAAgB,CAAC,6CAA6C,IAAI,+BAA+B,IAAI,GAAG,CAAC,CAAC;IACtH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAY,EAAE,IAAY;IACxD,aAAa,CAAC,IAAI,CAAC,CAAC;IACpB,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,IAAI,gBAAgB,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,cAAc,GAAG,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAClD,MAAM,sBAAsB,CAAC,cAAc,CAAC,CAAC;IAC7C,MAAM,EAAE,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxB,MAAM,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC9B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,IAAY,EAAE,MAAc;IAC1E,aAAa,CAAC,IAAI,CAAC,CAAC;IACpB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,gBAAgB,CAAC,uBAAuB,MAAM,EAAE,CAAC,CAAC;IACjG,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,MAAM,KAAK,SAAS;QAAE,MAAM,IAAI,gBAAgB,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC;IAC/E,MAAM,cAAc,GAAG,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAClD,MAAM,sBAAsB,CAAC,cAAc,CAAC,CAAC;IAC7C,MAAM,MAAM,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,cAAc,CAAC,CAAC;IAClF,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IAChE,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,cAAc,CAAC,CAAC;QAC5E,MAAM,qBAAqB,CAAC,cAAc,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,cAAc,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACxG,MAAM,KAAK,CAAC;IACd,CAAC;IACD,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC;IACzB,MAAM,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC5C,MAAM,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC9B,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../../src/core/targets/claude-code.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAA0B,aAAa,EAAoC,MAAM,YAAY,CAAC;AA6C1G,eAAO,MAAM,iBAAiB,EAAE,aAU/B,CAAC"}
1
+ {"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../../src/core/targets/claude-code.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAA0B,aAAa,EAAoC,MAAM,YAAY,CAAC;AA6C1G,eAAO,MAAM,iBAAiB,EAAE,aAoB/B,CAAC"}
@@ -47,8 +47,18 @@ function operation(receipt, context) {
47
47
  return [{ strategy, source, destination }];
48
48
  }
49
49
  export const claudeCodeAdapter = {
50
+ apiVersion: 1,
50
51
  name: "claude-code",
51
- supports: (kind) => targetCapability("claude-code", kind) !== "unsupported",
52
+ version: "1",
53
+ capabilities: {
54
+ skill: targetCapability("claude-code", "skill"),
55
+ agent: targetCapability("claude-code", "agent"),
56
+ workflow: targetCapability("claude-code", "workflow"),
57
+ instruction: targetCapability("claude-code", "instruction"),
58
+ prompt: targetCapability("claude-code", "prompt"),
59
+ mcp: targetCapability("claude-code", "mcp"),
60
+ adapter: targetCapability("claude-code", "adapter")
61
+ },
52
62
  plan(receipt, context = {}) {
53
63
  return {
54
64
  target: "claude-code",
@@ -1 +1 @@
1
- {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../src/core/targets/claude-code.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../src/core/targets/claude-code.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../src/core/targets/codex.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAA0B,aAAa,EAAoC,MAAM,YAAY,CAAC;AAkD1G,eAAO,MAAM,YAAY,EAAE,aAU1B,CAAC"}
1
+ {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../src/core/targets/codex.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAA0B,aAAa,EAAoC,MAAM,YAAY,CAAC;AAkD1G,eAAO,MAAM,YAAY,EAAE,aAoB1B,CAAC"}
@@ -51,8 +51,18 @@ function operation(receipt, context) {
51
51
  return [{ strategy, source, destination }];
52
52
  }
53
53
  export const codexAdapter = {
54
+ apiVersion: 1,
54
55
  name: "openai-codex",
55
- supports: (kind) => targetCapability("openai-codex", kind) !== "unsupported",
56
+ version: "1",
57
+ capabilities: {
58
+ skill: targetCapability("openai-codex", "skill"),
59
+ agent: targetCapability("openai-codex", "agent"),
60
+ workflow: targetCapability("openai-codex", "workflow"),
61
+ instruction: targetCapability("openai-codex", "instruction"),
62
+ prompt: targetCapability("openai-codex", "prompt"),
63
+ mcp: targetCapability("openai-codex", "mcp"),
64
+ adapter: targetCapability("openai-codex", "adapter")
65
+ },
56
66
  plan(receipt, context = {}) {
57
67
  return {
58
68
  target: "openai-codex",
@@ -1 +1 @@
1
- {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/core/targets/codex.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/core/targets/codex.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,4 @@
1
1
  import type { InstallReceipt } from "../installations.js";
2
- import type { BuiltinTarget } from "../target-capabilities.js";
3
- import type { TargetContext, TargetInstallPlan } from "./types.js";
4
- export declare function planTargetInstall(receipt: InstallReceipt, target: BuiltinTarget, context?: TargetContext): TargetInstallPlan;
2
+ import type { TargetContext, TargetInstallPlan, TargetName } from "./types.js";
3
+ export declare function planTargetInstall(receipt: InstallReceipt, target: TargetName, context?: TargetContext): TargetInstallPlan;
5
4
  //# sourceMappingURL=planner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"planner.d.ts","sourceRoot":"","sources":["../../../src/core/targets/planner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/D,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AASnE,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,aAAa,EACrB,OAAO,GAAE,aAAkB,GAC1B,iBAAiB,CAOnB"}
1
+ {"version":3,"file":"planner.d.ts","sourceRoot":"","sources":["../../../src/core/targets/planner.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAwB/E,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,UAAU,EAClB,OAAO,GAAE,aAAkB,GAC1B,iBAAiB,CAgCnB"}
@@ -1,4 +1,5 @@
1
1
  import { HarnessBrewError } from "../errors.js";
2
+ import path from "node:path";
2
3
  import { formulaKinds } from "../formulas.js";
3
4
  import { getTargetAdapter } from "./registry.js";
4
5
  function receiptKind(receipt) {
@@ -7,12 +8,51 @@ function receiptKind(receipt) {
7
8
  }
8
9
  return receipt.kind;
9
10
  }
11
+ function frozenClone(value) {
12
+ const clone = structuredClone(value);
13
+ if (typeof clone === "object" && clone !== null) {
14
+ Object.freeze(clone);
15
+ for (const item of Object.values(clone))
16
+ frozenCloneInPlace(item);
17
+ }
18
+ return clone;
19
+ }
20
+ function frozenCloneInPlace(value) {
21
+ if (typeof value !== "object" || value === null || Object.isFrozen(value))
22
+ return;
23
+ Object.freeze(value);
24
+ Object.values(value).forEach(frozenCloneInPlace);
25
+ }
10
26
  export function planTargetInstall(receipt, target, context = {}) {
11
27
  const adapter = getTargetAdapter(target);
12
28
  const kind = receiptKind(receipt);
13
- if (!adapter.supports(kind)) {
14
- throw new HarnessBrewError(`Formula ${receipt.coordinate} cannot be linked to ${target}: ${kind} is unsupported.`);
29
+ const capability = adapter.capabilities[kind];
30
+ if (capability === "unsupported") {
31
+ throw new HarnessBrewError(`Formula ${receipt.coordinate} cannot be linked to ${target}: ${kind} is unsupported; install it to the Cellar without --target.`);
32
+ }
33
+ let plan;
34
+ try {
35
+ plan = structuredClone(adapter.plan(frozenClone(receipt), frozenClone(context)));
36
+ }
37
+ catch (error) {
38
+ throw new HarnessBrewError(`Target Adapter ${target} failed to produce a data-only plan: ${error.message}`);
39
+ }
40
+ if (plan.target !== target || plan.coordinate !== receipt.coordinate || plan.operations.length !== 1) {
41
+ throw new HarnessBrewError(`Invalid installation plan from Target Adapter ${target}.`);
42
+ }
43
+ const operation = plan.operations[0];
44
+ if (operation === undefined || operation.strategy !== capability || !path.isAbsolute(operation.destination)
45
+ || operation.destination === path.parse(operation.destination).root) {
46
+ throw new HarnessBrewError(`Invalid installation operation from Target Adapter ${target}.`);
47
+ }
48
+ if (operation.source !== undefined) {
49
+ const cellar = path.resolve(receipt.cellarPath);
50
+ const source = path.resolve(operation.source);
51
+ if (source !== cellar && !source.startsWith(`${cellar}${path.sep}`)) {
52
+ throw new HarnessBrewError(`Target Adapter ${target} source escapes the Cellar: ${operation.source}`);
53
+ }
15
54
  }
16
- return adapter.plan(receipt, context);
55
+ frozenCloneInPlace(plan);
56
+ return plan;
17
57
  }
18
58
  //# sourceMappingURL=planner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"planner.js","sourceRoot":"","sources":["../../../src/core/targets/planner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,YAAY,EAAoB,MAAM,gBAAgB,CAAC;AAGhE,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGjD,SAAS,WAAW,CAAC,OAAuB;IAC1C,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAmB,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,gBAAgB,CAAC,iDAAiD,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9F,CAAC;IACD,OAAO,OAAO,CAAC,IAAmB,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,OAAuB,EACvB,MAAqB,EACrB,OAAO,GAAkB,EAAE;IAE3B,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,gBAAgB,CAAC,WAAW,OAAO,CAAC,UAAU,wBAAwB,MAAM,KAAK,IAAI,kBAAkB,CAAC,CAAC;IACrH,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACxC,CAAC"}
1
+ {"version":3,"file":"planner.js","sourceRoot":"","sources":["../../../src/core/targets/planner.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,8 @@
1
- import type { BuiltinTarget } from "../target-capabilities.js";
2
- import type { TargetAdapter } from "./types.js";
3
- export declare function getTargetAdapter(target: BuiltinTarget): TargetAdapter;
1
+ import { type TargetAdapter, type TargetName } from "./types.js";
2
+ export declare const TARGET_ADAPTER_VERSION = "1";
3
+ export declare function targetAdapterVersion(targets?: Iterable<TargetName>): string;
4
+ export declare function listTargetAdapters(): TargetAdapter[];
5
+ export declare function hasTargetAdapter(target: string): boolean;
6
+ export declare function registerTargetAdapter(adapter: TargetAdapter): () => void;
7
+ export declare function getTargetAdapter(target: TargetName): TargetAdapter;
4
8
  //# sourceMappingURL=registry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/core/targets/registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAG/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAOhD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,CAIrE"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/core/targets/registry.ts"],"names":[],"mappings":"AAKA,OAAO,EAA8B,KAAK,aAAa,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAO7F,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAE1C,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,MAAM,CAS3E;AAED,wBAAgB,kBAAkB,IAAI,aAAa,EAAE,CAEpD;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAExD;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,IAAI,CAqCxE;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,aAAa,CAIlE"}
@@ -1,10 +1,65 @@
1
1
  import { HarnessBrewError } from "../errors.js";
2
+ import { formulaKinds } from "../formulas.js";
3
+ import { targetOperationKinds } from "../target-capabilities.js";
2
4
  import { claudeCodeAdapter } from "./claude-code.js";
3
5
  import { codexAdapter } from "./codex.js";
6
+ import { TARGET_ADAPTER_API_VERSION } from "./types.js";
4
7
  const adapters = new Map([
5
8
  [codexAdapter.name, codexAdapter],
6
9
  [claudeCodeAdapter.name, claudeCodeAdapter]
7
10
  ]);
11
+ export const TARGET_ADAPTER_VERSION = "1";
12
+ export function targetAdapterVersion(targets) {
13
+ const selected = targets === undefined
14
+ ? listTargetAdapters()
15
+ : [...new Set(targets)].map((target) => getTargetAdapter(target));
16
+ const plugins = selected
17
+ .filter((adapter) => adapter.name !== "openai-codex" && adapter.name !== "claude-code")
18
+ .sort((left, right) => left.name.localeCompare(right.name))
19
+ .map((adapter) => `${adapter.name}@${adapter.version}`);
20
+ return plugins.length === 0 ? TARGET_ADAPTER_VERSION : `${TARGET_ADAPTER_VERSION};${plugins.join(",")}`;
21
+ }
22
+ export function listTargetAdapters() {
23
+ return [...adapters.values()].sort((left, right) => left.name.localeCompare(right.name));
24
+ }
25
+ export function hasTargetAdapter(target) {
26
+ return adapters.has(target);
27
+ }
28
+ export function registerTargetAdapter(adapter) {
29
+ if (adapter.apiVersion !== TARGET_ADAPTER_API_VERSION) {
30
+ throw new HarnessBrewError(`Unsupported Target Adapter API version for ${adapter.name}: ${adapter.apiVersion}`);
31
+ }
32
+ if (!/^[a-z0-9][a-z0-9-]*$/u.test(adapter.name)) {
33
+ throw new HarnessBrewError(`Invalid Target Adapter name: ${adapter.name}`);
34
+ }
35
+ if (typeof adapter.version !== "string" || adapter.version.trim() === "" || /[,;@]/u.test(adapter.version)) {
36
+ throw new HarnessBrewError(`Invalid Target Adapter version for ${adapter.name}.`);
37
+ }
38
+ if (adapters.has(adapter.name))
39
+ throw new HarnessBrewError(`Target adapter is already registered: ${adapter.name}`);
40
+ for (const kind of formulaKinds) {
41
+ if (!targetOperationKinds.includes(adapter.capabilities[kind])) {
42
+ throw new HarnessBrewError(`Invalid ${kind} capability for Target Adapter ${adapter.name}.`);
43
+ }
44
+ if (!["unsupported", "symlink-file", "symlink-directory"].includes(adapter.capabilities[kind])) {
45
+ throw new HarnessBrewError(`Target Adapter API v1 only supports symlink capabilities for third-party adapter ${adapter.name}.`);
46
+ }
47
+ }
48
+ if (Object.keys(adapter.capabilities).some((kind) => !formulaKinds.includes(kind))) {
49
+ throw new HarnessBrewError(`Target Adapter ${adapter.name} contains an unknown Formula capability.`);
50
+ }
51
+ if (!["unsupported", "symlink-directory"].includes(adapter.capabilities.skill)) {
52
+ throw new HarnessBrewError(`Target Adapter ${adapter.name} must install skills as complete directories.`);
53
+ }
54
+ const registered = Object.freeze({
55
+ ...adapter,
56
+ capabilities: Object.freeze({ ...adapter.capabilities }),
57
+ plan: (receipt, context) => adapter.plan.call(adapter, receipt, context)
58
+ });
59
+ adapters.set(adapter.name, registered);
60
+ return () => { if (adapters.get(adapter.name) === registered)
61
+ adapters.delete(adapter.name); };
62
+ }
8
63
  export function getTargetAdapter(target) {
9
64
  const adapter = adapters.get(target);
10
65
  if (adapter === undefined)
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/core/targets/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C,MAAM,QAAQ,GAAG,IAAI,GAAG,CAA+B;IACrD,CAAC,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC;IACjC,CAAC,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC;CAC5C,CAAC,CAAC;AAEH,MAAM,UAAU,gBAAgB,CAAC,MAAqB;IACpD,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,OAAO,KAAK,SAAS;QAAE,MAAM,IAAI,gBAAgB,CAAC,qCAAqC,MAAM,EAAE,CAAC,CAAC;IACrG,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/core/targets/registry.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../../src/core/targets/transaction.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AACtF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,sBAAsB,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC;IACrC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AA+SD,wBAAsB,qBAAqB,CAAC,SAAS,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiDxF;AAED,wBAAsB,qBAAqB,CAAC,SAAS,EAAE,kBAAkB,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAgFvG;AAED,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,SAAS,oBAAoB,EAAE,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CASpH"}
1
+ {"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../../src/core/targets/transaction.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AACtF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9C,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,sBAAsB,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC;IACrC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAoTD,wBAAsB,qBAAqB,CAAC,SAAS,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiDxF;AA+FD,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,kBAAkB,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAMjG;AAED,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,SAAS,oBAAoB,EAAE,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAiBpH"}
@@ -2,6 +2,8 @@ import { createHash } from "node:crypto";
2
2
  import { lstat, mkdir, readFile, readlink, rename, rm, rmdir, stat, symlink, writeFile } from "node:fs/promises";
3
3
  import path from "node:path";
4
4
  import { HarnessBrewError } from "../errors.js";
5
+ import { withTargetLock } from "../locks.js";
6
+ import { captureMissingParents, captureTransactionPath, markTransactionPath } from "../journal.js";
5
7
  function placementMetadata(input) {
6
8
  return {
7
9
  ...(input.scope === undefined ? {} : { scope: input.scope }),
@@ -133,6 +135,10 @@ async function createdParents(destination) {
133
135
  }
134
136
  async function cleanupParents(operation) {
135
137
  for (const directory of operation.createdDirectories) {
138
+ const relative = path.relative(directory, operation.destination);
139
+ if (!path.isAbsolute(directory) || relative === "" || relative === ".." || relative.startsWith(`..${path.sep}`)) {
140
+ throw new HarnessBrewError(`Unsafe created directory in operation ${operation.id}: ${directory}`);
141
+ }
136
142
  try {
137
143
  await rmdir(directory);
138
144
  }
@@ -148,8 +154,12 @@ async function assertDestinationAvailable(destination) {
148
154
  throw new HarnessBrewError(`Target path already exists: ${destination}`);
149
155
  }
150
156
  }
151
- async function applyOperation(input) {
157
+ async function applyOperationUnlocked(input) {
152
158
  const destination = path.resolve(input.destination);
159
+ const temporaryPath = `${destination}.${process.pid}.tmp`;
160
+ await captureMissingParents(destination);
161
+ await captureTransactionPath(destination);
162
+ await captureTransactionPath(temporaryPath);
153
163
  if (input.type !== "managed-block" && input.type !== "merge-config")
154
164
  await assertDestinationAvailable(destination);
155
165
  const directories = await createdParents(destination);
@@ -182,7 +192,6 @@ async function applyOperation(input) {
182
192
  if (input.type === "render-file") {
183
193
  if (input.content === undefined)
184
194
  throw new HarnessBrewError(`Missing content for render-file: ${input.id}`);
185
- const temporaryPath = `${destination}.${process.pid}.tmp`;
186
195
  await writeFile(temporaryPath, input.content, "utf8");
187
196
  await rename(temporaryPath, destination);
188
197
  return {
@@ -211,7 +220,6 @@ async function applyOperation(input) {
211
220
  }
212
221
  const block = managedBlock(input.marker, input.content);
213
222
  const prefix = before.length > 0 && !before.endsWith("\n") ? "\n" : "";
214
- const temporaryPath = `${destination}.${process.pid}.tmp`;
215
223
  await writeFile(temporaryPath, `${before}${prefix}${block}\n`, "utf8");
216
224
  await rename(temporaryPath, destination);
217
225
  return {
@@ -269,7 +277,6 @@ async function applyOperation(input) {
269
277
  installedDigest = digestContent(block);
270
278
  marker = input.marker;
271
279
  }
272
- const temporaryPath = `${destination}.${process.pid}.tmp`;
273
280
  await writeFile(temporaryPath, after, "utf8");
274
281
  await rename(temporaryPath, destination);
275
282
  return {
@@ -367,7 +374,10 @@ export async function verifyTargetOperation(operation) {
367
374
  throw new HarnessBrewError(`Installed target was modified: ${operation.destination}`);
368
375
  }
369
376
  }
370
- export async function removeTargetOperation(operation, force = false) {
377
+ async function removeTargetOperationUnlocked(operation, force = false) {
378
+ const temporaryPath = `${operation.destination}.${process.pid}.tmp`;
379
+ await captureTransactionPath(operation.destination);
380
+ await captureTransactionPath(temporaryPath);
371
381
  if (!force)
372
382
  await verifyTargetOperation(operation);
373
383
  if (operation.type === "merge-config") {
@@ -415,7 +425,6 @@ export async function removeTargetOperation(operation, force = false) {
415
425
  await rm(operation.destination, { force: true });
416
426
  }
417
427
  else {
418
- const temporaryPath = `${operation.destination}.${process.pid}.tmp`;
419
428
  await writeFile(temporaryPath, remaining, "utf8");
420
429
  await rename(temporaryPath, operation.destination);
421
430
  }
@@ -452,21 +461,48 @@ export async function removeTargetOperation(operation, force = false) {
452
461
  await rm(operation.destination, { force: true });
453
462
  }
454
463
  else {
455
- const temporaryPath = `${operation.destination}.${process.pid}.tmp`;
456
464
  await writeFile(temporaryPath, remaining, "utf8");
457
465
  await rename(temporaryPath, operation.destination);
458
466
  }
459
467
  await cleanupParents(operation);
460
468
  return;
461
469
  }
462
- await rm(operation.destination, { recursive: operation.type === "symlink-directory", force: true });
470
+ if (operation.type === "symlink-file" || operation.type === "symlink-directory") {
471
+ const metadata = await pathMetadata(operation.destination);
472
+ if (metadata === undefined)
473
+ return;
474
+ if (!metadata.isSymbolicLink()) {
475
+ if (force)
476
+ return;
477
+ throw new HarnessBrewError(`Installed target was modified: ${operation.destination}`);
478
+ }
479
+ await rm(operation.destination, { force: true });
480
+ }
481
+ else {
482
+ await rm(operation.destination, { force: true });
483
+ }
463
484
  await cleanupParents(operation);
464
485
  }
486
+ export function removeTargetOperation(operation, force = false) {
487
+ return withTargetLock(operation.destination, async () => {
488
+ await removeTargetOperationUnlocked(operation, force);
489
+ await markTransactionPath(operation.destination);
490
+ await markTransactionPath(`${operation.destination}.${process.pid}.tmp`);
491
+ });
492
+ }
465
493
  export async function executeTargetOperations(inputs) {
466
494
  const installed = [];
467
495
  try {
468
- for (const input of inputs)
469
- installed.push(await applyOperation(input));
496
+ for (const input of inputs) {
497
+ installed.push(await withTargetLock(input.destination, async () => {
498
+ const operation = await applyOperationUnlocked(input);
499
+ await markTransactionPath(operation.destination);
500
+ await markTransactionPath(`${operation.destination}.${process.pid}.tmp`);
501
+ for (const directory of operation.createdDirectories)
502
+ await markTransactionPath(directory);
503
+ return operation;
504
+ }));
505
+ }
470
506
  return installed;
471
507
  }
472
508
  catch (error) {