everybuddy 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/LICENSE +21 -0
- package/README.md +184 -0
- package/dist/atlas/bundled.d.ts +15 -0
- package/dist/atlas/bundled.js +438 -0
- package/dist/atlas/bundled.js.map +1 -0
- package/dist/bones/rarity.d.ts +2 -0
- package/dist/bones/rarity.js +43 -0
- package/dist/bones/rarity.js.map +1 -0
- package/dist/bones/roll.d.ts +10 -0
- package/dist/bones/roll.js +71 -0
- package/dist/bones/roll.js.map +1 -0
- package/dist/bones/species.d.ts +1 -0
- package/dist/bones/species.js +3 -0
- package/dist/bones/species.js.map +1 -0
- package/dist/bones/stats.d.ts +6 -0
- package/dist/bones/stats.js +55 -0
- package/dist/bones/stats.js.map +1 -0
- package/dist/cli/attach.d.ts +5 -0
- package/dist/cli/attach.js +64 -0
- package/dist/cli/attach.js.map +1 -0
- package/dist/cli/card.d.ts +3 -0
- package/dist/cli/card.js +19 -0
- package/dist/cli/card.js.map +1 -0
- package/dist/cli/detach.d.ts +4 -0
- package/dist/cli/detach.js +36 -0
- package/dist/cli/detach.js.map +1 -0
- package/dist/cli/event.d.ts +7 -0
- package/dist/cli/event.js +35 -0
- package/dist/cli/event.js.map +1 -0
- package/dist/cli/hatch.d.ts +6 -0
- package/dist/cli/hatch.js +20 -0
- package/dist/cli/hatch.js.map +1 -0
- package/dist/cli/init.d.ts +2 -0
- package/dist/cli/init.js +76 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/install.d.ts +32 -0
- package/dist/cli/install.js +121 -0
- package/dist/cli/install.js.map +1 -0
- package/dist/cli/io.d.ts +9 -0
- package/dist/cli/io.js +35 -0
- package/dist/cli/io.js.map +1 -0
- package/dist/cli/setup.d.ts +26 -0
- package/dist/cli/setup.js +297 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/cli/sidecar.d.ts +5 -0
- package/dist/cli/sidecar.js +12 -0
- package/dist/cli/sidecar.js.map +1 -0
- package/dist/i18n/companion.d.ts +9 -0
- package/dist/i18n/companion.js +117 -0
- package/dist/i18n/companion.js.map +1 -0
- package/dist/i18n/ui.d.ts +67 -0
- package/dist/i18n/ui.js +270 -0
- package/dist/i18n/ui.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +116 -0
- package/dist/index.js.map +1 -0
- package/dist/render/card.d.ts +10 -0
- package/dist/render/card.js +188 -0
- package/dist/render/card.js.map +1 -0
- package/dist/render/color.d.ts +5 -0
- package/dist/render/color.js +100 -0
- package/dist/render/color.js.map +1 -0
- package/dist/render/compose.d.ts +2 -0
- package/dist/render/compose.js +10 -0
- package/dist/render/compose.js.map +1 -0
- package/dist/render/gacha.d.ts +9 -0
- package/dist/render/gacha.js +322 -0
- package/dist/render/gacha.js.map +1 -0
- package/dist/render/sprites.d.ts +5 -0
- package/dist/render/sprites.js +316 -0
- package/dist/render/sprites.js.map +1 -0
- package/dist/runtime/observer.d.ts +73 -0
- package/dist/runtime/observer.js +448 -0
- package/dist/runtime/observer.js.map +1 -0
- package/dist/runtime/sidecar.d.ts +18 -0
- package/dist/runtime/sidecar.js +670 -0
- package/dist/runtime/sidecar.js.map +1 -0
- package/dist/runtime/socket.d.ts +6 -0
- package/dist/runtime/socket.js +47 -0
- package/dist/runtime/socket.js.map +1 -0
- package/dist/runtime/tmux.d.ts +41 -0
- package/dist/runtime/tmux.js +186 -0
- package/dist/runtime/tmux.js.map +1 -0
- package/dist/runtime/types.d.ts +96 -0
- package/dist/runtime/types.js +2 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/soul/hatch.d.ts +6 -0
- package/dist/soul/hatch.js +90 -0
- package/dist/soul/hatch.js.map +1 -0
- package/dist/soul/profile.d.ts +6 -0
- package/dist/soul/profile.js +48 -0
- package/dist/soul/profile.js.map +1 -0
- package/dist/soul/providers/anthropic.d.ts +17 -0
- package/dist/soul/providers/anthropic.js +105 -0
- package/dist/soul/providers/anthropic.js.map +1 -0
- package/dist/soul/providers/index.d.ts +10 -0
- package/dist/soul/providers/index.js +23 -0
- package/dist/soul/providers/index.js.map +1 -0
- package/dist/soul/providers/openai.d.ts +20 -0
- package/dist/soul/providers/openai.js +120 -0
- package/dist/soul/providers/openai.js.map +1 -0
- package/dist/soul/providers/types.d.ts +4 -0
- package/dist/soul/providers/types.js +2 -0
- package/dist/soul/providers/types.js.map +1 -0
- package/dist/storage/companion.d.ts +3 -0
- package/dist/storage/companion.js +155 -0
- package/dist/storage/companion.js.map +1 -0
- package/dist/storage/config.d.ts +36 -0
- package/dist/storage/config.js +220 -0
- package/dist/storage/config.js.map +1 -0
- package/dist/storage/paths.d.ts +3 -0
- package/dist/storage/paths.js +12 -0
- package/dist/storage/paths.js.map +1 -0
- package/dist/types/companion.d.ts +84 -0
- package/dist/types/companion.js +2 -0
- package/dist/types/companion.js.map +1 -0
- package/dist/types/onboarding.d.ts +12 -0
- package/dist/types/onboarding.js +2 -0
- package/dist/types/onboarding.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import os from "node:os";
|
|
2
|
+
import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { configFilePath, defaultStorageDir } from "./paths.js";
|
|
5
|
+
export const DEFAULT_OPENAI_BASE_URL = "https://coding.dashscope.aliyuncs.com/v1";
|
|
6
|
+
export const DEFAULT_OPENAI_MODEL = "qwen3.5-plus";
|
|
7
|
+
export const DEFAULT_OPENAI_OBSERVER_MODEL = "qwen3-coder-next";
|
|
8
|
+
export const DEFAULT_ANTHROPIC_BASE_URL = "https://api.anthropic.com";
|
|
9
|
+
export const DEFAULT_ANTHROPIC_MODEL = "claude-haiku-4-5-20251001";
|
|
10
|
+
export const DEFAULT_ANTHROPIC_OBSERVER_MODEL = "claude-haiku-4-5-20251001";
|
|
11
|
+
export const PROVIDER_DEFAULTS = {
|
|
12
|
+
openai: {
|
|
13
|
+
baseUrl: DEFAULT_OPENAI_BASE_URL,
|
|
14
|
+
model: DEFAULT_OPENAI_MODEL,
|
|
15
|
+
observerModel: DEFAULT_OPENAI_OBSERVER_MODEL,
|
|
16
|
+
},
|
|
17
|
+
anthropic: {
|
|
18
|
+
baseUrl: DEFAULT_ANTHROPIC_BASE_URL,
|
|
19
|
+
model: DEFAULT_ANTHROPIC_MODEL,
|
|
20
|
+
observerModel: DEFAULT_ANTHROPIC_OBSERVER_MODEL,
|
|
21
|
+
},
|
|
22
|
+
custom: {
|
|
23
|
+
baseUrl: undefined,
|
|
24
|
+
model: undefined,
|
|
25
|
+
observerModel: undefined,
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
const DEFAULT_CONFIG = {
|
|
29
|
+
provider: "openai",
|
|
30
|
+
language: "zh",
|
|
31
|
+
};
|
|
32
|
+
export async function resolveBuddyConfig(options = {}) {
|
|
33
|
+
const storageDir = options.storageDir ?? defaultStorageDir();
|
|
34
|
+
const fileConfig = await readBuddyConfigFile(storageDir);
|
|
35
|
+
const envConfig = readEnvConfig();
|
|
36
|
+
const cliConfig = compactConfig({
|
|
37
|
+
model: options.model,
|
|
38
|
+
apiKey: options.apiKey,
|
|
39
|
+
baseUrl: options.baseUrl,
|
|
40
|
+
});
|
|
41
|
+
const merged = {
|
|
42
|
+
...DEFAULT_CONFIG,
|
|
43
|
+
...fileConfig,
|
|
44
|
+
...envConfig,
|
|
45
|
+
...cliConfig,
|
|
46
|
+
storageDir,
|
|
47
|
+
};
|
|
48
|
+
const provider = isValidProvider(merged.provider) ? merged.provider : DEFAULT_CONFIG.provider;
|
|
49
|
+
const defaults = PROVIDER_DEFAULTS[provider];
|
|
50
|
+
const baseUrl = normalizeOptionalString(merged.baseUrl) ?? defaults.baseUrl ?? "";
|
|
51
|
+
const model = normalizeOptionalString(merged.model) ?? defaults.model ?? "";
|
|
52
|
+
const observerModel = normalizeOptionalString(merged.observerModel) ?? defaults.observerModel;
|
|
53
|
+
return {
|
|
54
|
+
provider,
|
|
55
|
+
model,
|
|
56
|
+
observerModel,
|
|
57
|
+
apiKey: normalizeOptionalString(merged.apiKey),
|
|
58
|
+
baseUrl,
|
|
59
|
+
language: normalizeLanguage(merged.language),
|
|
60
|
+
storageDir,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
export function assertHatchReadyConfig(config) {
|
|
64
|
+
const missing = [];
|
|
65
|
+
if (!config.apiKey) {
|
|
66
|
+
missing.push("API key (--api-key or env variable)");
|
|
67
|
+
}
|
|
68
|
+
if (!config.model) {
|
|
69
|
+
missing.push("model (--model)");
|
|
70
|
+
}
|
|
71
|
+
if (missing.length > 0) {
|
|
72
|
+
throw new Error(`Missing hatch configuration: ${missing.join(", ")}.`);
|
|
73
|
+
}
|
|
74
|
+
const apiKey = config.apiKey;
|
|
75
|
+
const model = config.model;
|
|
76
|
+
if (!apiKey) {
|
|
77
|
+
throw new Error("Missing hatch configuration: API key (--api-key or env variable).");
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
...config,
|
|
81
|
+
apiKey,
|
|
82
|
+
model,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
export function resolveUserId(cliUserId) {
|
|
86
|
+
const candidate = cliUserId?.trim() || process.env.EVERYBUDDY_USER_ID?.trim();
|
|
87
|
+
if (candidate) {
|
|
88
|
+
return candidate;
|
|
89
|
+
}
|
|
90
|
+
return os.userInfo().username || "buddy-user";
|
|
91
|
+
}
|
|
92
|
+
export async function readBuddyConfigFile(storageDir = defaultStorageDir()) {
|
|
93
|
+
const targetPath = configFilePath(storageDir);
|
|
94
|
+
try {
|
|
95
|
+
const raw = await readFile(targetPath, "utf8");
|
|
96
|
+
const parsed = JSON.parse(raw);
|
|
97
|
+
return parseBuddyConfig(parsed);
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
if (isMissingFileError(error)) {
|
|
101
|
+
return {};
|
|
102
|
+
}
|
|
103
|
+
throw new Error(`Failed to read config at ${targetPath}: ${getErrorMessage(error)}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
export async function writeBuddyConfigFile(config, storageDir = defaultStorageDir()) {
|
|
107
|
+
const normalized = parseBuddyConfig(config);
|
|
108
|
+
const targetPath = configFilePath(storageDir);
|
|
109
|
+
const tempPath = path.join(storageDir, `.config.${process.pid}.${Date.now().toString(36)}.tmp`);
|
|
110
|
+
const payload = JSON.stringify(normalized, null, 2);
|
|
111
|
+
await mkdir(storageDir, { recursive: true });
|
|
112
|
+
await writeFile(tempPath, payload, "utf8");
|
|
113
|
+
await rename(tempPath, targetPath);
|
|
114
|
+
}
|
|
115
|
+
export async function updateBuddyConfigFile(updates, storageDir = defaultStorageDir()) {
|
|
116
|
+
const current = await readBuddyConfigFile(storageDir);
|
|
117
|
+
const next = parseBuddyConfig({
|
|
118
|
+
...current,
|
|
119
|
+
...compactConfig(updates),
|
|
120
|
+
});
|
|
121
|
+
await writeBuddyConfigFile(next, storageDir);
|
|
122
|
+
return next;
|
|
123
|
+
}
|
|
124
|
+
function readEnvConfig() {
|
|
125
|
+
const explicitProvider = normalizeProvider(process.env.BUDDY_PROVIDER);
|
|
126
|
+
const openaiKey = process.env.OPENAI_API_KEY ?? process.env.DASHSCOPE_API_KEY;
|
|
127
|
+
const anthropicKey = process.env.ANTHROPIC_API_KEY;
|
|
128
|
+
let provider = explicitProvider;
|
|
129
|
+
let apiKey;
|
|
130
|
+
if (provider === "anthropic") {
|
|
131
|
+
apiKey = anthropicKey;
|
|
132
|
+
}
|
|
133
|
+
else if (provider === "openai" || provider === "custom") {
|
|
134
|
+
apiKey = openaiKey;
|
|
135
|
+
}
|
|
136
|
+
else if (anthropicKey && !openaiKey) {
|
|
137
|
+
provider = "anthropic";
|
|
138
|
+
apiKey = anthropicKey;
|
|
139
|
+
}
|
|
140
|
+
else if (openaiKey) {
|
|
141
|
+
provider = "openai";
|
|
142
|
+
apiKey = openaiKey;
|
|
143
|
+
}
|
|
144
|
+
return compactConfig({
|
|
145
|
+
provider,
|
|
146
|
+
apiKey,
|
|
147
|
+
baseUrl: process.env.OPENAI_BASE_URL,
|
|
148
|
+
model: process.env.OPENAI_MODEL ?? process.env.BUDDY_MODEL,
|
|
149
|
+
observerModel: process.env.OPENAI_OBSERVER_MODEL,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
function parseBuddyConfig(value) {
|
|
153
|
+
if (!isPlainObject(value)) {
|
|
154
|
+
throw new Error("Config file must contain a JSON object.");
|
|
155
|
+
}
|
|
156
|
+
const provider = value.provider;
|
|
157
|
+
const model = value.model;
|
|
158
|
+
const observerModel = value.observerModel;
|
|
159
|
+
const apiKey = value.apiKey;
|
|
160
|
+
const baseUrl = value.baseUrl;
|
|
161
|
+
const language = value.language;
|
|
162
|
+
if (provider !== undefined && !isValidProvider(provider)) {
|
|
163
|
+
throw new Error("Config `provider` must be one of: openai, anthropic, custom.");
|
|
164
|
+
}
|
|
165
|
+
if (model !== undefined && typeof model !== "string") {
|
|
166
|
+
throw new Error("Config `model` must be a string.");
|
|
167
|
+
}
|
|
168
|
+
if (apiKey !== undefined && typeof apiKey !== "string") {
|
|
169
|
+
throw new Error("Config `apiKey` must be a string.");
|
|
170
|
+
}
|
|
171
|
+
if (observerModel !== undefined && typeof observerModel !== "string") {
|
|
172
|
+
throw new Error("Config `observerModel` must be a string.");
|
|
173
|
+
}
|
|
174
|
+
if (baseUrl !== undefined && typeof baseUrl !== "string") {
|
|
175
|
+
throw new Error("Config `baseUrl` must be a string.");
|
|
176
|
+
}
|
|
177
|
+
if (language !== undefined && !isLanguage(language)) {
|
|
178
|
+
throw new Error("Config `language` must be `zh` or `en`.");
|
|
179
|
+
}
|
|
180
|
+
return compactConfig({
|
|
181
|
+
provider,
|
|
182
|
+
model,
|
|
183
|
+
observerModel,
|
|
184
|
+
apiKey,
|
|
185
|
+
baseUrl,
|
|
186
|
+
language,
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
function compactConfig(config) {
|
|
190
|
+
return Object.fromEntries(Object.entries(config).filter(([, value]) => value !== undefined));
|
|
191
|
+
}
|
|
192
|
+
function normalizeOptionalString(value) {
|
|
193
|
+
if (typeof value !== "string") {
|
|
194
|
+
return undefined;
|
|
195
|
+
}
|
|
196
|
+
const trimmed = value.trim();
|
|
197
|
+
return trimmed.length > 0 ? trimmed : undefined;
|
|
198
|
+
}
|
|
199
|
+
function normalizeLanguage(value) {
|
|
200
|
+
return isLanguage(value) ? value : DEFAULT_CONFIG.language;
|
|
201
|
+
}
|
|
202
|
+
function isLanguage(value) {
|
|
203
|
+
return value === "zh" || value === "en";
|
|
204
|
+
}
|
|
205
|
+
function normalizeProvider(value) {
|
|
206
|
+
return isValidProvider(value) ? value : undefined;
|
|
207
|
+
}
|
|
208
|
+
function isPlainObject(value) {
|
|
209
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
210
|
+
}
|
|
211
|
+
function isValidProvider(value) {
|
|
212
|
+
return value === "openai" || value === "anthropic" || value === "custom";
|
|
213
|
+
}
|
|
214
|
+
function isMissingFileError(error) {
|
|
215
|
+
return typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT";
|
|
216
|
+
}
|
|
217
|
+
function getErrorMessage(error) {
|
|
218
|
+
return error instanceof Error ? error.message : String(error);
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/storage/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import os from "node:os";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
export function defaultStorageDir() {
|
|
4
|
+
return path.join(os.homedir(), ".terminal-buddy");
|
|
5
|
+
}
|
|
6
|
+
export function configFilePath(storageDir = defaultStorageDir()) {
|
|
7
|
+
return path.join(storageDir, "config.json");
|
|
8
|
+
}
|
|
9
|
+
export function companionFilePath(storageDir = defaultStorageDir()) {
|
|
10
|
+
return path.join(storageDir, "companion.json");
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/storage/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,iBAAiB,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,UAAU,GAAG,iBAAiB,EAAE;IAC7D,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,UAAU,GAAG,iBAAiB,EAAE;IAChE,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
export type StatName = "GRIT" | "FOCUS" | "CHAOS" | "WIT" | "SASS";
|
|
2
|
+
export type BuddyProvider = "openai" | "anthropic" | "custom";
|
|
3
|
+
export type BuddyLanguage = "zh" | "en";
|
|
4
|
+
export type ObserverVoice = "quiet" | "dry" | "playful" | "deadpan";
|
|
5
|
+
export interface ColorPalette {
|
|
6
|
+
primary: string;
|
|
7
|
+
accent: string;
|
|
8
|
+
}
|
|
9
|
+
export interface SpeciesDefinition {
|
|
10
|
+
id: string;
|
|
11
|
+
name: string;
|
|
12
|
+
color: ColorPalette;
|
|
13
|
+
frames: string[][];
|
|
14
|
+
}
|
|
15
|
+
export interface EyeDefinition {
|
|
16
|
+
id: string;
|
|
17
|
+
label: string;
|
|
18
|
+
char: string;
|
|
19
|
+
}
|
|
20
|
+
export interface HatDefinition {
|
|
21
|
+
id: string;
|
|
22
|
+
label: string;
|
|
23
|
+
art: string;
|
|
24
|
+
}
|
|
25
|
+
export interface Rarity {
|
|
26
|
+
tier: number;
|
|
27
|
+
name: string;
|
|
28
|
+
stars: string;
|
|
29
|
+
color: string;
|
|
30
|
+
weight: number;
|
|
31
|
+
floor: number;
|
|
32
|
+
}
|
|
33
|
+
export type StatBlock = Record<StatName, number>;
|
|
34
|
+
export interface CompanionBones {
|
|
35
|
+
userId: string;
|
|
36
|
+
species: string;
|
|
37
|
+
rarity: Rarity;
|
|
38
|
+
eye: string;
|
|
39
|
+
hat: string;
|
|
40
|
+
stats: StatBlock;
|
|
41
|
+
color: ColorPalette;
|
|
42
|
+
shiny: boolean;
|
|
43
|
+
}
|
|
44
|
+
export interface BuddyConfig {
|
|
45
|
+
provider?: BuddyProvider | undefined;
|
|
46
|
+
model?: string | undefined;
|
|
47
|
+
observerModel?: string | undefined;
|
|
48
|
+
apiKey?: string | undefined;
|
|
49
|
+
baseUrl?: string | undefined;
|
|
50
|
+
language?: BuddyLanguage | undefined;
|
|
51
|
+
}
|
|
52
|
+
export interface ResolvedBuddyConfig {
|
|
53
|
+
provider: BuddyProvider;
|
|
54
|
+
model: string;
|
|
55
|
+
observerModel: string | undefined;
|
|
56
|
+
apiKey: string | undefined;
|
|
57
|
+
baseUrl: string | undefined;
|
|
58
|
+
language: BuddyLanguage;
|
|
59
|
+
storageDir: string;
|
|
60
|
+
}
|
|
61
|
+
export interface HatchReadyConfig extends ResolvedBuddyConfig {
|
|
62
|
+
apiKey: string;
|
|
63
|
+
model: string;
|
|
64
|
+
}
|
|
65
|
+
export interface ObserverProfile {
|
|
66
|
+
voice: ObserverVoice;
|
|
67
|
+
chattiness: 1 | 2 | 3 | 4 | 5;
|
|
68
|
+
sharpness: 1 | 2 | 3 | 4 | 5;
|
|
69
|
+
patience: 1 | 2 | 3 | 4 | 5;
|
|
70
|
+
}
|
|
71
|
+
export interface CompanionSoul {
|
|
72
|
+
name: string;
|
|
73
|
+
tagline?: string | undefined;
|
|
74
|
+
personality: string;
|
|
75
|
+
observerProfile: ObserverProfile;
|
|
76
|
+
modelUsed: string;
|
|
77
|
+
}
|
|
78
|
+
export interface CompanionRecord {
|
|
79
|
+
templateId?: string | undefined;
|
|
80
|
+
userId: string;
|
|
81
|
+
bones: CompanionBones;
|
|
82
|
+
soul: CompanionSoul;
|
|
83
|
+
createdAt: string;
|
|
84
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"companion.js","sourceRoot":"","sources":["../../src/types/companion.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { CompanionBones, CompanionRecord, CompanionSoul } from "./companion.js";
|
|
2
|
+
export type OnboardingStep = "bones_reveal" | "soul_imprint" | "final_reveal" | "install_tmux";
|
|
3
|
+
export type InstallTarget = "tmux";
|
|
4
|
+
export interface HatchSceneState {
|
|
5
|
+
step: OnboardingStep;
|
|
6
|
+
userId: string;
|
|
7
|
+
bones: CompanionBones;
|
|
8
|
+
soul?: CompanionSoul | undefined;
|
|
9
|
+
record?: CompanionRecord | undefined;
|
|
10
|
+
attempt: number;
|
|
11
|
+
error?: string | undefined;
|
|
12
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../../src/types/onboarding.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "everybuddy",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Gacha-hatched terminal companions that live in your tmux. Draw a pet, AI writes its soul, it watches your shell and reacts.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"buddy": "dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"README.md",
|
|
12
|
+
"LICENSE"
|
|
13
|
+
],
|
|
14
|
+
"repository": {
|
|
15
|
+
"type": "git",
|
|
16
|
+
"url": "https://github.com/Dylan-Nihilo/EveryBuddy.git"
|
|
17
|
+
},
|
|
18
|
+
"homepage": "https://github.com/Dylan-Nihilo/EveryBuddy",
|
|
19
|
+
"author": "Dylan Thomas",
|
|
20
|
+
"license": "MIT",
|
|
21
|
+
"keywords": [
|
|
22
|
+
"terminal",
|
|
23
|
+
"tmux",
|
|
24
|
+
"companion",
|
|
25
|
+
"pet",
|
|
26
|
+
"gacha",
|
|
27
|
+
"ascii-art",
|
|
28
|
+
"cli",
|
|
29
|
+
"sidecar"
|
|
30
|
+
],
|
|
31
|
+
"scripts": {
|
|
32
|
+
"build": "tsc -p tsconfig.json",
|
|
33
|
+
"dev": "tsx src/index.ts",
|
|
34
|
+
"test": "node --import tsx --test test/*.test.ts",
|
|
35
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
36
|
+
"prepack": "pnpm build"
|
|
37
|
+
},
|
|
38
|
+
"engines": {
|
|
39
|
+
"node": ">=20"
|
|
40
|
+
},
|
|
41
|
+
"packageManager": "pnpm@8.6.12",
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"commander": "^13.1.0"
|
|
44
|
+
},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"@types/node": "^24.6.0",
|
|
47
|
+
"puppeteer": "^24.40.0",
|
|
48
|
+
"sharp": "^0.34.5",
|
|
49
|
+
"tsx": "^4.20.6",
|
|
50
|
+
"typescript": "^5.9.3"
|
|
51
|
+
}
|
|
52
|
+
}
|