@gitroll/tacitt-cli 0.0.0-stage → 0.2.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 +84 -2
- package/bin/INDEX.md +9 -0
- package/bin/tacitt.cjs +16 -0
- package/dist/agent-setup-B8DAiQ6Z.mjs +71 -0
- package/dist/agent-setup-worker.mjs +56 -0
- package/dist/cli.mjs +1442 -0
- package/dist/codex-title-worker.mjs +215 -0
- package/dist/configured-preview-worker.mjs +133 -0
- package/dist/configured-session-worker.mjs +117 -0
- package/dist/frame-waS5FnN5.mjs +84 -0
- package/dist/heap-1FYhGds4.mjs +75 -0
- package/dist/heap-BHcvxWCw.mjs +7265 -0
- package/dist/inspection-worker.mjs +57 -0
- package/dist/job-J3NFw3MH.mjs +194 -0
- package/dist/locate-U3-nkird.mjs +10670 -0
- package/dist/messages-D3m3bhva.mjs +40 -0
- package/dist/model-BJdTLNjT.mjs +41 -0
- package/dist/operation-executor.mjs +181 -0
- package/dist/preview-worker.mjs +22 -0
- package/dist/privacy-validator.mjs +46 -0
- package/dist/query-BA0XCwnR.mjs +14869 -0
- package/dist/run-BeLHsZWb.mjs +916 -0
- package/dist/session-process.mjs +90 -0
- package/dist/src-B5SArpVY.mjs +6601 -0
- package/dist/src-CC95LYYp.mjs +12985 -0
- package/dist/src-k0Ya1Bri.mjs +16422 -0
- package/dist/store-database-worker.mjs +14 -0
- package/dist/web/THIRD_PARTY_LICENSES.md +388 -0
- package/dist/web/assets/ibm-plex-mono-cyrillic-400-normal-BSMlKf0J.woff2 +0 -0
- package/dist/web/assets/ibm-plex-mono-cyrillic-400-normal-CEL4l2ZJ.woff +0 -0
- package/dist/web/assets/ibm-plex-mono-cyrillic-500-normal-Ael50iVv.woff +0 -0
- package/dist/web/assets/ibm-plex-mono-cyrillic-500-normal-Bq9vWWag.woff2 +0 -0
- package/dist/web/assets/ibm-plex-mono-cyrillic-ext-400-normal-DMdlQ8Kv.woff +0 -0
- package/dist/web/assets/ibm-plex-mono-cyrillic-ext-400-normal-xuaO2J-f.woff2 +0 -0
- package/dist/web/assets/ibm-plex-mono-cyrillic-ext-500-normal-BIfNGwUT.woff +0 -0
- package/dist/web/assets/ibm-plex-mono-cyrillic-ext-500-normal-BqneJy0T.woff2 +0 -0
- package/dist/web/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
- package/dist/web/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
- package/dist/web/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
- package/dist/web/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
- package/dist/web/assets/ibm-plex-mono-latin-ext-400-normal-BmRBH3aV.woff2 +0 -0
- package/dist/web/assets/ibm-plex-mono-latin-ext-400-normal-D3D2R8hC.woff +0 -0
- package/dist/web/assets/ibm-plex-mono-latin-ext-500-normal-CAhNIIs5.woff2 +0 -0
- package/dist/web/assets/ibm-plex-mono-latin-ext-500-normal-CZ70TYgx.woff +0 -0
- package/dist/web/assets/ibm-plex-mono-vietnamese-400-normal-BulugwFq.woff2 +0 -0
- package/dist/web/assets/ibm-plex-mono-vietnamese-400-normal-DDuiU_S-.woff +0 -0
- package/dist/web/assets/ibm-plex-mono-vietnamese-500-normal-C8zxqsMH.woff +0 -0
- package/dist/web/assets/ibm-plex-mono-vietnamese-500-normal-DZ4AoWbu.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-cyrillic-400-normal-BTotfTJu.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-cyrillic-400-normal-DZqxrq2p.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-cyrillic-500-normal-ByOcLdNv.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-cyrillic-500-normal-CocWQlwt.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-cyrillic-600-normal-71GNu3SW.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-cyrillic-600-normal-BGq0mW3O.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-cyrillic-700-normal-D_uavGvn.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-cyrillic-700-normal-RFb1v-CK.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-cyrillic-ext-400-normal-Dsrv2Tcn.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-cyrillic-ext-400-normal-g30qAdWV.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-cyrillic-ext-500-normal-Cs5J6C77.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-cyrillic-ext-500-normal-DB5PtV2g.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-cyrillic-ext-600-normal-Bz0x94Yp.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-cyrillic-ext-600-normal-DUMzJB7m.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-cyrillic-ext-700-normal-BmRLXWpJ.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-cyrillic-ext-700-normal-DCQwxkRk.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-greek-400-normal-D9ESIMu3.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-greek-400-normal-_efipK4i.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-greek-500-normal-CuWXN6rf.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-greek-500-normal-JMMifIXV.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-greek-600-normal-D-CqTdkO.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-greek-600-normal-DzTrcv_p.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-greek-700-normal-CkZN0sRy.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-greek-700-normal-wyJ6jzdA.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-latin-700-normal-Bth3BMcD.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-latin-700-normal-Bxkt5Cjx.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-latin-ext-400-normal-C5H60-Va.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-latin-ext-400-normal-RBey6euL.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-latin-ext-500-normal-D0aIdm-b.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-latin-ext-500-normal-DakdToA3.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-latin-ext-600-normal-DIrixKbi.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-latin-ext-600-normal-DOrvGEcy.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-latin-ext-700-normal-DZH6Xh-4.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-latin-ext-700-normal-aMgXseD4.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-vietnamese-400-normal-DG4YqDda.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-vietnamese-400-normal-fK1oJ5dG.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-vietnamese-500-normal-BEb3_waV.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-vietnamese-500-normal-e4dixQRQ.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-vietnamese-600-normal-DgdngZtN.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-vietnamese-600-normal-DpPYBSTl.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-vietnamese-700-normal-BV5B8Are.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-vietnamese-700-normal-CkEo6LDy.woff2 +0 -0
- package/dist/web/assets/index-Bjos73wK.js +67 -0
- package/dist/web/assets/index-Bl4C2b2_.css +1 -0
- package/dist/web/index.html +14 -0
- package/package.json +56 -3
- package/skills/INDEX.md +9 -0
- package/skills/tacitt/INDEX.md +11 -0
- package/skills/tacitt/SKILL.md +44 -0
- package/skills/tacitt/references/INDEX.md +15 -0
- package/skills/tacitt/references/b-method.md +22 -0
- package/skills/tacitt/references/bootstrap.md +109 -0
- package/skills/tacitt/references/classification.md +83 -0
- package/skills/tacitt/references/commands.md +147 -0
- package/skills/tacitt/references/journey.md +54 -0
- package/skills/tacitt/references/parallel-review.md +64 -0
- package/skills/tacitt/references/send.md +30 -0
- package/skills/tacitt/scripts/INDEX.md +43 -0
- package/skills/tacitt/scripts/answer.mjs +278 -0
- package/skills/tacitt/scripts/describe.mjs +55 -0
- package/skills/tacitt/scripts/journey-card-consolidation.d.mts +17 -0
- package/skills/tacitt/scripts/journey-card-consolidation.mjs +209 -0
- package/skills/tacitt/scripts/journey-classification-metadata.d.mts +16 -0
- package/skills/tacitt/scripts/journey-classification-metadata.mjs +111 -0
- package/skills/tacitt/scripts/journey-classification-progress.mjs +195 -0
- package/skills/tacitt/scripts/journey-classification-tasks.d.mts +18 -0
- package/skills/tacitt/scripts/journey-classification-tasks.mjs +345 -0
- package/skills/tacitt/scripts/journey-classification-validation.d.mts +20 -0
- package/skills/tacitt/scripts/journey-classification-validation.mjs +240 -0
- package/skills/tacitt/scripts/journey-classification.mjs +145 -0
- package/skills/tacitt/scripts/journey-consolidation-submit.mjs +227 -0
- package/skills/tacitt/scripts/journey-consolidation.d.mts +14 -0
- package/skills/tacitt/scripts/journey-consolidation.mjs +227 -0
- package/skills/tacitt/scripts/journey-scan-timing.mjs +143 -0
- package/skills/tacitt/scripts/journey-state.d.mts +43 -0
- package/skills/tacitt/scripts/journey-state.mjs +294 -0
- package/skills/tacitt/scripts/journey-tasks.d.mts +26 -0
- package/skills/tacitt/scripts/journey-tasks.mjs +185 -0
- package/skills/tacitt/scripts/journey.d.mts +40 -0
- package/skills/tacitt/scripts/journey.mjs +592 -0
- package/skills/tacitt/scripts/local-cli.d.mts +18 -0
- package/skills/tacitt/scripts/local-cli.mjs +116 -0
- package/skills/tacitt/scripts/privacy-validator.mjs +10369 -0
- package/skills/tacitt/scripts/review-stream-client.d.mts +22 -0
- package/skills/tacitt/scripts/review-stream-client.mjs +194 -0
- package/skills/tacitt/scripts/review.d.mts +87 -0
- package/skills/tacitt/scripts/review.mjs +1610 -0
- package/skills/tacitt/scripts/verify-cli.mjs +10 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto'
|
|
2
|
+
import { lstat, open, readdir, realpath } from 'node:fs/promises'
|
|
3
|
+
import { dirname, isAbsolute, join } from 'node:path'
|
|
4
|
+
|
|
5
|
+
const fail = () => {
|
|
6
|
+
throw new Error('LOCAL_CLI_BINDING_INVALID')
|
|
7
|
+
}
|
|
8
|
+
const object = (value) => typeof value === 'object' && value !== null && !Array.isArray(value)
|
|
9
|
+
const versionPattern = /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/
|
|
10
|
+
const digestPattern = /^[a-f0-9]{64}$/
|
|
11
|
+
const digest = (bytes) => createHash('sha256').update(bytes).digest('hex')
|
|
12
|
+
|
|
13
|
+
async function regularFile(path, limit) {
|
|
14
|
+
const before = await lstat(path)
|
|
15
|
+
if (!before.isFile() || before.isSymbolicLink() || before.size > limit) fail()
|
|
16
|
+
const handle = await open(path, 'r')
|
|
17
|
+
try {
|
|
18
|
+
const opened = await handle.stat()
|
|
19
|
+
if (opened.dev !== before.dev || opened.ino !== before.ino) fail()
|
|
20
|
+
const bytes = await handle.readFile()
|
|
21
|
+
const after = await lstat(path)
|
|
22
|
+
if (
|
|
23
|
+
!after.isFile() ||
|
|
24
|
+
after.isSymbolicLink() ||
|
|
25
|
+
after.dev !== before.dev ||
|
|
26
|
+
after.ino !== before.ino ||
|
|
27
|
+
after.size !== before.size ||
|
|
28
|
+
after.mtimeMs !== before.mtimeMs ||
|
|
29
|
+
bytes.length !== before.size
|
|
30
|
+
)
|
|
31
|
+
fail()
|
|
32
|
+
return bytes
|
|
33
|
+
} finally {
|
|
34
|
+
await handle.close()
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
async function packageFiles(root) {
|
|
39
|
+
const files = []
|
|
40
|
+
let bytes = 0
|
|
41
|
+
const visit = async (name, depth = 0) => {
|
|
42
|
+
if (depth > 16 || files.length >= 10000) fail()
|
|
43
|
+
const path = join(root, name)
|
|
44
|
+
const info = await lstat(path)
|
|
45
|
+
if (info.isSymbolicLink()) fail()
|
|
46
|
+
if (info.isDirectory()) {
|
|
47
|
+
for (const child of (await readdir(path)).sort()) await visit(`${name}/${child}`, depth + 1)
|
|
48
|
+
} else if (info.isFile()) {
|
|
49
|
+
const content = await regularFile(path, 512 * 1024 * 1024 - bytes)
|
|
50
|
+
bytes += content.length
|
|
51
|
+
files.push([name, content.length, digest(content)])
|
|
52
|
+
} else fail()
|
|
53
|
+
}
|
|
54
|
+
for (const name of ['package.json', 'bin', 'dist', 'skills']) await visit(name)
|
|
55
|
+
return files
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** Reads only the selected installed package; it never downloads or opens application state. */
|
|
59
|
+
export async function readLocalCliBinding(cliPath, expected) {
|
|
60
|
+
if (
|
|
61
|
+
typeof cliPath !== 'string' ||
|
|
62
|
+
!isAbsolute(cliPath) ||
|
|
63
|
+
cliPath
|
|
64
|
+
.split('')
|
|
65
|
+
.some((character) => character.charCodeAt(0) < 32 || character.charCodeAt(0) === 127) ||
|
|
66
|
+
!object(expected) ||
|
|
67
|
+
expected.name !== '@gitroll/tacitt-cli' ||
|
|
68
|
+
typeof expected.version !== 'string' ||
|
|
69
|
+
!versionPattern.test(expected.version)
|
|
70
|
+
)
|
|
71
|
+
fail()
|
|
72
|
+
const requested = await lstat(cliPath)
|
|
73
|
+
if (!requested.isFile() || requested.isSymbolicLink()) fail()
|
|
74
|
+
const executable = await realpath(cliPath)
|
|
75
|
+
const root = dirname(dirname(executable))
|
|
76
|
+
if (executable !== join(root, 'bin', 'tacitt.cjs')) fail()
|
|
77
|
+
const metadataBytes = await regularFile(join(root, 'package.json'), 1024 * 1024)
|
|
78
|
+
const metadata = JSON.parse(metadataBytes.toString('utf8'))
|
|
79
|
+
if (
|
|
80
|
+
!object(metadata) ||
|
|
81
|
+
metadata.name !== expected.name ||
|
|
82
|
+
metadata.version !== expected.version ||
|
|
83
|
+
!object(metadata.bin) ||
|
|
84
|
+
metadata.bin['tacitt'] !== 'bin/tacitt.cjs'
|
|
85
|
+
)
|
|
86
|
+
fail()
|
|
87
|
+
const files = await packageFiles(root)
|
|
88
|
+
if (
|
|
89
|
+
!files.some(([name]) => name === 'dist/cli.mjs') ||
|
|
90
|
+
!files.some(([name, , sha256]) => name === 'package.json' && sha256 === digest(metadataBytes))
|
|
91
|
+
)
|
|
92
|
+
fail()
|
|
93
|
+
return {
|
|
94
|
+
schemaVersion: 1,
|
|
95
|
+
package: expected.name,
|
|
96
|
+
version: expected.version,
|
|
97
|
+
nodePath: await realpath(process.execPath),
|
|
98
|
+
cliPath: executable,
|
|
99
|
+
artifactSha256: digest(JSON.stringify(files)),
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** A receipt hash comes from the managed entry, independently of the local receipt bytes. */
|
|
104
|
+
export async function verifyLocalCliBinding(receiptPath, expectedReceiptSha256) {
|
|
105
|
+
if (!isAbsolute(receiptPath) || !digestPattern.test(expectedReceiptSha256)) fail()
|
|
106
|
+
const bytes = await regularFile(receiptPath, 8192)
|
|
107
|
+
if (digest(bytes) !== expectedReceiptSha256) fail()
|
|
108
|
+
const receipt = JSON.parse(bytes.toString('utf8'))
|
|
109
|
+
if (!object(receipt) || receipt.schemaVersion !== 1) fail()
|
|
110
|
+
const actual = await readLocalCliBinding(receipt.cliPath, {
|
|
111
|
+
name: receipt.package,
|
|
112
|
+
version: receipt.version,
|
|
113
|
+
})
|
|
114
|
+
if (JSON.stringify(actual) !== JSON.stringify(receipt)) fail()
|
|
115
|
+
return actual
|
|
116
|
+
}
|