skein-cli 0.1.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +180 -0
- package/bin/skein.mjs +7 -0
- package/dist/adapters/aider/conv-reader.d.ts +7 -0
- package/dist/adapters/aider/conv-reader.js +203 -0
- package/dist/adapters/aider/conv-reader.js.map +1 -0
- package/dist/adapters/aider/index.d.ts +2 -0
- package/dist/adapters/aider/index.js +123 -0
- package/dist/adapters/aider/index.js.map +1 -0
- package/dist/adapters/base.d.ts +71 -0
- package/dist/adapters/base.js +38 -0
- package/dist/adapters/base.js.map +1 -0
- package/dist/adapters/claude-code/conv-reader.d.ts +2 -0
- package/dist/adapters/claude-code/conv-reader.js +155 -0
- package/dist/adapters/claude-code/conv-reader.js.map +1 -0
- package/dist/adapters/claude-code/index.d.ts +3 -0
- package/dist/adapters/claude-code/index.js +517 -0
- package/dist/adapters/claude-code/index.js.map +1 -0
- package/dist/adapters/claude-desktop/index.d.ts +2 -0
- package/dist/adapters/claude-desktop/index.js +95 -0
- package/dist/adapters/claude-desktop/index.js.map +1 -0
- package/dist/adapters/codex/index.d.ts +2 -0
- package/dist/adapters/codex/index.js +472 -0
- package/dist/adapters/codex/index.js.map +1 -0
- package/dist/adapters/cursor/index.d.ts +2 -0
- package/dist/adapters/cursor/index.js +255 -0
- package/dist/adapters/cursor/index.js.map +1 -0
- package/dist/adapters/opencode/conv-reader.d.ts +3 -0
- package/dist/adapters/opencode/conv-reader.js +190 -0
- package/dist/adapters/opencode/conv-reader.js.map +1 -0
- package/dist/adapters/opencode/index.d.ts +2 -0
- package/dist/adapters/opencode/index.js +349 -0
- package/dist/adapters/opencode/index.js.map +1 -0
- package/dist/adapters/registry.d.ts +4 -0
- package/dist/adapters/registry.js +26 -0
- package/dist/adapters/registry.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.js +54 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/conv.d.ts +2 -0
- package/dist/commands/conv.js +261 -0
- package/dist/commands/conv.js.map +1 -0
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.js +85 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.js +38 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/memory.d.ts +2 -0
- package/dist/commands/memory.js +197 -0
- package/dist/commands/memory.js.map +1 -0
- package/dist/commands/migrate.d.ts +2 -0
- package/dist/commands/migrate.js +102 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/profile.d.ts +2 -0
- package/dist/commands/profile.js +183 -0
- package/dist/commands/profile.js.map +1 -0
- package/dist/commands/redact.d.ts +2 -0
- package/dist/commands/redact.js +73 -0
- package/dist/commands/redact.js.map +1 -0
- package/dist/commands/trace.d.ts +2 -0
- package/dist/commands/trace.js +181 -0
- package/dist/commands/trace.js.map +1 -0
- package/dist/commands/view.d.ts +13 -0
- package/dist/commands/view.js +184 -0
- package/dist/commands/view.js.map +1 -0
- package/dist/commands/watch.d.ts +6 -0
- package/dist/commands/watch.js +61 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/commands/wrap.d.ts +2 -0
- package/dist/commands/wrap.js +131 -0
- package/dist/commands/wrap.js.map +1 -0
- package/dist/conv/chatgpt-import.d.ts +33 -0
- package/dist/conv/chatgpt-import.js +145 -0
- package/dist/conv/chatgpt-import.js.map +1 -0
- package/dist/conv/cursor.d.ts +12 -0
- package/dist/conv/cursor.js +55 -0
- package/dist/conv/cursor.js.map +1 -0
- package/dist/conv/export.d.ts +40 -0
- package/dist/conv/export.js +215 -0
- package/dist/conv/export.js.map +1 -0
- package/dist/conv/replay/aider.d.ts +24 -0
- package/dist/conv/replay/aider.js +56 -0
- package/dist/conv/replay/aider.js.map +1 -0
- package/dist/conv/replay/claude-code.d.ts +38 -0
- package/dist/conv/replay/claude-code.js +80 -0
- package/dist/conv/replay/claude-code.js.map +1 -0
- package/dist/conv/replay/context.d.ts +25 -0
- package/dist/conv/replay/context.js +63 -0
- package/dist/conv/replay/context.js.map +1 -0
- package/dist/conv/replay/index.d.ts +22 -0
- package/dist/conv/replay/index.js +84 -0
- package/dist/conv/replay/index.js.map +1 -0
- package/dist/conv/search.d.ts +67 -0
- package/dist/conv/search.js +379 -0
- package/dist/conv/search.js.map +1 -0
- package/dist/conv/sink.d.ts +26 -0
- package/dist/conv/sink.js +76 -0
- package/dist/conv/sink.js.map +1 -0
- package/dist/conv/sources/aider.d.ts +13 -0
- package/dist/conv/sources/aider.js +95 -0
- package/dist/conv/sources/aider.js.map +1 -0
- package/dist/conv/sources/claude-code.d.ts +13 -0
- package/dist/conv/sources/claude-code.js +189 -0
- package/dist/conv/sources/claude-code.js.map +1 -0
- package/dist/conv/sources/codex.d.ts +15 -0
- package/dist/conv/sources/codex.js +175 -0
- package/dist/conv/sources/codex.js.map +1 -0
- package/dist/conv/sources/opencode.d.ts +12 -0
- package/dist/conv/sources/opencode.js +92 -0
- package/dist/conv/sources/opencode.js.map +1 -0
- package/dist/conv/store.d.ts +10 -0
- package/dist/conv/store.js +75 -0
- package/dist/conv/store.js.map +1 -0
- package/dist/conv/title.d.ts +9 -0
- package/dist/conv/title.js +74 -0
- package/dist/conv/title.js.map +1 -0
- package/dist/conv/watcher.d.ts +28 -0
- package/dist/conv/watcher.js +75 -0
- package/dist/conv/watcher.js.map +1 -0
- package/dist/conv/zip.d.ts +11 -0
- package/dist/conv/zip.js +82 -0
- package/dist/conv/zip.js.map +1 -0
- package/dist/hf/client.d.ts +41 -0
- package/dist/hf/client.js +87 -0
- package/dist/hf/client.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/ir/index.d.ts +24 -0
- package/dist/ir/index.js +23 -0
- package/dist/ir/index.js.map +1 -0
- package/dist/ir/profile.d.ts +55 -0
- package/dist/ir/profile.js +177 -0
- package/dist/ir/profile.js.map +1 -0
- package/dist/memory/index.d.ts +41 -0
- package/dist/memory/index.js +109 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/search.d.ts +24 -0
- package/dist/memory/search.js +114 -0
- package/dist/memory/search.js.map +1 -0
- package/dist/memory/sinks/claude-mem.d.ts +13 -0
- package/dist/memory/sinks/claude-mem.js +100 -0
- package/dist/memory/sinks/claude-mem.js.map +1 -0
- package/dist/memory/sinks/codex.d.ts +12 -0
- package/dist/memory/sinks/codex.js +82 -0
- package/dist/memory/sinks/codex.js.map +1 -0
- package/dist/memory/sinks/context.d.ts +21 -0
- package/dist/memory/sinks/context.js +42 -0
- package/dist/memory/sinks/context.js.map +1 -0
- package/dist/memory/sources/chatgpt.d.ts +22 -0
- package/dist/memory/sources/chatgpt.js +98 -0
- package/dist/memory/sources/chatgpt.js.map +1 -0
- package/dist/memory/sources/claude-mem.d.ts +8 -0
- package/dist/memory/sources/claude-mem.js +104 -0
- package/dist/memory/sources/claude-mem.js.map +1 -0
- package/dist/memory/sources/codex.d.ts +8 -0
- package/dist/memory/sources/codex.js +77 -0
- package/dist/memory/sources/codex.js.map +1 -0
- package/dist/memory/store.d.ts +19 -0
- package/dist/memory/store.js +82 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/proxy/http.d.ts +21 -0
- package/dist/proxy/http.js +205 -0
- package/dist/proxy/http.js.map +1 -0
- package/dist/proxy/recorder.d.ts +35 -0
- package/dist/proxy/recorder.js +221 -0
- package/dist/proxy/recorder.js.map +1 -0
- package/dist/proxy/streaming.d.ts +33 -0
- package/dist/proxy/streaming.js +185 -0
- package/dist/proxy/streaming.js.map +1 -0
- package/dist/redactor/entropy.d.ts +29 -0
- package/dist/redactor/entropy.js +98 -0
- package/dist/redactor/entropy.js.map +1 -0
- package/dist/redactor/index.d.ts +52 -0
- package/dist/redactor/index.js +152 -0
- package/dist/redactor/index.js.map +1 -0
- package/dist/redactor/ner.d.ts +53 -0
- package/dist/redactor/ner.js +97 -0
- package/dist/redactor/ner.js.map +1 -0
- package/dist/redactor/pii-patterns.d.ts +22 -0
- package/dist/redactor/pii-patterns.js +187 -0
- package/dist/redactor/pii-patterns.js.map +1 -0
- package/dist/redactor/secret-patterns.d.ts +27 -0
- package/dist/redactor/secret-patterns.js +475 -0
- package/dist/redactor/secret-patterns.js.map +1 -0
- package/dist/schema/conv.d.ts +698 -0
- package/dist/schema/conv.js +85 -0
- package/dist/schema/conv.js.map +1 -0
- package/dist/schema/index.d.ts +2 -0
- package/dist/schema/index.js +3 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/manifest.d.ts +1531 -0
- package/dist/schema/manifest.js +179 -0
- package/dist/schema/manifest.js.map +1 -0
- package/dist/schema/memory.d.ts +107 -0
- package/dist/schema/memory.js +45 -0
- package/dist/schema/memory.js.map +1 -0
- package/dist/schema/trace.d.ts +164 -0
- package/dist/schema/trace.js +89 -0
- package/dist/schema/trace.js.map +1 -0
- package/dist/trace/consent.d.ts +30 -0
- package/dist/trace/consent.js +60 -0
- package/dist/trace/consent.js.map +1 -0
- package/dist/trace/extract.d.ts +22 -0
- package/dist/trace/extract.js +168 -0
- package/dist/trace/extract.js.map +1 -0
- package/dist/trace/ml-pii.d.ts +33 -0
- package/dist/trace/ml-pii.js +35 -0
- package/dist/trace/ml-pii.js.map +1 -0
- package/dist/trace/push.d.ts +59 -0
- package/dist/trace/push.js +141 -0
- package/dist/trace/push.js.map +1 -0
- package/dist/trace/serialize.d.ts +23 -0
- package/dist/trace/serialize.js +67 -0
- package/dist/trace/serialize.js.map +1 -0
- package/dist/ui/banner.d.ts +2 -0
- package/dist/ui/banner.js +17 -0
- package/dist/ui/banner.js.map +1 -0
- package/dist/ui/box.d.ts +4 -0
- package/dist/ui/box.js +38 -0
- package/dist/ui/box.js.map +1 -0
- package/dist/ui/index.d.ts +5 -0
- package/dist/ui/index.js +5 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/spinner.d.ts +10 -0
- package/dist/ui/spinner.js +44 -0
- package/dist/ui/spinner.js.map +1 -0
- package/dist/ui/table.d.ts +9 -0
- package/dist/ui/table.js +55 -0
- package/dist/ui/table.js.map +1 -0
- package/dist/util/frontmatter.d.ts +6 -0
- package/dist/util/frontmatter.js +20 -0
- package/dist/util/frontmatter.js.map +1 -0
- package/dist/util/fs.d.ts +5 -0
- package/dist/util/fs.js +41 -0
- package/dist/util/fs.js.map +1 -0
- package/dist/util/ids.d.ts +3 -0
- package/dist/util/ids.js +16 -0
- package/dist/util/ids.js.map +1 -0
- package/dist/util/log.d.ts +13 -0
- package/dist/util/log.js +33 -0
- package/dist/util/log.js.map +1 -0
- package/dist/util/paths.d.ts +18 -0
- package/dist/util/paths.js +36 -0
- package/dist/util/paths.js.map +1 -0
- package/dist/version.d.ts +5 -0
- package/dist/version.js +32 -0
- package/dist/version.js.map +1 -0
- package/package.json +86 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/commands/memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { profileFromReader, mergeReports } from '../adapters/base.js';
|
|
4
|
+
import { getAdapterOrThrow } from '../adapters/registry.js';
|
|
5
|
+
import { Profile } from '../ir/index.js';
|
|
6
|
+
import { log } from '../util/log.js';
|
|
7
|
+
import { getToolPaths } from '../util/paths.js';
|
|
8
|
+
import { box, kvTable, warnBox, withSpinner } from '../ui/index.js';
|
|
9
|
+
export function registerMigrate(program) {
|
|
10
|
+
program
|
|
11
|
+
.command('migrate')
|
|
12
|
+
.description('one-shot profile migration between tools')
|
|
13
|
+
.requiredOption('--from <tool>', 'source tool')
|
|
14
|
+
.requiredOption('--to <tool>', 'target tool')
|
|
15
|
+
.option('--project <path>', 'project path for project-scoped artifacts')
|
|
16
|
+
.option('--dry-run', 'do not write files', false)
|
|
17
|
+
.action(async (opts) => {
|
|
18
|
+
const from = getAdapterOrThrow(opts.from);
|
|
19
|
+
const to = getAdapterOrThrow(opts.to);
|
|
20
|
+
if (!from.reader) {
|
|
21
|
+
log.error(`Adapter "${from.id}" has no reader`);
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
if (!to.writer) {
|
|
25
|
+
log.error(`Adapter "${to.id}" has no writer`);
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
const paths = getToolPaths();
|
|
29
|
+
const readCtx = {
|
|
30
|
+
homeDir: paths.homeDir,
|
|
31
|
+
...(opts.project ? { projectPath: resolve(opts.project) } : {}),
|
|
32
|
+
};
|
|
33
|
+
const profileObj = await withSpinner(`Reading ${chalk.cyan(from.name)}`, async () => {
|
|
34
|
+
const manifest = await profileFromReader(from.reader, from.id, readCtx);
|
|
35
|
+
return Profile.fromManifest(manifest).withProvenance({
|
|
36
|
+
sourceTool: from.id,
|
|
37
|
+
capturedAt: new Date().toISOString(),
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
const writeCtx = {
|
|
41
|
+
homeDir: paths.homeDir,
|
|
42
|
+
...(opts.project ? { projectPath: resolve(opts.project) } : {}),
|
|
43
|
+
dryRun: opts.dryRun,
|
|
44
|
+
};
|
|
45
|
+
const action = opts.dryRun ? chalk.yellow('dry-run') : chalk.green('live');
|
|
46
|
+
const report = await withSpinner(`Writing to ${chalk.cyan(to.name)} (${action})`, async () => apply(to.writer, profileObj, writeCtx));
|
|
47
|
+
const s = profileObj.summary();
|
|
48
|
+
console.log(box(kvTable([
|
|
49
|
+
{ label: 'From', value: chalk.cyan(from.name) },
|
|
50
|
+
{ label: 'To', value: chalk.cyan(to.name) },
|
|
51
|
+
{ label: 'Mode', value: opts.dryRun ? chalk.yellow('dry-run') : chalk.green('live') },
|
|
52
|
+
{ label: '─────────', value: '' },
|
|
53
|
+
{ label: 'Rules read', value: String(s.rules) },
|
|
54
|
+
{ label: 'Agents read', value: String(s.agents) },
|
|
55
|
+
{ label: 'Commands read', value: String(s.commands) },
|
|
56
|
+
{ label: 'Skills read', value: String(s.skills) },
|
|
57
|
+
{ label: 'MCP read', value: String(s.mcpServers) },
|
|
58
|
+
{ label: 'Hooks read', value: String(s.hooks) },
|
|
59
|
+
{ label: '─────────', value: '' },
|
|
60
|
+
{ label: 'Files written', value: chalk.green(String(report.written.length)) },
|
|
61
|
+
{ label: 'Skipped', value: chalk.yellow(String(report.skipped.length)) },
|
|
62
|
+
{ label: 'Warnings', value: chalk.yellow(String(report.warnings.length)) },
|
|
63
|
+
]), opts.dryRun ? 'Migration preview' : 'Migration complete'));
|
|
64
|
+
const unique = dedupe(report.warnings);
|
|
65
|
+
if (unique.length > 0) {
|
|
66
|
+
console.log('');
|
|
67
|
+
console.log(warnBox(unique
|
|
68
|
+
.map(w => `· ${w.message}${w.count > 1 ? chalk.dim(` (×${w.count})`) : ''}`)
|
|
69
|
+
.join('\n')));
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
function dedupe(messages) {
|
|
74
|
+
const seen = new Map();
|
|
75
|
+
for (const m of messages) {
|
|
76
|
+
const normalized = m.replace(/"[^"]+"/g, '"…"');
|
|
77
|
+
seen.set(normalized, (seen.get(normalized) ?? 0) + 1);
|
|
78
|
+
}
|
|
79
|
+
return [...seen.entries()].map(([message, count]) => ({ message, count }));
|
|
80
|
+
}
|
|
81
|
+
async function apply(writer, profileObj, ctx) {
|
|
82
|
+
const m = profileObj.manifest;
|
|
83
|
+
let report = { written: [], skipped: [], warnings: [] };
|
|
84
|
+
if (m.rules.length && writer.writeRules)
|
|
85
|
+
report = mergeReports(report, await writer.writeRules(m.rules, ctx));
|
|
86
|
+
if (m.agents.length && writer.writeAgents)
|
|
87
|
+
report = mergeReports(report, await writer.writeAgents(m.agents, ctx));
|
|
88
|
+
if (m.commands.length && writer.writeCommands)
|
|
89
|
+
report = mergeReports(report, await writer.writeCommands(m.commands, ctx));
|
|
90
|
+
if (m.skills.length && writer.writeSkills)
|
|
91
|
+
report = mergeReports(report, await writer.writeSkills(m.skills, ctx));
|
|
92
|
+
if (m.mcpServers.length && writer.writeMcpServers)
|
|
93
|
+
report = mergeReports(report, await writer.writeMcpServers(m.mcpServers, ctx));
|
|
94
|
+
if (m.hooks.length && writer.writeHooks)
|
|
95
|
+
report = mergeReports(report, await writer.writeHooks(m.hooks, ctx));
|
|
96
|
+
if (m.permissions && writer.writePermissions)
|
|
97
|
+
report = mergeReports(report, await writer.writePermissions(m.permissions, ctx));
|
|
98
|
+
if (m.models && writer.writeModels)
|
|
99
|
+
report = mergeReports(report, await writer.writeModels(m.models, ctx));
|
|
100
|
+
return report;
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { join, resolve } from 'node:path';
|
|
3
|
+
import { promises as fs } from 'node:fs';
|
|
4
|
+
import { profileFromReader } from '../adapters/base.js';
|
|
5
|
+
import { mergeReports } from '../adapters/base.js';
|
|
6
|
+
import { getAdapterOrThrow, ADAPTERS } from '../adapters/registry.js';
|
|
7
|
+
import { Profile } from '../ir/index.js';
|
|
8
|
+
import { ensureDir, writeFileAtomic } from '../util/fs.js';
|
|
9
|
+
import { log } from '../util/log.js';
|
|
10
|
+
import { getToolPaths, SKEIN_SUBDIRS } from '../util/paths.js';
|
|
11
|
+
import { box, kvTable, withSpinner, infoBox, warnBox } from '../ui/index.js';
|
|
12
|
+
export function registerProfile(program) {
|
|
13
|
+
const profile = program.command('profile').description('export, import, diff, and list profiles');
|
|
14
|
+
profile
|
|
15
|
+
.command('export')
|
|
16
|
+
.description('export profile from a source tool')
|
|
17
|
+
.option('--from <tool>', 'source tool', 'claude-code')
|
|
18
|
+
.option('--project <path>', 'project path for project-scoped artifacts')
|
|
19
|
+
.option('--out <file>', 'output file (default ~/.skein/profile/<tool>.yaml)')
|
|
20
|
+
.action(async (opts) => {
|
|
21
|
+
const adapter = getAdapterOrThrow(opts.from);
|
|
22
|
+
if (!adapter.reader) {
|
|
23
|
+
log.error(`Adapter "${adapter.id}" has no reader`);
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
const paths = getToolPaths();
|
|
27
|
+
const ctx = {
|
|
28
|
+
homeDir: paths.homeDir,
|
|
29
|
+
...(opts.project ? { projectPath: resolve(opts.project) } : {}),
|
|
30
|
+
};
|
|
31
|
+
const manifest = await withSpinner(`Reading ${chalk.cyan(adapter.name)} configuration`, async () => profileFromReader(adapter.reader, adapter.id, ctx));
|
|
32
|
+
const profileObj = Profile.fromManifest(manifest).withProvenance({
|
|
33
|
+
sourceTool: adapter.id,
|
|
34
|
+
capturedAt: new Date().toISOString(),
|
|
35
|
+
});
|
|
36
|
+
const outPath = opts.out
|
|
37
|
+
? resolve(opts.out)
|
|
38
|
+
: join(paths.skeinDir, SKEIN_SUBDIRS.profile, `${adapter.id}.yaml`);
|
|
39
|
+
await withSpinner(`Writing ${chalk.dim(outPath)}`, async () => {
|
|
40
|
+
await ensureDir(join(outPath, '..'));
|
|
41
|
+
await writeFileAtomic(outPath, profileObj.toYaml());
|
|
42
|
+
});
|
|
43
|
+
const s = profileObj.summary();
|
|
44
|
+
console.log(box(kvTable([
|
|
45
|
+
{
|
|
46
|
+
label: 'Source',
|
|
47
|
+
value: `${chalk.cyan(s.sourceTool)} ${chalk.dim(s.sourceVersion ?? '')}`,
|
|
48
|
+
},
|
|
49
|
+
{ label: 'Output', value: outPath },
|
|
50
|
+
{ label: '─────────', value: '' },
|
|
51
|
+
{ label: 'Rules', value: String(s.rules) },
|
|
52
|
+
{ label: 'Agents', value: String(s.agents) },
|
|
53
|
+
{ label: 'Commands', value: String(s.commands) },
|
|
54
|
+
{ label: 'Skills', value: String(s.skills) },
|
|
55
|
+
{ label: 'MCP servers', value: String(s.mcpServers) },
|
|
56
|
+
{ label: 'Hooks', value: String(s.hooks) },
|
|
57
|
+
{ label: 'Identity', value: s.hasIdentity ? chalk.green('yes') : chalk.dim('—') },
|
|
58
|
+
{ label: 'Permissions', value: s.hasPermissions ? chalk.green('yes') : chalk.dim('—') },
|
|
59
|
+
{ label: 'Models', value: s.hasModels ? chalk.green('yes') : chalk.dim('—') },
|
|
60
|
+
]), 'Profile snapshot'));
|
|
61
|
+
});
|
|
62
|
+
profile
|
|
63
|
+
.command('import')
|
|
64
|
+
.description('import profile into a target tool')
|
|
65
|
+
.requiredOption('--to <tool>', 'target tool')
|
|
66
|
+
.option('--in <file>', 'profile file', defaultProfileIn())
|
|
67
|
+
.option('--project <path>', 'project path for project-scoped artifacts')
|
|
68
|
+
.option('--dry-run', 'do not write files', false)
|
|
69
|
+
.action(async (opts) => {
|
|
70
|
+
const adapter = getAdapterOrThrow(opts.to);
|
|
71
|
+
if (!adapter.writer) {
|
|
72
|
+
log.error(`Adapter "${adapter.id}" has no writer`);
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
75
|
+
const profileObj = await withSpinner(`Reading profile from ${chalk.dim(resolve(opts.in))}`, async () => {
|
|
76
|
+
const raw = await fs.readFile(resolve(opts.in), 'utf8');
|
|
77
|
+
return Profile.fromYaml(raw);
|
|
78
|
+
});
|
|
79
|
+
const paths = getToolPaths();
|
|
80
|
+
const ctx = {
|
|
81
|
+
homeDir: paths.homeDir,
|
|
82
|
+
...(opts.project ? { projectPath: resolve(opts.project) } : {}),
|
|
83
|
+
dryRun: opts.dryRun,
|
|
84
|
+
};
|
|
85
|
+
const action = opts.dryRun ? chalk.yellow('(dry-run)') : chalk.green('(live)');
|
|
86
|
+
const report = await withSpinner(`Applying ${chalk.cyan(profileObj.sourceTool)} → ${chalk.cyan(adapter.name)} ${action}`, async () => applyManifest(adapter.writer, profileObj, ctx));
|
|
87
|
+
console.log(box(kvTable([
|
|
88
|
+
{ label: 'Wrote', value: chalk.green(String(report.written.length)) },
|
|
89
|
+
{ label: 'Skipped', value: chalk.yellow(String(report.skipped.length)) },
|
|
90
|
+
{ label: 'Warnings', value: chalk.yellow(String(report.warnings.length)) },
|
|
91
|
+
]), opts.dryRun ? 'Import preview' : 'Import complete'));
|
|
92
|
+
const unique = dedupeWarnings(report.warnings);
|
|
93
|
+
if (unique.length > 0) {
|
|
94
|
+
console.log('');
|
|
95
|
+
console.log(warnBox(unique
|
|
96
|
+
.map(w => `· ${w.message}${w.count > 1 ? chalk.dim(` (×${w.count})`) : ''}`)
|
|
97
|
+
.join('\n')));
|
|
98
|
+
}
|
|
99
|
+
if (report.skipped.length > 0) {
|
|
100
|
+
console.log('');
|
|
101
|
+
console.log(infoBox(report.skipped.map(s => `${chalk.dim(s.item)} ${s.reason}`).join('\n'), 'Skipped'));
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
profile
|
|
105
|
+
.command('list')
|
|
106
|
+
.description('list local profile snapshots')
|
|
107
|
+
.action(async () => {
|
|
108
|
+
const paths = getToolPaths();
|
|
109
|
+
const dir = join(paths.skeinDir, SKEIN_SUBDIRS.profile);
|
|
110
|
+
const files = (await fs.readdir(dir).catch(() => [])).filter(f => f.endsWith('.yaml'));
|
|
111
|
+
if (files.length === 0) {
|
|
112
|
+
console.log(infoBox(`No profiles yet — run ${chalk.cyan('skein profile export --from claude-code')}`));
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
console.log(box(files.map(f => `${chalk.cyan('▸')} ${f}`).join('\n'), 'Snapshots'));
|
|
116
|
+
});
|
|
117
|
+
profile
|
|
118
|
+
.command('adapters')
|
|
119
|
+
.description('list adapters with capability and homepage')
|
|
120
|
+
.action(() => {
|
|
121
|
+
const rows = ADAPTERS.map(a => [chalk.bold(a.name), chalk.dim(a.id), a.homepage ?? '']);
|
|
122
|
+
console.log(box(rows.map(r => `${r[0]}\n ${r[1]}${r[2] ? ` · ${chalk.dim(r[2])}` : ''}`).join('\n\n'), 'Adapters'));
|
|
123
|
+
});
|
|
124
|
+
profile
|
|
125
|
+
.command('diff')
|
|
126
|
+
.description('diff two profile snapshots by artifact ID')
|
|
127
|
+
.requiredOption('--a <file>')
|
|
128
|
+
.requiredOption('--b <file>')
|
|
129
|
+
.action(async (opts) => {
|
|
130
|
+
const [a, b] = await Promise.all([
|
|
131
|
+
fs.readFile(resolve(opts.a), 'utf8').then(Profile.fromYaml),
|
|
132
|
+
fs.readFile(resolve(opts.b), 'utf8').then(Profile.fromYaml),
|
|
133
|
+
]);
|
|
134
|
+
const diff = a.diff(b);
|
|
135
|
+
console.log(box(kvTable([
|
|
136
|
+
{ label: 'a', value: `${a.sourceTool} ${chalk.dim(`(${a.itemCount} items)`)}` },
|
|
137
|
+
{ label: 'b', value: `${b.sourceTool} ${chalk.dim(`(${b.itemCount} items)`)}` },
|
|
138
|
+
{ label: '─────────', value: '' },
|
|
139
|
+
{ label: 'Added', value: chalk.green(`+${sumDiff(diff.added)}`) },
|
|
140
|
+
{ label: 'Removed', value: chalk.red(`-${sumDiff(diff.removed)}`) },
|
|
141
|
+
{ label: 'Unchanged', value: chalk.dim(String(sumDiff(diff.unchanged))) },
|
|
142
|
+
]), 'Profile diff'));
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
function sumDiff(s) {
|
|
146
|
+
return s.rules + s.agents + s.commands + s.skills + s.mcpServers + s.hooks;
|
|
147
|
+
}
|
|
148
|
+
function dedupeWarnings(messages) {
|
|
149
|
+
const seen = new Map();
|
|
150
|
+
for (const m of messages) {
|
|
151
|
+
const normalized = m.replace(/"[^"]+"/g, '"…"');
|
|
152
|
+
seen.set(normalized, (seen.get(normalized) ?? 0) + 1);
|
|
153
|
+
}
|
|
154
|
+
return [...seen.entries()].map(([message, count]) => ({ message, count }));
|
|
155
|
+
}
|
|
156
|
+
function defaultProfileIn() {
|
|
157
|
+
const paths = getToolPaths();
|
|
158
|
+
return join(paths.skeinDir, SKEIN_SUBDIRS.profile, 'claude-code.yaml');
|
|
159
|
+
}
|
|
160
|
+
async function applyManifest(writer, profileObj, ctx) {
|
|
161
|
+
const manifest = profileObj.manifest;
|
|
162
|
+
let report = { written: [], skipped: [], warnings: [] };
|
|
163
|
+
if (manifest.identity && writer.writeIdentity)
|
|
164
|
+
report = mergeReports(report, await writer.writeIdentity(manifest.identity, ctx));
|
|
165
|
+
if (manifest.rules.length && writer.writeRules)
|
|
166
|
+
report = mergeReports(report, await writer.writeRules(manifest.rules, ctx));
|
|
167
|
+
if (manifest.agents.length && writer.writeAgents)
|
|
168
|
+
report = mergeReports(report, await writer.writeAgents(manifest.agents, ctx));
|
|
169
|
+
if (manifest.commands.length && writer.writeCommands)
|
|
170
|
+
report = mergeReports(report, await writer.writeCommands(manifest.commands, ctx));
|
|
171
|
+
if (manifest.skills.length && writer.writeSkills)
|
|
172
|
+
report = mergeReports(report, await writer.writeSkills(manifest.skills, ctx));
|
|
173
|
+
if (manifest.mcpServers.length && writer.writeMcpServers)
|
|
174
|
+
report = mergeReports(report, await writer.writeMcpServers(manifest.mcpServers, ctx));
|
|
175
|
+
if (manifest.hooks.length && writer.writeHooks)
|
|
176
|
+
report = mergeReports(report, await writer.writeHooks(manifest.hooks, ctx));
|
|
177
|
+
if (manifest.permissions && writer.writePermissions)
|
|
178
|
+
report = mergeReports(report, await writer.writePermissions(manifest.permissions, ctx));
|
|
179
|
+
if (manifest.models && writer.writeModels)
|
|
180
|
+
report = mergeReports(report, await writer.writeModels(manifest.models, ctx));
|
|
181
|
+
return report;
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../../src/commands/profile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { promises as fs } from 'node:fs';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import { redact, lastNerError } from '../redactor/index.js';
|
|
5
|
+
import { log } from '../util/log.js';
|
|
6
|
+
import { box, infoBox, kvTable, withSpinner } from '../ui/index.js';
|
|
7
|
+
export function registerRedact(program) {
|
|
8
|
+
program
|
|
9
|
+
.command('redact')
|
|
10
|
+
.description('redact secrets and PII from a file or stdin')
|
|
11
|
+
.argument('[file]', 'input file (omit to read from stdin)')
|
|
12
|
+
.option('--ml', 'enable optional ML PII detection via Transformers.js', false)
|
|
13
|
+
.option('--no-entropy', 'disable Shannon-entropy detector')
|
|
14
|
+
.option('--no-pii', 'disable PII regex detector')
|
|
15
|
+
.option('--no-secrets', 'disable secret regex detector (dangerous)')
|
|
16
|
+
.option('--json', 'emit structured JSON report instead of redacted text', false)
|
|
17
|
+
.option('-o, --out <file>', 'write redacted output to a file')
|
|
18
|
+
.action(async (file, opts) => {
|
|
19
|
+
const input = file ? await fs.readFile(resolve(file), 'utf8') : await readStdin();
|
|
20
|
+
const result = await withSpinner('Redacting', async () => redact(input, {
|
|
21
|
+
ml: Boolean(opts.ml),
|
|
22
|
+
tiers: {
|
|
23
|
+
secrets: opts.secrets !== false,
|
|
24
|
+
entropy: opts.entropy !== false,
|
|
25
|
+
'pii-regex': opts.pii !== false,
|
|
26
|
+
},
|
|
27
|
+
}));
|
|
28
|
+
if (opts.out) {
|
|
29
|
+
await fs.writeFile(resolve(opts.out), result.text, 'utf8');
|
|
30
|
+
log.ok(`Wrote ${resolve(opts.out)}`);
|
|
31
|
+
}
|
|
32
|
+
else if (opts.json) {
|
|
33
|
+
console.log(JSON.stringify(result, null, 2));
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
process.stdout.write(result.text);
|
|
38
|
+
if (!result.text.endsWith('\n'))
|
|
39
|
+
process.stdout.write('\n');
|
|
40
|
+
}
|
|
41
|
+
const groups = groupByTier(result.hits);
|
|
42
|
+
if (result.hits.length === 0) {
|
|
43
|
+
console.log(infoBox(chalk.dim('No secrets or PII detected.')));
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
console.log(box(kvTable([
|
|
47
|
+
{ label: 'Total hits', value: chalk.green(String(result.hits.length)) },
|
|
48
|
+
...[...groups.entries()].map(([tier, count]) => ({
|
|
49
|
+
label: ` ${tier}`,
|
|
50
|
+
value: chalk.dim(String(count)),
|
|
51
|
+
})),
|
|
52
|
+
]), 'Redaction summary'));
|
|
53
|
+
if (opts.ml && lastNerError()) {
|
|
54
|
+
console.log('');
|
|
55
|
+
console.log(infoBox(`ML PII tier unavailable: ${chalk.dim(lastNerError() ?? '')}\n` +
|
|
56
|
+
chalk.dim('Install @huggingface/transformers in your project to enable it.'), 'ML tier'));
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
async function readStdin() {
|
|
61
|
+
const chunks = [];
|
|
62
|
+
for await (const chunk of process.stdin) {
|
|
63
|
+
chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : chunk);
|
|
64
|
+
}
|
|
65
|
+
return Buffer.concat(chunks).toString('utf8');
|
|
66
|
+
}
|
|
67
|
+
function groupByTier(hits) {
|
|
68
|
+
const out = new Map();
|
|
69
|
+
for (const hit of hits)
|
|
70
|
+
out.set(hit.tier, (out.get(hit.tier) ?? 0) + 1);
|
|
71
|
+
return out;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=redact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redact.js","sourceRoot":"","sources":["../../src/commands/redact.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { promises as fs } from 'node:fs';
|
|
2
|
+
import { join, resolve } from 'node:path';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import { TRACE_COLUMNS } from '../schema/trace.js';
|
|
5
|
+
import { hasConsent, readConsent, recordConsent } from '../trace/consent.js';
|
|
6
|
+
import { buildTraceRows, pushTraces, TRACE_REPO } from '../trace/push.js';
|
|
7
|
+
import { resolveTraceFormat, serializeJsonl, serializeTraces, TRACE_FORMATS, } from '../trace/serialize.js';
|
|
8
|
+
import { box, infoBox, kvTable, withSpinner } from '../ui/index.js';
|
|
9
|
+
import { ensureDir } from '../util/fs.js';
|
|
10
|
+
import { log } from '../util/log.js';
|
|
11
|
+
import { getToolPaths } from '../util/paths.js';
|
|
12
|
+
function nowIso() {
|
|
13
|
+
return new Date().toISOString();
|
|
14
|
+
}
|
|
15
|
+
/** Default for `--ml-pii`, so the ML tier is also env-configurable. */
|
|
16
|
+
function envMlPii() {
|
|
17
|
+
const v = (process.env['SKEIN_TRACE_ML_PII'] ?? '').toLowerCase();
|
|
18
|
+
return v === '1' || v === 'true' || v === 'yes' || v === 'on';
|
|
19
|
+
}
|
|
20
|
+
/** One-line status describing the ML PII tier outcome for a build/push. */
|
|
21
|
+
function mlPiiStatus(s) {
|
|
22
|
+
if (!s.requested)
|
|
23
|
+
return chalk.dim('regex tiers only (--ml-pii to add ML)');
|
|
24
|
+
return s.available
|
|
25
|
+
? chalk.green('ML tier applied')
|
|
26
|
+
: chalk.yellow('requested but UNAVAILABLE — model not loaded');
|
|
27
|
+
}
|
|
28
|
+
export function registerTrace(program) {
|
|
29
|
+
const trace = program
|
|
30
|
+
.command('trace')
|
|
31
|
+
.description('build and publish conversation traces (content redacted before push)');
|
|
32
|
+
trace
|
|
33
|
+
.command('build')
|
|
34
|
+
.description('extract redacted-content trace rows from captured conversations')
|
|
35
|
+
.option('--ml-pii', 'also run the ML PII tier (names/addresses); env: SKEIN_TRACE_ML_PII', envMlPii())
|
|
36
|
+
.action(async (opts) => {
|
|
37
|
+
const result = await withSpinner('Building trace rows', async () => buildTraceRows({ builtAt: nowIso(), mlPii: Boolean(opts.mlPii) }));
|
|
38
|
+
const dir = join(getToolPaths().skeinDir, 'trace');
|
|
39
|
+
await ensureDir(dir);
|
|
40
|
+
const outPath = join(dir, 'rows.jsonl');
|
|
41
|
+
await fs.writeFile(outPath, serializeJsonl(result.rows), 'utf8');
|
|
42
|
+
console.log(box(kvTable([
|
|
43
|
+
{ label: 'Sessions', value: String(result.sessions) },
|
|
44
|
+
{ label: 'Trace rows', value: chalk.green(String(result.rows.length)) },
|
|
45
|
+
{ label: 'Columns', value: String(TRACE_COLUMNS.length) },
|
|
46
|
+
{ label: 'ML PII', value: mlPiiStatus(result.mlPii) },
|
|
47
|
+
{ label: 'Output', value: chalk.dim(outPath) },
|
|
48
|
+
]), 'Trace build'));
|
|
49
|
+
if (result.mlPii.requested && !result.mlPii.available) {
|
|
50
|
+
log.warn('ML PII tier requested but unavailable — rows use regex redaction only. ' +
|
|
51
|
+
'Install `@huggingface/transformers` (and allow the model to download) to enable it.');
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
trace
|
|
55
|
+
.command('export')
|
|
56
|
+
.description('export redacted trace rows as jsonl | json | csv (preview when no --out)')
|
|
57
|
+
.option('--dry-run', 'print to stdout instead of writing a file', false)
|
|
58
|
+
.option('-o, --out <file>', 'write rows to a file (format inferred from extension)')
|
|
59
|
+
.option('-f, --format <fmt>', `output format: ${TRACE_FORMATS.join(' | ')}`)
|
|
60
|
+
.option('--ml-pii', 'also run the ML PII tier (names/addresses); env: SKEIN_TRACE_ML_PII', envMlPii())
|
|
61
|
+
.action(async (opts) => {
|
|
62
|
+
let format;
|
|
63
|
+
try {
|
|
64
|
+
format = resolveTraceFormat(opts.format, opts.out);
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
log.error(err instanceof Error ? err.message : String(err));
|
|
68
|
+
process.exit(1);
|
|
69
|
+
}
|
|
70
|
+
const result = await buildTraceRows({ builtAt: nowIso(), mlPii: Boolean(opts.mlPii) });
|
|
71
|
+
if (result.mlPii.requested && !result.mlPii.available) {
|
|
72
|
+
log.warn('ML PII tier requested but unavailable — output uses regex redaction only.');
|
|
73
|
+
}
|
|
74
|
+
if (opts.out && !opts.dryRun) {
|
|
75
|
+
await fs.writeFile(resolve(opts.out), serializeTraces(result.rows, format), 'utf8');
|
|
76
|
+
log.ok(`Wrote ${resolve(opts.out)} (${result.rows.length} rows, ${format})`);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
// Preview: render up to the first 5 rows in the chosen format.
|
|
80
|
+
const PREVIEW_LIMIT = 5;
|
|
81
|
+
const previewRows = result.rows.slice(0, PREVIEW_LIMIT);
|
|
82
|
+
const body = result.rows.length
|
|
83
|
+
? chalk.dim(serializeTraces(previewRows, format).toString('utf8').trimEnd())
|
|
84
|
+
: chalk.dim('No rows yet — capture conversations first.');
|
|
85
|
+
const truncated = result.rows.length > PREVIEW_LIMIT
|
|
86
|
+
? chalk.dim(`\n… ${result.rows.length - PREVIEW_LIMIT} more row(s) not shown`)
|
|
87
|
+
: '';
|
|
88
|
+
console.log(box([
|
|
89
|
+
`${chalk.bold('Format:')} ${format} ${chalk.bold('Columns:')} ${TRACE_COLUMNS.length}`,
|
|
90
|
+
'',
|
|
91
|
+
body + truncated,
|
|
92
|
+
].join('\n'), `Trace export (${opts.dryRun ? 'dry-run · ' : ''}${result.rows.length} rows)`));
|
|
93
|
+
});
|
|
94
|
+
trace
|
|
95
|
+
.command('consent')
|
|
96
|
+
.description('record opt-in consent to publish your (redacted) conversation traces')
|
|
97
|
+
.option('--handle <handle>', 'optional pseudonymous contributor handle')
|
|
98
|
+
.option('--accept', 'record acceptance of the trace publishing terms', false)
|
|
99
|
+
.action(async (opts) => {
|
|
100
|
+
if (!opts.accept) {
|
|
101
|
+
const existing = await readConsent();
|
|
102
|
+
console.log(box([
|
|
103
|
+
existing
|
|
104
|
+
? chalk.green(`Consent on file (accepted ${existing.acceptedAt}).`)
|
|
105
|
+
: chalk.yellow('No consent recorded yet.'),
|
|
106
|
+
'',
|
|
107
|
+
'By accepting, you confirm these traces are derived from your own captured',
|
|
108
|
+
'sessions and may be published under ODC-BY. They include your prompts,',
|
|
109
|
+
'outputs, and tool I/O, redacted for secrets/PII (best-effort, not',
|
|
110
|
+
'anonymization). You can request deletion later using your local key map',
|
|
111
|
+
'(~/.skein/trace/keymap.jsonl).',
|
|
112
|
+
'',
|
|
113
|
+
`Run ${chalk.cyan('skein trace consent --accept')} to record consent.`,
|
|
114
|
+
].join('\n'), 'Trace consent'));
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
const consent = await recordConsent({
|
|
118
|
+
acceptedAt: nowIso(),
|
|
119
|
+
...(opts.handle ? { handle: opts.handle } : {}),
|
|
120
|
+
});
|
|
121
|
+
console.log(box(kvTable([
|
|
122
|
+
{ label: 'Accepted at', value: chalk.green(consent.acceptedAt) },
|
|
123
|
+
{ label: 'Terms version', value: consent.termsVersion },
|
|
124
|
+
...(consent.handle ? [{ label: 'Handle', value: consent.handle }] : []),
|
|
125
|
+
]), 'Consent recorded'));
|
|
126
|
+
});
|
|
127
|
+
trace
|
|
128
|
+
.command('push')
|
|
129
|
+
.description(`push redacted-content traces to ${TRACE_REPO}`)
|
|
130
|
+
.option('--dry-run', 'plan only; touch nothing', false)
|
|
131
|
+
.option('--yes', 'confirm a real push (required without --dry-run)', false)
|
|
132
|
+
.option('--only-new', 'skip sessions already pushed to the trace repo', false)
|
|
133
|
+
.option('--ml-pii', 'also run the ML PII tier; a real push FAILS CLOSED if it is unavailable; env: SKEIN_TRACE_ML_PII', envMlPii())
|
|
134
|
+
.action(async (opts) => {
|
|
135
|
+
const consented = await hasConsent();
|
|
136
|
+
if (!opts.dryRun) {
|
|
137
|
+
if (!consented) {
|
|
138
|
+
log.error('No consent on file. Run `skein trace consent --accept` first.');
|
|
139
|
+
process.exit(1);
|
|
140
|
+
}
|
|
141
|
+
if (!opts.yes) {
|
|
142
|
+
log.error('Refusing to push without --yes.');
|
|
143
|
+
process.exit(1);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
let plan;
|
|
147
|
+
try {
|
|
148
|
+
plan = await withSpinner(opts.dryRun ? 'Planning trace push' : 'Pushing traces', async () => pushTraces({
|
|
149
|
+
builtAt: nowIso(),
|
|
150
|
+
dryRun: Boolean(opts.dryRun),
|
|
151
|
+
confirm: Boolean(opts.yes),
|
|
152
|
+
skipAlreadyPushed: Boolean(opts.onlyNew),
|
|
153
|
+
mlPii: Boolean(opts.mlPii),
|
|
154
|
+
}));
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
log.error(err instanceof Error ? err.message : String(err));
|
|
158
|
+
process.exit(1);
|
|
159
|
+
}
|
|
160
|
+
console.log(box(kvTable([
|
|
161
|
+
{ label: 'Repo', value: chalk.cyan(plan.repo) },
|
|
162
|
+
{ label: 'Dataset path', value: chalk.dim(plan.datasetPath) },
|
|
163
|
+
{ label: 'Format', value: chalk.dim('JSONL (Hub auto-generates Parquet view)') },
|
|
164
|
+
{ label: 'Sessions', value: String(plan.sessions) },
|
|
165
|
+
{ label: 'Trace rows', value: chalk.green(String(plan.rows)) },
|
|
166
|
+
{ label: 'Skipped (already pushed)', value: String(plan.skippedSessions) },
|
|
167
|
+
{ label: 'ML PII', value: mlPiiStatus(plan.mlPii) },
|
|
168
|
+
{ label: 'Bytes', value: String(plan.bytes) },
|
|
169
|
+
]), opts.dryRun ? 'Trace push (dry-run)' : 'Trace push'));
|
|
170
|
+
console.log('');
|
|
171
|
+
console.log(box(chalk.dim(plan.columns.join(', ')), 'Allowlisted columns'));
|
|
172
|
+
if (opts.dryRun && plan.mlPii.requested && !plan.mlPii.available) {
|
|
173
|
+
log.warn('ML PII tier requested but unavailable — a real push would FAIL CLOSED.');
|
|
174
|
+
}
|
|
175
|
+
if (opts.dryRun) {
|
|
176
|
+
console.log('');
|
|
177
|
+
console.log(infoBox(`Dry-run only — nothing sent. ${consented ? '' : 'No consent on file (run `skein trace consent --accept`). '}A real push also needs --yes.`));
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=trace.js.map
|