@heysummon/app 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.
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.installDependencies = installDependencies;
37
+ exports.runMigrations = runMigrations;
38
+ exports.buildApp = buildApp;
39
+ const child_process_1 = require("child_process");
40
+ const config_1 = require("./config");
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ function runInAppDir(command, silent = true) {
44
+ const appDir = (0, config_1.getAppDir)();
45
+ const envFile = (0, config_1.getEnvFile)();
46
+ const appEnv = path.join(appDir, ".env");
47
+ if (!fs.existsSync(appEnv)) {
48
+ fs.copyFileSync(envFile, appEnv);
49
+ }
50
+ (0, child_process_1.execSync)(command, {
51
+ cwd: appDir,
52
+ stdio: silent ? "pipe" : "inherit",
53
+ env: { ...process.env, NODE_ENV: "production" },
54
+ });
55
+ }
56
+ function installDependencies() {
57
+ runInAppDir("npm install --production --silent 2>/dev/null || npm install --production");
58
+ }
59
+ function runMigrations() {
60
+ runInAppDir("npx prisma migrate deploy");
61
+ }
62
+ function buildApp() {
63
+ // Suppress noisy next build output — only show errors
64
+ try {
65
+ runInAppDir("npm run build");
66
+ }
67
+ catch (err) {
68
+ // Re-run with output on failure so user sees what went wrong
69
+ runInAppDir("npm run build", false);
70
+ throw err;
71
+ }
72
+ }
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.getLatestRelease = getLatestRelease;
37
+ exports.downloadAndExtract = downloadAndExtract;
38
+ const https = __importStar(require("https"));
39
+ const fs = __importStar(require("fs"));
40
+ const path = __importStar(require("path"));
41
+ const child_process_1 = require("child_process");
42
+ const config_1 = require("./config");
43
+ const GITHUB_API = "https://api.github.com";
44
+ const REPO = "thomasansems/heysummon";
45
+ function httpsGet(url) {
46
+ return new Promise((resolve, reject) => {
47
+ const options = {
48
+ headers: { "User-Agent": "heysummon-cli" },
49
+ };
50
+ https
51
+ .get(url, options, (res) => {
52
+ if (res.statusCode === 301 || res.statusCode === 302) {
53
+ const location = res.headers.location;
54
+ if (location) {
55
+ httpsGet(location).then(resolve, reject);
56
+ return;
57
+ }
58
+ }
59
+ if (res.statusCode !== 200) {
60
+ reject(new Error(`HTTP ${res.statusCode} for ${url}`));
61
+ return;
62
+ }
63
+ let data = "";
64
+ res.on("data", (chunk) => (data += chunk.toString()));
65
+ res.on("end", () => resolve(data));
66
+ })
67
+ .on("error", reject);
68
+ });
69
+ }
70
+ function httpsDownload(url, dest) {
71
+ return new Promise((resolve, reject) => {
72
+ const options = {
73
+ headers: { "User-Agent": "heysummon-cli" },
74
+ };
75
+ https
76
+ .get(url, options, (res) => {
77
+ if (res.statusCode === 301 || res.statusCode === 302) {
78
+ const location = res.headers.location;
79
+ if (location) {
80
+ httpsDownload(location, dest).then(resolve, reject);
81
+ return;
82
+ }
83
+ }
84
+ if (res.statusCode !== 200) {
85
+ reject(new Error(`HTTP ${res.statusCode} for ${url}`));
86
+ return;
87
+ }
88
+ const file = fs.createWriteStream(dest);
89
+ res.pipe(file);
90
+ file.on("finish", () => {
91
+ file.close();
92
+ resolve();
93
+ });
94
+ })
95
+ .on("error", reject);
96
+ });
97
+ }
98
+ async function getLatestRelease() {
99
+ const data = await httpsGet(`${GITHUB_API}/repos/${REPO}/releases/latest`);
100
+ return JSON.parse(data);
101
+ }
102
+ async function downloadAndExtract() {
103
+ const release = await getLatestRelease();
104
+ const version = release.tag_name;
105
+ console.log(` Downloading HeySummon ${version}...`);
106
+ // Look for a tarball asset first, fall back to source tarball
107
+ const tarballAsset = release.assets.find((a) => a.name.endsWith(".tar.gz"));
108
+ const downloadUrl = tarballAsset
109
+ ? tarballAsset.browser_download_url
110
+ : release.tarball_url;
111
+ const appDir = (0, config_1.getAppDir)();
112
+ const tmpFile = path.join(path.dirname(appDir), `heysummon-${version}.tar.gz`);
113
+ await httpsDownload(downloadUrl, tmpFile);
114
+ // Clean existing app dir and extract
115
+ if (fs.existsSync(appDir)) {
116
+ fs.rmSync(appDir, { recursive: true });
117
+ }
118
+ (0, config_1.ensureDir)(appDir);
119
+ console.log(" Extracting...");
120
+ (0, child_process_1.execSync)(`tar -xzf "${tmpFile}" -C "${appDir}" --strip-components=1`, {
121
+ stdio: "pipe",
122
+ });
123
+ // Clean up tarball
124
+ fs.unlinkSync(tmpFile);
125
+ return version;
126
+ }
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.ask = ask;
40
+ exports.askYesNo = askYesNo;
41
+ exports.askSecret = askSecret;
42
+ exports.askConfirmText = askConfirmText;
43
+ const p = __importStar(require("@clack/prompts"));
44
+ const picocolors_1 = __importDefault(require("picocolors"));
45
+ function handleCancel(value) {
46
+ if (p.isCancel(value)) {
47
+ p.cancel("Setup cancelled.");
48
+ process.exit(0);
49
+ }
50
+ }
51
+ async function ask(message, defaultValue) {
52
+ const value = await p.text({
53
+ message,
54
+ defaultValue,
55
+ placeholder: defaultValue,
56
+ });
57
+ handleCancel(value);
58
+ // After handleCancel, value is guaranteed to be string (not symbol)
59
+ // eslint-disable-next-line @typescript-eslint/no-base-to-string
60
+ return String(value);
61
+ }
62
+ async function askYesNo(message, defaultValue = true) {
63
+ const value = await p.confirm({
64
+ message,
65
+ initialValue: defaultValue,
66
+ });
67
+ handleCancel(value);
68
+ return Boolean(value);
69
+ }
70
+ async function askSecret(message) {
71
+ const value = await p.password({
72
+ message,
73
+ });
74
+ handleCancel(value);
75
+ return String(value);
76
+ }
77
+ async function askConfirmText(message, expected) {
78
+ const value = await p.text({
79
+ message,
80
+ placeholder: expected,
81
+ validate: (v) => {
82
+ if (v !== expected) {
83
+ return `Type ${picocolors_1.default.bold(expected)} to confirm, or press Ctrl+C to cancel.`;
84
+ }
85
+ },
86
+ });
87
+ handleCancel(value);
88
+ return String(value) === expected;
89
+ }
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.generateSecret = generateSecret;
37
+ exports.generateSecrets = generateSecrets;
38
+ const crypto = __importStar(require("crypto"));
39
+ function generateSecret(bytes = 32) {
40
+ return crypto.randomBytes(bytes).toString("hex");
41
+ }
42
+ function generateSecrets() {
43
+ return {
44
+ nextauthSecret: generateSecret(),
45
+ };
46
+ }
package/dist/lib/ui.js ADDED
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.color = void 0;
7
+ exports.printAnimatedBanner = printAnimatedBanner;
8
+ exports.printBannerStatic = printBannerStatic;
9
+ exports.printSuccess = printSuccess;
10
+ exports.printInfo = printInfo;
11
+ exports.printWarning = printWarning;
12
+ exports.printError = printError;
13
+ exports.printDivider = printDivider;
14
+ const picocolors_1 = __importDefault(require("picocolors"));
15
+ exports.color = {
16
+ bold: (s) => picocolors_1.default.bold(s),
17
+ dim: (s) => picocolors_1.default.dim(s),
18
+ green: (s) => picocolors_1.default.green(s),
19
+ yellow: (s) => picocolors_1.default.yellow(s),
20
+ cyan: (s) => picocolors_1.default.cyan(s),
21
+ magenta: (s) => picocolors_1.default.magenta(s),
22
+ red: (s) => picocolors_1.default.red(s),
23
+ blue: (s) => picocolors_1.default.blue(s),
24
+ boldCyan: (s) => picocolors_1.default.bold(picocolors_1.default.cyan(s)),
25
+ boldGreen: (s) => picocolors_1.default.bold(picocolors_1.default.green(s)),
26
+ boldYellow: (s) => picocolors_1.default.bold(picocolors_1.default.yellow(s)),
27
+ };
28
+ // Primary brand color = yellow (matches #fdb15f from the web UI)
29
+ const brand = (s) => picocolors_1.default.bold(picocolors_1.default.yellow(s));
30
+ const BANNER = `
31
+ ${brand(" _ ")}
32
+ ${brand(" | |__ ___ _ _ ___ _ _ _ __ ___ _ __ ___ ___ _ __")}
33
+ ${brand(" | _ \\ / _ \\ | | | / __| | | | '_ ` _ \\| '_ ` _ \\ / _ \\| '_ \\")}
34
+ ${brand(" | | | | __/ |_| | \\__ \\ |_| | | | | | | | | | | | (_) | | | |")}
35
+ ${brand(" |_| |_|\\___|\\__, | |___/\\__,_|_| |_| |_|_| |_| |_|\\___/|_| |_|")}
36
+ ${brand(" |___/ ")}
37
+ `;
38
+ const SUMMON_LINES = [
39
+ "hey summon Thomas About to delete 847 prod records. You sure about that?",
40
+ "hey summon Sarah Found a $200 cheaper flight. It leaves at 4:47 AM though.",
41
+ "hey summon Mark Email draft says 'As per my last email'. Send it like that?",
42
+ "hey summon Lisa New vendor invoice: $2,400. Never seen this account before.",
43
+ "hey summon Thomas Customer wants a refund from 8 months ago. Policy says 30 days.",
44
+ "hey summon James Ad budget is gone. Pause everything or throw in another $500?",
45
+ "hey summon Anna That PR has 6 major issues. Post the honest review or sugarcoat it?",
46
+ "hey summon Sarah Customer is furious and I'm 3 messages deep. Tag in?",
47
+ "hey summon Elon Wrote a rejection email. The applicant seems really excited though.",
48
+ "hey summon Thomas You said 'update the homepage'. I have 4 interpretations of that.",
49
+ "hey summon Lisa 'Make it faster' — load time, response time, or vibes?",
50
+ "hey summon Mark 'Reach out to last month's leads' — that's 214 people. All of them?",
51
+ "hey summon Anna Two Thomas Ansems in the CRM. Gonna need you to pick one.",
52
+ "hey summon James API key expires tomorrow. Renew the old one or start fresh?",
53
+ "hey summon Sarah Found a note: 'don't contact Mark until after holidays'. Is it after?",
54
+ "hey summon Thomas Tried solving this for 47 iterations. I officially give up. Help?",
55
+ "hey summon Elon You said 'surprise me' with the design. Wanna preview or just send it?",
56
+ "hey summon Lisa User says your product 'changed their life'. Ask for a testimonial?",
57
+ "hey summon Mark Wrote 6 apology emails. They all sound passive-aggressive somehow.",
58
+ "hey summon Anna Code comment says 'DO NOT CHANGE'. But you just asked me to change it.",
59
+ ];
60
+ const ANIMATION_CYCLES = 6;
61
+ const TYPE_DELAY_MS = 22;
62
+ const ERASE_DELAY_MS = 10;
63
+ const PAUSE_AFTER_LINE_MS = 1400;
64
+ const PAUSE_AFTER_ERASE_MS = 300;
65
+ function sleep(ms) {
66
+ return new Promise((resolve) => setTimeout(resolve, ms));
67
+ }
68
+ function isInteractive() {
69
+ return Boolean(process.stdout.isTTY && !process.env.CI);
70
+ }
71
+ function shuffled(arr) {
72
+ const copy = [...arr];
73
+ for (let i = copy.length - 1; i > 0; i--) {
74
+ const j = Math.floor(Math.random() * (i + 1));
75
+ [copy[i], copy[j]] = [copy[j], copy[i]];
76
+ }
77
+ return copy;
78
+ }
79
+ function parseSummonLine(line) {
80
+ const parts = line.split(" ");
81
+ return { name: parts[2], question: parts.slice(3).join(" ") };
82
+ }
83
+ function getMaxTypedChars() {
84
+ const cols = process.stdout.columns || 80;
85
+ // " > hey summon " = 16 visible chars
86
+ return cols - 16;
87
+ }
88
+ // The static prefix that never gets erased
89
+ const PROMPT_PREFIX = ` ${picocolors_1.default.dim(">")} ${picocolors_1.default.bold(picocolors_1.default.yellow("hey summon"))} `;
90
+ function renderLine(typedChars) {
91
+ process.stdout.write(`\r\x1b[K${PROMPT_PREFIX}${typedChars}`);
92
+ }
93
+ async function printAnimatedBanner() {
94
+ console.log(BANNER);
95
+ console.log(` ${picocolors_1.default.dim("AI does the work. Humans make the calls. Self-Hosted Human-in-the-loop")}`);
96
+ console.log("");
97
+ if (!isInteractive()) {
98
+ const line = SUMMON_LINES[Math.floor(Math.random() * SUMMON_LINES.length)];
99
+ const { name, question } = parseSummonLine(line);
100
+ renderLine(`${picocolors_1.default.bold(name)} ${picocolors_1.default.dim(question)}`);
101
+ console.log("");
102
+ console.log("");
103
+ return;
104
+ }
105
+ const order = shuffled(SUMMON_LINES);
106
+ const maxChars = getMaxTypedChars();
107
+ // Show the static prefix
108
+ renderLine("");
109
+ for (let i = 0; i < ANIMATION_CYCLES; i++) {
110
+ const { name, question } = parseSummonLine(order[i % order.length]);
111
+ const fullText = `${name} ${question}`;
112
+ // Truncate if needed
113
+ const displayText = fullText.length > maxChars - 3
114
+ ? fullText.slice(0, maxChars - 3) + "..."
115
+ : fullText;
116
+ // Type forward character by character
117
+ const chars = [...displayText];
118
+ for (let c = 0; c < chars.length; c++) {
119
+ const typed = displayText.slice(0, c + 1);
120
+ // Name part stays bold, question part is dim
121
+ const nameEnd = name.length;
122
+ if (c < nameEnd) {
123
+ renderLine(picocolors_1.default.bold(typed));
124
+ }
125
+ else {
126
+ renderLine(`${picocolors_1.default.bold(name)} ${picocolors_1.default.dim(typed.slice(nameEnd + 1))}`);
127
+ }
128
+ await sleep(TYPE_DELAY_MS);
129
+ }
130
+ // Pause to read
131
+ await sleep(PAUSE_AFTER_LINE_MS);
132
+ // Backspace erase (skip on last cycle — keep final text visible)
133
+ if (i < ANIMATION_CYCLES - 1) {
134
+ for (let c = chars.length; c > 0; c--) {
135
+ const typed = displayText.slice(0, c - 1);
136
+ const nameEnd = name.length;
137
+ if (c - 1 <= 0) {
138
+ renderLine("");
139
+ }
140
+ else if (c - 1 <= nameEnd) {
141
+ renderLine(picocolors_1.default.bold(typed));
142
+ }
143
+ else {
144
+ renderLine(`${picocolors_1.default.bold(name)} ${picocolors_1.default.dim(typed.slice(nameEnd + 1))}`);
145
+ }
146
+ await sleep(ERASE_DELAY_MS);
147
+ }
148
+ await sleep(PAUSE_AFTER_ERASE_MS);
149
+ }
150
+ }
151
+ console.log("");
152
+ console.log("");
153
+ }
154
+ function printBannerStatic() {
155
+ console.log(BANNER);
156
+ console.log(` ${picocolors_1.default.dim("AI does the work. Humans make the calls. Self-Hosted Human-in-the-loop")}`);
157
+ console.log("");
158
+ const { name, question } = parseSummonLine(SUMMON_LINES[0]);
159
+ console.log(`${PROMPT_PREFIX}${picocolors_1.default.bold(name)} ${picocolors_1.default.dim(question)}`);
160
+ console.log("");
161
+ }
162
+ function printSuccess(msg) {
163
+ console.log(` ${picocolors_1.default.green("✓")} ${msg}`);
164
+ }
165
+ function printInfo(msg) {
166
+ console.log(` ${picocolors_1.default.dim("·")} ${msg}`);
167
+ }
168
+ function printWarning(msg) {
169
+ console.log(` ${picocolors_1.default.yellow("⚠")} ${msg}`);
170
+ }
171
+ function printError(msg) {
172
+ console.log(` ${picocolors_1.default.red("✗")} ${msg}`);
173
+ }
174
+ function printDivider() {
175
+ console.log(` ${picocolors_1.default.dim("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")}`);
176
+ }
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@heysummon/app",
3
+ "version": "0.1.0",
4
+ "description": "HeySummon — Human-in-the-loop for AI agents. Install & run with one command.",
5
+ "bin": {
6
+ "heysummon": "./bin/cli.js"
7
+ },
8
+ "files": [
9
+ "bin/",
10
+ "dist/"
11
+ ],
12
+ "scripts": {
13
+ "build": "tsc",
14
+ "test": "node --test dist/__tests__/*.test.js"
15
+ },
16
+ "engines": {
17
+ "node": ">=18"
18
+ },
19
+ "keywords": [
20
+ "heysummon",
21
+ "ai",
22
+ "human-in-the-loop",
23
+ "agents"
24
+ ],
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "https://github.com/thomasansems/heysummon.git",
28
+ "directory": "cli"
29
+ },
30
+ "license": "MIT",
31
+ "dependencies": {
32
+ "@clack/prompts": "^0.10.0",
33
+ "picocolors": "^1.1.1"
34
+ },
35
+ "devDependencies": {
36
+ "@types/node": "^22.19.15",
37
+ "typescript": "^5.9.3"
38
+ }
39
+ }