harnessbrew 0.4.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 (60) hide show
  1. package/CHANGELOG.md +83 -0
  2. package/LICENSE +21 -0
  3. package/README.md +266 -0
  4. package/dist/bin.d.ts +3 -0
  5. package/dist/bin.d.ts.map +1 -0
  6. package/dist/bin.js +4 -0
  7. package/dist/bin.js.map +1 -0
  8. package/dist/cli.d.ts +9 -0
  9. package/dist/cli.d.ts.map +1 -0
  10. package/dist/cli.js +242 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/core/bundle.d.ts +43 -0
  13. package/dist/core/bundle.d.ts.map +1 -0
  14. package/dist/core/bundle.js +195 -0
  15. package/dist/core/bundle.js.map +1 -0
  16. package/dist/core/errors.d.ts +4 -0
  17. package/dist/core/errors.d.ts.map +1 -0
  18. package/dist/core/errors.js +7 -0
  19. package/dist/core/errors.js.map +1 -0
  20. package/dist/core/formulas.d.ts +29 -0
  21. package/dist/core/formulas.d.ts.map +1 -0
  22. package/dist/core/formulas.js +185 -0
  23. package/dist/core/formulas.js.map +1 -0
  24. package/dist/core/git.d.ts +3 -0
  25. package/dist/core/git.d.ts.map +1 -0
  26. package/dist/core/git.js +36 -0
  27. package/dist/core/git.js.map +1 -0
  28. package/dist/core/installations.d.ts +38 -0
  29. package/dist/core/installations.d.ts.map +1 -0
  30. package/dist/core/installations.js +250 -0
  31. package/dist/core/installations.js.map +1 -0
  32. package/dist/core/paths.d.ts +8 -0
  33. package/dist/core/paths.d.ts.map +1 -0
  34. package/dist/core/paths.js +39 -0
  35. package/dist/core/paths.js.map +1 -0
  36. package/dist/core/state.d.ts +16 -0
  37. package/dist/core/state.d.ts.map +1 -0
  38. package/dist/core/state.js +43 -0
  39. package/dist/core/state.js.map +1 -0
  40. package/dist/core/taps.d.ts +16 -0
  41. package/dist/core/taps.d.ts.map +1 -0
  42. package/dist/core/taps.js +102 -0
  43. package/dist/core/taps.js.map +1 -0
  44. package/dist/core/targets.d.ts +11 -0
  45. package/dist/core/targets.d.ts.map +1 -0
  46. package/dist/core/targets.js +150 -0
  47. package/dist/core/targets.js.map +1 -0
  48. package/dist/core/upgrades.d.ts +14 -0
  49. package/dist/core/upgrades.d.ts.map +1 -0
  50. package/dist/core/upgrades.js +127 -0
  51. package/dist/core/upgrades.js.map +1 -0
  52. package/dist/index.d.ts +15 -0
  53. package/dist/index.d.ts.map +1 -0
  54. package/dist/index.js +9 -0
  55. package/dist/index.js.map +1 -0
  56. package/dist/version.d.ts +2 -0
  57. package/dist/version.d.ts.map +1 -0
  58. package/dist/version.js +2 -0
  59. package/dist/version.js.map +1 -0
  60. package/package.json +63 -0
@@ -0,0 +1,150 @@
1
+ import { createHash } from "node:crypto";
2
+ import { homedir } from "node:os";
3
+ import { lstat, mkdir, readFile, readlink, rm, stat, symlink } from "node:fs/promises";
4
+ import path from "node:path";
5
+ import { HarnessBrewError } from "./errors.js";
6
+ import { installFormula, listInstalled, readReceipt, uninstallFormula, writeReceipt } from "./installations.js";
7
+ import { parseCoordinate } from "./paths.js";
8
+ export const builtinTargets = ["openai-codex", "claude-code"];
9
+ function defaultRoot(target) {
10
+ return path.join(homedir(), target === "openai-codex" ? ".codex" : ".claude");
11
+ }
12
+ function extensionFor(entry) {
13
+ return path.extname(entry) || ".md";
14
+ }
15
+ export function targetDestination(receipt, target, root) {
16
+ const targetRoot = path.resolve(root ?? defaultRoot(target));
17
+ const [, , name] = parseCoordinate(receipt.coordinate);
18
+ const extension = extensionFor(receipt.entry);
19
+ if (receipt.kind === "skill")
20
+ return path.join(targetRoot, "skills", name, path.basename(receipt.entry));
21
+ if (target === "claude-code" && receipt.kind === "workflow") {
22
+ return path.join(targetRoot, "commands", `${name}${extension}`);
23
+ }
24
+ const directories = {
25
+ agent: "agents",
26
+ workflow: "workflows",
27
+ instruction: "rules",
28
+ prompt: "prompts",
29
+ mcp: "mcp",
30
+ adapter: "adapters"
31
+ };
32
+ const directory = directories[receipt.kind] ?? `${receipt.kind}s`;
33
+ return path.join(targetRoot, directory, `${name}${extension}`);
34
+ }
35
+ async function exists(filePath) {
36
+ try {
37
+ await stat(filePath);
38
+ return true;
39
+ }
40
+ catch (error) {
41
+ if (error.code === "ENOENT")
42
+ return false;
43
+ throw error;
44
+ }
45
+ }
46
+ async function sha256(filePath) {
47
+ return createHash("sha256").update(await readFile(filePath)).digest("hex");
48
+ }
49
+ async function assertDestinationAvailable(home, receipt, destination) {
50
+ const installed = await listInstalled(home);
51
+ const owner = installed.find((candidate) => candidate.links.some((link) => link.path === destination));
52
+ if (owner !== undefined && owner.coordinate !== receipt.coordinate) {
53
+ throw new HarnessBrewError(`Target path is owned by ${owner.coordinate}: ${destination}`);
54
+ }
55
+ if (await exists(destination)) {
56
+ throw new HarnessBrewError(`Target path already exists and is not managed by HarnessBrew: ${destination}`);
57
+ }
58
+ }
59
+ export async function linkFormula(home, nameOrCoordinate, target, options = {}) {
60
+ const installed = await listInstalled(home);
61
+ const matches = nameOrCoordinate.split("/").length === 3
62
+ ? installed.filter((receipt) => receipt.coordinate === nameOrCoordinate)
63
+ : installed.filter((receipt) => receipt.coordinate.endsWith(`/${nameOrCoordinate}`));
64
+ if (matches.length !== 1) {
65
+ throw new HarnessBrewError(matches.length === 0
66
+ ? `Formula is not installed: ${nameOrCoordinate}`
67
+ : `Installed formula name is ambiguous: ${nameOrCoordinate}`);
68
+ }
69
+ const receipt = matches[0];
70
+ if (!receipt.supportedTargets.includes(target)) {
71
+ throw new HarnessBrewError(`Formula ${receipt.coordinate} does not support target ${target}.`);
72
+ }
73
+ const existing = receipt.links.find((link) => link.target === target);
74
+ if (existing !== undefined) {
75
+ try {
76
+ if ((await lstat(existing.path)).isSymbolicLink() && path.resolve(path.dirname(existing.path), await readlink(existing.path)) === existing.source) {
77
+ return receipt;
78
+ }
79
+ }
80
+ catch {
81
+ // Report the broken managed destination through the standard conflict check.
82
+ }
83
+ }
84
+ const source = path.join(receipt.cellarPath, receipt.entry);
85
+ const destination = targetDestination(receipt, target, options.root);
86
+ await assertDestinationAvailable(home, receipt, destination);
87
+ await mkdir(path.dirname(destination), { recursive: true });
88
+ await symlink(source, destination, "file");
89
+ const link = { path: destination, source, target, sha256: await sha256(source) };
90
+ receipt.links.push(link);
91
+ if (!receipt.targets.includes(target))
92
+ receipt.targets.push(target);
93
+ try {
94
+ await writeReceipt(home, receipt);
95
+ }
96
+ catch (error) {
97
+ await rm(destination, { force: true });
98
+ throw error;
99
+ }
100
+ return receipt;
101
+ }
102
+ export async function unlinkFormula(home, nameOrCoordinate, target, force = false) {
103
+ const receipt = await readReceipt(home, nameOrCoordinate.split("/").length === 3
104
+ ? nameOrCoordinate
105
+ : (await listInstalled(home)).find((item) => item.coordinate.endsWith(`/${nameOrCoordinate}`))?.coordinate ?? nameOrCoordinate);
106
+ if (receipt === undefined)
107
+ throw new HarnessBrewError(`Formula is not installed: ${nameOrCoordinate}`);
108
+ const links = receipt.links.filter((link) => link.target === target);
109
+ if (links.length === 0)
110
+ throw new HarnessBrewError(`Formula is not linked to ${target}: ${receipt.coordinate}`);
111
+ for (const link of links) {
112
+ if (!force) {
113
+ try {
114
+ if (!(await lstat(link.path)).isSymbolicLink() || path.resolve(path.dirname(link.path), await readlink(link.path)) !== link.source) {
115
+ throw new Error("changed");
116
+ }
117
+ }
118
+ catch {
119
+ throw new HarnessBrewError(`Installed target was modified for ${receipt.coordinate}: ${link.path}`);
120
+ }
121
+ }
122
+ await rm(link.path, { force: true });
123
+ }
124
+ receipt.links = receipt.links.filter((link) => link.target !== target);
125
+ receipt.targets = receipt.targets.filter((installedTarget) => installedTarget !== target);
126
+ await writeReceipt(home, receipt);
127
+ return receipt;
128
+ }
129
+ export async function installForTarget(home, nameOrCoordinate, target, options = {}) {
130
+ const before = new Set((await listInstalled(home)).map((receipt) => receipt.coordinate));
131
+ const receipts = await installFormula(home, nameOrCoordinate);
132
+ const linked = [];
133
+ try {
134
+ for (const receipt of receipts) {
135
+ linked.push(await linkFormula(home, receipt.coordinate, target, options));
136
+ }
137
+ return linked;
138
+ }
139
+ catch (error) {
140
+ for (const receipt of linked.reverse()) {
141
+ await unlinkFormula(home, receipt.coordinate, target, true);
142
+ }
143
+ for (const receipt of receipts.reverse()) {
144
+ if (!before.has(receipt.coordinate))
145
+ await uninstallFormula(home, receipt.coordinate, { force: true });
146
+ }
147
+ throw error;
148
+ }
149
+ }
150
+ //# sourceMappingURL=targets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"targets.js","sourceRoot":"","sources":["../../src/core/targets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export interface OutdatedFormula {
2
+ coordinate: string;
3
+ installedCommit: string;
4
+ availableCommit?: string;
5
+ available: boolean;
6
+ }
7
+ export interface UpgradeResult {
8
+ coordinate: string;
9
+ before: string;
10
+ after: string;
11
+ }
12
+ export declare function findOutdated(home: string): Promise<OutdatedFormula[]>;
13
+ export declare function upgradeFormulas(home: string, requested?: string): Promise<UpgradeResult[]>;
14
+ //# sourceMappingURL=upgrades.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrades.d.ts","sourceRoot":"","sources":["../../src/core/upgrades.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAmB3E;AAiED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAoChG"}
@@ -0,0 +1,127 @@
1
+ import { mkdir, rm, symlink } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { HarnessBrewError } from "./errors.js";
4
+ import { loadCatalog } from "./formulas.js";
5
+ import { installCatalogFormula, listInstalled, uninstallFormula, verifyReceiptIntegrity, writeReceipt } from "./installations.js";
6
+ import { resolveReceiptPath } from "./paths.js";
7
+ import { linkFormula } from "./targets.js";
8
+ export async function findOutdated(home) {
9
+ const catalog = new Map((await loadCatalog(home)).map((formula) => [formula.coordinate, formula]));
10
+ const outdated = [];
11
+ for (const receipt of await listInstalled(home)) {
12
+ const formula = catalog.get(receipt.coordinate);
13
+ if (formula === undefined) {
14
+ outdated.push({ coordinate: receipt.coordinate, installedCommit: receipt.commit, available: false });
15
+ continue;
16
+ }
17
+ if (formula.commit !== receipt.commit) {
18
+ outdated.push({
19
+ coordinate: receipt.coordinate,
20
+ installedCommit: receipt.commit,
21
+ availableCommit: formula.commit,
22
+ available: true
23
+ });
24
+ }
25
+ }
26
+ return outdated;
27
+ }
28
+ function targetRootFromLink(receipt, link) {
29
+ if (receipt.kind === "skill")
30
+ return path.dirname(path.dirname(path.dirname(link.path)));
31
+ return path.dirname(path.dirname(link.path));
32
+ }
33
+ async function restoreReceipt(home, receipt) {
34
+ for (const link of receipt.links) {
35
+ await mkdir(path.dirname(link.path), { recursive: true });
36
+ await rm(link.path, { force: true });
37
+ await symlink(link.source, link.path, "file");
38
+ }
39
+ await writeReceipt(home, receipt);
40
+ }
41
+ async function upgradeOne(home, receipt, formula) {
42
+ await verifyReceiptIntegrity(receipt);
43
+ const originalLinks = [...receipt.links];
44
+ for (const link of originalLinks)
45
+ await rm(link.path, { force: true });
46
+ await rm(resolveReceiptPath(home, receipt.coordinate), { force: true });
47
+ let replacement;
48
+ try {
49
+ replacement = await installCatalogFormula(home, formula, receipt.requested);
50
+ for (const link of originalLinks) {
51
+ await linkFormula(home, replacement.coordinate, link.target, {
52
+ root: targetRootFromLink(receipt, link)
53
+ });
54
+ }
55
+ await rm(receipt.cellarPath, { recursive: true, force: true });
56
+ return { coordinate: receipt.coordinate, before: receipt.commit, after: formula.commit };
57
+ }
58
+ catch (error) {
59
+ if (replacement !== undefined) {
60
+ await uninstallFormula(home, replacement.coordinate, { force: true }).catch(() => undefined);
61
+ }
62
+ await restoreReceipt(home, receipt);
63
+ throw error;
64
+ }
65
+ }
66
+ function orderForUpgrade(formulas) {
67
+ const candidates = new Map(formulas.map((formula) => [formula.coordinate, formula]));
68
+ const visiting = new Set();
69
+ const visited = new Set();
70
+ const ordered = [];
71
+ function visit(formula) {
72
+ if (visiting.has(formula.coordinate))
73
+ throw new HarnessBrewError(`Dependency cycle detected during upgrade: ${formula.coordinate}`);
74
+ if (visited.has(formula.coordinate))
75
+ return;
76
+ visiting.add(formula.coordinate);
77
+ for (const dependency of formula.dependencies) {
78
+ const candidate = candidates.get(dependency);
79
+ if (candidate !== undefined)
80
+ visit(candidate);
81
+ }
82
+ visiting.delete(formula.coordinate);
83
+ visited.add(formula.coordinate);
84
+ ordered.push(formula);
85
+ }
86
+ formulas.forEach(visit);
87
+ return ordered;
88
+ }
89
+ export async function upgradeFormulas(home, requested) {
90
+ const installed = await listInstalled(home);
91
+ const catalog = await loadCatalog(home);
92
+ const installedByCoordinate = new Map(installed.map((receipt) => [receipt.coordinate, receipt]));
93
+ let selected = catalog.filter((formula) => {
94
+ const receipt = installedByCoordinate.get(formula.coordinate);
95
+ return receipt !== undefined && receipt.commit !== formula.commit;
96
+ });
97
+ if (requested !== undefined) {
98
+ const roots = requested.split("/").length === 3
99
+ ? catalog.filter((formula) => formula.coordinate === requested)
100
+ : catalog.filter((formula) => formula.name === requested);
101
+ if (roots.length !== 1) {
102
+ throw new HarnessBrewError(roots.length === 0 ? `Formula not found: ${requested}` : `Formula name is ambiguous: ${requested}`);
103
+ }
104
+ const closure = new Set();
105
+ const byCoordinate = new Map(catalog.map((formula) => [formula.coordinate, formula]));
106
+ function collect(formula) {
107
+ if (closure.has(formula.coordinate))
108
+ return;
109
+ closure.add(formula.coordinate);
110
+ formula.dependencies.forEach((dependency) => {
111
+ const dependencyFormula = byCoordinate.get(dependency);
112
+ if (dependencyFormula !== undefined)
113
+ collect(dependencyFormula);
114
+ });
115
+ }
116
+ collect(roots[0]);
117
+ selected = selected.filter((formula) => closure.has(formula.coordinate));
118
+ }
119
+ const results = [];
120
+ for (const formula of orderForUpgrade(selected)) {
121
+ const receipt = installedByCoordinate.get(formula.coordinate);
122
+ if (receipt !== undefined)
123
+ results.push(await upgradeOne(home, receipt, formula));
124
+ }
125
+ return results;
126
+ }
127
+ //# sourceMappingURL=upgrades.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrades.js","sourceRoot":"","sources":["../../src/core/upgrades.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export { runCli, type CliIO, type CliOptions } from "./cli.js";
2
+ export { addTap, listTaps, removeTap, updateTaps } from "./core/taps.js";
3
+ export { getFormula, loadCatalog, searchFormulas, validateTapRepository } from "./core/formulas.js";
4
+ export type { CatalogFormula, Formula, FormulaKind, FormulaSearchOptions } from "./core/formulas.js";
5
+ export { installFormula, listInstalled, readReceipt, resolveDependencies, uninstallFormula } from "./core/installations.js";
6
+ export type { InstallReceipt, InstalledFile, InstalledLink, UninstallOptions } from "./core/installations.js";
7
+ export { builtinTargets, installForTarget, linkFormula, targetDestination, unlinkFormula } from "./core/targets.js";
8
+ export type { BuiltinTarget, LinkOptions } from "./core/targets.js";
9
+ export { findOutdated, upgradeFormulas } from "./core/upgrades.js";
10
+ export type { OutdatedFormula, UpgradeResult } from "./core/upgrades.js";
11
+ export { bundleCleanup, bundleInstall, lockfilePath, readHarnessfile } from "./core/bundle.js";
12
+ export type { BundleCleanupResult, BundleOptions, HarnessAssetDeclaration, HarnessLock, HarnessTapDeclaration, Harnessfile } from "./core/bundle.js";
13
+ export type { TapRecord } from "./core/state.js";
14
+ export { VERSION } from "./version.js";
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AACpG,YAAY,EAAE,cAAc,EAAE,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AACrG,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC5H,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC9G,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACpH,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACnE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC/F,YAAY,EACV,mBAAmB,EACnB,aAAa,EACb,uBAAuB,EACvB,WAAW,EACX,qBAAqB,EACrB,WAAW,EACZ,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ export { runCli } from "./cli.js";
2
+ export { addTap, listTaps, removeTap, updateTaps } from "./core/taps.js";
3
+ export { getFormula, loadCatalog, searchFormulas, validateTapRepository } from "./core/formulas.js";
4
+ export { installFormula, listInstalled, readReceipt, resolveDependencies, uninstallFormula } from "./core/installations.js";
5
+ export { builtinTargets, installForTarget, linkFormula, targetDestination, unlinkFormula } from "./core/targets.js";
6
+ export { findOutdated, upgradeFormulas } from "./core/upgrades.js";
7
+ export { bundleCleanup, bundleInstall, lockfilePath, readHarnessfile } from "./core/bundle.js";
8
+ export { VERSION } from "./version.js";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAA+B,MAAM,UAAU,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEpG,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE5H,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEpH,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEnE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAU/F,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const VERSION = "0.4.0";
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,UAAU,CAAC"}
@@ -0,0 +1,2 @@
1
+ export const VERSION = "0.4.0";
2
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC"}
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "harnessbrew",
3
+ "version": "0.4.0",
4
+ "description": "A Git-native package manager for AI Agent assets.",
5
+ "type": "module",
6
+ "bin": {
7
+ "harnessbrew": "./dist/bin.js"
8
+ },
9
+ "main": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.js"
15
+ }
16
+ },
17
+ "files": [
18
+ "dist",
19
+ "README.md",
20
+ "CHANGELOG.md"
21
+ ],
22
+ "scripts": {
23
+ "build": "tsc -p tsconfig.json",
24
+ "build:test": "tsc -p tsconfig.test.json",
25
+ "start": "node ./dist/bin.js",
26
+ "test": "npm run build:test && node --test .test-dist/tests/*.test.js",
27
+ "test:package": "npm run build && node ./scripts/package-smoke.mjs",
28
+ "check": "npm run build && npm test && npm run test:package && npm pack --dry-run --cache .npm-cache",
29
+ "prepack": "npm run build"
30
+ },
31
+ "keywords": [
32
+ "agent",
33
+ "assets",
34
+ "skills",
35
+ "instructions",
36
+ "git",
37
+ "package-manager"
38
+ ],
39
+ "license": "MIT",
40
+ "repository": {
41
+ "type": "git",
42
+ "url": "git+https://github.com/anzihenry/HarnessBrew.git"
43
+ },
44
+ "homepage": "https://github.com/anzihenry/HarnessBrew#readme",
45
+ "bugs": {
46
+ "url": "https://github.com/anzihenry/HarnessBrew/issues"
47
+ },
48
+ "publishConfig": {
49
+ "access": "public",
50
+ "registry": "https://registry.npmjs.org/"
51
+ },
52
+ "packageManager": "npm@11.17.0",
53
+ "engines": {
54
+ "node": ">=20"
55
+ },
56
+ "devDependencies": {
57
+ "@types/node": "^22.14.0",
58
+ "typescript": "^7.0.2"
59
+ },
60
+ "dependencies": {
61
+ "yaml": "^2.9.0"
62
+ }
63
+ }