@markusylisiurunen/tau 0.2.119 → 0.2.120
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
CHANGED
|
@@ -272,7 +272,7 @@ tau uses `caffeinate -i` and only holds the sleep assertion during active assist
|
|
|
272
272
|
tau comes with several built-in personas across different models:
|
|
273
273
|
|
|
274
274
|
- **Claude Opus 4.6** (Anthropic): `opus-4.6-chat`, `opus-4.6-coder`
|
|
275
|
-
- **Claude Opus 4.
|
|
275
|
+
- **Claude Opus 4.8** (Anthropic): `opus-4.8-chat`, `opus-4.8-coder`
|
|
276
276
|
- **GPT-5.3-Codex** (OpenAI): `gpt-5.3-codex`
|
|
277
277
|
- **GPT-5.4** (OpenAI): `gpt-5.4-chat`, `gpt-5.4-coder`
|
|
278
278
|
- **GPT-5.3-Codex (ChatGPT)** (OpenAI Codex): `gpt-5.3-codex-chatgpt`
|
|
@@ -289,7 +289,7 @@ switch personas at startup with `--persona` or mid-session with `/persona:<id>`:
|
|
|
289
289
|
persona id matching is exact/case-sensitive.
|
|
290
290
|
|
|
291
291
|
```sh
|
|
292
|
-
tau --persona opus-4.
|
|
292
|
+
tau --persona opus-4.8-coder
|
|
293
293
|
```
|
|
294
294
|
|
|
295
295
|
## sub-agents
|
|
@@ -319,7 +319,7 @@ when you write custom skills, you can specify trigger sensitivity in the skill d
|
|
|
319
319
|
some models support extended thinking, where they reason through problems before responding. cycle through reasoning levels with `shift+tab`, or set one at startup:
|
|
320
320
|
|
|
321
321
|
```sh
|
|
322
|
-
tau --persona opus-4.
|
|
322
|
+
tau --persona opus-4.8-chat:high
|
|
323
323
|
```
|
|
324
324
|
|
|
325
325
|
toggle visibility of the model's thinking with `ctrl+t`.
|
|
@@ -335,7 +335,7 @@ to explicitly target a sub-agent, use `@@agent:<name>` (for example, `@@agent:de
|
|
|
335
335
|
you can also pipe content directly:
|
|
336
336
|
|
|
337
337
|
```sh
|
|
338
|
-
cat src/tui/app.ts | tau --persona opus-4.
|
|
338
|
+
cat src/tui/app.ts | tau --persona opus-4.8-chat
|
|
339
339
|
```
|
|
340
340
|
|
|
341
341
|
by default, tau injects your AGENTS.md into the system prompt. use `--no-agent-context-files` to disable this behavior. tau searches for AGENTS.md in the current directory and parent directories up to your home folder (or filesystem root if cwd is outside home). tau also includes a paths-only listing of `AGENTS.md` files in child directories under the current working directory, excluding any file already injected in full.
|
|
@@ -587,7 +587,7 @@ create your own personas by adding markdown files to `~/.config/tau/personas/` (
|
|
|
587
587
|
---
|
|
588
588
|
id: my-assistant
|
|
589
589
|
provider: anthropic
|
|
590
|
-
model: claude-opus-4-
|
|
590
|
+
model: claude-opus-4-8
|
|
591
591
|
---
|
|
592
592
|
|
|
593
593
|
you are a helpful assistant specialized in my workflow. focus on clarity and efficiency.
|
|
@@ -597,7 +597,7 @@ the frontmatter defines the persona. required fields:
|
|
|
597
597
|
|
|
598
598
|
- `id`: unique id used by `--persona` and `/persona:<id>`
|
|
599
599
|
- `provider`: model provider id (for example `openai`, `anthropic`, `google`)
|
|
600
|
-
- `model`: model id for the provider (for example `gpt-5.4`, `claude-opus-4-
|
|
600
|
+
- `model`: model id for the provider (for example `gpt-5.4`, `claude-opus-4-8`)
|
|
601
601
|
|
|
602
602
|
custom personas/subagents can reference model ids that are not bundled yet, as long as the provider is known. built-in personas use the merged model catalog, so `models.json` can override bundled model definitions. see [docs/models.md](docs/models.md).
|
|
603
603
|
|
package/dist/core/cli.js
CHANGED
|
@@ -178,7 +178,7 @@ export function printHelp(personas) {
|
|
|
178
178
|
"",
|
|
179
179
|
"examples:",
|
|
180
180
|
" tau --persona gpt-5.4-chat:high",
|
|
181
|
-
" tau -p opus-4.
|
|
181
|
+
" tau -p opus-4.8-coder",
|
|
182
182
|
" tau --persona gpt-5.4-chat:medium --risk read-write",
|
|
183
183
|
" tau -p gpt-5.4-coder:high -r read-write",
|
|
184
184
|
" tau -l /tmp/tau-checkpoint-abc123/checkpoint.json",
|
package/dist/core/personas.js
CHANGED
|
@@ -163,10 +163,10 @@ const CODER_SYSTEM_PROMPT = [
|
|
|
163
163
|
].join("\n\n");
|
|
164
164
|
const PERSONA_SPECS = [
|
|
165
165
|
{
|
|
166
|
-
id: "opus-4.
|
|
167
|
-
description: "Claude Opus 4.
|
|
166
|
+
id: "opus-4.8",
|
|
167
|
+
description: "Claude Opus 4.8",
|
|
168
168
|
provider: "anthropic",
|
|
169
|
-
modelId: "claude-opus-4-
|
|
169
|
+
modelId: "claude-opus-4-8",
|
|
170
170
|
allowedReasoningLevels: ["low", "medium", "high", "xhigh"],
|
|
171
171
|
settings: { reasoning: "medium" },
|
|
172
172
|
skills: "*",
|
|
@@ -280,7 +280,7 @@ const PERSONA_SPECS = [
|
|
|
280
280
|
skills: "*",
|
|
281
281
|
},
|
|
282
282
|
];
|
|
283
|
-
export const DEFAULT_BUILTIN_PERSONA_ID = "opus-4.
|
|
283
|
+
export const DEFAULT_BUILTIN_PERSONA_ID = "opus-4.8-chat";
|
|
284
284
|
const VARIANT_CONFIG = {
|
|
285
285
|
chat: { suffix: "-chat", systemPrompt: BASIC_SYSTEM_PROMPT },
|
|
286
286
|
coder: { suffix: "-coder", systemPrompt: CODER_SYSTEM_PROMPT },
|
|
@@ -1,21 +1,32 @@
|
|
|
1
|
-
import { readdir, realpath, stat } from "node:fs/promises";
|
|
2
|
-
import { join } from "node:path";
|
|
3
1
|
import { spawnWithCapture } from "./spawn_capture.js";
|
|
4
|
-
const
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
2
|
+
const MAX_STDOUT_BYTES = 10 * 1024 * 1024;
|
|
3
|
+
const MAX_FILE_COUNT = 50_000;
|
|
4
|
+
const MAX_DIRECTORY_COUNT = 25_000;
|
|
5
|
+
const MAX_ENTRY_COUNT = MAX_FILE_COUNT + MAX_DIRECTORY_COUNT;
|
|
6
|
+
const RIPGREP_TIMEOUT_MS = 5000;
|
|
7
|
+
async function runRipgrepFiles(cwd) {
|
|
8
|
+
const result = await spawnWithCapture("rg", ["--files", "--hidden", "--glob", "!.git/"], {
|
|
8
9
|
cwd,
|
|
9
10
|
maxCaptureBytes: MAX_STDOUT_BYTES,
|
|
11
|
+
timeoutMs: RIPGREP_TIMEOUT_MS,
|
|
10
12
|
stdio: ["ignore", "pipe", "ignore"],
|
|
11
13
|
});
|
|
12
|
-
if (result.captureLimitExceeded) {
|
|
13
|
-
const err = new Error(`command stdout exceeded ${MAX_STDOUT_BYTES} bytes: ${cmd}`);
|
|
14
|
-
err.name = "StdoutLimitExceededError";
|
|
15
|
-
throw err;
|
|
16
|
-
}
|
|
17
14
|
return { status: result.exitCode ?? 1, stdout: result.stdout };
|
|
18
15
|
}
|
|
16
|
+
function listFilesFromOutput(stdout) {
|
|
17
|
+
const files = [];
|
|
18
|
+
const seen = new Set();
|
|
19
|
+
for (const line of stdout.split("\n")) {
|
|
20
|
+
const file = line.trim();
|
|
21
|
+
if (!file || seen.has(file))
|
|
22
|
+
continue;
|
|
23
|
+
files.push(file);
|
|
24
|
+
seen.add(file);
|
|
25
|
+
if (files.length >= MAX_FILE_COUNT)
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
return files;
|
|
29
|
+
}
|
|
19
30
|
function listDirectoriesFromFiles(files) {
|
|
20
31
|
const out = new Set();
|
|
21
32
|
for (const file of files) {
|
|
@@ -26,102 +37,38 @@ function listDirectoriesFromFiles(files) {
|
|
|
26
37
|
const dir = parts.slice(0, i).join("/");
|
|
27
38
|
if (dir)
|
|
28
39
|
out.add(`${dir}/`);
|
|
40
|
+
if (out.size >= MAX_DIRECTORY_COUNT)
|
|
41
|
+
return [...out];
|
|
29
42
|
}
|
|
30
43
|
}
|
|
31
44
|
return [...out];
|
|
32
45
|
}
|
|
33
46
|
function combineEntries(files, dirs) {
|
|
34
47
|
const out = new Set();
|
|
35
|
-
for (const file of files)
|
|
48
|
+
for (const file of files) {
|
|
36
49
|
out.add(file);
|
|
37
|
-
|
|
38
|
-
|
|
50
|
+
if (out.size >= MAX_ENTRY_COUNT)
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
if (out.size < MAX_ENTRY_COUNT) {
|
|
54
|
+
for (const dir of dirs) {
|
|
55
|
+
out.add(dir);
|
|
56
|
+
if (out.size >= MAX_ENTRY_COUNT)
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
39
60
|
return [...out].sort();
|
|
40
61
|
}
|
|
41
62
|
export async function listProjectFilesAsync(cwd) {
|
|
42
|
-
const fromRipgrep = await listProjectFilesFromRipgrepAsync(cwd);
|
|
43
|
-
if (fromRipgrep.length)
|
|
44
|
-
return fromRipgrep;
|
|
45
|
-
return listProjectFilesByWalkingAsync(cwd);
|
|
46
|
-
}
|
|
47
|
-
async function listProjectFilesFromRipgrepAsync(cwd) {
|
|
48
63
|
try {
|
|
49
|
-
const res = await
|
|
50
|
-
if (res.status !== 0)
|
|
64
|
+
const res = await runRipgrepFiles(cwd);
|
|
65
|
+
if (res.status !== 0 && !res.stdout)
|
|
51
66
|
return [];
|
|
52
|
-
const files = (res.stdout
|
|
53
|
-
|
|
54
|
-
.map((l) => l.trim())
|
|
55
|
-
.filter(Boolean);
|
|
56
|
-
const uniqueFiles = [...new Set(files)];
|
|
57
|
-
return combineEntries(uniqueFiles, listDirectoriesFromFiles(uniqueFiles));
|
|
67
|
+
const files = listFilesFromOutput(res.stdout);
|
|
68
|
+
return combineEntries(files, listDirectoriesFromFiles(files));
|
|
58
69
|
}
|
|
59
70
|
catch {
|
|
60
71
|
return [];
|
|
61
72
|
}
|
|
62
73
|
}
|
|
63
|
-
async function listProjectFilesByWalkingAsync(cwd) {
|
|
64
|
-
const files = new Set();
|
|
65
|
-
const dirs = new Set();
|
|
66
|
-
const realpathStack = new Set();
|
|
67
|
-
const walk = async (dirAbs, dirRel) => {
|
|
68
|
-
let dirReal;
|
|
69
|
-
try {
|
|
70
|
-
dirReal = await realpath(dirAbs);
|
|
71
|
-
}
|
|
72
|
-
catch {
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
if (realpathStack.has(dirReal))
|
|
76
|
-
return;
|
|
77
|
-
realpathStack.add(dirReal);
|
|
78
|
-
try {
|
|
79
|
-
const entries = await readdir(dirAbs, { withFileTypes: true, encoding: "utf8" });
|
|
80
|
-
for (const entry of entries) {
|
|
81
|
-
if (entry.isDirectory()) {
|
|
82
|
-
if (DEFAULT_IGNORED_DIRS.has(entry.name))
|
|
83
|
-
continue;
|
|
84
|
-
const nextAbs = join(dirAbs, entry.name);
|
|
85
|
-
const nextRel = dirRel ? join(dirRel, entry.name) : entry.name;
|
|
86
|
-
dirs.add(`${nextRel}/`);
|
|
87
|
-
await walk(nextAbs, nextRel);
|
|
88
|
-
continue;
|
|
89
|
-
}
|
|
90
|
-
if (entry.isSymbolicLink()) {
|
|
91
|
-
try {
|
|
92
|
-
const targetPath = join(dirAbs, entry.name);
|
|
93
|
-
const st = await stat(targetPath);
|
|
94
|
-
if (st.isDirectory()) {
|
|
95
|
-
if (DEFAULT_IGNORED_DIRS.has(entry.name))
|
|
96
|
-
continue;
|
|
97
|
-
const nextRel = dirRel ? join(dirRel, entry.name) : entry.name;
|
|
98
|
-
dirs.add(`${nextRel}/`);
|
|
99
|
-
await walk(targetPath, nextRel);
|
|
100
|
-
}
|
|
101
|
-
else if (st.isFile()) {
|
|
102
|
-
const rel = dirRel ? join(dirRel, entry.name) : entry.name;
|
|
103
|
-
files.add(rel);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
catch {
|
|
107
|
-
// Broken symlink or permission error, skip
|
|
108
|
-
}
|
|
109
|
-
continue;
|
|
110
|
-
}
|
|
111
|
-
if (entry.isFile()) {
|
|
112
|
-
const rel = dirRel ? join(dirRel, entry.name) : entry.name;
|
|
113
|
-
files.add(rel);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
catch {
|
|
118
|
-
return;
|
|
119
|
-
}
|
|
120
|
-
finally {
|
|
121
|
-
realpathStack.delete(dirReal);
|
|
122
|
-
}
|
|
123
|
-
};
|
|
124
|
-
await walk(cwd, "");
|
|
125
|
-
return combineEntries(files, dirs);
|
|
126
|
-
}
|
|
127
74
|
//# sourceMappingURL=project_files.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project_files.js","sourceRoot":"","sources":["../../../src/core/utils/project_files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"project_files.js","sourceRoot":"","sources":["../../../src/core/utils/project_files.ts"],"names":[],"mappings":"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"}
|
package/dist/core/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const APP_VERSION = "0.2.
|
|
1
|
+
export const APP_VERSION = "0.2.120";
|
|
2
2
|
//# sourceMappingURL=version.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@markusylisiurunen/tau",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.120",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": {
|
|
6
6
|
"tau": "./dist/main.js"
|
|
@@ -27,8 +27,8 @@
|
|
|
27
27
|
"access": "public"
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@earendil-works/pi-ai": "^0.
|
|
31
|
-
"@earendil-works/pi-tui": "^0.
|
|
30
|
+
"@earendil-works/pi-ai": "^0.77.0",
|
|
31
|
+
"@earendil-works/pi-tui": "^0.77.0",
|
|
32
32
|
"chalk": "^5.6.2",
|
|
33
33
|
"file-type": "^21.3.4",
|
|
34
34
|
"sharp": "^0.34.5",
|