@actrun_ai/tastekit-cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.d.ts +8 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +67 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/compile.d.ts +3 -0
- package/dist/commands/compile.d.ts.map +1 -0
- package/dist/commands/compile.js +61 -0
- package/dist/commands/compile.js.map +1 -0
- package/dist/commands/completion.d.ts +9 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +191 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/drift.d.ts +3 -0
- package/dist/commands/drift.d.ts.map +1 -0
- package/dist/commands/drift.js +175 -0
- package/dist/commands/drift.js.map +1 -0
- package/dist/commands/eval.d.ts +3 -0
- package/dist/commands/eval.d.ts.map +1 -0
- package/dist/commands/eval.js +147 -0
- package/dist/commands/eval.js.map +1 -0
- package/dist/commands/export.d.ts +3 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +279 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/import.d.ts +3 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/commands/import.js +315 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/init.d.ts +5 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +213 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/mcp.d.ts +3 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +226 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/onboard.d.ts +6 -0
- package/dist/commands/onboard.d.ts.map +1 -0
- package/dist/commands/onboard.js +186 -0
- package/dist/commands/onboard.js.map +1 -0
- package/dist/commands/simulate.d.ts +3 -0
- package/dist/commands/simulate.d.ts.map +1 -0
- package/dist/commands/simulate.js +14 -0
- package/dist/commands/simulate.js.map +1 -0
- package/dist/commands/skills.d.ts +3 -0
- package/dist/commands/skills.d.ts.map +1 -0
- package/dist/commands/skills.js +419 -0
- package/dist/commands/skills.js.map +1 -0
- package/dist/commands/trust.d.ts +3 -0
- package/dist/commands/trust.d.ts.map +1 -0
- package/dist/commands/trust.js +183 -0
- package/dist/commands/trust.js.map +1 -0
- package/dist/ui.d.ts +70 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +144 -0
- package/dist/ui.js.map +1 -0
- package/package.json +51 -0
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;GAIG"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* TasteKit CLI
|
|
4
|
+
*
|
|
5
|
+
* Command-line interface for TasteKit taste compilation and management.
|
|
6
|
+
*/
|
|
7
|
+
import { Command } from 'commander';
|
|
8
|
+
import { readFileSync } from 'fs';
|
|
9
|
+
import { fileURLToPath } from 'url';
|
|
10
|
+
import { dirname, join } from 'path';
|
|
11
|
+
import { initCommand } from './commands/init.js';
|
|
12
|
+
import { onboardCommand } from './commands/onboard.js';
|
|
13
|
+
import { compileCommand } from './commands/compile.js';
|
|
14
|
+
import { mcpCommand } from './commands/mcp.js';
|
|
15
|
+
import { trustCommand } from './commands/trust.js';
|
|
16
|
+
import { skillsCommand } from './commands/skills.js';
|
|
17
|
+
import { driftCommand } from './commands/drift.js';
|
|
18
|
+
import { evalCommand } from './commands/eval.js';
|
|
19
|
+
import { exportCommand } from './commands/export.js';
|
|
20
|
+
import { importCommand } from './commands/import.js';
|
|
21
|
+
import { completionCommand } from './commands/completion.js';
|
|
22
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
23
|
+
const pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8'));
|
|
24
|
+
const program = new Command();
|
|
25
|
+
program
|
|
26
|
+
.name('tastekit')
|
|
27
|
+
.description('Compile your taste into portable AI agent artifacts')
|
|
28
|
+
.version(pkg.version);
|
|
29
|
+
// Global options
|
|
30
|
+
program.option('--json', 'Output in JSON format');
|
|
31
|
+
program.option('--verbose', 'Enable verbose logging');
|
|
32
|
+
// Commands
|
|
33
|
+
program.addCommand(initCommand);
|
|
34
|
+
program.addCommand(onboardCommand);
|
|
35
|
+
program.addCommand(compileCommand);
|
|
36
|
+
program.addCommand(mcpCommand);
|
|
37
|
+
program.addCommand(trustCommand);
|
|
38
|
+
program.addCommand(skillsCommand);
|
|
39
|
+
program.addCommand(driftCommand);
|
|
40
|
+
program.addCommand(evalCommand);
|
|
41
|
+
program.addCommand(exportCommand);
|
|
42
|
+
program.addCommand(importCommand);
|
|
43
|
+
program.addCommand(completionCommand);
|
|
44
|
+
program.addHelpText('after', `
|
|
45
|
+
Commands:
|
|
46
|
+
Core:
|
|
47
|
+
init Create a new TasteKit workspace
|
|
48
|
+
onboard Run LLM-driven onboarding interview
|
|
49
|
+
compile Compile artifacts from onboarding session
|
|
50
|
+
export Export to runtime format (claude-code, openclaw, manus)
|
|
51
|
+
|
|
52
|
+
Skills:
|
|
53
|
+
skills list List available skills
|
|
54
|
+
skills lint Validate skill definitions
|
|
55
|
+
|
|
56
|
+
Drift:
|
|
57
|
+
drift detect Check for behavioral drift from traces
|
|
58
|
+
drift review Review and apply drift proposals
|
|
59
|
+
|
|
60
|
+
Advanced:
|
|
61
|
+
mcp Manage MCP tool bindings
|
|
62
|
+
trust Trust pinning and audit
|
|
63
|
+
eval Run evaluation packs
|
|
64
|
+
import Import from SOUL.md, Agent File, etc.
|
|
65
|
+
`);
|
|
66
|
+
program.parse();
|
|
67
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAErF,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,qDAAqD,CAAC;KAClE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAExB,iBAAiB;AACjB,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,uBAAuB,CAAC,CAAC;AAClD,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,wBAAwB,CAAC,CAAC;AAEtD,WAAW;AACX,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AAC/B,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;AAEtC,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;CAqB5B,CAAC,CAAC;AAEH,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,eAAO,MAAM,cAAc,SA0DvB,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { existsSync } from 'fs';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import ora from 'ora';
|
|
6
|
+
import { compile, canResume } from '@actrun_ai/tastekit-core/compiler';
|
|
7
|
+
import { loadSession } from '@actrun_ai/tastekit-core/interview';
|
|
8
|
+
import { resolveSessionPath } from '@actrun_ai/tastekit-core/utils';
|
|
9
|
+
import { getGlobalOptions, nextSteps, handleError, jsonOutput } from '../ui.js';
|
|
10
|
+
export const compileCommand = new Command('compile')
|
|
11
|
+
.description('Compile taste artifacts from onboarding session')
|
|
12
|
+
.option('--resume', 'Resume a previously interrupted compilation')
|
|
13
|
+
.action(async (options, cmd) => {
|
|
14
|
+
const globals = getGlobalOptions(cmd);
|
|
15
|
+
const workspacePath = join(process.cwd(), '.tastekit');
|
|
16
|
+
if (!existsSync(workspacePath)) {
|
|
17
|
+
handleError(new Error('No TasteKit workspace found. Run `tastekit init` first.'));
|
|
18
|
+
}
|
|
19
|
+
const sessionPath = resolveSessionPath(workspacePath);
|
|
20
|
+
if (!existsSync(sessionPath)) {
|
|
21
|
+
handleError(new Error('No onboarding session found. Run `tastekit onboard` first.'));
|
|
22
|
+
}
|
|
23
|
+
// Auto-detect resume if derivation state exists with incomplete steps
|
|
24
|
+
const shouldResume = options.resume || canResume(workspacePath);
|
|
25
|
+
const session = loadSession(sessionPath);
|
|
26
|
+
const label = shouldResume ? 'Resuming compilation...' : 'Compiling taste artifacts...';
|
|
27
|
+
const spinner = ora(label).start();
|
|
28
|
+
try {
|
|
29
|
+
const result = await compile({
|
|
30
|
+
workspacePath,
|
|
31
|
+
session,
|
|
32
|
+
generatorVersion: '0.5.0',
|
|
33
|
+
resume: shouldResume,
|
|
34
|
+
});
|
|
35
|
+
if (result.success) {
|
|
36
|
+
const suffix = result.resumed ? ' (resumed)' : '';
|
|
37
|
+
spinner.succeed(chalk.green(`Compilation complete!${suffix}`));
|
|
38
|
+
if (globals.json) {
|
|
39
|
+
jsonOutput({ success: true, artifacts: result.artifacts, resumed: result.resumed });
|
|
40
|
+
}
|
|
41
|
+
console.log('\nGenerated artifacts:');
|
|
42
|
+
for (const artifact of result.artifacts) {
|
|
43
|
+
console.log(chalk.cyan(` * ${artifact}`));
|
|
44
|
+
}
|
|
45
|
+
nextSteps([
|
|
46
|
+
{ cmd: 'tastekit export --target claude-code', desc: 'export for Claude Code' },
|
|
47
|
+
{ cmd: 'tastekit export --target openclaw', desc: 'export for OpenClaw' },
|
|
48
|
+
]);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
spinner.fail(chalk.red('Compilation failed'));
|
|
52
|
+
result.errors?.forEach(e => console.error(chalk.red(` ${e}`)));
|
|
53
|
+
console.log(chalk.yellow('\nRun `tastekit compile --resume` to continue from where it left off.'));
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
handleError(error, spinner);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
//# sourceMappingURL=compile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile.js","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shell completion command.
|
|
3
|
+
*
|
|
4
|
+
* Generates shell completion scripts for bash, zsh, and fish.
|
|
5
|
+
* Usage: eval "$(tastekit completion bash)"
|
|
6
|
+
*/
|
|
7
|
+
import { Command } from 'commander';
|
|
8
|
+
export declare const completionCommand: Command;
|
|
9
|
+
//# sourceMappingURL=completion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoLpC,eAAO,MAAM,iBAAiB,SAkB1B,CAAC"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shell completion command.
|
|
3
|
+
*
|
|
4
|
+
* Generates shell completion scripts for bash, zsh, and fish.
|
|
5
|
+
* Usage: eval "$(tastekit completion bash)"
|
|
6
|
+
*/
|
|
7
|
+
import { Command } from 'commander';
|
|
8
|
+
const COMMANDS = [
|
|
9
|
+
'init', 'onboard', 'compile', 'simulate',
|
|
10
|
+
'mcp', 'trust', 'skills', 'drift',
|
|
11
|
+
'eval', 'export', 'import', 'completion',
|
|
12
|
+
];
|
|
13
|
+
const SUBCOMMANDS = {
|
|
14
|
+
mcp: ['add', 'list', 'inspect', 'bind'],
|
|
15
|
+
trust: ['init', 'pin-mcp', 'pin-skill-source', 'audit'],
|
|
16
|
+
skills: ['list', 'lint', 'pack'],
|
|
17
|
+
drift: ['detect', 'apply', 'memory-consolidate'],
|
|
18
|
+
eval: ['run', 'replay'],
|
|
19
|
+
};
|
|
20
|
+
const GLOBAL_OPTIONS = ['--json', '--verbose', '--help', '--version'];
|
|
21
|
+
const EXPORT_TARGETS = ['claude-code', 'manus', 'openclaw', 'autopilots', 'agents-md', 'agent-file'];
|
|
22
|
+
const IMPORT_TARGETS = ['claude-code', 'manus', 'openclaw', 'autopilots', 'soul-md', 'agent-file'];
|
|
23
|
+
const DEPTHS = ['quick', 'guided', 'operator'];
|
|
24
|
+
function bashCompletion() {
|
|
25
|
+
const subCommandCases = Object.entries(SUBCOMMANDS)
|
|
26
|
+
.map(([cmd, subs]) => ` ${cmd}) COMPREPLY=($(compgen -W "${subs.join(' ')}" -- "$cur")) ;;`)
|
|
27
|
+
.join('\n');
|
|
28
|
+
return `# tastekit bash completion
|
|
29
|
+
# eval "$(tastekit completion bash)"
|
|
30
|
+
|
|
31
|
+
_tastekit_completions() {
|
|
32
|
+
local cur prev commands
|
|
33
|
+
COMPREPLY=()
|
|
34
|
+
cur="\${COMP_WORDS[COMP_CWORD]}"
|
|
35
|
+
prev="\${COMP_WORDS[COMP_CWORD-1]}"
|
|
36
|
+
commands="${COMMANDS.join(' ')}"
|
|
37
|
+
|
|
38
|
+
if [[ \${COMP_CWORD} -eq 1 ]]; then
|
|
39
|
+
COMPREPLY=($(compgen -W "$commands ${GLOBAL_OPTIONS.join(' ')}" -- "$cur"))
|
|
40
|
+
return 0
|
|
41
|
+
fi
|
|
42
|
+
|
|
43
|
+
case "\${COMP_WORDS[1]}" in
|
|
44
|
+
${subCommandCases}
|
|
45
|
+
export)
|
|
46
|
+
if [[ "$prev" == "--target" ]]; then
|
|
47
|
+
COMPREPLY=($(compgen -W "${EXPORT_TARGETS.join(' ')}" -- "$cur"))
|
|
48
|
+
else
|
|
49
|
+
COMPREPLY=($(compgen -W "--target --out" -- "$cur"))
|
|
50
|
+
fi
|
|
51
|
+
;;
|
|
52
|
+
import)
|
|
53
|
+
if [[ "$prev" == "--target" ]]; then
|
|
54
|
+
COMPREPLY=($(compgen -W "${IMPORT_TARGETS.join(' ')}" -- "$cur"))
|
|
55
|
+
else
|
|
56
|
+
COMPREPLY=($(compgen -W "--target --source" -- "$cur"))
|
|
57
|
+
fi
|
|
58
|
+
;;
|
|
59
|
+
init)
|
|
60
|
+
if [[ "$prev" == "--depth" ]]; then
|
|
61
|
+
COMPREPLY=($(compgen -W "${DEPTHS.join(' ')}" -- "$cur"))
|
|
62
|
+
else
|
|
63
|
+
COMPREPLY=($(compgen -W "--domain --depth" -- "$cur"))
|
|
64
|
+
fi
|
|
65
|
+
;;
|
|
66
|
+
onboard)
|
|
67
|
+
if [[ "$prev" == "--depth" ]]; then
|
|
68
|
+
COMPREPLY=($(compgen -W "${DEPTHS.join(' ')}" -- "$cur"))
|
|
69
|
+
else
|
|
70
|
+
COMPREPLY=($(compgen -W "--depth --resume --provider" -- "$cur"))
|
|
71
|
+
fi
|
|
72
|
+
;;
|
|
73
|
+
esac
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
complete -F _tastekit_completions tastekit
|
|
77
|
+
`;
|
|
78
|
+
}
|
|
79
|
+
function zshCompletion() {
|
|
80
|
+
const subcmdLines = Object.entries(SUBCOMMANDS)
|
|
81
|
+
.map(([cmd, subs]) => {
|
|
82
|
+
const items = subs.map(s => `'${s}:${s} subcommand'`).join(' ');
|
|
83
|
+
return ` ${cmd}) _values 'subcommand' ${items} ;;`;
|
|
84
|
+
})
|
|
85
|
+
.join('\n');
|
|
86
|
+
return `#compdef tastekit
|
|
87
|
+
# tastekit zsh completion
|
|
88
|
+
# eval "$(tastekit completion zsh)"
|
|
89
|
+
|
|
90
|
+
_tastekit() {
|
|
91
|
+
local -a commands
|
|
92
|
+
commands=(
|
|
93
|
+
'init:Initialize a new TasteKit workspace'
|
|
94
|
+
'onboard:Run the LLM-driven onboarding interview'
|
|
95
|
+
'compile:Compile taste artifacts'
|
|
96
|
+
'simulate:Run simulation with dry-run mode'
|
|
97
|
+
'mcp:Manage MCP server bindings'
|
|
98
|
+
'trust:Manage trust and provenance'
|
|
99
|
+
'skills:Manage skills library'
|
|
100
|
+
'drift:Manage drift detection and memory'
|
|
101
|
+
'eval:Run evaluations'
|
|
102
|
+
'export:Export to runtime adapter format'
|
|
103
|
+
'import:Import from runtime format'
|
|
104
|
+
'completion:Generate shell completions'
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
_arguments -C \\
|
|
108
|
+
'--json[Output in JSON format]' \\
|
|
109
|
+
'--verbose[Enable verbose logging]' \\
|
|
110
|
+
'1:command:->command' \\
|
|
111
|
+
'*::arg:->args'
|
|
112
|
+
|
|
113
|
+
case $state in
|
|
114
|
+
command)
|
|
115
|
+
_describe -t commands 'tastekit command' commands
|
|
116
|
+
;;
|
|
117
|
+
args)
|
|
118
|
+
case \${words[1]} in
|
|
119
|
+
${subcmdLines}
|
|
120
|
+
export) _arguments '--target[Target adapter]:target:(${EXPORT_TARGETS.join(' ')})' '--out[Output directory]:directory:_directories' ;;
|
|
121
|
+
import) _arguments '--target[Source format]:target:(${IMPORT_TARGETS.join(' ')})' '--source[Source path]:path:_files' ;;
|
|
122
|
+
init) _arguments '--domain[Domain ID]:domain:' '--depth[Onboarding depth]:depth:(${DEPTHS.join(' ')})' ;;
|
|
123
|
+
onboard) _arguments '--depth[Override depth]:depth:(${DEPTHS.join(' ')})' '--resume[Resume session]' '--provider[LLM provider]:provider:(anthropic openai ollama)' ;;
|
|
124
|
+
esac
|
|
125
|
+
;;
|
|
126
|
+
esac
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
_tastekit "$@"
|
|
130
|
+
`;
|
|
131
|
+
}
|
|
132
|
+
function fishCompletion() {
|
|
133
|
+
const lines = [
|
|
134
|
+
'# tastekit fish completion',
|
|
135
|
+
'# tastekit completion fish | source',
|
|
136
|
+
'',
|
|
137
|
+
'# Disable file completion by default',
|
|
138
|
+
'complete -c tastekit -f',
|
|
139
|
+
'',
|
|
140
|
+
'# Commands',
|
|
141
|
+
];
|
|
142
|
+
const cmdDescs = {
|
|
143
|
+
init: 'Initialize a new TasteKit workspace',
|
|
144
|
+
onboard: 'Run the LLM-driven onboarding interview',
|
|
145
|
+
compile: 'Compile taste artifacts',
|
|
146
|
+
simulate: 'Run simulation with dry-run mode',
|
|
147
|
+
mcp: 'Manage MCP server bindings',
|
|
148
|
+
trust: 'Manage trust and provenance',
|
|
149
|
+
skills: 'Manage skills library',
|
|
150
|
+
drift: 'Manage drift detection and memory',
|
|
151
|
+
eval: 'Run evaluations',
|
|
152
|
+
export: 'Export to runtime adapter format',
|
|
153
|
+
import: 'Import from runtime format',
|
|
154
|
+
completion: 'Generate shell completions',
|
|
155
|
+
};
|
|
156
|
+
for (const [cmd, desc] of Object.entries(cmdDescs)) {
|
|
157
|
+
lines.push(`complete -c tastekit -n '__fish_use_subcommand' -a ${cmd} -d '${desc}'`);
|
|
158
|
+
}
|
|
159
|
+
lines.push('');
|
|
160
|
+
lines.push('# Subcommands');
|
|
161
|
+
for (const [cmd, subs] of Object.entries(SUBCOMMANDS)) {
|
|
162
|
+
for (const sub of subs) {
|
|
163
|
+
lines.push(`complete -c tastekit -n '__fish_seen_subcommand_from ${cmd}' -a ${sub}`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
lines.push('');
|
|
167
|
+
lines.push('# Global options');
|
|
168
|
+
lines.push("complete -c tastekit -l json -d 'Output in JSON format'");
|
|
169
|
+
lines.push("complete -c tastekit -l verbose -d 'Enable verbose logging'");
|
|
170
|
+
return lines.join('\n') + '\n';
|
|
171
|
+
}
|
|
172
|
+
export const completionCommand = new Command('completion')
|
|
173
|
+
.description('Generate shell completion script')
|
|
174
|
+
.argument('[shell]', 'Shell type: bash, zsh, or fish', 'bash')
|
|
175
|
+
.action((shell) => {
|
|
176
|
+
switch (shell) {
|
|
177
|
+
case 'bash':
|
|
178
|
+
process.stdout.write(bashCompletion());
|
|
179
|
+
break;
|
|
180
|
+
case 'zsh':
|
|
181
|
+
process.stdout.write(zshCompletion());
|
|
182
|
+
break;
|
|
183
|
+
case 'fish':
|
|
184
|
+
process.stdout.write(fishCompletion());
|
|
185
|
+
break;
|
|
186
|
+
default:
|
|
187
|
+
console.error(`Unknown shell: ${shell}. Use bash, zsh, or fish.`);
|
|
188
|
+
process.exit(1);
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
//# sourceMappingURL=completion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion.js","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drift.d.ts","sourceRoot":"","sources":["../../src/commands/drift.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8MpC,eAAO,MAAM,YAAY,SAGO,CAAC"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import { existsSync, readFileSync, writeFileSync, readdirSync, mkdirSync } from 'fs';
|
|
5
|
+
import { join } from 'path';
|
|
6
|
+
import { DriftDetector } from '@actrun_ai/tastekit-core/drift';
|
|
7
|
+
import { MemoryConsolidator } from '@actrun_ai/tastekit-core/drift';
|
|
8
|
+
import { resolveArtifactPath, resolveTracesPath } from '@actrun_ai/tastekit-core/utils';
|
|
9
|
+
import { getGlobalOptions, riskColor, header, detail, hint, handleError, jsonOutput, verbose } from '../ui.js';
|
|
10
|
+
const driftDetectCommand = new Command('detect')
|
|
11
|
+
.description('Detect drift from traces and feedback')
|
|
12
|
+
.option('--since <date>', 'Detect drift since date (ISO format)')
|
|
13
|
+
.option('--skill <id>', 'Detect drift for specific skill')
|
|
14
|
+
.action(async (options, cmd) => {
|
|
15
|
+
const globals = getGlobalOptions(cmd);
|
|
16
|
+
const workspacePath = process.cwd();
|
|
17
|
+
const tastekitPath = join(workspacePath, '.tastekit');
|
|
18
|
+
const tracesDir = resolveTracesPath(tastekitPath);
|
|
19
|
+
if (!existsSync(tracesDir)) {
|
|
20
|
+
console.log(chalk.yellow('No traces found. Run your agent to generate traces first.'));
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const spinner = ora('Analyzing traces for drift...').start();
|
|
24
|
+
try {
|
|
25
|
+
const detector = new DriftDetector();
|
|
26
|
+
// Collect trace files
|
|
27
|
+
const traceFiles = readdirSync(tracesDir)
|
|
28
|
+
.filter(f => f.endsWith('.jsonl'))
|
|
29
|
+
.map(f => join(tracesDir, f));
|
|
30
|
+
if (traceFiles.length === 0) {
|
|
31
|
+
spinner.info(chalk.yellow('No trace files found.'));
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
verbose(`Found ${traceFiles.length} trace file(s)`, globals);
|
|
35
|
+
const detectionOptions = {};
|
|
36
|
+
if (options.since) {
|
|
37
|
+
detectionOptions.since = new Date(options.since);
|
|
38
|
+
}
|
|
39
|
+
if (options.skill) {
|
|
40
|
+
detectionOptions.skillId = options.skill;
|
|
41
|
+
}
|
|
42
|
+
const proposals = detector.detectFromTraces(traceFiles, detectionOptions);
|
|
43
|
+
if (proposals.length === 0) {
|
|
44
|
+
spinner.succeed(chalk.green('No drift detected.'));
|
|
45
|
+
if (globals.json)
|
|
46
|
+
jsonOutput({ proposals: [] });
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
spinner.warn(chalk.yellow(`Found ${proposals.length} drift proposal(s)`));
|
|
50
|
+
// Save proposals
|
|
51
|
+
const proposalsDir = join(workspacePath, '.tastekit', 'proposals');
|
|
52
|
+
mkdirSync(proposalsDir, { recursive: true });
|
|
53
|
+
for (const proposal of proposals) {
|
|
54
|
+
const proposalPath = join(proposalsDir, `${proposal.proposal_id}.json`);
|
|
55
|
+
writeFileSync(proposalPath, JSON.stringify(proposal, null, 2), 'utf-8');
|
|
56
|
+
}
|
|
57
|
+
if (globals.json) {
|
|
58
|
+
jsonOutput({ proposals });
|
|
59
|
+
}
|
|
60
|
+
// Display proposals
|
|
61
|
+
console.log('');
|
|
62
|
+
for (const proposal of proposals) {
|
|
63
|
+
console.log(chalk.bold(` ${proposal.proposal_id}`));
|
|
64
|
+
detail('Signal', `${proposal.signal_type} (${proposal.frequency}x)`);
|
|
65
|
+
console.log(` Risk: ${riskColor(proposal.risk_rating)}`);
|
|
66
|
+
console.log(` ${proposal.rationale}`);
|
|
67
|
+
console.log('');
|
|
68
|
+
}
|
|
69
|
+
hint('tastekit drift apply <proposal_id>', 'apply a proposal');
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
handleError(error, spinner);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
const driftApplyCommand = new Command('apply')
|
|
76
|
+
.description('Apply a drift proposal')
|
|
77
|
+
.argument('<proposal_id>', 'Proposal ID to apply')
|
|
78
|
+
.action(async (proposalId, _options, cmd) => {
|
|
79
|
+
const globals = getGlobalOptions(cmd);
|
|
80
|
+
const workspacePath = process.cwd();
|
|
81
|
+
const proposalPath = join(workspacePath, '.tastekit', 'proposals', `${proposalId}.json`);
|
|
82
|
+
if (!existsSync(proposalPath)) {
|
|
83
|
+
console.error(chalk.red(`Proposal not found: ${proposalId}`));
|
|
84
|
+
hint('tastekit drift detect', 'find proposals');
|
|
85
|
+
process.exit(1);
|
|
86
|
+
}
|
|
87
|
+
const spinner = ora(`Applying proposal ${proposalId}...`).start();
|
|
88
|
+
try {
|
|
89
|
+
const proposal = JSON.parse(readFileSync(proposalPath, 'utf-8'));
|
|
90
|
+
// Apply changes to constitution
|
|
91
|
+
const constitutionPath = resolveArtifactPath(join(workspacePath, '.tastekit'), 'constitution');
|
|
92
|
+
if (existsSync(constitutionPath) && proposal.proposed_changes.constitution) {
|
|
93
|
+
const constitution = JSON.parse(readFileSync(constitutionPath, 'utf-8'));
|
|
94
|
+
if (proposal.proposed_changes.constitution.add_principle) {
|
|
95
|
+
constitution.principles.push(proposal.proposed_changes.constitution.add_principle);
|
|
96
|
+
}
|
|
97
|
+
writeFileSync(constitutionPath, JSON.stringify(constitution, null, 2), 'utf-8');
|
|
98
|
+
}
|
|
99
|
+
// Mark proposal as applied
|
|
100
|
+
proposal.applied_at = new Date().toISOString();
|
|
101
|
+
writeFileSync(proposalPath, JSON.stringify(proposal, null, 2), 'utf-8');
|
|
102
|
+
spinner.succeed(chalk.green(`Applied proposal: ${proposalId}`));
|
|
103
|
+
if (globals.json) {
|
|
104
|
+
jsonOutput({ applied: proposalId, applied_at: proposal.applied_at });
|
|
105
|
+
}
|
|
106
|
+
hint('tastekit compile', 'recompile artifacts');
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
handleError(error, spinner);
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
const memoryConsolidateCommand = new Command('consolidate')
|
|
113
|
+
.description('Consolidate memory (prune old, merge similar)')
|
|
114
|
+
.option('--retention <days>', 'Retention period in days', '30')
|
|
115
|
+
.action(async (options, cmd) => {
|
|
116
|
+
const globals = getGlobalOptions(cmd);
|
|
117
|
+
const workspacePath = process.cwd();
|
|
118
|
+
const memoryDir = join(workspacePath, '.tastekit', 'memory');
|
|
119
|
+
if (!existsSync(memoryDir)) {
|
|
120
|
+
console.log(chalk.yellow('No memory directory found.'));
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
const spinner = ora('Consolidating memory...').start();
|
|
124
|
+
try {
|
|
125
|
+
// Read memory entries
|
|
126
|
+
const memoryFiles = existsSync(memoryDir)
|
|
127
|
+
? readdirSync(memoryDir).filter(f => f.endsWith('.json'))
|
|
128
|
+
: [];
|
|
129
|
+
if (memoryFiles.length === 0) {
|
|
130
|
+
spinner.info(chalk.yellow('No memory entries to consolidate.'));
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
verbose(`Processing ${memoryFiles.length} memory file(s)`, globals);
|
|
134
|
+
const memories = memoryFiles.map(f => {
|
|
135
|
+
const content = JSON.parse(readFileSync(join(memoryDir, f), 'utf-8'));
|
|
136
|
+
return {
|
|
137
|
+
id: f.replace('.json', ''),
|
|
138
|
+
content: content.content || JSON.stringify(content),
|
|
139
|
+
salience: content.salience || 0.5,
|
|
140
|
+
timestamp: content.timestamp || new Date().toISOString(),
|
|
141
|
+
};
|
|
142
|
+
});
|
|
143
|
+
const consolidator = new MemoryConsolidator();
|
|
144
|
+
const plan = consolidator.generateConsolidationPlan(memories, parseInt(options.retention));
|
|
145
|
+
spinner.succeed(chalk.green('Consolidation plan generated'));
|
|
146
|
+
if (globals.json) {
|
|
147
|
+
jsonOutput(plan);
|
|
148
|
+
}
|
|
149
|
+
console.log('');
|
|
150
|
+
header('Plan');
|
|
151
|
+
detail('Keep', `${plan.memories_to_keep.length} memories`);
|
|
152
|
+
detail('Prune', `${plan.memories_to_prune.length} memories`);
|
|
153
|
+
detail('Merge', `${plan.memories_to_merge.length} groups`);
|
|
154
|
+
if (plan.memories_to_merge.length > 0) {
|
|
155
|
+
console.log('');
|
|
156
|
+
console.log(chalk.bold(' Merges:'));
|
|
157
|
+
for (const merge of plan.memories_to_merge) {
|
|
158
|
+
console.log(` ${merge.source_ids.join(' + ')} -> merged`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// Save plan
|
|
162
|
+
const planPath = join(workspacePath, '.tastekit', 'consolidation-plan.json');
|
|
163
|
+
writeFileSync(planPath, JSON.stringify(plan, null, 2), 'utf-8');
|
|
164
|
+
console.log(chalk.gray(`\n Plan saved to: ${planPath}`));
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
handleError(error, spinner);
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
export const driftCommand = new Command('drift')
|
|
171
|
+
.description('Manage drift detection and memory')
|
|
172
|
+
.addCommand(driftDetectCommand)
|
|
173
|
+
.addCommand(driftApplyCommand);
|
|
174
|
+
driftCommand.addCommand(memoryConsolidateCommand.name('memory-consolidate'));
|
|
175
|
+
//# sourceMappingURL=drift.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drift.js","sourceRoot":"","sources":["../../src/commands/drift.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval.d.ts","sourceRoot":"","sources":["../../src/commands/eval.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmKpC,eAAO,MAAM,WAAW,SAGQ,CAAC"}
|