@flux-lang/cli-core 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.
Files changed (89) hide show
  1. package/dist/commands/add.d.ts +18 -0
  2. package/dist/commands/add.d.ts.map +1 -0
  3. package/dist/commands/add.js +49 -0
  4. package/dist/commands/add.js.map +1 -0
  5. package/dist/commands/check.d.ts +15 -0
  6. package/dist/commands/check.d.ts.map +1 -0
  7. package/dist/commands/check.js +40 -0
  8. package/dist/commands/check.js.map +1 -0
  9. package/dist/commands/common.d.ts +6 -0
  10. package/dist/commands/common.d.ts.map +1 -0
  11. package/dist/commands/common.js +35 -0
  12. package/dist/commands/common.js.map +1 -0
  13. package/dist/commands/config.d.ts +19 -0
  14. package/dist/commands/config.d.ts.map +1 -0
  15. package/dist/commands/config.js +21 -0
  16. package/dist/commands/config.js.map +1 -0
  17. package/dist/commands/format.d.ts +9 -0
  18. package/dist/commands/format.d.ts.map +1 -0
  19. package/dist/commands/format.js +23 -0
  20. package/dist/commands/format.js.map +1 -0
  21. package/dist/commands/new.d.ts +24 -0
  22. package/dist/commands/new.d.ts.map +1 -0
  23. package/dist/commands/new.js +93 -0
  24. package/dist/commands/new.js.map +1 -0
  25. package/dist/commands/parse.d.ts +20 -0
  26. package/dist/commands/parse.d.ts.map +1 -0
  27. package/dist/commands/parse.js +37 -0
  28. package/dist/commands/parse.js.map +1 -0
  29. package/dist/commands/pdf.d.ts +13 -0
  30. package/dist/commands/pdf.d.ts.map +1 -0
  31. package/dist/commands/pdf.js +53 -0
  32. package/dist/commands/pdf.js.map +1 -0
  33. package/dist/commands/render.d.ts +14 -0
  34. package/dist/commands/render.d.ts.map +1 -0
  35. package/dist/commands/render.js +40 -0
  36. package/dist/commands/render.js.map +1 -0
  37. package/dist/commands/step.d.ts +12 -0
  38. package/dist/commands/step.d.ts.map +1 -0
  39. package/dist/commands/step.js +29 -0
  40. package/dist/commands/step.js.map +1 -0
  41. package/dist/commands/tick.d.ts +12 -0
  42. package/dist/commands/tick.d.ts.map +1 -0
  43. package/dist/commands/tick.js +31 -0
  44. package/dist/commands/tick.js.map +1 -0
  45. package/dist/commands/view.d.ts +18 -0
  46. package/dist/commands/view.d.ts.map +1 -0
  47. package/dist/commands/view.js +28 -0
  48. package/dist/commands/view.js.map +1 -0
  49. package/dist/config.d.ts +37 -0
  50. package/dist/config.d.ts.map +1 -0
  51. package/dist/config.js +76 -0
  52. package/dist/config.js.map +1 -0
  53. package/dist/file-indexer.d.ts +29 -0
  54. package/dist/file-indexer.d.ts.map +1 -0
  55. package/dist/file-indexer.js +59 -0
  56. package/dist/file-indexer.js.map +1 -0
  57. package/dist/fs.d.ts +10 -0
  58. package/dist/fs.d.ts.map +1 -0
  59. package/dist/fs.js +57 -0
  60. package/dist/fs.js.map +1 -0
  61. package/dist/index.d.ts +19 -0
  62. package/dist/index.d.ts.map +1 -0
  63. package/dist/index.js +19 -0
  64. package/dist/index.js.map +1 -0
  65. package/dist/last-used-dir.d.ts +9 -0
  66. package/dist/last-used-dir.d.ts.map +1 -0
  67. package/dist/last-used-dir.js +23 -0
  68. package/dist/last-used-dir.js.map +1 -0
  69. package/dist/new/templates.d.ts +28 -0
  70. package/dist/new/templates.d.ts.map +1 -0
  71. package/dist/new/templates.js +679 -0
  72. package/dist/new/templates.js.map +1 -0
  73. package/dist/pinned.d.ts +12 -0
  74. package/dist/pinned.d.ts.map +1 -0
  75. package/dist/pinned.js +45 -0
  76. package/dist/pinned.js.map +1 -0
  77. package/dist/recents.d.ts +13 -0
  78. package/dist/recents.d.ts.map +1 -0
  79. package/dist/recents.js +27 -0
  80. package/dist/recents.js.map +1 -0
  81. package/dist/types.d.ts +23 -0
  82. package/dist/types.d.ts.map +1 -0
  83. package/dist/types.js +7 -0
  84. package/dist/types.js.map +1 -0
  85. package/dist/viewer/manager.d.ts +55 -0
  86. package/dist/viewer/manager.d.ts.map +1 -0
  87. package/dist/viewer/manager.js +182 -0
  88. package/dist/viewer/manager.js.map +1 -0
  89. package/package.json +34 -0
@@ -0,0 +1,40 @@
1
+ import path from "node:path";
2
+ import { renderDocumentIR } from "@flux-lang/core";
3
+ import { errorResult, okResult } from "../types.js";
4
+ import { formatIoError, formatParseOrLexerError, parseFlux, readSource } from "./common.js";
5
+ export async function renderCommand(options) {
6
+ const file = options.file;
7
+ if (!file) {
8
+ return errorResult("flux render: No input file specified.", "NO_INPUT");
9
+ }
10
+ const format = options.format ?? "ir";
11
+ if (format !== "ir") {
12
+ return errorResult(`flux render: Unsupported format '${format}'.`, "UNSUPPORTED_FORMAT");
13
+ }
14
+ let source;
15
+ try {
16
+ source = await readSource(file);
17
+ }
18
+ catch (error) {
19
+ return errorResult(formatIoError(file, error), "READ_ERROR", error);
20
+ }
21
+ let doc;
22
+ try {
23
+ doc = parseFlux(source, file);
24
+ }
25
+ catch (error) {
26
+ return errorResult(formatParseOrLexerError(file, error), "PARSE_ERROR", error);
27
+ }
28
+ if (!doc.meta?.target) {
29
+ doc = { ...doc, meta: { ...doc.meta, target: "print" } };
30
+ }
31
+ const dir = file === "-" ? process.cwd() : path.dirname(path.resolve(file));
32
+ const rendered = renderDocumentIR(doc, {
33
+ seed: options.seed,
34
+ time: options.time,
35
+ docstep: options.docstep,
36
+ assetCwd: dir,
37
+ });
38
+ return okResult({ rendered });
39
+ }
40
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/commands/render.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAyB,MAAM,iBAAiB,CAAC;AAE1E,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAsB,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAc5F,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAsB;IACxD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,WAAW,CAAC,uCAAuC,EAAE,UAAU,CAAC,CAAC;IAC1E,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC;IACtC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO,WAAW,CAAC,oCAAoC,MAAM,IAAI,EAAE,oBAAoB,CAAC,CAAC;IAC3F,CAAC;IAED,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,WAAW,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;IACtE,CAAC;IAED,IAAI,GAAiB,CAAC;IACtB,IAAI,CAAC;QACH,GAAG,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,WAAW,CAAC,uBAAuB,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;IACjF,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QACtB,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;IAC3D,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5E,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,EAAE;QACrC,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,QAAQ,EAAE,GAAG;KACd,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;AAChC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { RenderDocumentIR } from "@flux-lang/core";
2
+ import { type CommandResult } from "../types.js";
3
+ export interface StepOptions {
4
+ file: string;
5
+ steps?: number;
6
+ seed?: number;
7
+ }
8
+ export interface StepData {
9
+ rendered: RenderDocumentIR;
10
+ }
11
+ export declare function stepCommand(options: StepOptions): Promise<CommandResult<StepData>>;
12
+ //# sourceMappingURL=step.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step.d.ts","sourceRoot":"","sources":["../../src/commands/step.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAgB,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAyB,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAGxE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,gBAAgB,CAAC;CAC5B;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAwBxF"}
@@ -0,0 +1,29 @@
1
+ import path from "node:path";
2
+ import { createDocumentRuntimeIR } from "@flux-lang/core";
3
+ import { errorResult, okResult } from "../types.js";
4
+ import { formatIoError, formatParseOrLexerError, parseFlux, readSource } from "./common.js";
5
+ export async function stepCommand(options) {
6
+ if (!options.file) {
7
+ return errorResult("flux step: No input file specified.", "NO_INPUT");
8
+ }
9
+ const count = options.steps ?? 1;
10
+ let source;
11
+ try {
12
+ source = await readSource(options.file);
13
+ }
14
+ catch (error) {
15
+ return errorResult(formatIoError(options.file, error), "READ_ERROR", error);
16
+ }
17
+ let doc;
18
+ try {
19
+ doc = parseFlux(source, options.file);
20
+ }
21
+ catch (error) {
22
+ return errorResult(formatParseOrLexerError(options.file, error), "PARSE_ERROR", error);
23
+ }
24
+ const dir = options.file === "-" ? process.cwd() : path.dirname(path.resolve(options.file));
25
+ const runtime = createDocumentRuntimeIR(doc, { seed: options.seed, assetCwd: dir });
26
+ const rendered = runtime.step(count);
27
+ return okResult({ rendered });
28
+ }
29
+ //# sourceMappingURL=step.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step.js","sourceRoot":"","sources":["../../src/commands/step.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAsB,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAY5F,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAoB;IACpD,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,OAAO,WAAW,CAAC,qCAAqC,EAAE,UAAU,CAAC,CAAC;IACxE,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;IAEjC,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,WAAW,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,GAAiB,CAAC;IACtB,IAAI,CAAC;QACH,GAAG,GAAG,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,WAAW,CAAC,uBAAuB,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;IACzF,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5F,MAAM,OAAO,GAAG,uBAAuB,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;IACpF,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,OAAO,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;AAChC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { RenderDocumentIR } from "@flux-lang/core";
2
+ import { type CommandResult } from "../types.js";
3
+ export interface TickOptions {
4
+ file: string;
5
+ seconds: number;
6
+ seed?: number;
7
+ }
8
+ export interface TickData {
9
+ rendered: RenderDocumentIR;
10
+ }
11
+ export declare function tickCommand(options: TickOptions): Promise<CommandResult<TickData>>;
12
+ //# sourceMappingURL=tick.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tick.d.ts","sourceRoot":"","sources":["../../src/commands/tick.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAgB,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAyB,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAGxE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,gBAAgB,CAAC;CAC5B;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CA0BxF"}
@@ -0,0 +1,31 @@
1
+ import path from "node:path";
2
+ import { createDocumentRuntimeIR } from "@flux-lang/core";
3
+ import { errorResult, okResult } from "../types.js";
4
+ import { formatIoError, formatParseOrLexerError, parseFlux, readSource } from "./common.js";
5
+ export async function tickCommand(options) {
6
+ if (!options.file) {
7
+ return errorResult("flux tick: No input file specified.", "NO_INPUT");
8
+ }
9
+ if (!Number.isFinite(options.seconds)) {
10
+ return errorResult("flux tick: --seconds is required.", "MISSING_SECONDS");
11
+ }
12
+ let source;
13
+ try {
14
+ source = await readSource(options.file);
15
+ }
16
+ catch (error) {
17
+ return errorResult(formatIoError(options.file, error), "READ_ERROR", error);
18
+ }
19
+ let doc;
20
+ try {
21
+ doc = parseFlux(source, options.file);
22
+ }
23
+ catch (error) {
24
+ return errorResult(formatParseOrLexerError(options.file, error), "PARSE_ERROR", error);
25
+ }
26
+ const dir = options.file === "-" ? process.cwd() : path.dirname(path.resolve(options.file));
27
+ const runtime = createDocumentRuntimeIR(doc, { seed: options.seed, assetCwd: dir });
28
+ const rendered = runtime.tick(options.seconds);
29
+ return okResult({ rendered });
30
+ }
31
+ //# sourceMappingURL=tick.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tick.js","sourceRoot":"","sources":["../../src/commands/tick.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAsB,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAY5F,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAoB;IACpD,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,OAAO,WAAW,CAAC,qCAAqC,EAAE,UAAU,CAAC,CAAC;IACxE,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,OAAO,WAAW,CAAC,mCAAmC,EAAE,iBAAiB,CAAC,CAAC;IAC7E,CAAC;IAED,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,WAAW,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,GAAiB,CAAC;IACtB,IAAI,CAAC;QACH,GAAG,GAAG,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,WAAW,CAAC,uBAAuB,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;IACzF,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5F,MAAM,OAAO,GAAG,uBAAuB,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;IACpF,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/C,OAAO,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;AAChC,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { type CommandResult } from "../types.js";
2
+ import { type ViewerSession } from "../viewer/manager.js";
3
+ export interface ViewOptions {
4
+ cwd: string;
5
+ docPath: string;
6
+ port?: number;
7
+ docstepMs?: number;
8
+ seed?: number;
9
+ allowNet?: string[];
10
+ advanceTime?: boolean;
11
+ timeRate?: number;
12
+ editorDist?: string;
13
+ }
14
+ export interface ViewData {
15
+ session: ViewerSession;
16
+ }
17
+ export declare function viewCommand(options: ViewOptions): Promise<CommandResult<ViewData>>;
18
+ //# sourceMappingURL=view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../src/commands/view.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE/E,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,aAAa,CAAC;CACxB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAwBxF"}
@@ -0,0 +1,28 @@
1
+ import { errorResult, okResult } from "../types.js";
2
+ import { attachOrStartViewer } from "../viewer/manager.js";
3
+ export async function viewCommand(options) {
4
+ if (!options.docPath) {
5
+ return errorResult("flux view: No input file specified.", "NO_INPUT");
6
+ }
7
+ if (options.docPath === "-") {
8
+ return errorResult("flux view: stdin input is not supported for the web viewer.", "STDIN_UNSUPPORTED");
9
+ }
10
+ try {
11
+ const session = await attachOrStartViewer({
12
+ cwd: options.cwd,
13
+ docPath: options.docPath,
14
+ port: options.port,
15
+ docstepMs: options.docstepMs,
16
+ seed: options.seed,
17
+ allowNet: options.allowNet,
18
+ advanceTime: options.advanceTime,
19
+ timeRate: options.timeRate,
20
+ editorDist: options.editorDist,
21
+ });
22
+ return okResult({ session });
23
+ }
24
+ catch (error) {
25
+ return errorResult(`flux view: ${String(error?.message ?? error)}`, "VIEW_ERROR", error);
26
+ }
27
+ }
28
+ //# sourceMappingURL=view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.js","sourceRoot":"","sources":["../../src/commands/view.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAsB,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAsB,MAAM,sBAAsB,CAAC;AAkB/E,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAoB;IACpD,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACrB,OAAO,WAAW,CAAC,qCAAqC,EAAE,UAAU,CAAC,CAAC;IACxE,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,KAAK,GAAG,EAAE,CAAC;QAC5B,OAAO,WAAW,CAAC,6DAA6D,EAAE,mBAAmB,CAAC,CAAC;IACzG,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC;YACxC,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,UAAU,EAAE,OAAO,CAAC,UAAU;SAC/B,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,WAAW,CAAC,cAAc,MAAM,CAAE,KAAe,EAAE,OAAO,IAAI,KAAK,CAAC,EAAE,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;IACtG,CAAC;AACH,CAAC"}
@@ -0,0 +1,37 @@
1
+ export type PageSizeOption = "Letter" | "A4";
2
+ export type ThemeOption = "print" | "screen" | "both";
3
+ export type FontsPreset = "tech" | "bookish";
4
+ export type FontFallbackOption = "system" | "none";
5
+ export interface FluxConfig {
6
+ docstepMs: number;
7
+ advanceTime: boolean;
8
+ defaultPageSize: PageSizeOption;
9
+ defaultTheme: ThemeOption;
10
+ defaultFonts: FontsPreset;
11
+ defaultOutputDir: string;
12
+ }
13
+ export declare const DEFAULT_CONFIG: FluxConfig;
14
+ export interface LoadedConfig {
15
+ config: FluxConfig;
16
+ filePath: string | null;
17
+ exists: boolean;
18
+ repoRoot: string | null;
19
+ }
20
+ export interface ResolveConfigOptions {
21
+ cwd: string;
22
+ flags?: Partial<FluxConfig>;
23
+ env?: Record<string, string | undefined>;
24
+ }
25
+ export declare function loadConfigFile(cwd: string): Promise<LoadedConfig>;
26
+ export declare function applyEnvConfig(config: FluxConfig, env: Record<string, string | undefined>): FluxConfig;
27
+ export declare function applyFlagConfig(config: FluxConfig, flags: Partial<FluxConfig>): FluxConfig;
28
+ export declare function resolveConfig(options: ResolveConfigOptions): Promise<LoadedConfig>;
29
+ export interface SetConfigResult {
30
+ ok: boolean;
31
+ message?: string;
32
+ configPath?: string;
33
+ }
34
+ export declare function setConfigValue(cwd: string, key: keyof FluxConfig, value: FluxConfig[keyof FluxConfig], options?: {
35
+ init?: boolean;
36
+ }): Promise<SetConfigResult>;
37
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,IAAI,CAAC;AAC7C,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AACtD,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,SAAS,CAAC;AAC7C,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEnD,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,eAAe,EAAE,cAAc,CAAC;IAChC,YAAY,EAAE,WAAW,CAAC;IAC1B,YAAY,EAAE,WAAW,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,eAAO,MAAM,cAAc,EAAE,UAO5B,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CAC1C;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAYvE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,UAAU,CA2BtG;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,CAE1F;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,YAAY,CAAC,CAKxF;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,UAAU,EACrB,KAAK,EAAE,UAAU,CAAC,MAAM,UAAU,CAAC,EACnC,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GAC/B,OAAO,CAAC,eAAe,CAAC,CAY1B"}
package/dist/config.js ADDED
@@ -0,0 +1,76 @@
1
+ import path from "node:path";
2
+ import { findGitRoot, pathExists, readJsonFile, writeJsonFile } from "./fs.js";
3
+ export const DEFAULT_CONFIG = {
4
+ docstepMs: 1000,
5
+ advanceTime: true,
6
+ defaultPageSize: "Letter",
7
+ defaultTheme: "screen",
8
+ defaultFonts: "tech",
9
+ defaultOutputDir: ".",
10
+ };
11
+ export async function loadConfigFile(cwd) {
12
+ const repoRoot = await findGitRoot(cwd);
13
+ if (!repoRoot) {
14
+ return { config: { ...DEFAULT_CONFIG }, filePath: null, exists: false, repoRoot: null };
15
+ }
16
+ const filePath = path.join(repoRoot, "flux.config.json");
17
+ const exists = await pathExists(filePath);
18
+ if (!exists) {
19
+ return { config: { ...DEFAULT_CONFIG }, filePath, exists: false, repoRoot };
20
+ }
21
+ const fileConfig = (await readJsonFile(filePath)) ?? {};
22
+ return { config: { ...DEFAULT_CONFIG, ...fileConfig }, filePath, exists: true, repoRoot };
23
+ }
24
+ export function applyEnvConfig(config, env) {
25
+ const next = { ...config };
26
+ if (env.FLUX_DOCSTEP_MS) {
27
+ const parsed = Number(env.FLUX_DOCSTEP_MS);
28
+ if (Number.isFinite(parsed))
29
+ next.docstepMs = parsed;
30
+ }
31
+ if (env.FLUX_ADVANCE_TIME) {
32
+ next.advanceTime = env.FLUX_ADVANCE_TIME !== "0" && env.FLUX_ADVANCE_TIME !== "false";
33
+ }
34
+ if (env.FLUX_DEFAULT_PAGE) {
35
+ const page = env.FLUX_DEFAULT_PAGE === "A4" ? "A4" : "Letter";
36
+ next.defaultPageSize = page;
37
+ }
38
+ if (env.FLUX_DEFAULT_THEME) {
39
+ const theme = env.FLUX_DEFAULT_THEME;
40
+ if (theme === "print" || theme === "screen" || theme === "both") {
41
+ next.defaultTheme = theme;
42
+ }
43
+ }
44
+ if (env.FLUX_DEFAULT_FONTS) {
45
+ const fonts = env.FLUX_DEFAULT_FONTS;
46
+ if (fonts === "tech" || fonts === "bookish")
47
+ next.defaultFonts = fonts;
48
+ }
49
+ if (env.FLUX_DEFAULT_OUTPUT_DIR) {
50
+ next.defaultOutputDir = env.FLUX_DEFAULT_OUTPUT_DIR;
51
+ }
52
+ return next;
53
+ }
54
+ export function applyFlagConfig(config, flags) {
55
+ return { ...config, ...flags };
56
+ }
57
+ export async function resolveConfig(options) {
58
+ const { config: base, filePath, exists, repoRoot } = await loadConfigFile(options.cwd);
59
+ const withEnv = applyEnvConfig(base, options.env ?? {});
60
+ const withFlags = applyFlagConfig(withEnv, options.flags ?? {});
61
+ return { config: withFlags, filePath, exists, repoRoot };
62
+ }
63
+ export async function setConfigValue(cwd, key, value, options = {}) {
64
+ const { filePath, exists, repoRoot } = await loadConfigFile(cwd);
65
+ if (!filePath || !repoRoot) {
66
+ return { ok: false, message: "No git repository found; cannot write flux.config.json" };
67
+ }
68
+ if (!exists && !options.init) {
69
+ return { ok: false, message: "flux.config.json does not exist; pass --init to create it" };
70
+ }
71
+ const current = exists ? (await readJsonFile(filePath)) ?? {} : {};
72
+ const next = { ...current, [key]: value };
73
+ await writeJsonFile(filePath, next);
74
+ return { ok: true, configPath: filePath, message: "config updated" };
75
+ }
76
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ export type DirentLike = {
2
+ name: string;
3
+ isDirectory(): boolean;
4
+ isFile(): boolean;
5
+ };
6
+ export type WalkFilesOptions = {
7
+ root: string;
8
+ maxDepth: number;
9
+ readdir?: (dir: string) => Promise<DirentLike[]>;
10
+ signal?: AbortSignal;
11
+ yieldEvery?: number;
12
+ shouldEnterDir?: (dirPath: string, dirent: DirentLike) => boolean;
13
+ includeFile?: (filePath: string, dirent: DirentLike) => boolean;
14
+ };
15
+ export declare function walkFilesFromFs(options: WalkFilesOptions): AsyncGenerator<string>;
16
+ export type FileIndexEvent = {
17
+ type: "file";
18
+ path: string;
19
+ } | {
20
+ type: "done";
21
+ indexed: number;
22
+ truncated: boolean;
23
+ };
24
+ export declare function indexFiles(options: {
25
+ walker: AsyncIterable<string>;
26
+ maxFiles: number;
27
+ signal?: AbortSignal;
28
+ }): AsyncGenerator<FileIndexEvent>;
29
+ //# sourceMappingURL=file-indexer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-indexer.d.ts","sourceRoot":"","sources":["../src/file-indexer.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,IAAI,OAAO,CAAC;IACvB,MAAM,IAAI,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IACjD,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC;IAClE,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC;CACjE,CAAC;AAEF,wBAAuB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,cAAc,CAAC,MAAM,CAAC,CA4CxF;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC;AAE1D,wBAAuB,UAAU,CAAC,OAAO,EAAE;IACzC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,cAAc,CAAC,cAAc,CAAC,CAgBjC"}
@@ -0,0 +1,59 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ export async function* walkFilesFromFs(options) {
4
+ const { root, maxDepth, readdir = (dir) => fs.readdir(dir, { withFileTypes: true, encoding: "utf8" }), signal, yieldEvery = 200, shouldEnterDir, includeFile, } = options;
5
+ const queue = [{ dir: path.resolve(root), depth: maxDepth }];
6
+ let seen = 0;
7
+ while (queue.length > 0) {
8
+ if (signal?.aborted)
9
+ return;
10
+ const next = queue.shift();
11
+ if (!next)
12
+ break;
13
+ if (next.depth < 0)
14
+ continue;
15
+ let entries;
16
+ try {
17
+ entries = await readdir(next.dir);
18
+ }
19
+ catch {
20
+ continue;
21
+ }
22
+ for (const entry of entries) {
23
+ if (signal?.aborted)
24
+ return;
25
+ const full = path.join(next.dir, entry.name);
26
+ if (entry.isDirectory()) {
27
+ const allow = shouldEnterDir ? shouldEnterDir(full, entry) : true;
28
+ if (allow)
29
+ queue.push({ dir: full, depth: next.depth - 1 });
30
+ }
31
+ else if (entry.isFile()) {
32
+ if (!includeFile || includeFile(full, entry)) {
33
+ yield full;
34
+ }
35
+ }
36
+ seen += 1;
37
+ if (yieldEvery > 0 && seen % yieldEvery === 0) {
38
+ await new Promise((resolve) => setImmediate(resolve));
39
+ }
40
+ }
41
+ }
42
+ }
43
+ export async function* indexFiles(options) {
44
+ const { walker, maxFiles, signal } = options;
45
+ let indexed = 0;
46
+ let truncated = false;
47
+ for await (const file of walker) {
48
+ if (signal?.aborted)
49
+ break;
50
+ if (indexed >= maxFiles) {
51
+ truncated = true;
52
+ break;
53
+ }
54
+ indexed += 1;
55
+ yield { type: "file", path: file };
56
+ }
57
+ yield { type: "done", indexed, truncated };
58
+ }
59
+ //# sourceMappingURL=file-indexer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-indexer.js","sourceRoot":"","sources":["../src/file-indexer.ts"],"names":[],"mappings":"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"}
package/dist/fs.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ export declare function readFileText(filePath: string): Promise<string>;
2
+ export declare function writeFileText(filePath: string, text: string): Promise<void>;
3
+ export declare function readJsonFile<T>(filePath: string): Promise<T | null>;
4
+ export declare function writeJsonFile<T>(filePath: string, value: T): Promise<void>;
5
+ export declare function pathExists(filePath: string): Promise<boolean>;
6
+ export declare function findGitRoot(startDir: string): Promise<string | null>;
7
+ export declare function ensureDir(dir: string): Promise<void>;
8
+ export declare function repoStatePath(repoRoot: string): string;
9
+ export declare function fallbackStatePath(cwd: string): string;
10
+ //# sourceMappingURL=fs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../src/fs.ts"],"names":[],"mappings":"AAGA,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEpE;AAED,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGjF;AAED,wBAAsB,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAQzE;AAED,wBAAsB,aAAa,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhF;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnE;AAED,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAY1E;AAED,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1D;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAErD"}
package/dist/fs.js ADDED
@@ -0,0 +1,57 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ export async function readFileText(filePath) {
4
+ return fs.readFile(filePath, "utf8");
5
+ }
6
+ export async function writeFileText(filePath, text) {
7
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
8
+ await fs.writeFile(filePath, text, "utf8");
9
+ }
10
+ export async function readJsonFile(filePath) {
11
+ try {
12
+ const raw = await fs.readFile(filePath, "utf8");
13
+ return JSON.parse(raw);
14
+ }
15
+ catch (err) {
16
+ if (err.code === "ENOENT")
17
+ return null;
18
+ throw err;
19
+ }
20
+ }
21
+ export async function writeJsonFile(filePath, value) {
22
+ const json = JSON.stringify(value, null, 2) + "\n";
23
+ await writeFileText(filePath, json);
24
+ }
25
+ export async function pathExists(filePath) {
26
+ try {
27
+ await fs.access(filePath);
28
+ return true;
29
+ }
30
+ catch {
31
+ return false;
32
+ }
33
+ }
34
+ export async function findGitRoot(startDir) {
35
+ let current = path.resolve(startDir);
36
+ while (true) {
37
+ const gitPath = path.join(current, ".git");
38
+ if (await pathExists(gitPath)) {
39
+ return current;
40
+ }
41
+ const parent = path.dirname(current);
42
+ if (parent === current)
43
+ break;
44
+ current = parent;
45
+ }
46
+ return null;
47
+ }
48
+ export async function ensureDir(dir) {
49
+ await fs.mkdir(dir, { recursive: true });
50
+ }
51
+ export function repoStatePath(repoRoot) {
52
+ return path.join(repoRoot, ".git", "flux");
53
+ }
54
+ export function fallbackStatePath(cwd) {
55
+ return path.join(cwd, ".flux");
56
+ }
57
+ //# sourceMappingURL=fs.js.map
package/dist/fs.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../src/fs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB;IACjD,OAAO,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,QAAgB,EAAE,IAAY;IAChE,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAI,QAAgB;IACpD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAM,CAAC;IAC9B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAClE,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAI,QAAgB,EAAE,KAAQ;IAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IACnD,MAAM,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAAgB;IAChD,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACrC,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC3C,IAAI,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9B,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,MAAM,KAAK,OAAO;YAAE,MAAM;QAC9B,OAAO,GAAG,MAAM,CAAC;IACnB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAW;IACzC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,19 @@
1
+ export * from "./types.js";
2
+ export * from "./config.js";
3
+ export * from "./recents.js";
4
+ export * from "./pinned.js";
5
+ export * from "./last-used-dir.js";
6
+ export * from "./file-indexer.js";
7
+ export * from "./commands/parse.js";
8
+ export * from "./commands/check.js";
9
+ export * from "./commands/render.js";
10
+ export * from "./commands/tick.js";
11
+ export * from "./commands/step.js";
12
+ export * from "./commands/view.js";
13
+ export * from "./commands/pdf.js";
14
+ export * from "./commands/format.js";
15
+ export * from "./commands/config.js";
16
+ export * from "./commands/new.js";
17
+ export * from "./commands/add.js";
18
+ export * from "./viewer/manager.js";
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,19 @@
1
+ export * from "./types.js";
2
+ export * from "./config.js";
3
+ export * from "./recents.js";
4
+ export * from "./pinned.js";
5
+ export * from "./last-used-dir.js";
6
+ export * from "./file-indexer.js";
7
+ export * from "./commands/parse.js";
8
+ export * from "./commands/check.js";
9
+ export * from "./commands/render.js";
10
+ export * from "./commands/tick.js";
11
+ export * from "./commands/step.js";
12
+ export * from "./commands/view.js";
13
+ export * from "./commands/pdf.js";
14
+ export * from "./commands/format.js";
15
+ export * from "./commands/config.js";
16
+ export * from "./commands/new.js";
17
+ export * from "./commands/add.js";
18
+ export * from "./viewer/manager.js";
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,9 @@
1
+ export interface LastUsedDirStore {
2
+ dir: string | null;
3
+ storePath: string;
4
+ repoRoot: string | null;
5
+ fallback: boolean;
6
+ }
7
+ export declare function getLastUsedDirStore(cwd: string): Promise<LastUsedDirStore>;
8
+ export declare function setLastUsedDir(cwd: string, dir: string): Promise<LastUsedDirStore>;
9
+ //# sourceMappingURL=last-used-dir.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"last-used-dir.d.ts","sourceRoot":"","sources":["../src/last-used-dir.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAYhF;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAMxF"}
@@ -0,0 +1,23 @@
1
+ import path from "node:path";
2
+ import { ensureDir, fallbackStatePath, findGitRoot, readJsonFile, repoStatePath, writeJsonFile } from "./fs.js";
3
+ export async function getLastUsedDirStore(cwd) {
4
+ const repoRoot = await findGitRoot(cwd);
5
+ const baseDir = repoRoot ? repoStatePath(repoRoot) : fallbackStatePath(cwd);
6
+ const storePath = path.join(baseDir, "last-used-dir.json");
7
+ const raw = await readJsonFile(storePath);
8
+ const dir = typeof raw === "string" ? raw : raw?.dir ?? null;
9
+ return {
10
+ dir: dir ? path.resolve(dir) : null,
11
+ storePath,
12
+ repoRoot,
13
+ fallback: !repoRoot,
14
+ };
15
+ }
16
+ export async function setLastUsedDir(cwd, dir) {
17
+ const store = await getLastUsedDirStore(cwd);
18
+ const normalized = path.resolve(dir);
19
+ await ensureDir(path.dirname(store.storePath));
20
+ await writeJsonFile(store.storePath, { dir: normalized });
21
+ return { ...store, dir: normalized };
22
+ }
23
+ //# sourceMappingURL=last-used-dir.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"last-used-dir.js","sourceRoot":"","sources":["../src/last-used-dir.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAShH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,GAAW;IACnD,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAC5E,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;IAC3D,MAAM,GAAG,GAAG,MAAM,YAAY,CAA4B,SAAS,CAAC,CAAC;IACrE,MAAM,GAAG,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC;IAC7D,OAAO;QACL,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;QACnC,SAAS;QACT,QAAQ;QACR,QAAQ,EAAE,CAAC,QAAQ;KACpB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAW,EAAE,GAAW;IAC3D,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;IAC/C,MAAM,aAAa,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC;IAC1D,OAAO,EAAE,GAAG,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;AACvC,CAAC"}