jouzu 0.0.1 → 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/README.md +50 -0
- package/dist/args.d.ts +45 -0
- package/dist/args.d.ts.map +1 -0
- package/dist/args.js +221 -0
- package/dist/args.js.map +1 -0
- package/dist/cli.js +250 -29
- package/dist/cli.js.map +1 -1
- package/dist/doctor.d.ts +36 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +224 -0
- package/dist/doctor.js.map +1 -0
- package/dist/keybindings.d.ts +68 -0
- package/dist/keybindings.d.ts.map +1 -0
- package/dist/keybindings.js +460 -0
- package/dist/keybindings.js.map +1 -0
- package/dist/metadata.d.ts +21 -0
- package/dist/metadata.d.ts.map +1 -0
- package/dist/metadata.js +22 -0
- package/dist/metadata.js.map +1 -0
- package/dist/paths.d.ts +17 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +65 -0
- package/dist/paths.js.map +1 -0
- package/dist/pi.lock.json +15 -0
- package/dist/presentation.d.ts +45 -0
- package/dist/presentation.d.ts.map +1 -0
- package/dist/presentation.js +202 -0
- package/dist/presentation.js.map +1 -0
- package/dist/private-fs.d.ts +12 -0
- package/dist/private-fs.d.ts.map +1 -0
- package/dist/private-fs.js +64 -0
- package/dist/private-fs.js.map +1 -0
- package/dist/profile-choice.d.ts +14 -0
- package/dist/profile-choice.d.ts.map +1 -0
- package/dist/profile-choice.js +83 -0
- package/dist/profile-choice.js.map +1 -0
- package/dist/profile-manager.d.ts +50 -0
- package/dist/profile-manager.d.ts.map +1 -0
- package/dist/profile-manager.js +364 -0
- package/dist/profile-manager.js.map +1 -0
- package/dist/profiles/core/assets/jouzu-core-skill.md +12 -0
- package/dist/profiles/core/assets/jouzu-review.md +1 -0
- package/dist/profiles/core/manifest.json +17 -0
- package/dist/profiles/ja/assets/APPEND_SYSTEM.md +8 -0
- package/dist/profiles/ja/manifest.json +13 -0
- package/dist/profiles.d.ts +18 -0
- package/dist/profiles.d.ts.map +1 -0
- package/dist/profiles.js +153 -0
- package/dist/profiles.js.map +1 -0
- package/dist/resume.d.ts +7 -0
- package/dist/resume.d.ts.map +1 -0
- package/dist/resume.js +23 -0
- package/dist/resume.js.map +1 -0
- package/dist/runtime.d.ts +18 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +59 -0
- package/dist/runtime.js.map +1 -0
- package/dist/state-lock.d.ts +39 -0
- package/dist/state-lock.d.ts.map +1 -0
- package/dist/state-lock.js +143 -0
- package/dist/state-lock.js.map +1 -0
- package/dist/updater.d.ts +113 -0
- package/dist/updater.d.ts.map +1 -0
- package/dist/updater.js +698 -0
- package/dist/updater.js.map +1 -0
- package/package.json +7 -4
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { InlineExtension, Theme } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import type { JouzuMetadata } from "./metadata.js";
|
|
3
|
+
import type { ProfileSelection } from "./runtime.js";
|
|
4
|
+
export declare const CLEAR_SCREEN_SEQUENCE = "\u001B[2J\u001B[H";
|
|
5
|
+
export interface InteractiveStartupContext {
|
|
6
|
+
stdinIsTTY?: boolean;
|
|
7
|
+
stdoutIsTTY?: boolean;
|
|
8
|
+
env?: NodeJS.ProcessEnv;
|
|
9
|
+
}
|
|
10
|
+
export type BannerColorMode = "truecolor" | "256" | "16" | "none";
|
|
11
|
+
export interface BannerPalette {
|
|
12
|
+
markTruecolor: {
|
|
13
|
+
start: readonly [number, number, number];
|
|
14
|
+
end: readonly [number, number, number];
|
|
15
|
+
};
|
|
16
|
+
mark256: readonly number[];
|
|
17
|
+
mark16: readonly number[];
|
|
18
|
+
versionTruecolor: {
|
|
19
|
+
jouzu: readonly [number, number, number];
|
|
20
|
+
pi: readonly [number, number, number];
|
|
21
|
+
};
|
|
22
|
+
version256: {
|
|
23
|
+
jouzu: number;
|
|
24
|
+
pi: number;
|
|
25
|
+
};
|
|
26
|
+
version16: {
|
|
27
|
+
jouzu: number;
|
|
28
|
+
pi: number;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export declare const DEFAULT_BANNER_PALETTE: BannerPalette;
|
|
32
|
+
export interface BannerRenderOptions {
|
|
33
|
+
colorMode?: BannerColorMode;
|
|
34
|
+
colorDepth?: number;
|
|
35
|
+
env?: NodeJS.ProcessEnv;
|
|
36
|
+
palette?: BannerPalette;
|
|
37
|
+
}
|
|
38
|
+
export declare function isInteractivePiStartup(args: string[], context?: InteractiveStartupContext): boolean;
|
|
39
|
+
export declare function shouldClearInteractiveStartup(args: string[], context?: InteractiveStartupContext): boolean;
|
|
40
|
+
export declare function clearInteractiveStartup(args: string[], context?: InteractiveStartupContext): boolean;
|
|
41
|
+
export declare function brandDefaultSystemPrompt(systemPrompt: string, customPrompt?: string): string;
|
|
42
|
+
export declare function detectBannerColorMode(options?: BannerRenderOptions): BannerColorMode;
|
|
43
|
+
export declare function renderBannerLines(theme: Theme, metadata: JouzuMetadata, width: number, colorMode: BannerColorMode, palette?: BannerPalette): string[];
|
|
44
|
+
export declare function createJouzuPresentationExtension(metadata: JouzuMetadata, profile: ProfileSelection, options?: BannerRenderOptions): InlineExtension;
|
|
45
|
+
//# sourceMappingURL=presentation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentation.d.ts","sourceRoot":"","sources":["../src/presentation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,iCAAiC,CAAC;AAC9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAErD,eAAO,MAAM,qBAAqB,sBAAsB,CAAC;AAezD,MAAM,WAAW,yBAAyB;IACzC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACxB;AAED,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG,KAAK,GAAG,IAAI,GAAG,MAAM,CAAC;AAElE,MAAM,WAAW,aAAa;IAC7B,aAAa,EAAE;QAAE,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,GAAG,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC;IACpG,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,gBAAgB,EAAE;QAAE,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,EAAE,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC;IACtG,UAAU,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,SAAS,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;CACzC;AAED,eAAO,MAAM,sBAAsB,EAAE,aAOpC,CAAC;AAEF,MAAM,WAAW,mBAAmB;IACnC,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,aAAa,CAAC;CACxB;AAMD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,yBAA8B,GAAG,OAAO,CAkBvG;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,yBAA8B,GAAG,OAAO,CAG9G;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,yBAA8B,GAAG,OAAO,CAIxG;AAUD,wBAAgB,wBAAwB,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAG5F;AASD,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,mBAAwB,GAAG,eAAe,CAYxF;AA8DD,wBAAgB,iBAAiB,CAChC,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,aAAa,EACvB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,eAAe,EAC1B,OAAO,GAAE,aAAsC,GAC7C,MAAM,EAAE,CAMV;AAED,wBAAgB,gCAAgC,CAC/C,QAAQ,EAAE,aAAa,EACvB,OAAO,EAAE,gBAAgB,EACzB,OAAO,GAAE,mBAAwB,GAC/B,eAAe,CAyDjB"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { basename } from "node:path";
|
|
2
|
+
export const CLEAR_SCREEN_SEQUENCE = "\u001b[2J\u001b[H";
|
|
3
|
+
const NON_INTERACTIVE_COMMANDS = new Set(["auth", "config", "install", "list", "remove", "uninstall", "update"]);
|
|
4
|
+
const NON_INTERACTIVE_FLAGS = new Set([
|
|
5
|
+
"-h",
|
|
6
|
+
"--help",
|
|
7
|
+
"-p",
|
|
8
|
+
"--print",
|
|
9
|
+
"-v",
|
|
10
|
+
"--version",
|
|
11
|
+
"--list-models",
|
|
12
|
+
"--export",
|
|
13
|
+
]);
|
|
14
|
+
const NON_INTERACTIVE_MODES = new Set(["json", "print", "rpc"]);
|
|
15
|
+
export const DEFAULT_BANNER_PALETTE = {
|
|
16
|
+
markTruecolor: { start: [34, 211, 238], end: [244, 114, 182] },
|
|
17
|
+
mark256: [45, 81, 117, 141, 177, 213],
|
|
18
|
+
mark16: [96, 94, 95],
|
|
19
|
+
versionTruecolor: { jouzu: [103, 232, 249], pi: [249, 168, 212] },
|
|
20
|
+
version256: { jouzu: 117, pi: 218 },
|
|
21
|
+
version16: { jouzu: 96, pi: 95 },
|
|
22
|
+
};
|
|
23
|
+
function envFlagIsTrue(value) {
|
|
24
|
+
return value !== undefined && ["1", "true", "yes", "on"].includes(value.toLowerCase());
|
|
25
|
+
}
|
|
26
|
+
export function isInteractivePiStartup(args, context = {}) {
|
|
27
|
+
const env = context.env ?? process.env;
|
|
28
|
+
const stdinIsTTY = context.stdinIsTTY ?? process.stdin.isTTY === true;
|
|
29
|
+
const stdoutIsTTY = context.stdoutIsTTY ?? process.stdout.isTTY === true;
|
|
30
|
+
if (!stdinIsTTY || !stdoutIsTTY || env.TERM === "dumb")
|
|
31
|
+
return false;
|
|
32
|
+
if (args.length > 0 && NON_INTERACTIVE_COMMANDS.has(args[0]))
|
|
33
|
+
return false;
|
|
34
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
35
|
+
const arg = args[index];
|
|
36
|
+
if (NON_INTERACTIVE_FLAGS.has(arg) || arg.startsWith("--export="))
|
|
37
|
+
return false;
|
|
38
|
+
if (arg === "--mode") {
|
|
39
|
+
if (NON_INTERACTIVE_MODES.has(args[index + 1] ?? ""))
|
|
40
|
+
return false;
|
|
41
|
+
index += 1;
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (arg.startsWith("--mode=") && NON_INTERACTIVE_MODES.has(arg.slice("--mode=".length)))
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
export function shouldClearInteractiveStartup(args, context = {}) {
|
|
50
|
+
const env = context.env ?? process.env;
|
|
51
|
+
return isInteractivePiStartup(args, context) && !envFlagIsTrue(env.JOUZU_NO_CLEAR);
|
|
52
|
+
}
|
|
53
|
+
export function clearInteractiveStartup(args, context = {}) {
|
|
54
|
+
if (!shouldClearInteractiveStartup(args, context))
|
|
55
|
+
return false;
|
|
56
|
+
process.stdout.write(CLEAR_SCREEN_SEQUENCE);
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
const BRAILLE_MARK = ["⠈⢹ ⡎⢱ ⡇⢸ ⢉⠝ ⡇⢸", "⠣⠜ ⠣⠜ ⠣⠜ ⠮⠤ ⠣⠜"];
|
|
60
|
+
const BRAILLE_MIN_WIDTH = 16;
|
|
61
|
+
const ANSI_RESET = "\u001b[0m";
|
|
62
|
+
const PI_DEFAULT_IDENTITY = "You are an expert coding assistant operating inside pi, a coding agent harness. You help users by reading files, executing commands, editing code, and writing new files.";
|
|
63
|
+
const JOUZU_DEFAULT_IDENTITY = "You are an expert coding assistant operating inside Jouzu, a coding-agent environment built on the Pi harness. You help users by reading files, executing commands, editing code, and writing new files.";
|
|
64
|
+
export function brandDefaultSystemPrompt(systemPrompt, customPrompt) {
|
|
65
|
+
if (customPrompt || !systemPrompt.startsWith(PI_DEFAULT_IDENTITY))
|
|
66
|
+
return systemPrompt;
|
|
67
|
+
return `${JOUZU_DEFAULT_IDENTITY}${systemPrompt.slice(PI_DEFAULT_IDENTITY.length)}`;
|
|
68
|
+
}
|
|
69
|
+
function fit(text, width) {
|
|
70
|
+
if (width <= 0)
|
|
71
|
+
return "";
|
|
72
|
+
if (text.length <= width)
|
|
73
|
+
return text;
|
|
74
|
+
if (width === 1)
|
|
75
|
+
return "…";
|
|
76
|
+
return `${text.slice(0, width - 1)}…`;
|
|
77
|
+
}
|
|
78
|
+
export function detectBannerColorMode(options = {}) {
|
|
79
|
+
const env = options.env ?? process.env;
|
|
80
|
+
if (env.NO_COLOR !== undefined || env.TERM === "dumb")
|
|
81
|
+
return "none";
|
|
82
|
+
const colorDepth = options.colorDepth ??
|
|
83
|
+
(process.stdout.isTTY && typeof process.stdout.getColorDepth === "function"
|
|
84
|
+
? process.stdout.getColorDepth(env)
|
|
85
|
+
: undefined);
|
|
86
|
+
if ((colorDepth ?? 0) >= 24 || /^(truecolor|24bit)$/i.test(env.COLORTERM ?? ""))
|
|
87
|
+
return "truecolor";
|
|
88
|
+
if ((colorDepth ?? 0) >= 8 || /256color/i.test(env.TERM ?? ""))
|
|
89
|
+
return "256";
|
|
90
|
+
if ((colorDepth ?? 0) >= 4 || (env.TERM !== undefined && env.TERM !== ""))
|
|
91
|
+
return "16";
|
|
92
|
+
return "none";
|
|
93
|
+
}
|
|
94
|
+
function colorizeMark(line, mode, palette) {
|
|
95
|
+
if (mode === "none")
|
|
96
|
+
return line;
|
|
97
|
+
const characters = Array.from(line);
|
|
98
|
+
const glyphCount = characters.filter((character) => character !== " ").length;
|
|
99
|
+
let glyphIndex = 0;
|
|
100
|
+
return characters
|
|
101
|
+
.map((character) => {
|
|
102
|
+
if (character === " ")
|
|
103
|
+
return character;
|
|
104
|
+
const ratio = glyphCount <= 1 ? 0 : glyphIndex / (glyphCount - 1);
|
|
105
|
+
glyphIndex += 1;
|
|
106
|
+
if (mode === "truecolor") {
|
|
107
|
+
const { start, end } = palette.markTruecolor;
|
|
108
|
+
const [red, green, blue] = start.map((value, index) => Math.round(value + (end[index] - value) * ratio));
|
|
109
|
+
return `\u001b[38;2;${red};${green};${blue}m${character}${ANSI_RESET}`;
|
|
110
|
+
}
|
|
111
|
+
if (mode === "256") {
|
|
112
|
+
const colors = palette.mark256;
|
|
113
|
+
const color = colors[Math.min(colors.length - 1, Math.round(ratio * (colors.length - 1)))];
|
|
114
|
+
return `\u001b[38;5;${color}m${character}${ANSI_RESET}`;
|
|
115
|
+
}
|
|
116
|
+
const colors = palette.mark16;
|
|
117
|
+
const color = colors[Math.min(colors.length - 1, Math.round(ratio * (colors.length - 1)))];
|
|
118
|
+
return `\u001b[${color}m${character}${ANSI_RESET}`;
|
|
119
|
+
})
|
|
120
|
+
.join("");
|
|
121
|
+
}
|
|
122
|
+
function colorizeVersion(value, mode, rgb, indexed, basic) {
|
|
123
|
+
if (mode === "truecolor")
|
|
124
|
+
return `\u001b[38;2;${rgb.join(";")}m${value}${ANSI_RESET}`;
|
|
125
|
+
if (mode === "256")
|
|
126
|
+
return `\u001b[38;5;${indexed}m${value}${ANSI_RESET}`;
|
|
127
|
+
if (mode === "16")
|
|
128
|
+
return `\u001b[${basic}m${value}${ANSI_RESET}`;
|
|
129
|
+
return value;
|
|
130
|
+
}
|
|
131
|
+
function versionLine(metadata, width, mode, palette) {
|
|
132
|
+
const plain = `jouzu ${metadata.jouzuVersion} · pi ${metadata.piVersion}`;
|
|
133
|
+
if (fit(plain, width) !== plain || mode === "none")
|
|
134
|
+
return fit(plain, width);
|
|
135
|
+
const jouzu = colorizeVersion(metadata.jouzuVersion, mode, palette.versionTruecolor.jouzu, palette.version256.jouzu, palette.version16.jouzu);
|
|
136
|
+
const pi = colorizeVersion(metadata.piVersion, mode, palette.versionTruecolor.pi, palette.version256.pi, palette.version16.pi);
|
|
137
|
+
return `jouzu ${jouzu} · pi ${pi}`;
|
|
138
|
+
}
|
|
139
|
+
export function renderBannerLines(theme, metadata, width, colorMode, palette = DEFAULT_BANNER_PALETTE) {
|
|
140
|
+
const versions = versionLine(metadata, width, colorMode, palette);
|
|
141
|
+
const hints = fit("/model choose · /hotkeys shortcuts · /status session", width);
|
|
142
|
+
const details = colorMode === "none" ? [versions, hints] : [versions, theme.fg("dim", hints)];
|
|
143
|
+
if (width < BRAILLE_MIN_WIDTH)
|
|
144
|
+
return [fit("J O U Z U", width), ...details];
|
|
145
|
+
return [...BRAILLE_MARK.map((line) => colorizeMark(line, colorMode, palette)), ...details];
|
|
146
|
+
}
|
|
147
|
+
export function createJouzuPresentationExtension(metadata, profile, options = {}) {
|
|
148
|
+
return {
|
|
149
|
+
name: "jouzu",
|
|
150
|
+
factory: (pi) => {
|
|
151
|
+
pi.on("before_agent_start", (event) => {
|
|
152
|
+
const systemPrompt = brandDefaultSystemPrompt(event.systemPrompt, event.systemPromptOptions.customPrompt);
|
|
153
|
+
if (systemPrompt === event.systemPrompt)
|
|
154
|
+
return;
|
|
155
|
+
return { systemPrompt };
|
|
156
|
+
});
|
|
157
|
+
pi.on("session_start", (_event, ctx) => {
|
|
158
|
+
if (ctx.mode !== "tui")
|
|
159
|
+
return;
|
|
160
|
+
const colorMode = options.colorMode ?? detectBannerColorMode(options);
|
|
161
|
+
ctx.ui.setTitle(`Jouzu - ${basename(ctx.cwd) || "workspace"}`);
|
|
162
|
+
ctx.ui.setWorkingIndicator({
|
|
163
|
+
frames: [
|
|
164
|
+
ctx.ui.theme.fg("dim", "·"),
|
|
165
|
+
ctx.ui.theme.fg("muted", "•"),
|
|
166
|
+
ctx.ui.theme.fg("accent", "●"),
|
|
167
|
+
ctx.ui.theme.fg("muted", "•"),
|
|
168
|
+
],
|
|
169
|
+
intervalMs: 120,
|
|
170
|
+
});
|
|
171
|
+
ctx.ui.setHeader((_tui, theme) => ({
|
|
172
|
+
render: (width) => renderBannerLines(theme, metadata, width, colorMode, options.palette),
|
|
173
|
+
invalidate() { },
|
|
174
|
+
}));
|
|
175
|
+
});
|
|
176
|
+
pi.registerCommand("status", {
|
|
177
|
+
description: "Show the current Jouzu session, model, context, and profile status",
|
|
178
|
+
handler: async (_args, ctx) => {
|
|
179
|
+
const model = ctx.model ? `${ctx.model.provider}/${ctx.model.id}` : "not selected";
|
|
180
|
+
const usage = ctx.getContextUsage();
|
|
181
|
+
const context = usage
|
|
182
|
+
? `${usage.tokens ?? "unknown"}/${usage.contextWindow} tokens (${usage.percent ?? "unknown"}%)`
|
|
183
|
+
: "unknown";
|
|
184
|
+
const scopedModels = ctx.scopedModels.length === 0 ? "all available" : String(ctx.scopedModels.length);
|
|
185
|
+
const applied = profile.appliedManifestSha256 ? "applied" : "not applied";
|
|
186
|
+
ctx.ui.notify([
|
|
187
|
+
"Jouzu session status",
|
|
188
|
+
`session: ${ctx.sessionManager.getSessionId()}`,
|
|
189
|
+
`workspace: ${basename(ctx.cwd) || "workspace"}`,
|
|
190
|
+
`model: ${model}`,
|
|
191
|
+
`thinking: ${ctx.thinkingLevel ?? "off"}`,
|
|
192
|
+
`context: ${context}`,
|
|
193
|
+
`scoped models: ${scopedModels}`,
|
|
194
|
+
`profile: ${profile.id} (${applied})`,
|
|
195
|
+
`runtime: Jouzu ${metadata.jouzuVersion} · Pi ${metadata.piVersion}`,
|
|
196
|
+
].join("\n"), "info");
|
|
197
|
+
},
|
|
198
|
+
});
|
|
199
|
+
},
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=presentation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentation.js","sourceRoot":"","sources":["../src/presentation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare class PrivatePathError extends Error {
|
|
2
|
+
constructor(message: string);
|
|
3
|
+
}
|
|
4
|
+
export declare function validatePrivateDirectory(path: string): void;
|
|
5
|
+
/**
|
|
6
|
+
* Create a Jouzu-owned root or descendant without following symlinks inside
|
|
7
|
+
* that owned boundary. Existing caller-owned ancestors are left unchanged.
|
|
8
|
+
*/
|
|
9
|
+
export declare function ensurePrivateDirectory(root: string, directory?: string): void;
|
|
10
|
+
/** Copy a backup into a private owned directory without replacing a prior file. */
|
|
11
|
+
export declare function copyPrivateFile(source: string, destination: string, root: string): void;
|
|
12
|
+
//# sourceMappingURL=private-fs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"private-fs.d.ts","sourceRoot":"","sources":["../src/private-fs.ts"],"names":[],"mappings":"AAMA,qBAAa,gBAAiB,SAAQ,KAAK;gBAC9B,OAAO,EAAE,MAAM;CAI3B;AAWD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAK3D;AAOD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,MAAa,GAAG,IAAI,CAoBnF;AAED,mFAAmF;AACnF,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAIvF"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { chmodSync, constants, copyFileSync, lstatSync, mkdirSync } from "node:fs";
|
|
2
|
+
import { dirname, isAbsolute, relative, resolve, sep } from "node:path";
|
|
3
|
+
const PRIVATE_DIRECTORY_MODE = 0o700;
|
|
4
|
+
const PRIVATE_FILE_MODE = 0o600;
|
|
5
|
+
export class PrivatePathError extends Error {
|
|
6
|
+
constructor(message) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.name = "PrivatePathError";
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
function lstatIfPresent(path) {
|
|
12
|
+
try {
|
|
13
|
+
return lstatSync(path);
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT")
|
|
17
|
+
return undefined;
|
|
18
|
+
throw error;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export function validatePrivateDirectory(path) {
|
|
22
|
+
const metadata = lstatIfPresent(path);
|
|
23
|
+
if (metadata && (metadata.isSymbolicLink() || !metadata.isDirectory())) {
|
|
24
|
+
throw new PrivatePathError(`Jouzu-owned directory must be a real directory: ${path}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function requireDirectory(path) {
|
|
28
|
+
validatePrivateDirectory(path);
|
|
29
|
+
if (process.platform !== "win32")
|
|
30
|
+
chmodSync(path, PRIVATE_DIRECTORY_MODE);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Create a Jouzu-owned root or descendant without following symlinks inside
|
|
34
|
+
* that owned boundary. Existing caller-owned ancestors are left unchanged.
|
|
35
|
+
*/
|
|
36
|
+
export function ensurePrivateDirectory(root, directory = root) {
|
|
37
|
+
const resolvedRoot = resolve(root);
|
|
38
|
+
const resolvedDirectory = resolve(directory);
|
|
39
|
+
const relativeDirectory = relative(resolvedRoot, resolvedDirectory);
|
|
40
|
+
if (relativeDirectory === ".." || relativeDirectory.startsWith(`..${sep}`) || isAbsolute(relativeDirectory)) {
|
|
41
|
+
throw new PrivatePathError(`private directory escaped its Jouzu-owned root: ${directory}`);
|
|
42
|
+
}
|
|
43
|
+
if (lstatIfPresent(resolvedRoot) === undefined) {
|
|
44
|
+
mkdirSync(resolvedRoot, { recursive: true, mode: PRIVATE_DIRECTORY_MODE });
|
|
45
|
+
}
|
|
46
|
+
requireDirectory(resolvedRoot);
|
|
47
|
+
if (relativeDirectory === "")
|
|
48
|
+
return;
|
|
49
|
+
let current = resolvedRoot;
|
|
50
|
+
for (const part of relativeDirectory.split(sep)) {
|
|
51
|
+
current = resolve(current, part);
|
|
52
|
+
if (lstatIfPresent(current) === undefined)
|
|
53
|
+
mkdirSync(current, { mode: PRIVATE_DIRECTORY_MODE });
|
|
54
|
+
requireDirectory(current);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/** Copy a backup into a private owned directory without replacing a prior file. */
|
|
58
|
+
export function copyPrivateFile(source, destination, root) {
|
|
59
|
+
ensurePrivateDirectory(root, dirname(destination));
|
|
60
|
+
copyFileSync(source, destination, constants.COPYFILE_EXCL);
|
|
61
|
+
if (process.platform !== "win32")
|
|
62
|
+
chmodSync(destination, PRIVATE_FILE_MODE);
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=private-fs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"private-fs.js","sourceRoot":"","sources":["../src/private-fs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ProfileId } from "./args.js";
|
|
2
|
+
export interface ProfileChoice {
|
|
3
|
+
schemaVersion: 1;
|
|
4
|
+
profile: ProfileId;
|
|
5
|
+
chosenAt: string;
|
|
6
|
+
}
|
|
7
|
+
export declare class ProfileChoiceError extends Error {
|
|
8
|
+
constructor(message: string);
|
|
9
|
+
}
|
|
10
|
+
export declare function readProfileChoice(path: string): ProfileChoice | undefined;
|
|
11
|
+
export declare function writeProfileChoice(path: string, profile: ProfileId, now?: Date): ProfileChoice;
|
|
12
|
+
export declare function parseJapaneseSupportAnswer(answer: string): ProfileId;
|
|
13
|
+
export declare function promptForJapaneseSupport(input?: NodeJS.ReadableStream, output?: NodeJS.WritableStream): Promise<ProfileId>;
|
|
14
|
+
//# sourceMappingURL=profile-choice.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-choice.d.ts","sourceRoot":"","sources":["../src/profile-choice.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAK3C,MAAM,WAAW,aAAa;IAC7B,aAAa,EAAE,CAAC,CAAC;IACjB,OAAO,EAAE,SAAS,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,kBAAmB,SAAQ,KAAK;gBAChC,OAAO,EAAE,MAAM;CAI3B;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAiCzE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,OAAa,GAAG,aAAa,CAiBpG;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAEpE;AAED,wBAAsB,wBAAwB,CAC7C,KAAK,GAAE,MAAM,CAAC,cAA8B,EAC5C,MAAM,GAAE,MAAM,CAAC,cAA+B,GAC5C,OAAO,CAAC,SAAS,CAAC,CAYpB"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { closeSync, existsSync, fsyncSync, lstatSync, openSync, readFileSync, renameSync, rmSync, writeFileSync, } from "node:fs";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { createInterface } from "node:readline/promises";
|
|
5
|
+
import { ensurePrivateDirectory, validatePrivateDirectory } from "./private-fs.js";
|
|
6
|
+
const PROFILE_CHOICE_FIELDS = new Set(["schemaVersion", "profile", "chosenAt"]);
|
|
7
|
+
export class ProfileChoiceError extends Error {
|
|
8
|
+
constructor(message) {
|
|
9
|
+
super(message);
|
|
10
|
+
this.name = "ProfileChoiceError";
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export function readProfileChoice(path) {
|
|
14
|
+
try {
|
|
15
|
+
validatePrivateDirectory(dirname(path));
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
throw new ProfileChoiceError(error instanceof Error ? error.message : String(error));
|
|
19
|
+
}
|
|
20
|
+
if (!existsSync(path))
|
|
21
|
+
return undefined;
|
|
22
|
+
const metadata = lstatSync(path);
|
|
23
|
+
if (!metadata.isFile() || metadata.isSymbolicLink()) {
|
|
24
|
+
throw new ProfileChoiceError("profile choice must be a regular file");
|
|
25
|
+
}
|
|
26
|
+
let parsed;
|
|
27
|
+
try {
|
|
28
|
+
parsed = JSON.parse(readFileSync(path, "utf8"));
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
throw new ProfileChoiceError(`profile choice is invalid JSON: ${error instanceof Error ? error.message : error}`);
|
|
32
|
+
}
|
|
33
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
34
|
+
throw new ProfileChoiceError("profile choice must be an object");
|
|
35
|
+
}
|
|
36
|
+
const choice = parsed;
|
|
37
|
+
if (!Object.keys(choice).every((key) => PROFILE_CHOICE_FIELDS.has(key))) {
|
|
38
|
+
throw new ProfileChoiceError("profile choice has unknown fields");
|
|
39
|
+
}
|
|
40
|
+
if (choice.schemaVersion !== 1 ||
|
|
41
|
+
(choice.profile !== "core" && choice.profile !== "ja") ||
|
|
42
|
+
typeof choice.chosenAt !== "string" ||
|
|
43
|
+
!Number.isFinite(Date.parse(choice.chosenAt))) {
|
|
44
|
+
throw new ProfileChoiceError("profile choice fields are invalid");
|
|
45
|
+
}
|
|
46
|
+
return { schemaVersion: 1, profile: choice.profile, chosenAt: choice.chosenAt };
|
|
47
|
+
}
|
|
48
|
+
export function writeProfileChoice(path, profile, now = new Date()) {
|
|
49
|
+
const choice = { schemaVersion: 1, profile, chosenAt: now.toISOString() };
|
|
50
|
+
ensurePrivateDirectory(dirname(path));
|
|
51
|
+
const temporary = join(dirname(path), `.${randomUUID()}.tmp`);
|
|
52
|
+
let descriptor;
|
|
53
|
+
try {
|
|
54
|
+
descriptor = openSync(temporary, "wx", 0o600);
|
|
55
|
+
writeFileSync(descriptor, `${JSON.stringify(choice, null, 2)}\n`);
|
|
56
|
+
fsyncSync(descriptor);
|
|
57
|
+
closeSync(descriptor);
|
|
58
|
+
descriptor = undefined;
|
|
59
|
+
renameSync(temporary, path);
|
|
60
|
+
}
|
|
61
|
+
finally {
|
|
62
|
+
if (descriptor !== undefined)
|
|
63
|
+
closeSync(descriptor);
|
|
64
|
+
rmSync(temporary, { force: true });
|
|
65
|
+
}
|
|
66
|
+
return choice;
|
|
67
|
+
}
|
|
68
|
+
export function parseJapaneseSupportAnswer(answer) {
|
|
69
|
+
return /^(?:y|yes|はい)$/iu.test(answer.trim()) ? "ja" : "core";
|
|
70
|
+
}
|
|
71
|
+
export async function promptForJapaneseSupport(input = process.stdin, output = process.stdout) {
|
|
72
|
+
output.write("Jouzu can add an optional Japanese-support profile with Japanese-focused instructions and skills.\n" +
|
|
73
|
+
"Existing profile files are checked for conflicts before Jouzu writes anything.\n");
|
|
74
|
+
const readline = createInterface({ input, output });
|
|
75
|
+
try {
|
|
76
|
+
const answer = await readline.question("Enable Japanese support? / 日本語サポートを有効にしますか? [y/N] ");
|
|
77
|
+
return parseJapaneseSupportAnswer(answer);
|
|
78
|
+
}
|
|
79
|
+
finally {
|
|
80
|
+
readline.close();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=profile-choice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-choice.js","sourceRoot":"","sources":["../src/profile-choice.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { JouzuPaths } from "./paths.js";
|
|
2
|
+
import type { ResolvedProfile } from "./profiles.js";
|
|
3
|
+
export type ProfileActionType = "create" | "update" | "delete" | "adopt" | "state-update" | "conflict";
|
|
4
|
+
export interface ProfileAction {
|
|
5
|
+
type: ProfileActionType;
|
|
6
|
+
target: string;
|
|
7
|
+
reason: string;
|
|
8
|
+
desiredSha256?: string;
|
|
9
|
+
observedSha256?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface ProfilePlan {
|
|
12
|
+
schemaVersion: 1;
|
|
13
|
+
profile: string;
|
|
14
|
+
profileVersion: number;
|
|
15
|
+
manifestSha256: string;
|
|
16
|
+
agentDir: string;
|
|
17
|
+
actions: ProfileAction[];
|
|
18
|
+
}
|
|
19
|
+
export interface ProfileState {
|
|
20
|
+
schemaVersion: 1;
|
|
21
|
+
activeProfile: "core" | "ja";
|
|
22
|
+
profileVersion: number;
|
|
23
|
+
manifestSha256: string;
|
|
24
|
+
jouzuVersion: string;
|
|
25
|
+
transactionId: string;
|
|
26
|
+
appliedAt: string;
|
|
27
|
+
managedTargets: Array<{
|
|
28
|
+
target: string;
|
|
29
|
+
sha256: string;
|
|
30
|
+
}>;
|
|
31
|
+
}
|
|
32
|
+
export interface ApplyProfileResult {
|
|
33
|
+
changed: boolean;
|
|
34
|
+
plan: ProfilePlan;
|
|
35
|
+
transactionId?: string;
|
|
36
|
+
backupDir?: string;
|
|
37
|
+
}
|
|
38
|
+
export declare class ProfileStateError extends Error {
|
|
39
|
+
constructor(message: string);
|
|
40
|
+
}
|
|
41
|
+
export declare function formatProfilePlan(plan: ProfilePlan): string;
|
|
42
|
+
export declare class ProfileConflictError extends Error {
|
|
43
|
+
readonly exitCode = 3;
|
|
44
|
+
readonly plan: ProfilePlan;
|
|
45
|
+
constructor(plan: ProfilePlan);
|
|
46
|
+
}
|
|
47
|
+
export declare function readProfileState(path: string): ProfileState | undefined;
|
|
48
|
+
export declare function planProfile(profile: ResolvedProfile, paths: JouzuPaths, jouzuVersion: string): ProfilePlan;
|
|
49
|
+
export declare function applyProfile(profile: ResolvedProfile, paths: JouzuPaths, jouzuVersion: string): ApplyProfileResult;
|
|
50
|
+
//# sourceMappingURL=profile-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-manager.d.ts","sourceRoot":"","sources":["../src/profile-manager.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAgBrD,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,cAAc,GAAG,UAAU,CAAC;AAEvG,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,iBAAiB,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC3B,aAAa,EAAE,CAAC,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,aAAa,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC5B,aAAa,EAAE,CAAC,CAAC;IACjB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC1D;AAED,MAAM,WAAW,kBAAkB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,WAAW,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,iBAAkB,SAAQ,KAAK;gBAC/B,OAAO,EAAE,MAAM;CAI3B;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAa3D;AAED,qBAAa,oBAAqB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,QAAQ,KAAK;IACtB,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;gBAEf,IAAI,EAAE,WAAW;CAK7B;AAUD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAgEvE;AA4DD,wBAAgB,WAAW,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,GAAG,WAAW,CA4G1G;AAiCD,wBAAgB,YAAY,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,GAAG,kBAAkB,CAoDlH"}
|