@assistkick/create 1.24.0 → 1.26.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/dist/src/scaffolder.js +4 -3
- package/dist/src/scaffolder.js.map +1 -1
- package/package.json +1 -1
- package/templates/assistkick-product-system/packages/backend/src/services/chat_cli_bridge.ts +12 -0
- package/templates/assistkick-product-system/packages/backend/src/services/init.ts +40 -2
- package/templates/assistkick-product-system/packages/shared/db/migrate.ts +22 -4
- package/templates/assistkick-product-system/packages/shared/drizzle.config.js +9 -4
- package/templates/assistkick-product-system/packages/shared/scripts/assign-project.ts +21 -4
package/dist/src/scaffolder.js
CHANGED
|
@@ -32,7 +32,7 @@ export class Scaffolder {
|
|
|
32
32
|
dbConfig = await this.promptDbConfig();
|
|
33
33
|
portConfig = await this.promptPortConfig();
|
|
34
34
|
secretConfig = await this.promptSecrets();
|
|
35
|
-
appConfig = await this.promptAppConfig();
|
|
35
|
+
appConfig = await this.promptAppConfig(portConfig);
|
|
36
36
|
}
|
|
37
37
|
this.scaffoldProductSystem(productSystemTarget);
|
|
38
38
|
await this.scaffoldSkills(skillsTarget, isRerun);
|
|
@@ -98,10 +98,11 @@ export class Scaffolder {
|
|
|
98
98
|
}
|
|
99
99
|
return { jwtSecret, encryptionKey };
|
|
100
100
|
};
|
|
101
|
-
promptAppConfig = async () => {
|
|
101
|
+
promptAppConfig = async (portConfig) => {
|
|
102
102
|
console.log('\nApplication configuration:');
|
|
103
|
+
const defaultUrl = `http://localhost:${portConfig.frontendPort}`;
|
|
103
104
|
const resendApiKey = (await this.prompt('RESEND_API_KEY (optional, press Enter to skip): ')).trim();
|
|
104
|
-
const appBaseUrl = (await this.prompt(
|
|
105
|
+
const appBaseUrl = (await this.prompt(`APP_BASE_URL [default=${defaultUrl}]: `)).trim() || defaultUrl;
|
|
105
106
|
const emailFrom = (await this.prompt('EMAIL_FROM [default=noreply@example.com]: ')).trim() || 'noreply@example.com';
|
|
106
107
|
return { resendApiKey, appBaseUrl, emailFrom };
|
|
107
108
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffolder.js","sourceRoot":"","sources":["../../src/scaffolder.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,UAAU,EACV,SAAS,EACT,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAc1C,MAAM,oBAAoB,GAAG,GAAa,EAAE;IAC1C,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7E,OAAO,CAAC,QAAgB,EAAE,EAAE,CAC1B,IAAI,OAAO,CAAS,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACrF,CAAC,CAAC;AAEF,MAAM,OAAO,UAAU;IACJ,SAAS,CAAS;IAClB,YAAY,CAAS;IACrB,MAAM,CAAW;IAElC,YAAY,SAAiB,EAAE,YAAoB,EAAE,MAAiB;QACpE,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,oBAAoB,EAAE,CAAC;IACjD,CAAC;IAED,GAAG,GAAG,KAAK,IAAI,EAAE;QACf,IAAI,CAAC,SAAS,EAAE,CAAC;QAEjB,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,2BAA2B,CAAC,CAAC;QAC9E,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC/D,MAAM,OAAO,GAAG,UAAU,CAAC,mBAAmB,CAAC,CAAC;QAEhD,IAAI,QAAQ,GAAoB,IAAI,CAAC;QACrC,IAAI,UAAU,GAAsB,IAAI,CAAC;QACzC,IAAI,YAAY,GAAwB,IAAI,CAAC;QAC7C,IAAI,SAAS,GAAqB,IAAI,CAAC;QAEvC,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,wFAAwF,CAAC,CAAC;QACxG,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;YACvC,UAAU,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3C,YAAY,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;YAC1C,SAAS,GAAG,MAAM,IAAI,CAAC,eAAe,
|
|
1
|
+
{"version":3,"file":"scaffolder.js","sourceRoot":"","sources":["../../src/scaffolder.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/templates/assistkick-product-system/packages/backend/src/services/chat_cli_bridge.ts
CHANGED
|
@@ -202,6 +202,18 @@ export class ChatCliBridge {
|
|
|
202
202
|
let stderrLines: string[] = [];
|
|
203
203
|
let stdoutNonJsonLines: string[] = [];
|
|
204
204
|
|
|
205
|
+
// Attach error handlers on stdio streams to prevent unhandled 'error' events
|
|
206
|
+
// from crashing the process (e.g. EPIPE if CLI exits before stdin write completes)
|
|
207
|
+
child.stdin!.on('error', (err) => {
|
|
208
|
+
this.log('CHAT_CLI', `[stdin error] ${err.message}`);
|
|
209
|
+
});
|
|
210
|
+
child.stdout!.on('error', (err) => {
|
|
211
|
+
this.log('CHAT_CLI', `[stdout error] ${err.message}`);
|
|
212
|
+
});
|
|
213
|
+
child.stderr!.on('error', (err) => {
|
|
214
|
+
this.log('CHAT_CLI', `[stderr error] ${err.message}`);
|
|
215
|
+
});
|
|
216
|
+
|
|
205
217
|
child.stdout!.on('data', (chunk: Buffer) => {
|
|
206
218
|
stdoutReceived = true;
|
|
207
219
|
lineBuf += chunk.toString();
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
import { join, dirname } from 'node:path';
|
|
7
7
|
import { fileURLToPath } from 'node:url';
|
|
8
|
+
import { appendFileSync, existsSync, mkdirSync, readFileSync, writeFileSync, statSync } from 'node:fs';
|
|
8
9
|
import { createClaudeService } from '@assistkick/shared/lib/claude-service.js';
|
|
9
10
|
import { GitWorkflow } from '@assistkick/shared/lib/git_workflow.js';
|
|
10
11
|
import { getDb } from '@assistkick/shared/lib/db.js';
|
|
@@ -41,16 +42,53 @@ const DEBUGGER_SKILL_PATH = join(SKILLS_DIR, 'product-debugger', 'SKILL.md');
|
|
|
41
42
|
const VIDEO_PACKAGE_DIR = join(SKILL_ROOT, 'video');
|
|
42
43
|
const BUNDLE_OUTPUT_DIR = process.env.REMOTION_BUNDLE_DIR || join(PROJECT_ROOT, 'data', 'remotion-bundle');
|
|
43
44
|
|
|
45
|
+
/* ── Persistent file logger ──────────────────────────────────────────────
|
|
46
|
+
* Writes every log line to data/server.log so logs survive tsx watch restarts.
|
|
47
|
+
* Truncates the file when it exceeds MAX_LOG_LINES to prevent unbounded growth.
|
|
48
|
+
*/
|
|
49
|
+
const LOG_DIR = join(SKILL_ROOT, 'data');
|
|
50
|
+
const LOG_FILE = join(LOG_DIR, 'server.log');
|
|
51
|
+
const MAX_LOG_LINES = 2000;
|
|
52
|
+
const TRUNCATE_TO = 1500; // keep last N lines after truncation
|
|
53
|
+
|
|
54
|
+
if (!existsSync(LOG_DIR)) mkdirSync(LOG_DIR, { recursive: true });
|
|
55
|
+
|
|
56
|
+
/** Append a line to the log file, truncating when it gets too large. */
|
|
57
|
+
const writeToLogFile = (line: string): void => {
|
|
58
|
+
try {
|
|
59
|
+
appendFileSync(LOG_FILE, line + '\n');
|
|
60
|
+
// Check file size periodically (cheap stat check — only truncate when > ~200KB)
|
|
61
|
+
const stats = statSync(LOG_FILE);
|
|
62
|
+
if (stats.size > 200_000) {
|
|
63
|
+
const content = readFileSync(LOG_FILE, 'utf-8');
|
|
64
|
+
const lines = content.split('\n');
|
|
65
|
+
if (lines.length > MAX_LOG_LINES) {
|
|
66
|
+
const trimmed = lines.slice(-TRUNCATE_TO).join('\n');
|
|
67
|
+
writeFileSync(LOG_FILE, trimmed + '\n');
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
} catch {
|
|
71
|
+
// Never let logging failures break the app
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
// Write startup marker so you can find restart boundaries in the log file
|
|
76
|
+
writeToLogFile(`\n${'='.repeat(80)}\n[${new Date().toISOString()}] SERVER STARTING (pid ${process.pid})\n${'='.repeat(80)}`);
|
|
77
|
+
|
|
44
78
|
export const log = (tag: string, ...args: any[]) => {
|
|
45
79
|
const ts = new Date().toISOString().slice(11, 23);
|
|
46
|
-
|
|
80
|
+
const line = `[${ts}] [${tag}] ${args.map(a => typeof a === 'string' ? a : JSON.stringify(a)).join(' ')}`;
|
|
81
|
+
console.log(line);
|
|
82
|
+
writeToLogFile(line);
|
|
47
83
|
};
|
|
48
84
|
|
|
49
85
|
/** Log an error with its stack trace for debugging. */
|
|
50
86
|
export const logError = (tag: string, msg: string, err: unknown) => {
|
|
51
87
|
const ts = new Date().toISOString().slice(11, 23);
|
|
52
88
|
const stack = err instanceof Error ? err.stack : String(err);
|
|
53
|
-
|
|
89
|
+
const line = `[${ts}] [${tag}] ERROR ${msg} ${stack}`;
|
|
90
|
+
console.error(line);
|
|
91
|
+
writeToLogFile(line);
|
|
54
92
|
};
|
|
55
93
|
|
|
56
94
|
export let claudeService: any;
|
|
@@ -14,12 +14,30 @@ import { migrate } from 'drizzle-orm/libsql/migrator';
|
|
|
14
14
|
import { drizzle } from 'drizzle-orm/libsql';
|
|
15
15
|
import { createClient } from '@libsql/client';
|
|
16
16
|
import { getTableColumns, getTableName } from 'drizzle-orm';
|
|
17
|
+
import { existsSync, mkdirSync } from 'node:fs';
|
|
18
|
+
import { join } from 'node:path';
|
|
17
19
|
import * as schema from './schema.js';
|
|
18
20
|
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
const tursoUrl = process.env.TURSO_DATABASE_URL;
|
|
22
|
+
const tursoAuthToken = process.env.TURSO_AUTH_TOKEN;
|
|
23
|
+
|
|
24
|
+
let connectionUrl: string;
|
|
25
|
+
let connectionAuthToken: string | undefined;
|
|
26
|
+
|
|
27
|
+
if (tursoUrl && tursoAuthToken) {
|
|
28
|
+
connectionUrl = tursoUrl;
|
|
29
|
+
connectionAuthToken = tursoAuthToken;
|
|
30
|
+
} else {
|
|
31
|
+
// Local SQLite fallback — same logic as lib/db.ts
|
|
32
|
+
const dataDir = join(import.meta.dirname, '..', '..', '..', 'data');
|
|
33
|
+
if (!existsSync(dataDir)) {
|
|
34
|
+
mkdirSync(dataDir, { recursive: true });
|
|
35
|
+
}
|
|
36
|
+
connectionUrl = `file:${join(dataDir, 'local.db')}`;
|
|
37
|
+
connectionAuthToken = undefined;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const client = createClient({ url: connectionUrl, authToken: connectionAuthToken });
|
|
23
41
|
|
|
24
42
|
const db = drizzle(client);
|
|
25
43
|
|
|
@@ -1,14 +1,19 @@
|
|
|
1
1
|
import { defineConfig } from 'drizzle-kit';
|
|
2
2
|
import { config } from 'dotenv';
|
|
3
|
+
import { join } from 'node:path';
|
|
3
4
|
|
|
4
5
|
config({ path: '../../.env' });
|
|
5
6
|
|
|
7
|
+
const tursoUrl = process.env.TURSO_DATABASE_URL;
|
|
8
|
+
const tursoAuthToken = process.env.TURSO_AUTH_TOKEN;
|
|
9
|
+
|
|
10
|
+
const dbCredentials = (tursoUrl && tursoAuthToken)
|
|
11
|
+
? { url: tursoUrl, authToken: tursoAuthToken }
|
|
12
|
+
: { url: `file:${join(import.meta.dirname, '..', '..', 'data', 'local.db')}` };
|
|
13
|
+
|
|
6
14
|
export default defineConfig({
|
|
7
15
|
schema: './db/schema.ts',
|
|
8
16
|
out: './db/migrations',
|
|
9
17
|
dialect: 'turso',
|
|
10
|
-
dbCredentials
|
|
11
|
-
url: process.env.TURSO_DATABASE_URL,
|
|
12
|
-
authToken: process.env.TURSO_AUTH_TOKEN,
|
|
13
|
-
},
|
|
18
|
+
dbCredentials,
|
|
14
19
|
});
|
|
@@ -7,6 +7,8 @@ import { config } from 'dotenv';
|
|
|
7
7
|
config({ path: '../../.env' });
|
|
8
8
|
|
|
9
9
|
import { createClient } from '@libsql/client';
|
|
10
|
+
import { existsSync, mkdirSync } from 'node:fs';
|
|
11
|
+
import { join } from 'node:path';
|
|
10
12
|
|
|
11
13
|
const TABLES = [
|
|
12
14
|
'nodes',
|
|
@@ -25,10 +27,25 @@ if (!projectId) {
|
|
|
25
27
|
}
|
|
26
28
|
|
|
27
29
|
async function main() {
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
const tursoUrl = process.env.TURSO_DATABASE_URL;
|
|
31
|
+
const tursoAuthToken = process.env.TURSO_AUTH_TOKEN;
|
|
32
|
+
|
|
33
|
+
let connectionUrl: string;
|
|
34
|
+
let connectionAuthToken: string | undefined;
|
|
35
|
+
|
|
36
|
+
if (tursoUrl && tursoAuthToken) {
|
|
37
|
+
connectionUrl = tursoUrl;
|
|
38
|
+
connectionAuthToken = tursoAuthToken;
|
|
39
|
+
} else {
|
|
40
|
+
const dataDir = join(import.meta.dirname, '..', '..', '..', 'data');
|
|
41
|
+
if (!existsSync(dataDir)) {
|
|
42
|
+
mkdirSync(dataDir, { recursive: true });
|
|
43
|
+
}
|
|
44
|
+
connectionUrl = `file:${join(dataDir, 'local.db')}`;
|
|
45
|
+
connectionAuthToken = undefined;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const client = createClient({ url: connectionUrl, authToken: connectionAuthToken });
|
|
32
49
|
|
|
33
50
|
console.log(`Assigning unassigned rows to project: ${projectId}\n`);
|
|
34
51
|
|