@fml-inc/fml 0.7.0 → 0.8.0-rc.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.
Files changed (45) hide show
  1. package/.claude-plugin/plugin.json +2 -4
  2. package/README.md +312 -79
  3. package/agent-assets/fml/SKILL.md +180 -0
  4. package/bin/fml +4 -18
  5. package/bin/hook-handler +7 -0
  6. package/bin/mcp-server +4 -18
  7. package/bin/observer +6 -0
  8. package/dist/chunk-7DR5X7XI.js +1522 -0
  9. package/dist/chunk-CK5MEL5J.js +140 -0
  10. package/dist/chunk-DEMVOVVY.js +4442 -0
  11. package/dist/chunk-F66IBM3Z.js +1037 -0
  12. package/dist/chunk-HUR2HCUG.js +953 -0
  13. package/dist/chunk-I4GZPTBM.js +109 -0
  14. package/dist/chunk-JXSSPQ5B.js +3331 -0
  15. package/dist/{chunk-PZ5AY32C.js → chunk-MLKGABMK.js} +0 -1
  16. package/dist/{chunk-PTUZMKSN.js → chunk-P3QLARXE.js} +34 -23
  17. package/dist/chunk-T5YVLSUC.js +138 -0
  18. package/dist/cli.js +7523 -1005
  19. package/dist/{esm-2EUDFZWP.js → esm-4YKLKFRX.js} +546 -741
  20. package/dist/hook-handler.js +190 -0
  21. package/dist/mcp/server.js +112 -98
  22. package/dist/observer-server.js +1566 -0
  23. package/dist/sync-cycle.js +31 -0
  24. package/dist/{token-store-3IQSLOTQ.js → token-store-R7WXEPLI.js} +10 -3
  25. package/hooks/hooks.json +290 -0
  26. package/package.json +24 -27
  27. package/dist/chunk-PTUZMKSN.js.map +0 -1
  28. package/dist/chunk-PZ5AY32C.js.map +0 -1
  29. package/dist/chunk-S4TJNLEN.js +0 -61
  30. package/dist/chunk-S4TJNLEN.js.map +0 -1
  31. package/dist/chunk-VV4JHH4H.js +0 -437
  32. package/dist/chunk-VV4JHH4H.js.map +0 -1
  33. package/dist/chunk-YH5ROR7G.js +0 -69
  34. package/dist/chunk-YH5ROR7G.js.map +0 -1
  35. package/dist/cli.js.map +0 -1
  36. package/dist/daemon-MSLDHLMH.js +0 -21
  37. package/dist/daemon-MSLDHLMH.js.map +0 -1
  38. package/dist/daemon-utils-OODBIYB7.js +0 -10
  39. package/dist/daemon-utils-OODBIYB7.js.map +0 -1
  40. package/dist/esm-2EUDFZWP.js.map +0 -1
  41. package/dist/mcp/server.js.map +0 -1
  42. package/dist/postinstall.js +0 -16
  43. package/dist/postinstall.js.map +0 -1
  44. package/dist/token-store-3IQSLOTQ.js.map +0 -1
  45. package/scripts/postinstall.cjs +0 -25
@@ -0,0 +1,109 @@
1
+ import {
2
+ FML_HOOK_CAPTURE_DISABLED_FILE
3
+ } from "./chunk-7DR5X7XI.js";
4
+
5
+ // src/json-file.ts
6
+ import { randomUUID } from "crypto";
7
+ import fs from "fs";
8
+ import path from "path";
9
+ var NEW_FILE_MODE = 384;
10
+ var UNSUPPORTED_DIRECTORY_FSYNC_CODES = /* @__PURE__ */ new Set([
11
+ "EBADF",
12
+ "EINVAL",
13
+ "EISDIR",
14
+ "ENOTSUP",
15
+ "EOPNOTSUPP",
16
+ "EPERM"
17
+ ]);
18
+ function fsyncParentDirectory(directory) {
19
+ if (process.platform === "win32") return;
20
+ let descriptor;
21
+ try {
22
+ descriptor = fs.openSync(directory, "r");
23
+ fs.fsyncSync(descriptor);
24
+ } catch (error) {
25
+ const code = error.code;
26
+ if (code === void 0 || !UNSUPPORTED_DIRECTORY_FSYNC_CODES.has(code)) {
27
+ throw error;
28
+ }
29
+ } finally {
30
+ if (descriptor !== void 0) fs.closeSync(descriptor);
31
+ }
32
+ }
33
+ function readJsonFile(filePath) {
34
+ try {
35
+ const parsed = JSON.parse(fs.readFileSync(filePath, "utf8"));
36
+ return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : null;
37
+ } catch {
38
+ return null;
39
+ }
40
+ }
41
+ function writeTextFileAtomic(filePath, contents) {
42
+ try {
43
+ if (fs.readFileSync(filePath, "utf8") === contents) return;
44
+ } catch {
45
+ }
46
+ let mode = NEW_FILE_MODE;
47
+ try {
48
+ mode = fs.statSync(filePath).mode & 511;
49
+ } catch {
50
+ }
51
+ const directory = path.dirname(filePath);
52
+ fs.mkdirSync(directory, { recursive: true });
53
+ const tempPath = path.join(
54
+ directory,
55
+ `.${path.basename(filePath)}.${process.pid}.${randomUUID()}.tmp`
56
+ );
57
+ try {
58
+ const descriptor = fs.openSync(tempPath, "wx", mode);
59
+ try {
60
+ fs.writeFileSync(descriptor, contents, { encoding: "utf8" });
61
+ fs.fsyncSync(descriptor);
62
+ } finally {
63
+ fs.closeSync(descriptor);
64
+ }
65
+ fs.renameSync(tempPath, filePath);
66
+ fsyncParentDirectory(directory);
67
+ } catch (error) {
68
+ fs.rmSync(tempPath, { force: true });
69
+ throw error;
70
+ }
71
+ }
72
+ function writeJsonFile(filePath, data) {
73
+ writeTextFileAtomic(filePath, `${JSON.stringify(data, null, 2)}
74
+ `);
75
+ }
76
+
77
+ // src/hooks/capture-state.ts
78
+ import fs2 from "fs";
79
+ import path2 from "path";
80
+ function hookCaptureIsDisabled(stateFile = FML_HOOK_CAPTURE_DISABLED_FILE) {
81
+ try {
82
+ fs2.lstatSync(stateFile);
83
+ return true;
84
+ } catch (error) {
85
+ return error.code !== "ENOENT";
86
+ }
87
+ }
88
+ function setHookCaptureDisabled(disabled, stateFile = FML_HOOK_CAPTURE_DISABLED_FILE) {
89
+ if (disabled) {
90
+ const directory = path2.dirname(stateFile);
91
+ fs2.mkdirSync(directory, { recursive: true, mode: 448 });
92
+ try {
93
+ fs2.chmodSync(directory, 448);
94
+ } catch (error) {
95
+ if (process.platform !== "win32") throw error;
96
+ }
97
+ writeTextFileAtomic(stateFile, "disabled\n");
98
+ return;
99
+ }
100
+ fs2.rmSync(stateFile, { force: true });
101
+ }
102
+
103
+ export {
104
+ readJsonFile,
105
+ writeTextFileAtomic,
106
+ writeJsonFile,
107
+ hookCaptureIsDisabled,
108
+ setHookCaptureDisabled
109
+ };