ruleshare 0.1.2 → 0.3.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/cli.js +33 -10
- package/dist/cli.js.map +1 -1
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +40 -0
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/addAll.d.ts +9 -0
- package/dist/commands/addAll.d.ts.map +1 -0
- package/dist/commands/addAll.js +52 -0
- package/dist/commands/addAll.js.map +1 -0
- package/dist/commands/addRule.test.d.ts +2 -0
- package/dist/commands/addRule.test.d.ts.map +1 -0
- package/dist/commands/addRule.test.js +27 -0
- package/dist/commands/addRule.test.js.map +1 -0
- package/dist/commands/addSource.test.d.ts +2 -0
- package/dist/commands/addSource.test.d.ts.map +1 -0
- package/dist/commands/addSource.test.js +25 -0
- package/dist/commands/addSource.test.js.map +1 -0
- package/dist/commands/index.d.ts +1 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +1 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +2 -3
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/remove.js +17 -5
- package/dist/commands/remove.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +6 -6
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +52 -13
- package/dist/commands/sync.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +12 -2
- package/dist/config.js.map +1 -1
- package/dist/fetcher.d.ts +8 -1
- package/dist/fetcher.d.ts.map +1 -1
- package/dist/fetcher.js +37 -6
- package/dist/fetcher.js.map +1 -1
- package/dist/resolver.alias.test.d.ts +2 -0
- package/dist/resolver.alias.test.d.ts.map +1 -0
- package/dist/resolver.alias.test.js +33 -0
- package/dist/resolver.alias.test.js.map +1 -0
- package/dist/resolver.d.ts +1 -0
- package/dist/resolver.d.ts.map +1 -1
- package/dist/resolver.github.test.d.ts +2 -0
- package/dist/resolver.github.test.d.ts.map +1 -0
- package/dist/resolver.github.test.js +27 -0
- package/dist/resolver.github.test.js.map +1 -0
- package/dist/resolver.js +17 -6
- package/dist/resolver.js.map +1 -1
- package/dist/resolver.url.test.d.ts +2 -0
- package/dist/resolver.url.test.d.ts.map +1 -0
- package/dist/resolver.url.test.js +22 -0
- package/dist/resolver.url.test.js.map +1 -0
- package/dist/types.d.ts +8 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +6 -3
package/dist/cli.js
CHANGED
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { init, addRule, addSource, addAll, sync, status, list, remove, } from "./commands/index.js";
|
|
6
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
const pkg = JSON.parse(readFileSync(join(__dirname, "..", "package.json"), "utf-8"));
|
|
8
|
+
const VERSION = pkg.version;
|
|
3
9
|
const commandMap = {
|
|
4
10
|
init: async () => { await init(); },
|
|
5
11
|
add: handleAdd,
|
|
12
|
+
"add-all": handleAddAll,
|
|
6
13
|
sync: handleSync,
|
|
7
14
|
update: async () => { await sync({ force: true }); },
|
|
8
15
|
status: async () => { await status(); },
|
|
@@ -12,7 +19,10 @@ const commandMap = {
|
|
|
12
19
|
rm: handleRemove,
|
|
13
20
|
};
|
|
14
21
|
function isHelpCommand(command) {
|
|
15
|
-
return !command || command === "help" || command === "--help";
|
|
22
|
+
return !command || command === "help" || command === "--help" || command === "-h";
|
|
23
|
+
}
|
|
24
|
+
function isVersionCommand(command) {
|
|
25
|
+
return command === "--version" || command === "-v";
|
|
16
26
|
}
|
|
17
27
|
async function executeCommand(command, args) {
|
|
18
28
|
const handler = commandMap[command];
|
|
@@ -38,10 +48,17 @@ async function main() {
|
|
|
38
48
|
printHelp();
|
|
39
49
|
return { exitCode: 0 };
|
|
40
50
|
}
|
|
51
|
+
if (isVersionCommand(command)) {
|
|
52
|
+
console.log(`ruleshare ${VERSION}`);
|
|
53
|
+
return { exitCode: 0 };
|
|
54
|
+
}
|
|
41
55
|
return executeCommand(command, args.slice(1));
|
|
42
56
|
}
|
|
43
57
|
async function handleAdd(args) {
|
|
44
|
-
if (args[0] === "source"
|
|
58
|
+
if (args[0] === "source") {
|
|
59
|
+
if (args.length < 3) {
|
|
60
|
+
throw new Error("Usage: ruleshare add source <alias> <github:owner/repo>");
|
|
61
|
+
}
|
|
45
62
|
await addSource({ alias: args[1], source: args[2] });
|
|
46
63
|
return;
|
|
47
64
|
}
|
|
@@ -49,21 +66,25 @@ async function handleAdd(args) {
|
|
|
49
66
|
await addRule({ name: args[0], source: args[1] });
|
|
50
67
|
return;
|
|
51
68
|
}
|
|
52
|
-
|
|
53
|
-
|
|
69
|
+
throw new Error("Usage: ruleshare add <name> <source>\n" +
|
|
70
|
+
" ruleshare add source <alias> <github:owner/repo>");
|
|
54
71
|
}
|
|
55
72
|
async function handleSync(args) {
|
|
56
73
|
const force = args.includes("--force") || args.includes("-f");
|
|
57
|
-
console.log("Syncing rules...");
|
|
58
74
|
await sync({ force });
|
|
59
75
|
}
|
|
60
76
|
async function handleRemove(args) {
|
|
61
77
|
if (args.length < 1) {
|
|
62
|
-
|
|
63
|
-
return;
|
|
78
|
+
throw new Error("Usage: ruleshare remove <name>");
|
|
64
79
|
}
|
|
65
80
|
await remove({ name: args[0] });
|
|
66
81
|
}
|
|
82
|
+
async function handleAddAll(args) {
|
|
83
|
+
if (args.length < 1) {
|
|
84
|
+
throw new Error("Usage: ruleshare add-all <source>");
|
|
85
|
+
}
|
|
86
|
+
await addAll({ source: args[0] });
|
|
87
|
+
}
|
|
67
88
|
function printHelp() {
|
|
68
89
|
console.log(`
|
|
69
90
|
ruleshare - Sync Claude Code rules from remote sources
|
|
@@ -75,6 +96,7 @@ Commands:
|
|
|
75
96
|
init Create shared.json config file
|
|
76
97
|
add <name> <source> Add a rule
|
|
77
98
|
add source <alias> <source> Add a source alias
|
|
99
|
+
add-all <source> Add all .md files from a source
|
|
78
100
|
sync [--force] Download rules to .claude/rules/shared/
|
|
79
101
|
update Force update all rules
|
|
80
102
|
status Check for outdated rules
|
|
@@ -83,8 +105,9 @@ Commands:
|
|
|
83
105
|
|
|
84
106
|
Examples:
|
|
85
107
|
ruleshare init
|
|
86
|
-
ruleshare add source
|
|
87
|
-
ruleshare add typescript
|
|
108
|
+
ruleshare add source kc github:kevincrabbe/kc-rules
|
|
109
|
+
ruleshare add typescript kc:typescript.md
|
|
110
|
+
ruleshare add-all kc:
|
|
88
111
|
ruleshare sync
|
|
89
112
|
`);
|
|
90
113
|
}
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EACL,IAAI,EACJ,OAAO,EACP,SAAS,EACT,IAAI,EACJ,MAAM,EACN,IAAI,EACJ,MAAM,GACP,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAIA,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,KAAK,aAAa,GAAG;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,wBAAsB,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAevE;AAoCD,KAAK,aAAa,GAAG;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,KAAK,eAAe,GAAG;IACrB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,wBAAsB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC,CAmB7E"}
|
package/dist/commands/add.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { readConfig, writeConfig, createEmptyConfig } from "../config.js";
|
|
2
|
+
const RESERVED_ALIASES = ["github", "http", "https", "file"];
|
|
2
3
|
export async function addRule(args) {
|
|
3
4
|
const { name, source } = args;
|
|
5
|
+
validateRuleName({ name });
|
|
4
6
|
let config = await readConfig();
|
|
5
7
|
if (!config) {
|
|
6
8
|
config = createEmptyConfig();
|
|
@@ -10,8 +12,33 @@ export async function addRule(args) {
|
|
|
10
12
|
console.log(`Added rule "${name}" -> ${source}`);
|
|
11
13
|
return { added: true, name };
|
|
12
14
|
}
|
|
15
|
+
function validateRuleName(args) {
|
|
16
|
+
const { name } = args;
|
|
17
|
+
checkNameNotEmpty({ name });
|
|
18
|
+
checkNameChars({ name });
|
|
19
|
+
checkNamePrefix({ name });
|
|
20
|
+
}
|
|
21
|
+
function checkNameNotEmpty(args) {
|
|
22
|
+
if (!args.name || args.name.trim() === "") {
|
|
23
|
+
throw new Error("Rule name cannot be empty");
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function checkNameChars(args) {
|
|
27
|
+
const invalidChars = /[/\\:*?"<>|.]/;
|
|
28
|
+
if (invalidChars.test(args.name) || args.name.includes("..")) {
|
|
29
|
+
throw new Error(`Rule name "${args.name}" contains invalid characters. ` +
|
|
30
|
+
`Avoid: / \\ : * ? " < > | .`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function checkNamePrefix(args) {
|
|
34
|
+
const firstChar = args.name[0];
|
|
35
|
+
if (firstChar === "." || firstChar === "-") {
|
|
36
|
+
throw new Error(`Rule name cannot start with "${firstChar}"`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
13
39
|
export async function addSource(args) {
|
|
14
40
|
const { alias, source } = args;
|
|
41
|
+
validateAliasName({ alias });
|
|
15
42
|
let config = await readConfig();
|
|
16
43
|
if (!config) {
|
|
17
44
|
config = createEmptyConfig();
|
|
@@ -24,4 +51,17 @@ export async function addSource(args) {
|
|
|
24
51
|
console.log(`Added source alias "${alias}" -> ${source}`);
|
|
25
52
|
return { added: true, alias };
|
|
26
53
|
}
|
|
54
|
+
function validateAliasName(args) {
|
|
55
|
+
const { alias } = args;
|
|
56
|
+
if (!alias || alias.trim() === "") {
|
|
57
|
+
throw new Error("Alias name cannot be empty");
|
|
58
|
+
}
|
|
59
|
+
if (RESERVED_ALIASES.includes(alias.toLowerCase())) {
|
|
60
|
+
throw new Error(`"${alias}" is a reserved name. ` +
|
|
61
|
+
`Cannot use: ${RESERVED_ALIASES.join(", ")}`);
|
|
62
|
+
}
|
|
63
|
+
if (alias.includes(":")) {
|
|
64
|
+
throw new Error("Alias name cannot contain ':'");
|
|
65
|
+
}
|
|
66
|
+
}
|
|
27
67
|
//# sourceMappingURL=add.js.map
|
package/dist/commands/add.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addAll.d.ts","sourceRoot":"","sources":["../../src/commands/addAll.ts"],"names":[],"mappings":"AAIA,KAAK,UAAU,GAAG;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,KAAK,YAAY,GAAG;IAClB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC;AAEF,wBAAsB,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,CAmCpE"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { readConfig, writeConfig, createEmptyConfig } from "../config.js";
|
|
2
|
+
import { listFiles } from "../fetcher.js";
|
|
3
|
+
import { resolveSource } from "../resolver.js";
|
|
4
|
+
export async function addAll(args) {
|
|
5
|
+
const { source } = args;
|
|
6
|
+
let config = await readConfig();
|
|
7
|
+
if (!config) {
|
|
8
|
+
config = createEmptyConfig();
|
|
9
|
+
}
|
|
10
|
+
const { resolved, originalSource } = resolveSource({ source, config });
|
|
11
|
+
if (resolved.type !== "github") {
|
|
12
|
+
throw new Error("add-all only supports GitHub sources");
|
|
13
|
+
}
|
|
14
|
+
const { files } = await listFiles({
|
|
15
|
+
owner: resolved.owner,
|
|
16
|
+
repo: resolved.repo,
|
|
17
|
+
path: resolved.path || "",
|
|
18
|
+
ref: resolved.ref,
|
|
19
|
+
});
|
|
20
|
+
const mdFiles = files.filter((f) => f.type === "file" && f.name.endsWith(".md"));
|
|
21
|
+
if (mdFiles.length === 0) {
|
|
22
|
+
console.log("No .md files found in source");
|
|
23
|
+
return { added: [] };
|
|
24
|
+
}
|
|
25
|
+
const added = addFilesToConfig({ mdFiles, originalSource, config });
|
|
26
|
+
await writeConfig(config);
|
|
27
|
+
console.log(`Added ${added.length} rules:`);
|
|
28
|
+
added.forEach((name) => console.log(` ${name}`));
|
|
29
|
+
return { added };
|
|
30
|
+
}
|
|
31
|
+
function addFilesToConfig(args) {
|
|
32
|
+
const { mdFiles, originalSource, config } = args;
|
|
33
|
+
const added = [];
|
|
34
|
+
for (const file of mdFiles) {
|
|
35
|
+
const name = file.name.replace(/\.md$/, "");
|
|
36
|
+
const ruleSource = buildRuleSource({ originalSource, fileName: file.name });
|
|
37
|
+
config.rules[name] = ruleSource;
|
|
38
|
+
added.push(name);
|
|
39
|
+
}
|
|
40
|
+
return added;
|
|
41
|
+
}
|
|
42
|
+
function buildRuleSource(args) {
|
|
43
|
+
const { originalSource, fileName } = args;
|
|
44
|
+
if (originalSource.endsWith(":")) {
|
|
45
|
+
return `${originalSource}${fileName}`;
|
|
46
|
+
}
|
|
47
|
+
if (originalSource.includes(":") && !originalSource.includes("/")) {
|
|
48
|
+
return `${originalSource}/${fileName}`;
|
|
49
|
+
}
|
|
50
|
+
return `${originalSource}/${fileName}`;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=addAll.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addAll.js","sourceRoot":"","sources":["../../src/commands/addAll.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addRule.test.d.ts","sourceRoot":"","sources":["../../src/commands/addRule.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from "vitest";
|
|
2
|
+
import { addRule } from "./add.js";
|
|
3
|
+
vi.mock("../config.js", () => ({
|
|
4
|
+
readConfig: vi.fn(),
|
|
5
|
+
writeConfig: vi.fn(),
|
|
6
|
+
createEmptyConfig: () => ({ sources: {}, rules: {} }),
|
|
7
|
+
}));
|
|
8
|
+
describe("addRule - name validation", () => {
|
|
9
|
+
it("should reject empty names", async () => {
|
|
10
|
+
const promise = addRule({ name: "", source: "test:file.md" });
|
|
11
|
+
await expect(promise).rejects.toThrow("Rule name cannot be empty");
|
|
12
|
+
});
|
|
13
|
+
it.each([
|
|
14
|
+
["path/to/file", "invalid characters"],
|
|
15
|
+
["path\\file", "invalid characters"],
|
|
16
|
+
[".hidden", "invalid characters"],
|
|
17
|
+
["test:name", "invalid characters"],
|
|
18
|
+
])("should reject name '%s'", async (name, expectedError) => {
|
|
19
|
+
const promise = addRule({ name, source: "test:file.md" });
|
|
20
|
+
await expect(promise).rejects.toThrow(expectedError);
|
|
21
|
+
});
|
|
22
|
+
it("should reject names starting with dash", async () => {
|
|
23
|
+
const promise = addRule({ name: "-flag", source: "test:file.md" });
|
|
24
|
+
await expect(promise).rejects.toThrow('cannot start with "-"');
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
//# sourceMappingURL=addRule.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addRule.test.js","sourceRoot":"","sources":["../../src/commands/addRule.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAEnC,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7B,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;IACnB,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE;IACpB,iBAAiB,EAAE,GAAW,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;CAC9D,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QACzC,MAAM,OAAO,GAAG,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;QAC9D,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC;QACN,CAAC,cAAc,EAAE,oBAAoB,CAAC;QACtC,CAAC,YAAY,EAAE,oBAAoB,CAAC;QACpC,CAAC,SAAS,EAAE,oBAAoB,CAAC;QACjC,CAAC,WAAW,EAAE,oBAAoB,CAAC;KACpC,CAAC,CAAC,yBAAyB,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE;QAC1D,MAAM,OAAO,GAAG,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;QAC1D,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,OAAO,GAAG,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;QACnE,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addSource.test.d.ts","sourceRoot":"","sources":["../../src/commands/addSource.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from "vitest";
|
|
2
|
+
import { addSource } from "./add.js";
|
|
3
|
+
vi.mock("../config.js", () => ({
|
|
4
|
+
readConfig: vi.fn(),
|
|
5
|
+
writeConfig: vi.fn(),
|
|
6
|
+
createEmptyConfig: () => ({ sources: {}, rules: {} }),
|
|
7
|
+
}));
|
|
8
|
+
describe("addSource - alias validation", () => {
|
|
9
|
+
it("should reject empty aliases", async () => {
|
|
10
|
+
const promise = addSource({ alias: "", source: "github:owner/repo" });
|
|
11
|
+
await expect(promise).rejects.toThrow("Alias name cannot be empty");
|
|
12
|
+
});
|
|
13
|
+
it.each([
|
|
14
|
+
["github", "reserved name"],
|
|
15
|
+
["https", "reserved name"],
|
|
16
|
+
])("should reject reserved alias '%s'", async (alias, expectedError) => {
|
|
17
|
+
const promise = addSource({ alias, source: "github:owner/repo" });
|
|
18
|
+
await expect(promise).rejects.toThrow(expectedError);
|
|
19
|
+
});
|
|
20
|
+
it("should reject aliases with colons", async () => {
|
|
21
|
+
const promise = addSource({ alias: "my:alias", source: "github:owner/repo" });
|
|
22
|
+
await expect(promise).rejects.toThrow("cannot contain ':'");
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
//# sourceMappingURL=addSource.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addSource.test.js","sourceRoot":"","sources":["../../src/commands/addSource.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7B,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;IACnB,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE;IACpB,iBAAiB,EAAE,GAAW,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;CAC9D,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC3C,MAAM,OAAO,GAAG,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC,CAAC;QACtE,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC;QACN,CAAC,QAAQ,EAAE,eAAe,CAAC;QAC3B,CAAC,OAAO,EAAE,eAAe,CAAC;KAC3B,CAAC,CAAC,mCAAmC,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE;QACrE,MAAM,OAAO,GAAG,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC,CAAC;QAClE,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,OAAO,GAAG,SAAS,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC,CAAC;QAC9E,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/commands/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/commands/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAEA,KAAK,SAAS,GAAG;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,KAAK,WAAW,GAAG;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,KAAK,UAAU,GAAG;IAChB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB,CAAC;AAEF,wBAAsB,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAEA,KAAK,SAAS,GAAG;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,KAAK,WAAW,GAAG;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,KAAK,UAAU,GAAG;IAChB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB,CAAC;AAEF,wBAAsB,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC,CAwBhD"}
|
package/dist/commands/list.js
CHANGED
|
@@ -2,8 +2,7 @@ import { readConfig, readLock } from "../config.js";
|
|
|
2
2
|
export async function list() {
|
|
3
3
|
const config = await readConfig();
|
|
4
4
|
if (!config) {
|
|
5
|
-
|
|
6
|
-
return { rules: [], sources: [] };
|
|
5
|
+
throw new Error("No shared.json found. Run `ruleshare init` first.");
|
|
7
6
|
}
|
|
8
7
|
const lock = await readLock();
|
|
9
8
|
const rules = Object.entries(config.rules).map(([name, source]) => ({
|
|
@@ -35,7 +34,7 @@ function printRules(args) {
|
|
|
35
34
|
return;
|
|
36
35
|
console.log("\nRules:");
|
|
37
36
|
for (const { name, source, synced } of rules) {
|
|
38
|
-
const marker = synced ? "
|
|
37
|
+
const marker = synced ? "[x]" : "[ ]";
|
|
39
38
|
console.log(` ${marker} ${name}: ${source}`);
|
|
40
39
|
}
|
|
41
40
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAkBpD,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAkBpD,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,QAAQ,EAAE,CAAC;IAE9B,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QAClE,IAAI;QACJ,MAAM;QACN,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC;KAC5B,CAAC,CAAC,CAAC;IAEJ,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1E,KAAK;QACL,GAAG;KACJ,CAAC,CAAC,CAAC;IAEJ,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1B,UAAU,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACtB,iBAAiB,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAEtC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAC5B,CAAC;AAMD,SAAS,YAAY,CAAC,IAAsB;IAC1C,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IACzB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAEjC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC1B,KAAK,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,OAAO,EAAE,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,KAAK,GAAG,EAAE,CAAC,CAAC;IACpC,CAAC;AACH,CAAC;AAMD,SAAS,UAAU,CAAC,IAAoB;IACtC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IACvB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAE/B,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxB,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC,CAAC;IAChD,CAAC;AACH,CAAC;AAOD,SAAS,iBAAiB,CAAC,IAAoB;IAC7C,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IACnD,CAAC;AACH,CAAC"}
|
package/dist/commands/remove.js
CHANGED
|
@@ -6,13 +6,12 @@ export async function remove(args) {
|
|
|
6
6
|
const { name } = args;
|
|
7
7
|
const config = await readConfig();
|
|
8
8
|
if (!config) {
|
|
9
|
-
|
|
10
|
-
return { removed: false, name };
|
|
9
|
+
throw new Error("No shared.json found.");
|
|
11
10
|
}
|
|
12
11
|
if (!config.rules[name]) {
|
|
13
|
-
|
|
14
|
-
return { removed: false, name };
|
|
12
|
+
throw new Error(`Rule "${name}" not found.`);
|
|
15
13
|
}
|
|
14
|
+
const source = config.rules[name];
|
|
16
15
|
delete config.rules[name];
|
|
17
16
|
await writeConfig(config);
|
|
18
17
|
const lock = await readLock();
|
|
@@ -20,11 +19,24 @@ export async function remove(args) {
|
|
|
20
19
|
delete lock.rules[name];
|
|
21
20
|
await writeLock(lock);
|
|
22
21
|
}
|
|
23
|
-
const
|
|
22
|
+
const extension = getExtension({ source });
|
|
23
|
+
const filePath = join(getSharedDir(), `${name}${extension}`);
|
|
24
24
|
if (existsSync(filePath)) {
|
|
25
25
|
await unlink(filePath);
|
|
26
26
|
}
|
|
27
27
|
console.log(`Removed rule "${name}"`);
|
|
28
28
|
return { removed: true, name };
|
|
29
29
|
}
|
|
30
|
+
function getExtension(args) {
|
|
31
|
+
const { source } = args;
|
|
32
|
+
const lastDot = source.lastIndexOf(".");
|
|
33
|
+
const lastSlash = source.lastIndexOf("/");
|
|
34
|
+
const lastAt = source.lastIndexOf("@");
|
|
35
|
+
const pathEnd = lastAt > lastSlash ? lastAt : source.length;
|
|
36
|
+
const dotInPath = lastDot > lastSlash && lastDot < pathEnd;
|
|
37
|
+
if (!dotInPath) {
|
|
38
|
+
return ".md";
|
|
39
|
+
}
|
|
40
|
+
return source.substring(lastDot, pathEnd);
|
|
41
|
+
}
|
|
30
42
|
//# sourceMappingURL=remove.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remove.js","sourceRoot":"","sources":["../../src/commands/remove.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,UAAU,EACV,WAAW,EACX,QAAQ,EACR,SAAS,EACT,YAAY,GACb,MAAM,cAAc,CAAC;AAWtB,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAgB;IAC3C,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IAEtB,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,
|
|
1
|
+
{"version":3,"file":"remove.js","sourceRoot":"","sources":["../../src/commands/remove.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,UAAU,EACV,WAAW,EACX,QAAQ,EACR,SAAS,EACT,YAAY,GACb,MAAM,cAAc,CAAC;AAWtB,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAgB;IAC3C,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IAEtB,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,cAAc,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;IAE1B,MAAM,IAAI,GAAG,MAAM,QAAQ,EAAE,CAAC;IAC9B,IAAI,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxB,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAED,MAAM,SAAS,GAAG,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,GAAG,IAAI,GAAG,SAAS,EAAE,CAAC,CAAC;IAC7D,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,GAAG,CAAC,CAAC;IACtC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACjC,CAAC;AAMD,SAAS,YAAY,CAAC,IAAsB;IAC1C,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACxB,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;IAC5D,MAAM,SAAS,GAAG,OAAO,GAAG,SAAS,IAAI,OAAO,GAAG,OAAO,CAAC;IAC3D,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAA4B,MAAM,aAAa,CAAC;AAEzE,KAAK,YAAY,GAAG;IAClB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,wBAAsB,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC,
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAA4B,MAAM,aAAa,CAAC;AAEzE,KAAK,YAAY,GAAG;IAClB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,wBAAsB,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC,CAiBpD"}
|
package/dist/commands/status.js
CHANGED
|
@@ -4,13 +4,11 @@ import { checkForUpdate } from "../fetcher.js";
|
|
|
4
4
|
export async function status() {
|
|
5
5
|
const config = await readConfig();
|
|
6
6
|
if (!config) {
|
|
7
|
-
|
|
8
|
-
return { entries: [], hasOutdated: false };
|
|
7
|
+
throw new Error("No shared.json found. Run `ruleshare init` first.");
|
|
9
8
|
}
|
|
10
9
|
const lock = await readLock();
|
|
11
10
|
if (!lock) {
|
|
12
|
-
|
|
13
|
-
return { entries: [], hasOutdated: false };
|
|
11
|
+
throw new Error("No lock file. Run `ruleshare sync` first.");
|
|
14
12
|
}
|
|
15
13
|
const entries = await collectStatusEntries({ config, lock });
|
|
16
14
|
const hasOutdated = entries.some((e) => e.isOutdated);
|
|
@@ -60,12 +58,14 @@ async function checkRemoteStatus(args) {
|
|
|
60
58
|
source,
|
|
61
59
|
};
|
|
62
60
|
}
|
|
63
|
-
catch {
|
|
61
|
+
catch (error) {
|
|
62
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
63
|
+
console.error(` ${name}: failed to check - ${message}`);
|
|
64
64
|
return {
|
|
65
65
|
name,
|
|
66
66
|
currentSha: lockEntry.sha.substring(0, 8),
|
|
67
67
|
latestSha: "error",
|
|
68
|
-
isOutdated:
|
|
68
|
+
isOutdated: true,
|
|
69
69
|
source,
|
|
70
70
|
};
|
|
71
71
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAQ/C,MAAM,CAAC,KAAK,UAAU,MAAM;IAC1B,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,UAAU,EAA4B,MAAM,aAAa,CAAC;AAExE,KAAK,QAAQ,GAAG;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,KAAK,UAAU,GAAG;IAChB,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB,CAAC;AAEF,wBAAsB,IAAI,CAAC,IAAI,GAAE,QAAa,GAAG,OAAO,CAAC,UAAU,CAAC,CAgBnE"}
|
package/dist/commands/sync.js
CHANGED
|
@@ -5,48 +5,87 @@ import { resolveSource } from "../resolver.js";
|
|
|
5
5
|
import { fetchContent } from "../fetcher.js";
|
|
6
6
|
export async function sync(args = {}) {
|
|
7
7
|
const { force = false } = args;
|
|
8
|
+
const config = await loadAndValidateConfig();
|
|
9
|
+
const ruleEntries = Object.entries(config.rules);
|
|
10
|
+
if (ruleEntries.length === 0) {
|
|
11
|
+
console.log("No rules configured. Use `ruleshare add` to add rules.");
|
|
12
|
+
return { results: [] };
|
|
13
|
+
}
|
|
14
|
+
console.log("Syncing rules...");
|
|
15
|
+
const results = await syncAllRules({ ruleEntries, config, force });
|
|
16
|
+
printSummary({ results });
|
|
17
|
+
return { results };
|
|
18
|
+
}
|
|
19
|
+
async function loadAndValidateConfig() {
|
|
8
20
|
const config = await readConfig();
|
|
9
21
|
if (!config) {
|
|
10
|
-
|
|
11
|
-
return { results: [] };
|
|
22
|
+
throw new Error("No shared.json found. Run `ruleshare init` first.");
|
|
12
23
|
}
|
|
24
|
+
return config;
|
|
25
|
+
}
|
|
26
|
+
async function syncAllRules(args) {
|
|
27
|
+
const { ruleEntries, config, force } = args;
|
|
13
28
|
const lock = (await readLock()) || createEmptyLock();
|
|
14
29
|
const sharedDir = getSharedDir();
|
|
15
30
|
await mkdir(sharedDir, { recursive: true });
|
|
16
31
|
const results = [];
|
|
17
|
-
for (const [name, source] of
|
|
18
|
-
const result = await syncRule({ name, source, lock, sharedDir, force });
|
|
32
|
+
for (const [name, source] of ruleEntries) {
|
|
33
|
+
const result = await syncRule({ name, source, lock, sharedDir, force, config });
|
|
19
34
|
results.push(result);
|
|
20
35
|
}
|
|
21
36
|
await writeLock(lock);
|
|
22
|
-
return
|
|
37
|
+
return results;
|
|
23
38
|
}
|
|
24
39
|
async function syncRule(args) {
|
|
25
|
-
const { name, source, lock, sharedDir, force } = args;
|
|
26
40
|
try {
|
|
27
|
-
return await attemptSync(
|
|
41
|
+
return await attemptSync(args);
|
|
28
42
|
}
|
|
29
43
|
catch (error) {
|
|
30
44
|
const message = error instanceof Error ? error.message : String(error);
|
|
31
|
-
console.error(` ${name}: error - ${message}`);
|
|
32
|
-
return { name, status: "error", error: message };
|
|
45
|
+
console.error(` ${args.name}: error - ${message}`);
|
|
46
|
+
return { name: args.name, status: "error", error: message };
|
|
33
47
|
}
|
|
34
48
|
}
|
|
35
49
|
async function attemptSync(args) {
|
|
36
|
-
const { name, source, lock, sharedDir, force } = args;
|
|
37
|
-
const
|
|
38
|
-
const resolved = resolveSource({ source, config: config });
|
|
50
|
+
const { name, source, lock, sharedDir, force, config } = args;
|
|
51
|
+
const resolved = resolveSource({ source, config });
|
|
39
52
|
const { content, sha } = await fetchContent({ resolved: resolved.resolved });
|
|
40
53
|
const existingEntry = lock.rules[name];
|
|
41
54
|
if (existingEntry?.sha === sha && !force) {
|
|
42
55
|
console.log(` ${name}: unchanged`);
|
|
43
56
|
return { name, status: "unchanged" };
|
|
44
57
|
}
|
|
45
|
-
const
|
|
58
|
+
const extension = getExtension({ source: resolved.resolved.path });
|
|
59
|
+
const filePath = join(sharedDir, `${name}${extension}`);
|
|
46
60
|
await writeFile(filePath, content, "utf-8");
|
|
47
61
|
lock.rules[name] = { source, sha, updated: new Date().toISOString() };
|
|
48
62
|
const status = existingEntry ? "updated" : "created";
|
|
49
63
|
console.log(` ${name}: ${status}`);
|
|
50
64
|
return { name, status };
|
|
51
65
|
}
|
|
66
|
+
function getExtension(args) {
|
|
67
|
+
const { source } = args;
|
|
68
|
+
const lastDot = source.lastIndexOf(".");
|
|
69
|
+
if (lastDot === -1 || lastDot < source.lastIndexOf("/")) {
|
|
70
|
+
return ".md";
|
|
71
|
+
}
|
|
72
|
+
return source.substring(lastDot);
|
|
73
|
+
}
|
|
74
|
+
function printSummary(args) {
|
|
75
|
+
const { results } = args;
|
|
76
|
+
const created = results.filter((r) => r.status === "created").length;
|
|
77
|
+
const updated = results.filter((r) => r.status === "updated").length;
|
|
78
|
+
const unchanged = results.filter((r) => r.status === "unchanged").length;
|
|
79
|
+
const errors = results.filter((r) => r.status === "error").length;
|
|
80
|
+
const parts = [];
|
|
81
|
+
if (created > 0)
|
|
82
|
+
parts.push(`${created} created`);
|
|
83
|
+
if (updated > 0)
|
|
84
|
+
parts.push(`${updated} updated`);
|
|
85
|
+
if (unchanged > 0)
|
|
86
|
+
parts.push(`${unchanged} unchanged`);
|
|
87
|
+
if (errors > 0)
|
|
88
|
+
parts.push(`${errors} failed`);
|
|
89
|
+
console.log(`Done: ${parts.join(", ")}`);
|
|
90
|
+
}
|
|
52
91
|
//# sourceMappingURL=sync.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,UAAU,EACV,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,eAAe,GAChB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAW7C,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAAiB,EAAE;IAC5C,MAAM,EAAE,KAAK,GAAG,KAAK,EAAE,GAAG,IAAI,CAAC;IAE/B,MAAM,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,UAAU,EACV,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,eAAe,GAChB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAW7C,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAAiB,EAAE;IAC5C,MAAM,EAAE,KAAK,GAAG,KAAK,EAAE,GAAG,IAAI,CAAC;IAE/B,MAAM,MAAM,GAAG,MAAM,qBAAqB,EAAE,CAAC;IAC7C,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAEjD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;QACtE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACzB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAEnE,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1B,OAAO,EAAE,OAAO,EAAE,CAAC;AACrB,CAAC;AAED,KAAK,UAAU,qBAAqB;IAClC,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAQD,KAAK,UAAU,YAAY,CAAC,IAAiB;IAC3C,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IAC5C,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,EAAE,CAAC,IAAI,eAAe,EAAE,CAAC;IACrD,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5C,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAChF,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC;IAED,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;IACtB,OAAO,OAAO,CAAC;AACjB,CAAC;AAWD,KAAK,UAAU,QAAQ,CAAC,IAAkB;IACxC,IAAI,CAAC;QACH,OAAO,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,IAAI,aAAa,OAAO,EAAE,CAAC,CAAC;QACpD,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAC9D,CAAC;AACH,CAAC;AAID,KAAK,UAAU,WAAW,CAAC,IAAqB;IAC9C,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAE9D,MAAM,QAAQ,GAAG,aAAa,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACnD,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,MAAM,YAAY,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IAE7E,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,aAAa,EAAE,GAAG,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,aAAa,CAAC,CAAC;QACpC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACvC,CAAC;IAED,MAAM,SAAS,GAAG,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACnE,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,GAAG,SAAS,EAAE,CAAC,CAAC;IACxD,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAE5C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;IAEtE,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,KAAK,MAAM,EAAE,CAAC,CAAC;IACpC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1B,CAAC;AAMD,SAAS,YAAY,CAAC,IAAsB;IAC1C,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACxB,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,OAAO,KAAK,CAAC,CAAC,IAAI,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QACxD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC;AAMD,SAAS,YAAY,CAAC,IAAsB;IAC1C,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IACzB,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;IACrE,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;IACrE,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,MAAM,CAAC;IACzE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;IAElE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,OAAO,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,UAAU,CAAC,CAAC;IAClD,IAAI,OAAO,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,UAAU,CAAC,CAAC;IAClD,IAAI,SAAS,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,SAAS,YAAY,CAAC,CAAC;IACxD,IAAI,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,SAAS,CAAC,CAAC;IAE/C,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC3C,CAAC"}
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAM3D,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAM3D,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAW/D;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAKrE;AAED,wBAAsB,QAAQ,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAW3D;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAK/D;AAED,wBAAgB,iBAAiB,IAAI,YAAY,CAEhD;AAED,wBAAgB,eAAe,IAAI,UAAU,CAE5C"}
|
package/dist/config.js
CHANGED
|
@@ -19,7 +19,12 @@ export async function readConfig() {
|
|
|
19
19
|
return null;
|
|
20
20
|
}
|
|
21
21
|
const content = await readFile(path, "utf-8");
|
|
22
|
-
|
|
22
|
+
try {
|
|
23
|
+
return JSON.parse(content);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
throw new Error(`Invalid JSON in ${path}. Please fix or delete the file.`);
|
|
27
|
+
}
|
|
23
28
|
}
|
|
24
29
|
export async function writeConfig(config) {
|
|
25
30
|
const path = getConfigPath();
|
|
@@ -33,7 +38,12 @@ export async function readLock() {
|
|
|
33
38
|
return null;
|
|
34
39
|
}
|
|
35
40
|
const content = await readFile(path, "utf-8");
|
|
36
|
-
|
|
41
|
+
try {
|
|
42
|
+
return JSON.parse(content);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
throw new Error(`Invalid JSON in ${path}. Please fix or delete the file.`);
|
|
46
|
+
}
|
|
37
47
|
}
|
|
38
48
|
export async function writeLock(lock) {
|
|
39
49
|
const path = getLockPath();
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAG1C,MAAM,WAAW,GAAG,aAAa,CAAC;AAClC,MAAM,SAAS,GAAG,aAAa,CAAC;AAChC,MAAM,SAAS,GAAG,eAAe,CAAC;AAElC,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;IAC7B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/fetcher.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ResolvedSource, FetchResult } from "./types.js";
|
|
1
|
+
import type { ResolvedSource, FetchResult, ListFilesResult } from "./types.js";
|
|
2
2
|
type FetchArgs = {
|
|
3
3
|
resolved: ResolvedSource;
|
|
4
4
|
};
|
|
@@ -12,5 +12,12 @@ type CheckUpdateResult = {
|
|
|
12
12
|
latestSha: string;
|
|
13
13
|
};
|
|
14
14
|
export declare function checkForUpdate(args: CheckUpdateArgs): Promise<CheckUpdateResult>;
|
|
15
|
+
type ListFilesArgs = {
|
|
16
|
+
owner: string;
|
|
17
|
+
repo: string;
|
|
18
|
+
path?: string;
|
|
19
|
+
ref?: string;
|
|
20
|
+
};
|
|
21
|
+
export declare function listFiles(args: ListFilesArgs): Promise<ListFilesResult>;
|
|
15
22
|
export {};
|
|
16
23
|
//# sourceMappingURL=fetcher.d.ts.map
|
package/dist/fetcher.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetcher.d.ts","sourceRoot":"","sources":["../src/fetcher.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"fetcher.d.ts","sourceRoot":"","sources":["../src/fetcher.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAI/E,KAAK,SAAS,GAAG;IACf,QAAQ,EAAE,cAAc,CAAC;CAC1B,CAAC;AAEF,wBAAsB,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAQxE;AA0HD,KAAK,eAAe,GAAG;IACrB,QAAQ,EAAE,cAAc,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,KAAK,iBAAiB,GAAG;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,wBAAsB,cAAc,CAClC,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,iBAAiB,CAAC,CAI5B;AAED,KAAK,aAAa,GAAG;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,wBAAsB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC,CAiB7E"}
|
package/dist/fetcher.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { execFile } from "child_process";
|
|
2
2
|
import { promisify } from "util";
|
|
3
|
-
const
|
|
3
|
+
const execFileAsync = promisify(execFile);
|
|
4
4
|
export async function fetchContent(args) {
|
|
5
5
|
const { resolved } = args;
|
|
6
6
|
if (resolved.type === "url") {
|
|
@@ -55,16 +55,24 @@ async function fetchViaGhCli(args) {
|
|
|
55
55
|
const { owner, repo, path, branch } = args;
|
|
56
56
|
const apiPath = `/repos/${owner}/${repo}/contents/${path}?ref=${branch}`;
|
|
57
57
|
try {
|
|
58
|
-
const { stdout } = await
|
|
59
|
-
|
|
58
|
+
const { stdout } = await execFileAsync("gh", [
|
|
59
|
+
"api",
|
|
60
|
+
apiPath,
|
|
61
|
+
"--jq",
|
|
62
|
+
".content",
|
|
63
|
+
]);
|
|
64
|
+
const content = Buffer.from(stdout.trim(), "base64").toString("utf-8");
|
|
60
65
|
const sha = await computeHash({ content });
|
|
61
66
|
return { content, sha };
|
|
62
67
|
}
|
|
63
68
|
catch (error) {
|
|
64
69
|
const message = error instanceof Error ? error.message : String(error);
|
|
70
|
+
const isNotInstalled = message.includes("ENOENT");
|
|
71
|
+
const hint = isNotInstalled
|
|
72
|
+
? "Install GitHub CLI: https://cli.github.com/"
|
|
73
|
+
: "For private repos, run 'gh auth login' first.";
|
|
65
74
|
throw new Error(`Failed to fetch ${owner}/${repo}/${path}. ` +
|
|
66
|
-
`Ensure the repo exists and you have access. `
|
|
67
|
-
`For private repos, run 'gh auth login' first.\n${message}`);
|
|
75
|
+
`Ensure the repo exists and you have access. ${hint}\n${message}`);
|
|
68
76
|
}
|
|
69
77
|
}
|
|
70
78
|
async function computeHash(args) {
|
|
@@ -80,4 +88,27 @@ export async function checkForUpdate(args) {
|
|
|
80
88
|
const { sha: latestSha } = await fetchContent({ resolved });
|
|
81
89
|
return { isOutdated: currentSha !== latestSha, latestSha };
|
|
82
90
|
}
|
|
91
|
+
export async function listFiles(args) {
|
|
92
|
+
const { owner, repo, path = "", ref = "main" } = args;
|
|
93
|
+
const apiPath = `/repos/${owner}/${repo}/contents/${path}?ref=${ref}`;
|
|
94
|
+
try {
|
|
95
|
+
const { stdout } = await execFileAsync("gh", [
|
|
96
|
+
"api",
|
|
97
|
+
apiPath,
|
|
98
|
+
"--jq",
|
|
99
|
+
".[] | {name, path, type}",
|
|
100
|
+
]);
|
|
101
|
+
const files = parseGhOutput({ stdout });
|
|
102
|
+
return { files };
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
106
|
+
throw new Error(`Failed to list files from ${owner}/${repo}. ${message}`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
function parseGhOutput(args) {
|
|
110
|
+
const { stdout } = args;
|
|
111
|
+
const lines = stdout.trim().split("\n").filter(Boolean);
|
|
112
|
+
return lines.map((line) => JSON.parse(line));
|
|
113
|
+
}
|
|
83
114
|
//# sourceMappingURL=fetcher.js.map
|
package/dist/fetcher.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetcher.js","sourceRoot":"","sources":["../src/fetcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"fetcher.js","sourceRoot":"","sources":["../src/fetcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.alias.test.d.ts","sourceRoot":"","sources":["../src/resolver.alias.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { resolveSource } from "./resolver.js";
|
|
3
|
+
const emptyConfig = { rules: {} };
|
|
4
|
+
const configWithAlias = {
|
|
5
|
+
sources: { kc: "github:kevincrabbe/kc-rules" },
|
|
6
|
+
rules: {},
|
|
7
|
+
};
|
|
8
|
+
describe("resolveSource - Alias sources", () => {
|
|
9
|
+
it("should resolve alias to github source", () => {
|
|
10
|
+
const result = resolveSource({
|
|
11
|
+
source: "kc:general.md",
|
|
12
|
+
config: configWithAlias,
|
|
13
|
+
});
|
|
14
|
+
expect(result.resolved.type).toBe("github");
|
|
15
|
+
expect(result.resolved.owner).toBe("kevincrabbe");
|
|
16
|
+
expect(result.resolved.repo).toBe("kc-rules");
|
|
17
|
+
expect(result.resolved.path).toBe("general.md");
|
|
18
|
+
});
|
|
19
|
+
it("should resolve alias with nested path", () => {
|
|
20
|
+
const result = resolveSource({
|
|
21
|
+
source: "kc:typescript/rules.md",
|
|
22
|
+
config: configWithAlias,
|
|
23
|
+
});
|
|
24
|
+
expect(result.resolved.path).toBe("typescript/rules.md");
|
|
25
|
+
});
|
|
26
|
+
it("should throw for unknown alias", () => {
|
|
27
|
+
expect(() => resolveSource({
|
|
28
|
+
source: "unknown:file.md",
|
|
29
|
+
config: emptyConfig,
|
|
30
|
+
})).toThrow("Invalid source format");
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
//# sourceMappingURL=resolver.alias.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.alias.test.js","sourceRoot":"","sources":["../src/resolver.alias.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAG9C,MAAM,WAAW,GAAiB,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AAChD,MAAM,eAAe,GAAiB;IACpC,OAAO,EAAE,EAAE,EAAE,EAAE,6BAA6B,EAAE;IAC9C,KAAK,EAAE,EAAE;CACV,CAAC;AAEF,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,MAAM,GAAG,aAAa,CAAC;YAC3B,MAAM,EAAE,eAAe;YACvB,MAAM,EAAE,eAAe;SACxB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,MAAM,GAAG,aAAa,CAAC;YAC3B,MAAM,EAAE,wBAAwB;YAChC,MAAM,EAAE,eAAe;SACxB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,GAAG,EAAE,CACV,aAAa,CAAC;YACZ,MAAM,EAAE,iBAAiB;YACzB,MAAM,EAAE,WAAW;SACpB,CAAC,CACH,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/resolver.d.ts
CHANGED
package/dist/resolver.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/D,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,YAAY,CAAC;CACtB,CAAC;AAEF,KAAK,aAAa,GAAG;IACnB,QAAQ,EAAE,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/D,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,YAAY,CAAC;CACtB,CAAC;AAEF,KAAK,aAAa,GAAG;IACnB,QAAQ,EAAE,cAAc,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,aAAa,CAkB9D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.github.test.d.ts","sourceRoot":"","sources":["../src/resolver.github.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { resolveSource } from "./resolver.js";
|
|
3
|
+
const emptyConfig = { rules: {} };
|
|
4
|
+
describe("resolveSource - GitHub parsing", () => {
|
|
5
|
+
it.each([
|
|
6
|
+
["github:owner/repo/path/file.md", "owner", "repo", "path/file.md"],
|
|
7
|
+
["github:owner/repo/file.md", "owner", "repo", "file.md"],
|
|
8
|
+
["github:owner/repo", "owner", "repo", ""],
|
|
9
|
+
])("should parse %s", (source, owner, repo, path) => {
|
|
10
|
+
const result = resolveSource({ source, config: emptyConfig });
|
|
11
|
+
expect(result.resolved.owner).toBe(owner);
|
|
12
|
+
expect(result.resolved.repo).toBe(repo);
|
|
13
|
+
expect(result.resolved.path).toBe(path);
|
|
14
|
+
});
|
|
15
|
+
it("should extract ref from @ symbol", () => {
|
|
16
|
+
const result = resolveSource({
|
|
17
|
+
source: "github:owner/repo/file.md@v1.0.0",
|
|
18
|
+
config: emptyConfig,
|
|
19
|
+
});
|
|
20
|
+
expect(result.resolved.ref).toBe("v1.0.0");
|
|
21
|
+
});
|
|
22
|
+
it("should throw for source missing repo", () => {
|
|
23
|
+
expect(() => resolveSource({ source: "github:owner", config: emptyConfig }))
|
|
24
|
+
.toThrow("Invalid GitHub source");
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
//# sourceMappingURL=resolver.github.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.github.test.js","sourceRoot":"","sources":["../src/resolver.github.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAG9C,MAAM,WAAW,GAAiB,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AAEhD,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,EAAE,CAAC,IAAI,CAAC;QACN,CAAC,gCAAgC,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,CAAC;QACnE,CAAC,2BAA2B,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC;QACzD,CAAC,mBAAmB,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC;KAC3C,CAAC,CAAC,iBAAiB,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QAClD,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;QAC9D,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,MAAM,GAAG,aAAa,CAAC;YAC3B,MAAM,EAAE,kCAAkC;YAC1C,MAAM,EAAE,WAAW;SACpB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;aACzE,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/resolver.js
CHANGED
|
@@ -1,16 +1,22 @@
|
|
|
1
1
|
export function resolveSource(args) {
|
|
2
2
|
const { source, config } = args;
|
|
3
3
|
if (source.startsWith("https://") || source.startsWith("http://")) {
|
|
4
|
-
return {
|
|
4
|
+
return {
|
|
5
|
+
resolved: { type: "url", path: source, url: source },
|
|
6
|
+
originalSource: source,
|
|
7
|
+
};
|
|
5
8
|
}
|
|
6
9
|
if (source.startsWith("github:")) {
|
|
7
|
-
return {
|
|
10
|
+
return {
|
|
11
|
+
resolved: parseGitHubSource({ source }),
|
|
12
|
+
originalSource: source,
|
|
13
|
+
};
|
|
8
14
|
}
|
|
9
15
|
return resolveAlias({ source, config });
|
|
10
16
|
}
|
|
11
17
|
function resolveAlias(args) {
|
|
12
18
|
const { source, config } = args;
|
|
13
|
-
const aliasMatch = source.match(/^([^:]+):(
|
|
19
|
+
const aliasMatch = source.match(/^([^:]+):(.*)$/);
|
|
14
20
|
const hasAlias = aliasMatch && config.sources?.[aliasMatch[1]];
|
|
15
21
|
if (!hasAlias) {
|
|
16
22
|
throw new Error(`Invalid source format: ${source}`);
|
|
@@ -18,22 +24,27 @@ function resolveAlias(args) {
|
|
|
18
24
|
const alias = aliasMatch[1];
|
|
19
25
|
const filePath = aliasMatch[2];
|
|
20
26
|
const baseSource = config.sources[alias];
|
|
27
|
+
if (!filePath) {
|
|
28
|
+
const result = resolveSource({ source: baseSource, config });
|
|
29
|
+
return { resolved: result.resolved, originalSource: source };
|
|
30
|
+
}
|
|
21
31
|
const combined = combineSourceAndPath({ baseSource, filePath });
|
|
22
|
-
|
|
32
|
+
const result = resolveSource({ source: combined, config });
|
|
33
|
+
return { resolved: result.resolved, originalSource: source };
|
|
23
34
|
}
|
|
24
35
|
function parseGitHubSource(args) {
|
|
25
36
|
const { source } = args;
|
|
26
37
|
const withoutPrefix = source.replace("github:", "");
|
|
27
38
|
const { ref, pathPart } = extractRef({ source: withoutPrefix });
|
|
28
39
|
const parts = pathPart.split("/");
|
|
29
|
-
if (parts.length <
|
|
40
|
+
if (parts.length < 2) {
|
|
30
41
|
throw new Error(`Invalid GitHub source: ${source}`);
|
|
31
42
|
}
|
|
32
43
|
return {
|
|
33
44
|
type: "github",
|
|
34
45
|
owner: parts[0],
|
|
35
46
|
repo: parts[1],
|
|
36
|
-
path: parts.slice(2).join("/"),
|
|
47
|
+
path: parts.length > 2 ? parts.slice(2).join("/") : "",
|
|
37
48
|
ref,
|
|
38
49
|
};
|
|
39
50
|
}
|
package/dist/resolver.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.url.test.d.ts","sourceRoot":"","sources":["../src/resolver.url.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { resolveSource } from "./resolver.js";
|
|
3
|
+
const emptyConfig = { rules: {} };
|
|
4
|
+
describe("resolveSource - URL sources", () => {
|
|
5
|
+
it("should resolve http URLs", () => {
|
|
6
|
+
const result = resolveSource({
|
|
7
|
+
source: "http://example.com/rules.md",
|
|
8
|
+
config: emptyConfig,
|
|
9
|
+
});
|
|
10
|
+
expect(result.resolved.type).toBe("url");
|
|
11
|
+
expect(result.resolved.url).toBe("http://example.com/rules.md");
|
|
12
|
+
});
|
|
13
|
+
it("should resolve https URLs", () => {
|
|
14
|
+
const result = resolveSource({
|
|
15
|
+
source: "https://example.com/rules.md",
|
|
16
|
+
config: emptyConfig,
|
|
17
|
+
});
|
|
18
|
+
expect(result.resolved.type).toBe("url");
|
|
19
|
+
expect(result.resolved.url).toBe("https://example.com/rules.md");
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
//# sourceMappingURL=resolver.url.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.url.test.js","sourceRoot":"","sources":["../src/resolver.url.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAG9C,MAAM,WAAW,GAAiB,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AAEhD,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,MAAM,GAAG,aAAa,CAAC;YAC3B,MAAM,EAAE,6BAA6B;YACrC,MAAM,EAAE,WAAW;SACpB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,MAAM,GAAG,aAAa,CAAC;YAC3B,MAAM,EAAE,8BAA8B;YACtC,MAAM,EAAE,WAAW;SACpB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -36,4 +36,12 @@ export type StatusEntry = {
|
|
|
36
36
|
isOutdated: boolean;
|
|
37
37
|
source: string;
|
|
38
38
|
};
|
|
39
|
+
export type GitHubFile = {
|
|
40
|
+
name: string;
|
|
41
|
+
path: string;
|
|
42
|
+
type: "file" | "dir";
|
|
43
|
+
};
|
|
44
|
+
export type ListFilesResult = {
|
|
45
|
+
files: GitHubFile[];
|
|
46
|
+
};
|
|
39
47
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,QAAQ,GAAG,KAAK,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,QAAQ,GAAG,KAAK,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ruleshare",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "Sync shared Claude Code rules from remote sources",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -20,7 +20,9 @@
|
|
|
20
20
|
"start": "node ./dist/cli.js",
|
|
21
21
|
"lint": "eslint src/",
|
|
22
22
|
"lint:fix": "eslint src/ --fix",
|
|
23
|
-
"typecheck": "tsc --noEmit"
|
|
23
|
+
"typecheck": "tsc --noEmit",
|
|
24
|
+
"test": "vitest run",
|
|
25
|
+
"test:watch": "vitest"
|
|
24
26
|
},
|
|
25
27
|
"keywords": [
|
|
26
28
|
"claude",
|
|
@@ -36,7 +38,8 @@
|
|
|
36
38
|
"@types/node": "^20.0.0",
|
|
37
39
|
"eslint": "^9.0.0",
|
|
38
40
|
"typescript": "^5.0.0",
|
|
39
|
-
"typescript-eslint": "^8.0.0"
|
|
41
|
+
"typescript-eslint": "^8.0.0",
|
|
42
|
+
"vitest": "^4.0.17"
|
|
40
43
|
},
|
|
41
44
|
"engines": {
|
|
42
45
|
"node": ">=18.0.0"
|