@intentic/fileq 1.317.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/LICENSE +21 -0
- package/README.md +46 -0
- package/dist/app.d.ts +2 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +43 -0
- package/dist/app.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +4 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/derive.command.d.ts +5 -0
- package/dist/commands/derive.command.d.ts.map +1 -0
- package/dist/commands/derive.command.js +53 -0
- package/dist/commands/derive.command.js.map +1 -0
- package/dist/commands/git-attributes.command.d.ts +3 -0
- package/dist/commands/git-attributes.command.d.ts.map +1 -0
- package/dist/commands/git-attributes.command.js +12 -0
- package/dist/commands/git-attributes.command.js.map +1 -0
- package/dist/commands/read.command.d.ts +3 -0
- package/dist/commands/read.command.d.ts.map +1 -0
- package/dist/commands/read.command.js +126 -0
- package/dist/commands/read.command.js.map +1 -0
- package/dist/commands/sweep.command.d.ts +3 -0
- package/dist/commands/sweep.command.d.ts.map +1 -0
- package/dist/commands/sweep.command.js +41 -0
- package/dist/commands/sweep.command.js.map +1 -0
- package/dist/lib/archives.d.ts +18 -0
- package/dist/lib/archives.d.ts.map +1 -0
- package/dist/lib/archives.js +133 -0
- package/dist/lib/archives.js.map +1 -0
- package/dist/lib/derive.d.ts +32 -0
- package/dist/lib/derive.d.ts.map +1 -0
- package/dist/lib/derive.js +99 -0
- package/dist/lib/derive.js.map +1 -0
- package/dist/lib/derivers/archive.d.ts +3 -0
- package/dist/lib/derivers/archive.d.ts.map +1 -0
- package/dist/lib/derivers/archive.js +132 -0
- package/dist/lib/derivers/archive.js.map +1 -0
- package/dist/lib/derivers/deriver.d.ts +13 -0
- package/dist/lib/derivers/deriver.d.ts.map +1 -0
- package/dist/lib/derivers/deriver.js +8 -0
- package/dist/lib/derivers/deriver.js.map +1 -0
- package/dist/lib/derivers/docx.d.ts +6 -0
- package/dist/lib/derivers/docx.d.ts.map +1 -0
- package/dist/lib/derivers/docx.js +29 -0
- package/dist/lib/derivers/docx.js.map +1 -0
- package/dist/lib/derivers/epub.d.ts +3 -0
- package/dist/lib/derivers/epub.d.ts.map +1 -0
- package/dist/lib/derivers/epub.js +102 -0
- package/dist/lib/derivers/epub.js.map +1 -0
- package/dist/lib/derivers/html.d.ts +3 -0
- package/dist/lib/derivers/html.d.ts.map +1 -0
- package/dist/lib/derivers/html.js +18 -0
- package/dist/lib/derivers/html.js.map +1 -0
- package/dist/lib/derivers/image.d.ts +3 -0
- package/dist/lib/derivers/image.d.ts.map +1 -0
- package/dist/lib/derivers/image.js +42 -0
- package/dist/lib/derivers/image.js.map +1 -0
- package/dist/lib/derivers/ipynb.d.ts +3 -0
- package/dist/lib/derivers/ipynb.d.ts.map +1 -0
- package/dist/lib/derivers/ipynb.js +75 -0
- package/dist/lib/derivers/ipynb.js.map +1 -0
- package/dist/lib/derivers/media.d.ts +3 -0
- package/dist/lib/derivers/media.d.ts.map +1 -0
- package/dist/lib/derivers/media.js +45 -0
- package/dist/lib/derivers/media.js.map +1 -0
- package/dist/lib/derivers/odp.d.ts +3 -0
- package/dist/lib/derivers/odp.d.ts.map +1 -0
- package/dist/lib/derivers/odp.js +41 -0
- package/dist/lib/derivers/odp.js.map +1 -0
- package/dist/lib/derivers/ods.d.ts +3 -0
- package/dist/lib/derivers/ods.d.ts.map +1 -0
- package/dist/lib/derivers/ods.js +86 -0
- package/dist/lib/derivers/ods.js.map +1 -0
- package/dist/lib/derivers/odt.d.ts +4 -0
- package/dist/lib/derivers/odt.d.ts.map +1 -0
- package/dist/lib/derivers/odt.js +77 -0
- package/dist/lib/derivers/odt.js.map +1 -0
- package/dist/lib/derivers/pdf-furniture.d.ts +7 -0
- package/dist/lib/derivers/pdf-furniture.d.ts.map +1 -0
- package/dist/lib/derivers/pdf-furniture.js +76 -0
- package/dist/lib/derivers/pdf-furniture.js.map +1 -0
- package/dist/lib/derivers/pdf.d.ts +4 -0
- package/dist/lib/derivers/pdf.d.ts.map +1 -0
- package/dist/lib/derivers/pdf.js +79 -0
- package/dist/lib/derivers/pdf.js.map +1 -0
- package/dist/lib/derivers/pptx.d.ts +4 -0
- package/dist/lib/derivers/pptx.d.ts.map +1 -0
- package/dist/lib/derivers/pptx.js +51 -0
- package/dist/lib/derivers/pptx.js.map +1 -0
- package/dist/lib/derivers/profile.d.ts +3 -0
- package/dist/lib/derivers/profile.d.ts.map +1 -0
- package/dist/lib/derivers/profile.js +115 -0
- package/dist/lib/derivers/profile.js.map +1 -0
- package/dist/lib/derivers/rtf.d.ts +4 -0
- package/dist/lib/derivers/rtf.d.ts.map +1 -0
- package/dist/lib/derivers/rtf.js +187 -0
- package/dist/lib/derivers/rtf.js.map +1 -0
- package/dist/lib/derivers/xlsx.d.ts +3 -0
- package/dist/lib/derivers/xlsx.d.ts.map +1 -0
- package/dist/lib/derivers/xlsx.js +68 -0
- package/dist/lib/derivers/xlsx.js.map +1 -0
- package/dist/lib/env.d.ts +2 -0
- package/dist/lib/env.d.ts.map +1 -0
- package/dist/lib/env.js +5 -0
- package/dist/lib/env.js.map +1 -0
- package/dist/lib/flags.d.ts +2 -0
- package/dist/lib/flags.d.ts.map +1 -0
- package/dist/lib/flags.js +8 -0
- package/dist/lib/flags.js.map +1 -0
- package/dist/lib/formats.d.ts +6 -0
- package/dist/lib/formats.d.ts.map +1 -0
- package/dist/lib/formats.js +110 -0
- package/dist/lib/formats.js.map +1 -0
- package/dist/lib/sidecar.d.ts +30 -0
- package/dist/lib/sidecar.d.ts.map +1 -0
- package/dist/lib/sidecar.js +108 -0
- package/dist/lib/sidecar.js.map +1 -0
- package/dist/lib/sweep.d.ts +7 -0
- package/dist/lib/sweep.d.ts.map +1 -0
- package/dist/lib/sweep.js +56 -0
- package/dist/lib/sweep.js.map +1 -0
- package/dist/lib/tools.d.ts +2 -0
- package/dist/lib/tools.d.ts.map +1 -0
- package/dist/lib/tools.js +15 -0
- package/dist/lib/tools.js.map +1 -0
- package/dist/lib/xml.d.ts +3 -0
- package/dist/lib/xml.d.ts.map +1 -0
- package/dist/lib/xml.js +16 -0
- package/dist/lib/xml.js.map +1 -0
- package/dist/skill.d.ts +5 -0
- package/dist/skill.d.ts.map +1 -0
- package/dist/skill.js +75 -0
- package/dist/skill.js.map +1 -0
- package/dist/testing.d.ts +25 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +220 -0
- package/dist/testing.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/package.json +89 -0
- package/src/app.ts +48 -0
- package/src/cli.integration.test.ts +200 -0
- package/src/cli.ts +6 -0
- package/src/commands/derive.command.ts +59 -0
- package/src/commands/git-attributes.command.ts +13 -0
- package/src/commands/read.command.ts +158 -0
- package/src/commands/sweep.command.ts +48 -0
- package/src/derivers.integration.test.ts +415 -0
- package/src/lib/archives.test.ts +72 -0
- package/src/lib/archives.ts +209 -0
- package/src/lib/derive.ts +132 -0
- package/src/lib/derivers/archive.ts +168 -0
- package/src/lib/derivers/deriver.ts +33 -0
- package/src/lib/derivers/docx.test.ts +38 -0
- package/src/lib/derivers/docx.ts +44 -0
- package/src/lib/derivers/epub.ts +130 -0
- package/src/lib/derivers/html.ts +21 -0
- package/src/lib/derivers/image.ts +54 -0
- package/src/lib/derivers/ipynb.ts +113 -0
- package/src/lib/derivers/load-cost.test.ts +44 -0
- package/src/lib/derivers/media.ts +51 -0
- package/src/lib/derivers/odp.ts +52 -0
- package/src/lib/derivers/ods.ts +104 -0
- package/src/lib/derivers/odt.ts +101 -0
- package/src/lib/derivers/pdf-furniture.test.ts +60 -0
- package/src/lib/derivers/pdf-furniture.ts +121 -0
- package/src/lib/derivers/pdf.ts +102 -0
- package/src/lib/derivers/pptx.ts +61 -0
- package/src/lib/derivers/profile.ts +172 -0
- package/src/lib/derivers/rtf.ts +233 -0
- package/src/lib/derivers/xlsx.ts +82 -0
- package/src/lib/env.ts +7 -0
- package/src/lib/formats.test.ts +50 -0
- package/src/lib/formats.ts +141 -0
- package/src/lib/sidecar.test.ts +60 -0
- package/src/lib/sidecar.ts +156 -0
- package/src/lib/sweep.ts +72 -0
- package/src/lib/tools.ts +16 -0
- package/src/lib/xml.ts +20 -0
- package/src/skill.ts +90 -0
- package/src/testing.ts +333 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Artur Kurowski
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# fileq
|
|
2
|
+
|
|
3
|
+
A CLI that shows an agent the contents of binary workspace files (Office documents, PDFs, images, audio, archives) as budgeted markdown, cached as sidecars.
|
|
4
|
+
|
|
5
|
+
```mermaid
|
|
6
|
+
flowchart LR
|
|
7
|
+
agent["Agent<br/>fileq read"] --> fileq(["fileq"])
|
|
8
|
+
daemon["Daemon<br/>derive · sweep"] --> fileq
|
|
9
|
+
git["git diff · show<br/>textconv"] --> fileq
|
|
10
|
+
fileq --> derivers["Derivers<br/>docx · pdf · xlsx · image …"]
|
|
11
|
+
fileq --> sidecars["Sidecars<br/>.intentic/local/cache/derived"]
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
- An agent cannot `cat` a docx or the text layer of a PDF. `fileq <file>` prints a capsule line (title, format,
|
|
15
|
+
token cost, derived or fresh), then the markdown clipped to `--budget` tokens, and names the sidecar that holds the
|
|
16
|
+
whole text.
|
|
17
|
+
- Each derivable file gets one sidecar at `.intentic/local/cache/derived/<path>.md`. It is fresh while the source's
|
|
18
|
+
sha256 and the deriver's version stamp both match, so reading a file twice derives it once. Text is neutralized at
|
|
19
|
+
write time, because a sidecar is later read as a plain file.
|
|
20
|
+
- The daemon keeps sidecars converged in the background with `fileq derive` and `fileq sweep`
|
|
21
|
+
(`_sandbox/sandbox/src/derived/`), and imports `./formats` and `./sidecar` so both sides agree on what is derivable.
|
|
22
|
+
- In the sandbox image, `git diff` and `git show` on a document print its text through `fileq read --plain`, wired by
|
|
23
|
+
`fileq git-attributes`.
|
|
24
|
+
- Out of scope: plain text files (read them directly), web pages ([webq](../webq)), OCR and transcription.
|
|
25
|
+
|
|
26
|
+
## Usage
|
|
27
|
+
|
|
28
|
+
```sh
|
|
29
|
+
fileq report.docx # capsule + markdown up to 4000 tokens, whole text saved
|
|
30
|
+
fileq read deck.pptx --budget 8000 # a bigger slice on stdout
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Key files
|
|
34
|
+
|
|
35
|
+
- [src/app.ts](src/app.ts) — the command routes and the `--help` text an agent reads.
|
|
36
|
+
- [src/lib/derive.ts](src/lib/derive.ts) — `ensureSidecar`: the pipeline `read`, `derive` and `sweep` all run.
|
|
37
|
+
- [src/lib/formats.ts](src/lib/formats.ts) — `detectFormat`: magic bytes first, extension as fallback.
|
|
38
|
+
- [src/lib/sidecar.ts](src/lib/sidecar.ts) — sidecar paths, front matter and the freshness rule.
|
|
39
|
+
- [src/lib/derivers/deriver.ts](src/lib/derivers/deriver.ts) — the contract every format handler meets.
|
|
40
|
+
- [src/derivers.integration.test.ts](src/derivers.integration.test.ts) — each format's output, by fixture.
|
|
41
|
+
|
|
42
|
+
## Commands
|
|
43
|
+
|
|
44
|
+
```sh
|
|
45
|
+
pnpm --filter @intentic/fileq test
|
|
46
|
+
```
|
package/dist/app.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AA8BA,eAAO,MAAM,GAAG,6EAiBf,CAAC"}
|
package/dist/app.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { packageVersion } from "@intentic/agent-cli/version";
|
|
2
|
+
import { buildApplication, buildRouteMap } from "@stricli/core";
|
|
3
|
+
import { deriveCommand } from "./commands/derive.command.js";
|
|
4
|
+
import { gitAttributesCommand } from "./commands/git-attributes.command.js";
|
|
5
|
+
import { readCommand } from "./commands/read.command.js";
|
|
6
|
+
import { sweepCommand } from "./commands/sweep.command.js";
|
|
7
|
+
const HELP = `fileq — binary workspace files as clean, budgeted markdown.
|
|
8
|
+
|
|
9
|
+
Reads the formats an agent cannot: docx, xlsx, pptx, pdf (text layer), images
|
|
10
|
+
(dimensions + EXIF), audio/video (duration + tags), html. Each workspace file
|
|
11
|
+
gets a markdown SIDECAR under .intentic/local/cache/derived/<path>.md, kept
|
|
12
|
+
fresh by content hash — reading a file twice derives once.
|
|
13
|
+
|
|
14
|
+
fileq <file> print it as markdown (default: read), budgeted
|
|
15
|
+
fileq read <file> --budget 8000
|
|
16
|
+
fileq derive <file…> converge named files' sidecars (stale→derive, gone→remove)
|
|
17
|
+
fileq sweep converge the whole workspace, prune orphaned sidecars
|
|
18
|
+
fileq read --plain <f> the markdown alone, for a program; git's textconv driver
|
|
19
|
+
fileq git-attributes the gitattributes that route documents through it
|
|
20
|
+
|
|
21
|
+
git diff, git show and git log -p on a document print its text, not "Binary
|
|
22
|
+
files differ": the sandbox names every derivable extension diff=fileq.
|
|
23
|
+
|
|
24
|
+
Not fileq's business: plain text (read it directly), the open web (webq),
|
|
25
|
+
files needing OCR or transcription (later tiers say so in their sidecars).
|
|
26
|
+
|
|
27
|
+
Exit codes: 0 content, 1 nothing derivable, 2 broken invocation or install.`;
|
|
28
|
+
export const app = buildApplication(buildRouteMap({
|
|
29
|
+
routes: {
|
|
30
|
+
read: readCommand,
|
|
31
|
+
derive: deriveCommand,
|
|
32
|
+
sweep: sweepCommand,
|
|
33
|
+
gitAttributes: gitAttributesCommand,
|
|
34
|
+
},
|
|
35
|
+
defaultCommand: "read",
|
|
36
|
+
docs: { brief: "fileq, agent-native file reading: binary files as clean budgeted markdown", fullDescription: HELP },
|
|
37
|
+
}), {
|
|
38
|
+
name: "fileq",
|
|
39
|
+
versionInfo: { currentVersion: packageVersion(import.meta.url) },
|
|
40
|
+
scanner: { caseStyle: "allow-kebab-for-camel" },
|
|
41
|
+
determineExitCode: () => 2,
|
|
42
|
+
});
|
|
43
|
+
//# sourceMappingURL=app.js.map
|
package/dist/app.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAG3D,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;4EAoB+D,CAAC;AAE7E,MAAM,CAAC,MAAM,GAAG,GAAG,gBAAgB,CAC/B,aAAa,CAAC;IACV,MAAM,EAAE;QACJ,IAAI,EAAE,WAAW;QACjB,MAAM,EAAE,aAAa;QACrB,KAAK,EAAE,YAAY;QACnB,aAAa,EAAE,oBAAoB;KACtC;IACD,cAAc,EAAE,MAAM;IACtB,IAAI,EAAE,EAAE,KAAK,EAAE,2EAA2E,EAAE,eAAe,EAAE,IAAI,EAAE;CACtH,CAAC,EACF;IACI,IAAI,EAAE,OAAO;IACb,WAAW,EAAE,EAAE,cAAc,EAAE,cAAc,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE;IAChE,OAAO,EAAE,EAAE,SAAS,EAAE,uBAAuB,EAAE;IAC/C,iBAAiB,EAAE,GAAG,EAAE,CAAC,CAAC;CAC7B,CACJ,CAAC"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,MAAM,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type CommandContext } from "@stricli/core";
|
|
2
|
+
import { type Outcome } from "../lib/derive.js";
|
|
3
|
+
export declare const outcomeLine: (outcome: Outcome) => string;
|
|
4
|
+
export declare const deriveCommand: import("@stricli/core").Command<CommandContext>;
|
|
5
|
+
//# sourceMappingURL=derive.command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derive.command.d.ts","sourceRoot":"","sources":["../../src/commands/derive.command.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAiB,KAAK,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAO/D,eAAO,MAAM,WAAW,YAAa,OAAO,KAAG,MAW9C,CAAC;AAEF,eAAO,MAAM,aAAa,iDAmCxB,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { resolve } from "node:path";
|
|
2
|
+
import { buildCommand } from "@stricli/core";
|
|
3
|
+
import { ensureSidecar } from "../lib/derive.js";
|
|
4
|
+
import { workspaceRoot } from "../lib/env.js";
|
|
5
|
+
export const outcomeLine = (outcome) => {
|
|
6
|
+
switch (outcome.kind) {
|
|
7
|
+
case "derived":
|
|
8
|
+
return `derived ${outcome.relPath} -> ${outcome.sidecarPath} (${outcome.tokens} tokens)`;
|
|
9
|
+
case "fresh":
|
|
10
|
+
return `fresh ${outcome.relPath}`;
|
|
11
|
+
case "removed":
|
|
12
|
+
return `removed ${outcome.relPath} (source gone)`;
|
|
13
|
+
case "skipped":
|
|
14
|
+
return `skipped ${outcome.relPath}: ${outcome.reason}`;
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
export const deriveCommand = buildCommand({
|
|
18
|
+
docs: { brief: "Converge sidecars for the named files (derive stale, remove orphaned, skip fresh)" },
|
|
19
|
+
parameters: {
|
|
20
|
+
flags: {
|
|
21
|
+
json: { kind: "boolean", default: false, brief: "One JSON object per line" },
|
|
22
|
+
},
|
|
23
|
+
positional: { kind: "array", parameter: { parse: String, brief: "Files to converge, workspace-root-relative (the watcher's own namespace) or absolute", placeholder: "file" } },
|
|
24
|
+
},
|
|
25
|
+
async func(flags, ...files) {
|
|
26
|
+
const root = workspaceRoot();
|
|
27
|
+
if (root === undefined) {
|
|
28
|
+
this.process.stdout.write("fileq: derive needs a workspace (WORKSPACE_ROOT is not set); use `fileq read` for one-off files\n");
|
|
29
|
+
process.exitCode = 2;
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
if (files.length === 0) {
|
|
33
|
+
this.process.stdout.write("fileq: derive takes file paths (or run `fileq sweep` for the whole workspace)\n");
|
|
34
|
+
process.exitCode = 2;
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
let useful = 0;
|
|
38
|
+
for (const file of files) {
|
|
39
|
+
const outcome = await ensureSidecar(root, resolve(root, file));
|
|
40
|
+
if (outcome.kind !== "skipped") {
|
|
41
|
+
useful += 1;
|
|
42
|
+
}
|
|
43
|
+
if (flags.json) {
|
|
44
|
+
this.process.stdout.write(`${JSON.stringify(outcome.kind === "derived" ? { ...outcome, doc: undefined, body: undefined } : outcome)}\n`);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
this.process.stdout.write(`${outcomeLine(outcome)}\n`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
process.exitCode = useful > 0 ? 0 : 1;
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
//# sourceMappingURL=derive.command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derive.command.js","sourceRoot":"","sources":["../../src/commands/derive.command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-attributes.command.d.ts","sourceRoot":"","sources":["../../src/commands/git-attributes.command.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAGlE,eAAO,MAAM,oBAAoB,iDAQ/B,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { buildCommand } from "@stricli/core";
|
|
2
|
+
import { gitAttributeLines } from "../lib/formats.js";
|
|
3
|
+
export const gitAttributesCommand = buildCommand({
|
|
4
|
+
docs: {
|
|
5
|
+
brief: "Print gitattributes marking every derivable format `diff=fileq`, for a `diff.fileq.textconv` of `fileq read --plain`",
|
|
6
|
+
},
|
|
7
|
+
parameters: { positional: { kind: "tuple", parameters: [] } },
|
|
8
|
+
func() {
|
|
9
|
+
this.process.stdout.write(`${gitAttributeLines().join("\n")}\n`);
|
|
10
|
+
},
|
|
11
|
+
});
|
|
12
|
+
//# sourceMappingURL=git-attributes.command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-attributes.command.js","sourceRoot":"","sources":["../../src/commands/git-attributes.command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAuB,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,CAAC,MAAM,oBAAoB,GAAG,YAAY,CAAC;IAC7C,IAAI,EAAE;QACF,KAAK,EAAE,sHAAsH;KAChI;IACD,UAAU,EAAE,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE;IAC7D,IAAI;QACA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,iBAAiB,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrE,CAAC;CACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.command.d.ts","sourceRoot":"","sources":["../../src/commands/read.command.ts"],"names":[],"mappings":"AAQA,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAalE,eAAO,MAAM,WAAW,iDAwCtB,CAAC"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
3
|
+
import { basename, join, resolve } from "node:path";
|
|
4
|
+
import { toolOutDir } from "@intentic/agent-cli/env";
|
|
5
|
+
import { countParser } from "@intentic/agent-cli/flags";
|
|
6
|
+
import { capsule, clip } from "@intentic/agent-cli/output";
|
|
7
|
+
import { estimateTokens } from "@intentic/base/format";
|
|
8
|
+
import { buildCommand } from "@stricli/core";
|
|
9
|
+
import { errorMessage } from "@intentic/base/errors";
|
|
10
|
+
import { deriverStamp, neutralizeDoc } from "../lib/derivers/deriver.js";
|
|
11
|
+
import { detectFormat } from "../lib/formats.js";
|
|
12
|
+
import { DERIVERS, ensureSidecar } from "../lib/derive.js";
|
|
13
|
+
import { workspaceRoot } from "../lib/env.js";
|
|
14
|
+
export const readCommand = buildCommand({
|
|
15
|
+
docs: { brief: "One file as clean markdown: budgeted on stdout, whole in its sidecar" },
|
|
16
|
+
parameters: {
|
|
17
|
+
flags: {
|
|
18
|
+
budget: { kind: "parsed", parse: countParser, default: "4000", brief: "Max stdout tokens; 0 prints only the capsule" },
|
|
19
|
+
json: { kind: "boolean", default: false, brief: "Machine-readable result on stdout" },
|
|
20
|
+
plain: { kind: "boolean", default: false, brief: "The markdown alone, whole and unbudgeted; nothing saved for a file outside the workspace (git textconv)" },
|
|
21
|
+
},
|
|
22
|
+
positional: {
|
|
23
|
+
kind: "tuple",
|
|
24
|
+
parameters: [{ parse: String, brief: "The file to read (relative paths resolve against the cwd)", placeholder: "file" }],
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
async func(flags, file) {
|
|
28
|
+
const absPath = resolve(file);
|
|
29
|
+
const root = workspaceRoot();
|
|
30
|
+
const save = !flags.plain;
|
|
31
|
+
const result = root === undefined ? await readOutsideWorkspace(absPath, save) : await readInWorkspace(root, absPath, save);
|
|
32
|
+
if (result === undefined) {
|
|
33
|
+
process.exitCode = 1;
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
if (flags.plain) {
|
|
37
|
+
this.process.stdout.write(result.body === "" ? "" : `${result.body}\n`);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (flags.json) {
|
|
41
|
+
this.process.stdout.write(`${JSON.stringify({ file: absPath, format: result.format, deriver: result.deriver, tokens: result.tokens, path: result.savedPath, source: result.source, notes: result.notes })}\n`);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const fields = [result.title ?? basename(absPath), result.format, `${result.tokens} tokens`, result.source];
|
|
45
|
+
this.process.stdout.write(capsule("fileq", fields, result.notes));
|
|
46
|
+
this.process.stdout.write(`saved: ${result.savedPath}\n`);
|
|
47
|
+
if (flags.budget > 0 && result.body !== "") {
|
|
48
|
+
this.process.stdout.write("---\n");
|
|
49
|
+
this.process.stdout.write(withFinalNewline(clip(result.body, flags.budget, result.savedPath, "document")));
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
const readInWorkspace = async (root, absPath, save) => {
|
|
54
|
+
const outcome = await ensureSidecar(root, absPath);
|
|
55
|
+
if (outcome.kind === "skipped" && outcome.reason === "outside-workspace") {
|
|
56
|
+
return readOutsideWorkspace(absPath, save);
|
|
57
|
+
}
|
|
58
|
+
return fromOutcome(outcome);
|
|
59
|
+
};
|
|
60
|
+
const fromOutcome = (outcome) => {
|
|
61
|
+
switch (outcome.kind) {
|
|
62
|
+
case "derived":
|
|
63
|
+
return {
|
|
64
|
+
format: outcome.format,
|
|
65
|
+
deriver: deriverStamp(DERIVERS[outcome.format]),
|
|
66
|
+
body: outcome.body,
|
|
67
|
+
tokens: outcome.tokens,
|
|
68
|
+
savedPath: outcome.sidecarPath,
|
|
69
|
+
source: "derived",
|
|
70
|
+
title: outcome.doc.title,
|
|
71
|
+
notes: outcome.doc.notes,
|
|
72
|
+
};
|
|
73
|
+
case "fresh":
|
|
74
|
+
return {
|
|
75
|
+
format: outcome.format,
|
|
76
|
+
deriver: deriverStamp(DERIVERS[outcome.format]),
|
|
77
|
+
body: outcome.body,
|
|
78
|
+
tokens: outcome.tokens,
|
|
79
|
+
savedPath: outcome.sidecarPath,
|
|
80
|
+
source: "fresh",
|
|
81
|
+
notes: [],
|
|
82
|
+
};
|
|
83
|
+
case "removed":
|
|
84
|
+
case "skipped": {
|
|
85
|
+
const reason = outcome.kind === "removed" ? "missing" : outcome.reason;
|
|
86
|
+
process.stdout.write(`fileq: cannot read ${outcome.relPath}: ${reason}\n`);
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
const readOutsideWorkspace = async (absPath, save) => {
|
|
92
|
+
const format = await detectFormat(absPath).catch(() => undefined);
|
|
93
|
+
if (format === undefined) {
|
|
94
|
+
process.stdout.write(`fileq: cannot read ${absPath}: unsupported or missing\n`);
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
let doc;
|
|
98
|
+
try {
|
|
99
|
+
doc = neutralizeDoc(await DERIVERS[format].derive(absPath));
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
process.stdout.write(`fileq: cannot read ${absPath}: derive-failed (${format}): ${errorMessage(error).split("\n")[0]}\n`);
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
const outDir = toolOutDir("fileq");
|
|
106
|
+
const hash = createHash("sha256").update(absPath).digest("hex").slice(0, 8);
|
|
107
|
+
const savedPath = join(outDir, `${basename(absPath)
|
|
108
|
+
.toLowerCase()
|
|
109
|
+
.replaceAll(/[^a-z0-9.]+/g, "-")}-${hash}.md`);
|
|
110
|
+
if (save) {
|
|
111
|
+
await mkdir(outDir, { recursive: true });
|
|
112
|
+
await writeFile(savedPath, `${doc.markdown}\n`);
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
format,
|
|
116
|
+
deriver: deriverStamp(DERIVERS[format]),
|
|
117
|
+
body: doc.markdown,
|
|
118
|
+
tokens: estimateTokens(doc.markdown),
|
|
119
|
+
savedPath,
|
|
120
|
+
source: "derived",
|
|
121
|
+
title: doc.title,
|
|
122
|
+
notes: doc.notes,
|
|
123
|
+
};
|
|
124
|
+
};
|
|
125
|
+
const withFinalNewline = (text) => (text.endsWith("\n") ? text : `${text}\n`);
|
|
126
|
+
//# sourceMappingURL=read.command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.command.js","sourceRoot":"","sources":["../../src/commands/read.command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sweep.command.d.ts","sourceRoot":"","sources":["../../src/commands/sweep.command.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAUlE,eAAO,MAAM,YAAY,iDAoCvB,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { buildCommand } from "@stricli/core";
|
|
2
|
+
import { sweep } from "../lib/sweep.js";
|
|
3
|
+
import { workspaceRoot } from "../lib/env.js";
|
|
4
|
+
import { outcomeLine } from "./derive.command.js";
|
|
5
|
+
export const sweepCommand = buildCommand({
|
|
6
|
+
docs: { brief: "Converge every derivable workspace file's sidecar; prune shadows of deleted files" },
|
|
7
|
+
parameters: {
|
|
8
|
+
flags: {
|
|
9
|
+
json: { kind: "boolean", default: false, brief: "Machine-readable summary on stdout" },
|
|
10
|
+
quiet: { kind: "boolean", default: false, brief: "Totals only, no per-file lines" },
|
|
11
|
+
},
|
|
12
|
+
positional: { kind: "tuple", parameters: [] },
|
|
13
|
+
},
|
|
14
|
+
async func(flags) {
|
|
15
|
+
const root = workspaceRoot();
|
|
16
|
+
if (root === undefined) {
|
|
17
|
+
this.process.stdout.write("fileq: sweep needs a workspace (WORKSPACE_ROOT is not set)\n");
|
|
18
|
+
process.exitCode = 2;
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const result = await sweep(root, (outcome) => {
|
|
22
|
+
if (!flags.quiet && !flags.json && outcome.kind !== "fresh") {
|
|
23
|
+
this.process.stdout.write(`${outcomeLine(outcome)}\n`);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
const counts = { derived: 0, fresh: 0, removed: 0, skipped: 0 };
|
|
27
|
+
for (const outcome of result.outcomes) {
|
|
28
|
+
counts[outcome.kind] += 1;
|
|
29
|
+
}
|
|
30
|
+
if (flags.json) {
|
|
31
|
+
this.process.stdout.write(`${JSON.stringify({ ...counts, pruned: result.pruned.length })}\n`);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
for (const relPath of result.pruned) {
|
|
35
|
+
this.process.stdout.write(`pruned ${relPath} (source gone)\n`);
|
|
36
|
+
}
|
|
37
|
+
this.process.stdout.write(`sweep: ${counts.derived} derived, ${counts.fresh} fresh, ${counts.removed + result.pruned.length} removed, ${counts.skipped} skipped\n`);
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
//# sourceMappingURL=sweep.command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sweep.command.js","sourceRoot":"","sources":["../../src/commands/sweep.command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAuB,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAOlD,MAAM,CAAC,MAAM,YAAY,GAAG,YAAY,CAAC;IACrC,IAAI,EAAE,EAAE,KAAK,EAAE,mFAAmF,EAAE;IACpG,UAAU,EAAE;QACR,KAAK,EAAE;YACH,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,oCAAoC,EAAE;YACtF,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,gCAAgC,EAAE;SACtF;QACD,UAAU,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE;KAChD;IACD,KAAK,CAAC,IAAI,CAAuB,KAAiB;QAC9C,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;QAC7B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACrB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;YAC1F,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACX,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE;YACzC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC1D,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC3D,CAAC;QACL,CAAC,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QAChE,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACb,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;QAClG,CAAC;aAAM,CAAC;YACJ,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,OAAO,kBAAkB,CAAC,CAAC;YACnE,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CACrB,UAAU,MAAM,CAAC,OAAO,aAAa,MAAM,CAAC,KAAK,WAAW,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,aAAa,MAAM,CAAC,OAAO,YAAY,CAC3I,CAAC;QACN,CAAC;IACL,CAAC;CACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface ArchiveEntry {
|
|
2
|
+
readonly path: string;
|
|
3
|
+
readonly size: number | undefined;
|
|
4
|
+
readonly packed: number | undefined;
|
|
5
|
+
readonly directory: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare const zipEntries: (bytes: Uint8Array) => ArchiveEntry[];
|
|
8
|
+
export declare const looksLikeTar: (bytes: Uint8Array) => boolean;
|
|
9
|
+
export declare const tarEntries: (bytes: Uint8Array) => ArchiveEntry[];
|
|
10
|
+
export interface GzipHead {
|
|
11
|
+
readonly name: string | undefined;
|
|
12
|
+
readonly unpackedBytes: number;
|
|
13
|
+
}
|
|
14
|
+
export declare const gzipHead: (bytes: Uint8Array) => GzipHead | undefined;
|
|
15
|
+
export declare const tarOnPath: () => boolean;
|
|
16
|
+
export declare const parseTarListing: (stdout: string) => ArchiveEntry[];
|
|
17
|
+
export declare const listWithTar: (absPath: string) => Promise<ArchiveEntry[]>;
|
|
18
|
+
//# sourceMappingURL=archives.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archives.d.ts","sourceRoot":"","sources":["../../src/lib/archives.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAElC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC/B;AAGD,eAAO,MAAM,UAAU,UAAW,UAAU,KAAG,YAAY,EAS1D,CAAC;AAiCF,eAAO,MAAM,YAAY,UAAW,UAAU,KAAG,OAAqG,CAAC;AAiEvJ,eAAO,MAAM,UAAU,UAAW,UAAU,KAAG,YAAY,EAkB1D,CAAC;AAEF,MAAM,WAAW,QAAQ;IAErB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAElC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAClC;AAcD,eAAO,MAAM,QAAQ,UAAW,UAAU,KAAG,QAAQ,GAAG,SAMvD,CAAC;AAGF,eAAO,MAAM,SAAS,QAAO,OAAwB,CAAC;AAOtD,eAAO,MAAM,eAAe,WAAY,MAAM,KAAG,YAAY,EAa5D,CAAC;AAOF,eAAO,MAAM,WAAW,YAAmB,MAAM,KAAG,OAAO,CAAC,YAAY,EAAE,CAGzE,CAAC"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
import { unzipSync } from "fflate";
|
|
4
|
+
import { onPath } from "./tools.js";
|
|
5
|
+
const run = promisify(execFile);
|
|
6
|
+
export const zipEntries = (bytes) => {
|
|
7
|
+
const entries = [];
|
|
8
|
+
unzipSync(bytes, {
|
|
9
|
+
filter: (file) => {
|
|
10
|
+
entries.push({ path: file.name, size: file.originalSize, packed: file.size, directory: file.name.endsWith("/") });
|
|
11
|
+
return false;
|
|
12
|
+
},
|
|
13
|
+
});
|
|
14
|
+
return entries;
|
|
15
|
+
};
|
|
16
|
+
const BLOCK = 512;
|
|
17
|
+
const decoder = new TextDecoder();
|
|
18
|
+
const field = (bytes, offset, length) => {
|
|
19
|
+
const raw = bytes.subarray(offset, offset + length);
|
|
20
|
+
const end = raw.indexOf(0);
|
|
21
|
+
return decoder.decode(end === -1 ? raw : raw.subarray(0, end)).trim();
|
|
22
|
+
};
|
|
23
|
+
const octal = (bytes, offset, length) => {
|
|
24
|
+
const text = field(bytes, offset, length).replaceAll(/[^0-7]/g, "");
|
|
25
|
+
return text === "" ? 0 : Number.parseInt(text, 8);
|
|
26
|
+
};
|
|
27
|
+
const headerChecks = (block) => {
|
|
28
|
+
if (block.length < BLOCK) {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
let sum = 0;
|
|
32
|
+
for (let index = 0; index < BLOCK; index++) {
|
|
33
|
+
sum += index >= 148 && index < 156 ? 0x20 : (block[index] ?? 0);
|
|
34
|
+
}
|
|
35
|
+
return sum === octal(block, 148, 8);
|
|
36
|
+
};
|
|
37
|
+
export const looksLikeTar = (bytes) => bytes.length >= BLOCK && (field(bytes, 257, 6).startsWith("ustar") || headerChecks(bytes));
|
|
38
|
+
const paxPath = (data) => {
|
|
39
|
+
for (const record of decoder.decode(data).split("\n")) {
|
|
40
|
+
const match = /^\d+ path=(.*)$/.exec(record);
|
|
41
|
+
if (match !== null) {
|
|
42
|
+
return match[1];
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return undefined;
|
|
46
|
+
};
|
|
47
|
+
const blockAt = (bytes, offset) => {
|
|
48
|
+
if (offset + BLOCK > bytes.length) {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
const header = bytes.subarray(offset, offset + BLOCK);
|
|
52
|
+
if (header.every((byte) => byte === 0)) {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
const size = octal(header, 124, 12);
|
|
56
|
+
return {
|
|
57
|
+
header,
|
|
58
|
+
type: field(header, 156, 1),
|
|
59
|
+
size,
|
|
60
|
+
data: bytes.subarray(offset + BLOCK, offset + BLOCK + size),
|
|
61
|
+
next: offset + BLOCK + Math.ceil(size / BLOCK) * BLOCK,
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
const NAME_CARRIERS = new Set(["L", "x", "X", "g"]);
|
|
65
|
+
const carriedName = (block, current) => {
|
|
66
|
+
if (block.type === "L") {
|
|
67
|
+
return field(block.data, 0, block.data.length);
|
|
68
|
+
}
|
|
69
|
+
return block.type === "g" ? current : (paxPath(block.data) ?? current);
|
|
70
|
+
};
|
|
71
|
+
const entryOf = (block, carried) => {
|
|
72
|
+
const prefix = field(block.header, 345, 155);
|
|
73
|
+
const name = field(block.header, 0, 100);
|
|
74
|
+
const path = carried ?? (prefix === "" ? name : `${prefix}/${name}`);
|
|
75
|
+
const directory = block.type === "5" || path.endsWith("/");
|
|
76
|
+
return { path, size: directory ? undefined : block.size, packed: undefined, directory };
|
|
77
|
+
};
|
|
78
|
+
export const tarEntries = (bytes) => {
|
|
79
|
+
if (!looksLikeTar(bytes)) {
|
|
80
|
+
throw new Error("not a tar archive: no header block at the start");
|
|
81
|
+
}
|
|
82
|
+
const entries = [];
|
|
83
|
+
let carried;
|
|
84
|
+
let offset = 0;
|
|
85
|
+
for (let block = blockAt(bytes, offset); block !== undefined; block = blockAt(bytes, offset)) {
|
|
86
|
+
offset = block.next;
|
|
87
|
+
if (NAME_CARRIERS.has(block.type)) {
|
|
88
|
+
carried = carriedName(block, carried);
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
entries.push(entryOf(block, carried));
|
|
92
|
+
carried = undefined;
|
|
93
|
+
}
|
|
94
|
+
return entries;
|
|
95
|
+
};
|
|
96
|
+
const gzipName = (bytes, flags) => {
|
|
97
|
+
if ((flags & 0x08) === 0) {
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
const extra = (flags & 0x04) === 0 ? 0 : 2 + ((bytes[10] ?? 0) | ((bytes[11] ?? 0) << 8));
|
|
101
|
+
const end = bytes.indexOf(0, 10 + extra);
|
|
102
|
+
const name = end === -1 ? "" : decoder.decode(bytes.subarray(10 + extra, end));
|
|
103
|
+
return name === "" ? undefined : name;
|
|
104
|
+
};
|
|
105
|
+
export const gzipHead = (bytes) => {
|
|
106
|
+
if (bytes.length < 18 || bytes[0] !== 0x1f || bytes[1] !== 0x8b) {
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
const view = new DataView(bytes.buffer, bytes.byteOffset + bytes.length - 4, 4);
|
|
110
|
+
return { name: gzipName(bytes, bytes[3] ?? 0), unpackedBytes: view.getUint32(0, true) };
|
|
111
|
+
};
|
|
112
|
+
export const tarOnPath = () => onPath("tar");
|
|
113
|
+
const LISTING_LINE = /^(\S+)\s+\S+\s+(\d+)\s+\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}(?::\d{2})?\s+(.+)$/;
|
|
114
|
+
export const parseTarListing = (stdout) => {
|
|
115
|
+
const entries = [];
|
|
116
|
+
for (const line of stdout.split("\n")) {
|
|
117
|
+
const match = LISTING_LINE.exec(line);
|
|
118
|
+
if (match === null) {
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
const [, mode = "", size = "0", path = ""] = match;
|
|
122
|
+
const directory = mode.startsWith("d");
|
|
123
|
+
entries.push({ path: path.split(" -> ")[0] ?? path, size: directory ? undefined : Number(size), packed: undefined, directory });
|
|
124
|
+
}
|
|
125
|
+
return entries;
|
|
126
|
+
};
|
|
127
|
+
const TAR_TIMEOUT_MS = 60_000;
|
|
128
|
+
const TAR_MAX_BUFFER = 16 * 1024 * 1024;
|
|
129
|
+
export const listWithTar = async (absPath) => {
|
|
130
|
+
const { stdout } = await run("tar", ["-tvf", absPath], { timeout: TAR_TIMEOUT_MS, maxBuffer: TAR_MAX_BUFFER });
|
|
131
|
+
return parseTarListing(stdout);
|
|
132
|
+
};
|
|
133
|
+
//# sourceMappingURL=archives.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archives.js","sourceRoot":"","sources":["../../src/lib/archives.ts"],"names":[],"mappings":"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"}
|