keyfabe 0.1.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.
- package/README.md +125 -0
- package/dist/commands/clone.d.ts +1 -0
- package/dist/commands/clone.js +66 -0
- package/dist/commands/clone.js.map +1 -0
- package/dist/commands/delete.d.ts +1 -0
- package/dist/commands/delete.js +13 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/doctor.d.ts +1 -0
- package/dist/commands/doctor.js +73 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/export.d.ts +1 -0
- package/dist/commands/export.js +14 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/import.d.ts +1 -0
- package/dist/commands/import.js +39 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/list.d.ts +1 -0
- package/dist/commands/list.js +26 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/read.d.ts +1 -0
- package/dist/commands/read.js +41 -0
- package/dist/commands/read.js.map +1 -0
- package/dist/commands/rename.d.ts +1 -0
- package/dist/commands/rename.js +17 -0
- package/dist/commands/rename.js.map +1 -0
- package/dist/commands/setup.d.ts +1 -0
- package/dist/commands/setup.js +158 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/show.d.ts +1 -0
- package/dist/commands/show.js +20 -0
- package/dist/commands/show.js.map +1 -0
- package/dist/commands/write.d.ts +1 -0
- package/dist/commands/write.js +22 -0
- package/dist/commands/write.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +58 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/card-ops.d.ts +2 -0
- package/dist/lib/card-ops.js +89 -0
- package/dist/lib/card-ops.js.map +1 -0
- package/dist/lib/display.d.ts +7 -0
- package/dist/lib/display.js +20 -0
- package/dist/lib/display.js.map +1 -0
- package/dist/lib/firmware.d.ts +13 -0
- package/dist/lib/firmware.js +79 -0
- package/dist/lib/firmware.js.map +1 -0
- package/dist/lib/parsers.d.ts +25 -0
- package/dist/lib/parsers.js +58 -0
- package/dist/lib/parsers.js.map +1 -0
- package/dist/lib/pm3.d.ts +11 -0
- package/dist/lib/pm3.js +48 -0
- package/dist/lib/pm3.js.map +1 -0
- package/dist/lib/prompts.d.ts +4 -0
- package/dist/lib/prompts.js +27 -0
- package/dist/lib/prompts.js.map +1 -0
- package/dist/lib/store.d.ts +16 -0
- package/dist/lib/store.js +74 -0
- package/dist/lib/store.js.map +1 -0
- package/package.json +42 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
const STORE_DIR = process.env.KEYFABE_STORE_PATH
|
|
5
|
+
? dirname(process.env.KEYFABE_STORE_PATH)
|
|
6
|
+
: join(homedir(), ".keyfabe");
|
|
7
|
+
const STORE_PATH = process.env.KEYFABE_STORE_PATH ?? join(STORE_DIR, "fobs.json");
|
|
8
|
+
export async function loadFobs() {
|
|
9
|
+
try {
|
|
10
|
+
const data = await readFile(STORE_PATH, "utf-8");
|
|
11
|
+
return JSON.parse(data);
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return [];
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export async function saveFob(fob) {
|
|
18
|
+
const fobs = await loadFobs();
|
|
19
|
+
const existing = fobs.findIndex((f) => f.name === fob.name);
|
|
20
|
+
if (existing >= 0) {
|
|
21
|
+
fobs[existing] = fob;
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
fobs.push(fob);
|
|
25
|
+
}
|
|
26
|
+
await mkdir(STORE_DIR, { recursive: true });
|
|
27
|
+
await writeFile(STORE_PATH, `${JSON.stringify(fobs, null, 2)}\n`);
|
|
28
|
+
}
|
|
29
|
+
export async function getFob(name) {
|
|
30
|
+
const fobs = await loadFobs();
|
|
31
|
+
return fobs.find((f) => f.name === name);
|
|
32
|
+
}
|
|
33
|
+
export async function renameFob(oldName, newName) {
|
|
34
|
+
const fobs = await loadFobs();
|
|
35
|
+
const index = fobs.findIndex((f) => f.name === oldName);
|
|
36
|
+
if (index < 0)
|
|
37
|
+
return "not-found";
|
|
38
|
+
if (fobs.some((f) => f.name === newName))
|
|
39
|
+
return "name-taken";
|
|
40
|
+
fobs[index].name = newName;
|
|
41
|
+
await mkdir(STORE_DIR, { recursive: true });
|
|
42
|
+
await writeFile(STORE_PATH, `${JSON.stringify(fobs, null, 2)}\n`);
|
|
43
|
+
return "ok";
|
|
44
|
+
}
|
|
45
|
+
export async function importFobs(incoming) {
|
|
46
|
+
const fobs = await loadFobs();
|
|
47
|
+
let added = 0;
|
|
48
|
+
let updated = 0;
|
|
49
|
+
for (const fob of incoming) {
|
|
50
|
+
const existing = fobs.findIndex((f) => f.name === fob.name);
|
|
51
|
+
if (existing >= 0) {
|
|
52
|
+
fobs[existing] = fob;
|
|
53
|
+
updated++;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
fobs.push(fob);
|
|
57
|
+
added++;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
await mkdir(STORE_DIR, { recursive: true });
|
|
61
|
+
await writeFile(STORE_PATH, `${JSON.stringify(fobs, null, 2)}\n`);
|
|
62
|
+
return { added, updated };
|
|
63
|
+
}
|
|
64
|
+
export async function removeFob(name) {
|
|
65
|
+
const fobs = await loadFobs();
|
|
66
|
+
const index = fobs.findIndex((f) => f.name === name);
|
|
67
|
+
if (index < 0)
|
|
68
|
+
return false;
|
|
69
|
+
fobs.splice(index, 1);
|
|
70
|
+
await mkdir(STORE_DIR, { recursive: true });
|
|
71
|
+
await writeFile(STORE_PATH, `${JSON.stringify(fobs, null, 2)}\n`);
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/lib/store.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "keyfabe",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "CLI tool for Proxmark3 keyfob cloning",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"keyfabe": "dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist"
|
|
11
|
+
],
|
|
12
|
+
"engines": {
|
|
13
|
+
"node": ">=20"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"proxmark3",
|
|
17
|
+
"rfid",
|
|
18
|
+
"keyfob",
|
|
19
|
+
"clone",
|
|
20
|
+
"nfc"
|
|
21
|
+
],
|
|
22
|
+
"scripts": {
|
|
23
|
+
"dev": "tsx src/index.ts",
|
|
24
|
+
"build": "tsc && chmod +x dist/index.js",
|
|
25
|
+
"lint": "biome check",
|
|
26
|
+
"lint:fix": "biome check --write",
|
|
27
|
+
"test": "vitest run",
|
|
28
|
+
"test:watch": "vitest"
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"chalk": "^5.6.2",
|
|
32
|
+
"commander": "^14.0.3",
|
|
33
|
+
"ora": "^9.3.0"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@biomejs/biome": "^2.3.14",
|
|
37
|
+
"@types/node": "^25.2.2",
|
|
38
|
+
"tsx": "^4.21.0",
|
|
39
|
+
"typescript": "^5.9.3",
|
|
40
|
+
"vitest": "^3.2.4"
|
|
41
|
+
}
|
|
42
|
+
}
|