@dungle-scrubs/tallow 0.9.6 → 0.9.7
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.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.js +1 -1
- package/dist/process-cleanup.js +1 -1
- package/dist/process-cleanup.js.map +1 -1
- package/dist/sdk.d.ts +2 -2
- package/dist/sdk.d.ts.map +1 -1
- package/dist/sdk.js +32 -26
- package/dist/sdk.js.map +1 -1
- package/dist/workspace-transition-interactive.js +1 -1
- package/dist/workspace-transition-interactive.js.map +1 -1
- package/extensions/_shared/__tests__/shell-policy.test.ts +19 -0
- package/extensions/_shared/shell-policy.ts +121 -1
- package/extensions/command-expansion/index.ts +8 -2
- package/extensions/context-fork/frontmatter-index.ts +6 -1
- package/extensions/git-status/__tests__/git-status.test.ts +65 -2
- package/extensions/git-status/index.ts +268 -98
- package/extensions/minimal-skill-display/index.ts +7 -1
- package/extensions/read-tool-enhanced/index.ts +7 -2
- package/extensions/rewind/__tests__/session-files.test.ts +115 -0
- package/extensions/rewind/__tests__/snapshots.test.ts +23 -0
- package/extensions/rewind/index.ts +5 -0
- package/extensions/rewind/session-files.ts +138 -0
- package/extensions/rewind/snapshots.ts +104 -5
- package/extensions/skill-commands/index.ts +6 -1
- package/extensions/subagent-tool/schema.ts +1 -2
- package/extensions/teams-tool/tools/teammate-tools.ts +1 -2
- package/extensions/wezterm-pane-control/index.ts +1 -2
- package/node_modules/@mariozechner/pi-tui/package.json +1 -1
- package/package.json +5 -5
- package/skills/tallow-expert/SKILL.md +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-transition-interactive.js","sourceRoot":"","sources":["../src/workspace-transition-interactive.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"workspace-transition-interactive.js","sourceRoot":"","sources":["../src/workspace-transition-interactive.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,7 +20,9 @@ import {
|
|
|
20
20
|
isYoloMode,
|
|
21
21
|
reloadPermissions,
|
|
22
22
|
resetPermissionCache,
|
|
23
|
+
runCommand,
|
|
23
24
|
runCommandSync,
|
|
25
|
+
runGitCommand,
|
|
24
26
|
runGitCommandSync,
|
|
25
27
|
runShellCommandSync,
|
|
26
28
|
} from "../shell-policy.js";
|
|
@@ -419,6 +421,23 @@ describe("process wrappers", () => {
|
|
|
419
421
|
expect(version).toContain("git version");
|
|
420
422
|
});
|
|
421
423
|
|
|
424
|
+
test("runCommand executes allowlisted internal commands asynchronously", async () => {
|
|
425
|
+
const result = await runCommand({
|
|
426
|
+
command: "git",
|
|
427
|
+
args: ["--version"],
|
|
428
|
+
cwd: process.cwd(),
|
|
429
|
+
source: "git-helper",
|
|
430
|
+
timeoutMs: 3000,
|
|
431
|
+
});
|
|
432
|
+
expect(result.ok).toBe(true);
|
|
433
|
+
expect(result.stdout).toContain("git version");
|
|
434
|
+
});
|
|
435
|
+
|
|
436
|
+
test("runGitCommand executes allowlisted internal commands asynchronously", async () => {
|
|
437
|
+
const version = await runGitCommand(["--version"], process.cwd(), 3000);
|
|
438
|
+
expect(version).toContain("git version");
|
|
439
|
+
});
|
|
440
|
+
|
|
422
441
|
test("commandExistsOnPath checks executables through policy wrapper", () => {
|
|
423
442
|
expect(commandExistsOnPath("git", process.cwd())).toBe(true);
|
|
424
443
|
});
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* - audit trail recording
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import { spawnSync } from "node:child_process";
|
|
17
|
+
import { execFile, spawnSync } from "node:child_process";
|
|
18
18
|
import { existsSync, mkdirSync, readFileSync } from "node:fs";
|
|
19
19
|
import { homedir } from "node:os";
|
|
20
20
|
import { dirname, isAbsolute, join } from "node:path";
|
|
@@ -1106,6 +1106,102 @@ export function runCommandSync(options: RunCommandOptions): ProcessRunResult {
|
|
|
1106
1106
|
};
|
|
1107
1107
|
}
|
|
1108
1108
|
|
|
1109
|
+
/**
|
|
1110
|
+
* Run a non-shell process asynchronously with centralized policy and audit logging.
|
|
1111
|
+
*
|
|
1112
|
+
* @param options - Process invocation options
|
|
1113
|
+
* @returns Structured process result including policy-blocked state
|
|
1114
|
+
*/
|
|
1115
|
+
export async function runCommand(options: RunCommandOptions): Promise<ProcessRunResult> {
|
|
1116
|
+
const commandLine = [options.command, ...options.args].join(" ").trim();
|
|
1117
|
+
const verdict = evaluateCommand(commandLine, options.source, options.cwd);
|
|
1118
|
+
if (!verdict.allowed) {
|
|
1119
|
+
recordAudit({
|
|
1120
|
+
timestamp: Date.now(),
|
|
1121
|
+
command: verdict.normalizedCommand,
|
|
1122
|
+
source: options.source,
|
|
1123
|
+
trustLevel: verdict.trustLevel,
|
|
1124
|
+
cwd: options.cwd,
|
|
1125
|
+
outcome: "blocked",
|
|
1126
|
+
reason: verdict.reason,
|
|
1127
|
+
});
|
|
1128
|
+
return {
|
|
1129
|
+
ok: false,
|
|
1130
|
+
blocked: true,
|
|
1131
|
+
stdout: "",
|
|
1132
|
+
stderr: "",
|
|
1133
|
+
exitCode: null,
|
|
1134
|
+
reason: verdict.reason,
|
|
1135
|
+
};
|
|
1136
|
+
}
|
|
1137
|
+
|
|
1138
|
+
const timeoutMs = clampTimeout(options.timeoutMs);
|
|
1139
|
+
const startedAt = Date.now();
|
|
1140
|
+
|
|
1141
|
+
return await new Promise((resolve) => {
|
|
1142
|
+
execFile(
|
|
1143
|
+
options.command,
|
|
1144
|
+
[...options.args],
|
|
1145
|
+
{
|
|
1146
|
+
cwd: options.cwd,
|
|
1147
|
+
encoding: "utf-8",
|
|
1148
|
+
timeout: timeoutMs,
|
|
1149
|
+
maxBuffer: options.maxBuffer ?? DEFAULT_MAX_BUFFER,
|
|
1150
|
+
},
|
|
1151
|
+
(error, stdout = "", stderr = "") => {
|
|
1152
|
+
const exitCode = typeof error?.code === "number" ? error.code : 0;
|
|
1153
|
+
const durationMs = Date.now() - startedAt;
|
|
1154
|
+
const normalizedStdout = stdout.toString();
|
|
1155
|
+
const normalizedStderr = stderr.toString();
|
|
1156
|
+
if (error) {
|
|
1157
|
+
const reason =
|
|
1158
|
+
error.killed && error.signal === "SIGTERM"
|
|
1159
|
+
? `Command timed out after ${timeoutMs}ms`
|
|
1160
|
+
: error.message;
|
|
1161
|
+
recordAudit({
|
|
1162
|
+
timestamp: Date.now(),
|
|
1163
|
+
command: verdict.normalizedCommand,
|
|
1164
|
+
source: options.source,
|
|
1165
|
+
trustLevel: verdict.trustLevel,
|
|
1166
|
+
cwd: options.cwd,
|
|
1167
|
+
outcome: "failed",
|
|
1168
|
+
reason,
|
|
1169
|
+
exitCode: typeof error?.code === "number" ? error.code : null,
|
|
1170
|
+
durationMs,
|
|
1171
|
+
});
|
|
1172
|
+
resolve({
|
|
1173
|
+
ok: false,
|
|
1174
|
+
blocked: false,
|
|
1175
|
+
stdout: normalizedStdout,
|
|
1176
|
+
stderr: normalizedStderr,
|
|
1177
|
+
exitCode: typeof error?.code === "number" ? error.code : null,
|
|
1178
|
+
reason,
|
|
1179
|
+
});
|
|
1180
|
+
return;
|
|
1181
|
+
}
|
|
1182
|
+
|
|
1183
|
+
recordAudit({
|
|
1184
|
+
timestamp: Date.now(),
|
|
1185
|
+
command: verdict.normalizedCommand,
|
|
1186
|
+
source: options.source,
|
|
1187
|
+
trustLevel: verdict.trustLevel,
|
|
1188
|
+
cwd: options.cwd,
|
|
1189
|
+
outcome: "executed",
|
|
1190
|
+
exitCode,
|
|
1191
|
+
durationMs,
|
|
1192
|
+
});
|
|
1193
|
+
resolve({
|
|
1194
|
+
ok: true,
|
|
1195
|
+
blocked: false,
|
|
1196
|
+
stdout: normalizedStdout,
|
|
1197
|
+
stderr: normalizedStderr,
|
|
1198
|
+
exitCode,
|
|
1199
|
+
});
|
|
1200
|
+
}
|
|
1201
|
+
);
|
|
1202
|
+
});
|
|
1203
|
+
}
|
|
1204
|
+
|
|
1109
1205
|
/**
|
|
1110
1206
|
* Run a git command through centralized policy and process wrapper.
|
|
1111
1207
|
*
|
|
@@ -1130,6 +1226,30 @@ export function runGitCommandSync(
|
|
|
1130
1226
|
return result.stdout.trim();
|
|
1131
1227
|
}
|
|
1132
1228
|
|
|
1229
|
+
/**
|
|
1230
|
+
* Run a git command asynchronously through centralized policy and process wrapper.
|
|
1231
|
+
*
|
|
1232
|
+
* @param args - Git arguments
|
|
1233
|
+
* @param cwd - Working directory
|
|
1234
|
+
* @param timeoutMs - Optional timeout override
|
|
1235
|
+
* @returns Trimmed stdout on success, null otherwise
|
|
1236
|
+
*/
|
|
1237
|
+
export async function runGitCommand(
|
|
1238
|
+
args: readonly string[],
|
|
1239
|
+
cwd: string,
|
|
1240
|
+
timeoutMs?: number
|
|
1241
|
+
): Promise<string | null> {
|
|
1242
|
+
const result = await runCommand({
|
|
1243
|
+
command: "git",
|
|
1244
|
+
args,
|
|
1245
|
+
cwd,
|
|
1246
|
+
source: "git-helper",
|
|
1247
|
+
timeoutMs,
|
|
1248
|
+
});
|
|
1249
|
+
if (!result.ok) return null;
|
|
1250
|
+
return result.stdout.trim();
|
|
1251
|
+
}
|
|
1252
|
+
|
|
1133
1253
|
/**
|
|
1134
1254
|
* Check whether an executable exists on PATH using policy-wrapped process execution.
|
|
1135
1255
|
*
|
|
@@ -19,7 +19,7 @@ import * as fs from "node:fs";
|
|
|
19
19
|
import * as os from "node:os";
|
|
20
20
|
import * as path from "node:path";
|
|
21
21
|
import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
|
|
22
|
-
import { loadSkills, stripFrontmatter } from "@mariozechner/pi-coding-agent";
|
|
22
|
+
import { getAgentDir, loadSkills, stripFrontmatter } from "@mariozechner/pi-coding-agent";
|
|
23
23
|
import { createLazyInitializer } from "../_shared/lazy-init.js";
|
|
24
24
|
import { isProjectTrusted } from "../_shared/project-trust.js";
|
|
25
25
|
|
|
@@ -52,7 +52,13 @@ interface CommandExpansionDependencies {
|
|
|
52
52
|
|
|
53
53
|
/** Default dependency implementation for production runtime. */
|
|
54
54
|
const DEFAULT_COMMAND_EXPANSION_DEPENDENCIES: CommandExpansionDependencies = {
|
|
55
|
-
loadSkills
|
|
55
|
+
loadSkills: () =>
|
|
56
|
+
loadSkills({
|
|
57
|
+
cwd: process.cwd(),
|
|
58
|
+
agentDir: getAgentDir(),
|
|
59
|
+
skillPaths: [],
|
|
60
|
+
includeDefaults: true,
|
|
61
|
+
}),
|
|
56
62
|
loadPromptTemplates,
|
|
57
63
|
};
|
|
58
64
|
|
|
@@ -297,7 +297,12 @@ export function buildFrontmatterIndex(debugLog?: (msg: string) => void): Frontma
|
|
|
297
297
|
|
|
298
298
|
// Skills: skill name as-is
|
|
299
299
|
try {
|
|
300
|
-
const { skills } = loadSkills(
|
|
300
|
+
const { skills } = loadSkills({
|
|
301
|
+
cwd: process.cwd(),
|
|
302
|
+
agentDir: getAgentDir(),
|
|
303
|
+
skillPaths: [],
|
|
304
|
+
includeDefaults: true,
|
|
305
|
+
});
|
|
301
306
|
for (const skill of skills) {
|
|
302
307
|
maybeAdd(skill.name, skill.filePath);
|
|
303
308
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { describe, expect, test } from "bun:test";
|
|
2
2
|
import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
|
|
3
|
-
import gitStatus from "../index.js";
|
|
3
|
+
import gitStatus, { formatStatus, parseGitStatus, parsePullRequestInfo } from "../index.js";
|
|
4
4
|
|
|
5
5
|
describe("git-status extension", () => {
|
|
6
|
-
test("registers session_start, tool_result, and session_shutdown handlers", () => {
|
|
6
|
+
test("registers session_start, agent_end, tool_result, and session_shutdown handlers", () => {
|
|
7
7
|
const events: string[] = [];
|
|
8
8
|
const pi = {
|
|
9
9
|
on: (event: string) => {
|
|
@@ -13,6 +13,7 @@ describe("git-status extension", () => {
|
|
|
13
13
|
|
|
14
14
|
gitStatus(pi);
|
|
15
15
|
expect(events).toContain("session_start");
|
|
16
|
+
expect(events).toContain("agent_end");
|
|
16
17
|
expect(events).toContain("tool_result");
|
|
17
18
|
expect(events).toContain("session_shutdown");
|
|
18
19
|
});
|
|
@@ -30,3 +31,65 @@ describe("git-status extension", () => {
|
|
|
30
31
|
expect(commands).toHaveLength(0);
|
|
31
32
|
});
|
|
32
33
|
});
|
|
34
|
+
|
|
35
|
+
describe("parseGitStatus", () => {
|
|
36
|
+
test("extracts branch, ahead/behind, and dirty state", () => {
|
|
37
|
+
const parsed = parseGitStatus(
|
|
38
|
+
[
|
|
39
|
+
"# branch.oid abcdef",
|
|
40
|
+
"# branch.head main",
|
|
41
|
+
"# branch.upstream origin/main",
|
|
42
|
+
"# branch.ab +2 -3",
|
|
43
|
+
"1 .M N... 100644 100644 100644 abc def file.ts",
|
|
44
|
+
].join("\n")
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
expect(parsed).toEqual({
|
|
48
|
+
branch: "main",
|
|
49
|
+
dirty: true,
|
|
50
|
+
ahead: 2,
|
|
51
|
+
behind: 3,
|
|
52
|
+
prState: null,
|
|
53
|
+
prNumber: null,
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
test("returns null when branch metadata is missing", () => {
|
|
58
|
+
expect(parseGitStatus("# branch.oid abcdef")).toBeNull();
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
describe("parsePullRequestInfo", () => {
|
|
63
|
+
test("prefers draft state when isDraft is true", () => {
|
|
64
|
+
expect(parsePullRequestInfo('{"number":42,"isDraft":true,"state":"OPEN"}')).toEqual({
|
|
65
|
+
prState: "draft",
|
|
66
|
+
prNumber: 42,
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
test("normalizes regular PR state values", () => {
|
|
71
|
+
expect(parsePullRequestInfo('{"number":42,"state":"OPEN"}')).toEqual({
|
|
72
|
+
prState: "open",
|
|
73
|
+
prNumber: 42,
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
describe("formatStatus", () => {
|
|
79
|
+
test("includes dirty, ahead/behind, and PR metadata", () => {
|
|
80
|
+
const formatted = formatStatus({
|
|
81
|
+
branch: "main",
|
|
82
|
+
dirty: true,
|
|
83
|
+
ahead: 1,
|
|
84
|
+
behind: 2,
|
|
85
|
+
prState: "draft",
|
|
86
|
+
prNumber: 42,
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
expect(formatted).toContain("main");
|
|
90
|
+
expect(formatted).toContain("*");
|
|
91
|
+
expect(formatted).toContain("↑1");
|
|
92
|
+
expect(formatted).toContain("↓2");
|
|
93
|
+
expect(formatted).toContain("PR#42(draft)");
|
|
94
|
+
});
|
|
95
|
+
});
|