@assistkick/create 1.0.0 → 1.2.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.d.ts +6 -1
- package/dist/src/scaffolder.js +20 -9
- package/dist/src/scaffolder.js.map +1 -1
- package/package.json +2 -2
- package/templates/{product-system → assistkick-product-system}/CLAUDE.md +4 -4
- package/templates/{product-system → assistkick-product-system}/package.json +5 -5
- package/templates/{product-system → assistkick-product-system}/packages/backend/package.json +2 -2
- package/templates/{product-system → assistkick-product-system}/packages/backend/src/routes/auth.ts +1 -1
- package/templates/{product-system → assistkick-product-system}/packages/backend/src/routes/coherence.ts +1 -1
- package/templates/{product-system → assistkick-product-system}/packages/backend/src/routes/graph.ts +3 -3
- package/templates/{product-system → assistkick-product-system}/packages/backend/src/routes/kanban.ts +2 -2
- package/templates/{product-system → assistkick-product-system}/packages/backend/src/server.ts +5 -5
- package/templates/{product-system → assistkick-product-system}/packages/backend/src/services/coherence-review.ts +4 -4
- package/templates/{product-system → assistkick-product-system}/packages/backend/src/services/init.ts +10 -10
- package/templates/{product-system → assistkick-product-system}/packages/backend/src/services/invitation_service.ts +1 -1
- package/templates/{product-system → assistkick-product-system}/packages/backend/src/services/password_reset_service.ts +1 -1
- package/templates/{product-system → assistkick-product-system}/packages/backend/src/services/project_service.ts +1 -1
- package/templates/{product-system → assistkick-product-system}/packages/backend/src/services/user_management_service.ts +1 -1
- package/templates/{product-system → assistkick-product-system}/packages/frontend/package.json +1 -1
- package/templates/assistkick-product-system/packages/frontend/vite.config.ts +31 -0
- package/templates/{product-system → assistkick-product-system}/packages/shared/lib/db.ts +1 -1
- package/templates/{product-system → assistkick-product-system}/packages/shared/lib/prompt_builder.ts +2 -2
- package/templates/{product-system → assistkick-product-system}/packages/shared/package.json +1 -1
- package/templates/{product-system → assistkick-product-system}/tests/db_sqlite_fallback.test.ts +1 -1
- package/templates/skills/{product-bootstrap → assistkick-bootstrap}/SKILL.md +3 -3
- package/templates/skills/{product-code-reviewer → assistkick-code-reviewer}/SKILL.md +3 -3
- package/templates/skills/{product-debugger → assistkick-debugger}/SKILL.md +5 -5
- package/templates/skills/{product-developer → assistkick-developer}/SKILL.md +3 -3
- package/templates/skills/{product-interview → assistkick-interview}/SKILL.md +3 -3
- package/templates/product-system/packages/frontend/vite.config.ts +0 -20
- /package/templates/{product-system → assistkick-product-system}/.env.example +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/backend/src/middleware/auth_middleware.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/backend/src/middleware/auth_middleware.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/backend/src/routes/pipeline.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/backend/src/routes/projects.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/backend/src/routes/users.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/backend/src/services/auth_service.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/backend/src/services/auth_service.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/backend/src/services/email_service.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/backend/src/services/invitation_service.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/backend/src/services/password_reset_service.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/backend/src/services/project_service.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/backend/src/services/pty_session_manager.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/backend/src/services/pty_session_manager.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/backend/src/services/terminal_ws_handler.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/backend/src/services/user_management_service.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/backend/tsconfig.json +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/index.html +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/package-lock.json +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/public/favicon.svg +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/App.tsx +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/api/client.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/api/client_projects.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/api/client_refresh.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/components/CoherenceView.tsx +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/components/GraphLegend.tsx +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/components/GraphSettings.tsx +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/components/GraphView.tsx +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/components/InviteUserDialog.tsx +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/components/KanbanView.tsx +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/components/LoginPage.tsx +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/components/ProjectSelector.tsx +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/components/QaIssueSheet.tsx +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/components/SidePanel.tsx +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/components/TerminalView.tsx +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/components/Toolbar.tsx +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/components/UsersView.tsx +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/constants/graph.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/hooks/useAuth.tsx +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/hooks/useGraph.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/hooks/useKanban.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/hooks/useProjects.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/hooks/useTheme.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/hooks/useToast.tsx +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/hooks/use_projects_logic.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/main.tsx +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/pages/accept_invitation_page.tsx +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/pages/forgot_password_page.tsx +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/pages/register_page.tsx +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/pages/reset_password_page.tsx +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/routes/ProtectedRoute.tsx +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/routes/accept_invitation.tsx +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/routes/dashboard.tsx +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/routes/forgot_password.tsx +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/routes/login.tsx +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/routes/register.tsx +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/routes/reset_password.tsx +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/styles/index.css +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/utils/auth_validation.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/utils/auth_validation.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/utils/login_validation.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/utils/login_validation.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/utils/logout.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/utils/node_sizing.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/utils/node_sizing.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/utils/task_status.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/utils/task_status.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/frontend/tsconfig.json +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/shared/.env.example +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/shared/README.md +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/shared/db/migrate.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/shared/db/migrations/0000_dashing_gorgon.sql +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/shared/db/migrations/meta/0000_snapshot.json +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/shared/db/migrations/meta/_journal.json +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/shared/db/schema.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/shared/drizzle.config.js +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/shared/lib/claude-service.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/shared/lib/coherence.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/shared/lib/completeness.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/shared/lib/constants.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/shared/lib/git_workflow.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/shared/lib/graph.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/shared/lib/kanban.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/shared/lib/markdown.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/shared/lib/pipeline-state-store.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/shared/lib/pipeline.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/shared/lib/relevance_search.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/shared/lib/session.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/shared/lib/validator.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/shared/lib/work_summary_parser.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/shared/scripts/assign-project.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/shared/tools/add_edge.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/shared/tools/add_node.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/shared/tools/end_session.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/shared/tools/get_gaps.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/shared/tools/get_kanban.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/shared/tools/get_node.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/shared/tools/get_status.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/shared/tools/migrate_to_turso.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/shared/tools/move_card.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/shared/tools/rebuild_index.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/shared/tools/remove_edge.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/shared/tools/remove_node.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/shared/tools/resolve_question.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/shared/tools/search_nodes.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/shared/tools/start_session.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/shared/tools/update_node.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/packages/shared/tsconfig.json +0 -0
- /package/templates/{product-system → assistkick-product-system}/pnpm-workspace.yaml +0 -0
- /package/templates/{product-system → assistkick-product-system}/smoke_test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/tests/coherence_review.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/tests/edge_type_color_coding.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/tests/emit-tool-use-events.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/tests/feature_kind.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/tests/gap_indicators.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/tests/graceful_init.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/tests/graph_legend.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/tests/graph_settings_sheet.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/tests/hide_defined_filter.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/tests/kanban.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/tests/neighborhood_focus.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/tests/node_search.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/tests/node_sizing.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/tests/node_type_toggle_filters.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/tests/node_type_visual_encoding.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/tests/pipeline-state-store.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/tests/pipeline-unit.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/tests/pipeline.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/tests/pipeline_stats_all_cards.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/tests/play_all.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/tests/qa_issue_sheet.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/tests/relevance_search.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/tests/search_reorder.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/tests/serve_ui.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/tests/serve_ui_drizzle.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/tests/session_context_recall.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/tests/side_panel.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/tests/spec_completeness_label.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/tests/url_routing_test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/tests/user_login.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/tests/user_registration.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/tests/web_terminal.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/tests/work_summary.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/tests/zoom_pan.test.ts +0 -0
- /package/templates/{product-system → assistkick-product-system}/tsconfig.json +0 -0
- /package/templates/skills/{product-debugger → assistkick-debugger}/references/agent-browser.md +0 -0
package/dist/src/scaffolder.d.ts
CHANGED
|
@@ -5,6 +5,10 @@ type DbConfig = {
|
|
|
5
5
|
url: string;
|
|
6
6
|
authToken: string;
|
|
7
7
|
};
|
|
8
|
+
type PortConfig = {
|
|
9
|
+
backendPort: number;
|
|
10
|
+
frontendPort: number;
|
|
11
|
+
};
|
|
8
12
|
export type PromptFn = (question: string) => Promise<string>;
|
|
9
13
|
export declare class Scaffolder {
|
|
10
14
|
private readonly targetDir;
|
|
@@ -14,9 +18,10 @@ export declare class Scaffolder {
|
|
|
14
18
|
run: () => Promise<void>;
|
|
15
19
|
private checkPnpm;
|
|
16
20
|
private promptDbConfig;
|
|
21
|
+
private promptPortConfig;
|
|
17
22
|
private scaffoldProductSystem;
|
|
18
23
|
private scaffoldSkills;
|
|
19
24
|
skillHasModifications: (sourceDir: string, targetDir: string) => boolean;
|
|
20
|
-
generateEnv: (productSystemDir: string, dbConfig: DbConfig) => void;
|
|
25
|
+
generateEnv: (productSystemDir: string, dbConfig: DbConfig, portConfig: PortConfig) => void;
|
|
21
26
|
}
|
|
22
27
|
export {};
|
package/dist/src/scaffolder.js
CHANGED
|
@@ -17,27 +17,29 @@ export class Scaffolder {
|
|
|
17
17
|
}
|
|
18
18
|
run = async () => {
|
|
19
19
|
this.checkPnpm();
|
|
20
|
-
const productSystemTarget = join(this.targetDir, 'product-system');
|
|
20
|
+
const productSystemTarget = join(this.targetDir, 'assistkick-product-system');
|
|
21
21
|
const skillsTarget = join(this.targetDir, '.claude', 'skills');
|
|
22
22
|
const isRerun = existsSync(productSystemTarget);
|
|
23
23
|
let dbConfig = null;
|
|
24
|
+
let portConfig = null;
|
|
24
25
|
if (isRerun) {
|
|
25
|
-
console.log('product-system/ already exists. Updating code, preserving data/ and .env...');
|
|
26
|
+
console.log('assistkick-product-system/ already exists. Updating code, preserving data/ and .env...');
|
|
26
27
|
}
|
|
27
28
|
else {
|
|
28
29
|
dbConfig = await this.promptDbConfig();
|
|
30
|
+
portConfig = await this.promptPortConfig();
|
|
29
31
|
}
|
|
30
32
|
this.scaffoldProductSystem(productSystemTarget);
|
|
31
33
|
await this.scaffoldSkills(skillsTarget, isRerun);
|
|
32
|
-
if (!isRerun && dbConfig) {
|
|
33
|
-
this.generateEnv(productSystemTarget, dbConfig);
|
|
34
|
+
if (!isRerun && dbConfig && portConfig) {
|
|
35
|
+
this.generateEnv(productSystemTarget, dbConfig, portConfig);
|
|
34
36
|
}
|
|
35
37
|
console.log('\nRunning pnpm install...');
|
|
36
38
|
execSync('pnpm install', { cwd: productSystemTarget, stdio: 'inherit' });
|
|
37
39
|
console.log('\nRunning db:migrate...');
|
|
38
40
|
execSync('pnpm db:migrate', { cwd: productSystemTarget, stdio: 'inherit' });
|
|
39
|
-
console.log('\
|
|
40
|
-
console.log(' cd product-system && pnpm dev');
|
|
41
|
+
console.log('\nassistkick-product-system is ready!');
|
|
42
|
+
console.log(' cd assistkick-product-system && pnpm dev');
|
|
41
43
|
};
|
|
42
44
|
checkPnpm = () => {
|
|
43
45
|
try {
|
|
@@ -61,8 +63,16 @@ export class Scaffolder {
|
|
|
61
63
|
}
|
|
62
64
|
return { type: 'local' };
|
|
63
65
|
};
|
|
66
|
+
promptPortConfig = async () => {
|
|
67
|
+
console.log('\nPort configuration:');
|
|
68
|
+
const backendInput = await this.prompt('Backend port [default=3000]: ');
|
|
69
|
+
const frontendInput = await this.prompt('Frontend port [default=5173]: ');
|
|
70
|
+
const backendPort = backendInput.trim() ? parseInt(backendInput.trim(), 10) : 3000;
|
|
71
|
+
const frontendPort = frontendInput.trim() ? parseInt(frontendInput.trim(), 10) : 5173;
|
|
72
|
+
return { backendPort, frontendPort };
|
|
73
|
+
};
|
|
64
74
|
scaffoldProductSystem = (targetDir) => {
|
|
65
|
-
const sourceDir = join(this.templatesDir, 'product-system');
|
|
75
|
+
const sourceDir = join(this.templatesDir, 'assistkick-product-system');
|
|
66
76
|
mkdirSync(targetDir, { recursive: true });
|
|
67
77
|
cpSync(sourceDir, targetDir, {
|
|
68
78
|
recursive: true,
|
|
@@ -72,7 +82,7 @@ export class Scaffolder {
|
|
|
72
82
|
return base !== 'node_modules';
|
|
73
83
|
},
|
|
74
84
|
});
|
|
75
|
-
console.log('Scaffolded product-system/');
|
|
85
|
+
console.log('Scaffolded assistkick-product-system/');
|
|
76
86
|
};
|
|
77
87
|
scaffoldSkills = async (targetDir, isRerun) => {
|
|
78
88
|
const sourceSkillsDir = join(this.templatesDir, 'skills');
|
|
@@ -105,7 +115,7 @@ export class Scaffolder {
|
|
|
105
115
|
return false;
|
|
106
116
|
return readFileSync(sourceFile, 'utf-8') !== readFileSync(targetFile, 'utf-8');
|
|
107
117
|
};
|
|
108
|
-
generateEnv = (productSystemDir, dbConfig) => {
|
|
118
|
+
generateEnv = (productSystemDir, dbConfig, portConfig) => {
|
|
109
119
|
const lines = [];
|
|
110
120
|
if (dbConfig.type === 'local') {
|
|
111
121
|
lines.push('# Database — local SQLite', '# The database file is created automatically at data/local.db', '# To upgrade to Turso, uncomment and fill in the variables below:', '#TURSO_DATABASE_URL=libsql://your-db.turso.io', '#TURSO_AUTH_TOKEN=your-token', '');
|
|
@@ -113,6 +123,7 @@ export class Scaffolder {
|
|
|
113
123
|
else {
|
|
114
124
|
lines.push('# Database — Turso cloud', `TURSO_DATABASE_URL=${dbConfig.url}`, `TURSO_AUTH_TOKEN=${dbConfig.authToken}`, '');
|
|
115
125
|
}
|
|
126
|
+
lines.push('# Ports', `PORT=${portConfig.backendPort}`, `FRONTEND_PORT=${portConfig.frontendPort}`, '');
|
|
116
127
|
writeFileSync(join(productSystemDir, '.env'), lines.join('\n'));
|
|
117
128
|
console.log('Generated .env');
|
|
118
129
|
};
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"scaffolder.js","sourceRoot":"","sources":["../../src/scaffolder.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@assistkick/create",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "Scaffold
|
|
3
|
+
"version": "1.2.0",
|
|
4
|
+
"description": "Scaffold assistkick-product-system into any project",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"@assistkick/create": "./dist/bin/create.js"
|
|
@@ -15,11 +15,11 @@ AI requirements interview system that builds a specification knowledge graph thr
|
|
|
15
15
|
## Project Structure
|
|
16
16
|
|
|
17
17
|
```
|
|
18
|
-
product-system/
|
|
18
|
+
assistkick-product-system/
|
|
19
19
|
packages/
|
|
20
|
-
backend/ — Express API server (@
|
|
21
|
-
frontend/ — React SPA (@
|
|
22
|
-
shared/ — DB schema, migrations, shared types (@
|
|
20
|
+
backend/ — Express API server (@assistkick/backend)
|
|
21
|
+
frontend/ — React SPA (@assistkick/frontend)
|
|
22
|
+
shared/ — DB schema, migrations, shared types (@assistkick/shared)
|
|
23
23
|
```
|
|
24
24
|
|
|
25
25
|
## Commands
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
{
|
|
2
|
-
"name": "
|
|
2
|
+
"name": "assistkick",
|
|
3
3
|
"version": "1.0.0",
|
|
4
4
|
"description": "AI requirements interview system — builds a specification knowledge graph through structured interviews",
|
|
5
5
|
"private": true,
|
|
6
6
|
"type": "module",
|
|
7
7
|
"scripts": {
|
|
8
|
-
"dev": "concurrently -n backend,frontend -c blue,green \"pnpm --filter @
|
|
8
|
+
"dev": "concurrently -n backend,frontend -c blue,green \"pnpm --filter @assistkick/backend dev\" \"pnpm --filter @assistkick/frontend dev\"",
|
|
9
9
|
"build": "pnpm -r build",
|
|
10
10
|
"start": "tsx packages/backend/src/server.ts",
|
|
11
11
|
"test": "tsx --test tests/**/*.test.ts",
|
|
12
12
|
"clean": "pnpm -r clean",
|
|
13
|
-
"db:migrate": "pnpm --filter @
|
|
14
|
-
"db:rollback": "pnpm --filter @
|
|
15
|
-
"db:generate": "pnpm --filter @
|
|
13
|
+
"db:migrate": "pnpm --filter @assistkick/shared db:migrate",
|
|
14
|
+
"db:rollback": "pnpm --filter @assistkick/shared db:rollback",
|
|
15
|
+
"db:generate": "pnpm --filter @assistkick/shared db:generate"
|
|
16
16
|
},
|
|
17
17
|
"pnpm": {
|
|
18
18
|
"onlyBuiltDependencies": ["esbuild", "node-pty"]
|
package/templates/{product-system → assistkick-product-system}/packages/backend/package.json
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"name": "@
|
|
2
|
+
"name": "@assistkick/backend",
|
|
3
3
|
"version": "1.0.0",
|
|
4
4
|
"private": true,
|
|
5
5
|
"type": "module",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"postinstall": "chmod +x node_modules/node-pty/prebuilds/darwin-arm64/spawn-helper 2>/dev/null || true"
|
|
12
12
|
},
|
|
13
13
|
"dependencies": {
|
|
14
|
-
"@
|
|
14
|
+
"@assistkick/shared": "workspace:*",
|
|
15
15
|
"bcryptjs": "^3.0.3",
|
|
16
16
|
"cookie-parser": "^1.4.7",
|
|
17
17
|
"cors": "^2.8.5",
|
package/templates/{product-system → assistkick-product-system}/packages/backend/src/routes/auth.ts
RENAMED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
import { Router } from 'express';
|
|
9
9
|
import { eq, count } from 'drizzle-orm';
|
|
10
10
|
import { randomUUID } from 'node:crypto';
|
|
11
|
-
import { users, refreshTokens } from '@
|
|
11
|
+
import { users, refreshTokens } from '@assistkick/shared/db/schema.js';
|
|
12
12
|
import type { AuthService } from '../services/auth_service.js';
|
|
13
13
|
import type { PasswordResetService } from '../services/password_reset_service.js';
|
|
14
14
|
import type { InvitationService } from '../services/invitation_service.js';
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import { Router } from 'express';
|
|
6
|
-
import { detectConflicts } from '@
|
|
6
|
+
import { detectConflicts } from '@assistkick/shared/lib/coherence.js';
|
|
7
7
|
import { log } from '../services/init.js';
|
|
8
8
|
import {
|
|
9
9
|
coherenceRunning,
|
package/templates/{product-system → assistkick-product-system}/packages/backend/src/routes/graph.ts
RENAMED
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
import {Router} from 'express';
|
|
6
6
|
import {readFile} from 'node:fs/promises';
|
|
7
7
|
import {join} from 'node:path';
|
|
8
|
-
import {readGraph} from '@
|
|
9
|
-
import {getDb} from '@
|
|
10
|
-
import {nodes} from '@
|
|
8
|
+
import {readGraph} from '@assistkick/shared/lib/graph.js';
|
|
9
|
+
import {getDb} from '@assistkick/shared/lib/db.js';
|
|
10
|
+
import {nodes} from '@assistkick/shared/db/schema.js';
|
|
11
11
|
import {eq} from 'drizzle-orm';
|
|
12
12
|
import matter from 'gray-matter';
|
|
13
13
|
import {log, paths} from '../services/init.js';
|
package/templates/{product-system → assistkick-product-system}/packages/backend/src/routes/kanban.ts
RENAMED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
import { Router } from 'express';
|
|
6
6
|
import { randomUUID } from 'node:crypto';
|
|
7
|
-
import { readGraph } from '@
|
|
8
|
-
import { loadKanban, getKanbanEntry, saveKanbanEntry } from '@
|
|
7
|
+
import { readGraph } from '@assistkick/shared/lib/graph.js';
|
|
8
|
+
import { loadKanban, getKanbanEntry, saveKanbanEntry } from '@assistkick/shared/lib/kanban.js';
|
|
9
9
|
import { log, pipeline } from '../services/init.js';
|
|
10
10
|
|
|
11
11
|
const router: Router = Router();
|
package/templates/{product-system → assistkick-product-system}/packages/backend/src/server.ts
RENAMED
|
@@ -29,14 +29,14 @@ import { AuthMiddleware } from './middleware/auth_middleware.js';
|
|
|
29
29
|
import { createAuthRoutes } from './routes/auth.js';
|
|
30
30
|
import { createUserRoutes } from './routes/users.js';
|
|
31
31
|
import { createProjectRoutes } from './routes/projects.js';
|
|
32
|
-
import { getDb } from '@
|
|
32
|
+
import { getDb } from '@assistkick/shared/lib/db.js';
|
|
33
33
|
import graphRoutes from './routes/graph.js';
|
|
34
34
|
import kanbanRoutes from './routes/kanban.js';
|
|
35
35
|
import pipelineRoutes from './routes/pipeline.js';
|
|
36
36
|
import coherenceRoutes from './routes/coherence.js';
|
|
37
37
|
|
|
38
38
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
39
|
-
const DEFAULT_PORT = 3000;
|
|
39
|
+
const DEFAULT_PORT = parseInt(process.env.PORT || '3000', 10);
|
|
40
40
|
|
|
41
41
|
const parseArgs = (argv: string[]) => {
|
|
42
42
|
const args = { port: DEFAULT_PORT, verbose: false };
|
|
@@ -80,7 +80,7 @@ const jwtSecret = process.env.JWT_SECRET || 'dev-secret-change-in-production';
|
|
|
80
80
|
const isProduction = process.env.NODE_ENV === 'production';
|
|
81
81
|
const authService = new AuthService({ jwtSecret, isProduction });
|
|
82
82
|
const resendApiKey = process.env.RESEND_API_KEY || '';
|
|
83
|
-
const appBaseUrl = process.env.APP_BASE_URL || 'https://
|
|
83
|
+
const appBaseUrl = process.env.APP_BASE_URL || 'https://assistkick.localhost';
|
|
84
84
|
const emailFromAddress = process.env.EMAIL_FROM || 'noreply@example.com';
|
|
85
85
|
const emailService = new EmailService({ apiKey: resendApiKey, fromAddress: emailFromAddress });
|
|
86
86
|
const passwordResetService = new PasswordResetService({ getDb, emailService, authService, appBaseUrl, log });
|
|
@@ -130,7 +130,7 @@ const server = createServer(app);
|
|
|
130
130
|
|
|
131
131
|
// Set up WebSocket for terminal
|
|
132
132
|
const wss = new WebSocketServer({ noServer: true });
|
|
133
|
-
// Resolve project root: from packages/backend/src → product-system → repo root
|
|
133
|
+
// Resolve project root: from packages/backend/src → assistkick-product-system → repo root
|
|
134
134
|
const PROJECT_ROOT = join(__dirname, '..', '..', '..', '..');
|
|
135
135
|
const ptyManager = new PtySessionManager({ spawn: pty.spawn, log, projectRoot: PROJECT_ROOT });
|
|
136
136
|
const terminalHandler = new TerminalWsHandler({ wss, authService, ptyManager, log });
|
|
@@ -152,7 +152,7 @@ server.listen(args.port, () => {
|
|
|
152
152
|
if (existsSync(FRONTEND_DIST)) {
|
|
153
153
|
log('SERVER', `Serving frontend from ${FRONTEND_DIST}`);
|
|
154
154
|
} else {
|
|
155
|
-
log('SERVER', `No frontend dist found — run "pnpm --filter @
|
|
155
|
+
log('SERVER', `No frontend dist found — run "pnpm --filter @assistkick/frontend build" first, or use dev mode`);
|
|
156
156
|
}
|
|
157
157
|
});
|
|
158
158
|
|
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
|
|
5
5
|
import { join } from 'node:path';
|
|
6
6
|
import { randomUUID } from 'node:crypto';
|
|
7
|
-
import { readGraph, removeEdge as removeEdgeDb, patchNode as patchNodeDb } from '@
|
|
8
|
-
import { loadCoherence, saveCoherence, getDismissalKey, sortProposals } from '@
|
|
9
|
-
import { getDb } from '@
|
|
10
|
-
import { nodes } from '@
|
|
7
|
+
import { readGraph, removeEdge as removeEdgeDb, patchNode as patchNodeDb } from '@assistkick/shared/lib/graph.js';
|
|
8
|
+
import { loadCoherence, saveCoherence, getDismissalKey, sortProposals } from '@assistkick/shared/lib/coherence.js';
|
|
9
|
+
import { getDb } from '@assistkick/shared/lib/db.js';
|
|
10
|
+
import { nodes } from '@assistkick/shared/db/schema.js';
|
|
11
11
|
import { eq } from 'drizzle-orm';
|
|
12
12
|
import { claudeService, paths, log } from './init.js';
|
|
13
13
|
|
package/templates/{product-system → assistkick-product-system}/packages/backend/src/services/init.ts
RENAMED
|
@@ -6,18 +6,18 @@
|
|
|
6
6
|
import { join, dirname } from 'node:path';
|
|
7
7
|
import { fileURLToPath } from 'node:url';
|
|
8
8
|
import { existsSync } from 'node:fs';
|
|
9
|
-
import { createClaudeService } from '@
|
|
10
|
-
import { Pipeline } from '@
|
|
11
|
-
import { PipelineStateStore } from '@
|
|
12
|
-
import { PromptBuilder } from '@
|
|
13
|
-
import { GitWorkflow } from '@
|
|
14
|
-
import { getDb } from '@
|
|
15
|
-
import { getKanbanEntry, saveKanbanEntry } from '@
|
|
16
|
-
import { getNode } from '@
|
|
17
|
-
import { WorkSummaryParser } from '@
|
|
9
|
+
import { createClaudeService } from '@assistkick/shared/lib/claude-service.js';
|
|
10
|
+
import { Pipeline } from '@assistkick/shared/lib/pipeline.js';
|
|
11
|
+
import { PipelineStateStore } from '@assistkick/shared/lib/pipeline-state-store.js';
|
|
12
|
+
import { PromptBuilder } from '@assistkick/shared/lib/prompt_builder.js';
|
|
13
|
+
import { GitWorkflow } from '@assistkick/shared/lib/git_workflow.js';
|
|
14
|
+
import { getDb } from '@assistkick/shared/lib/db.js';
|
|
15
|
+
import { getKanbanEntry, saveKanbanEntry } from '@assistkick/shared/lib/kanban.js';
|
|
16
|
+
import { getNode } from '@assistkick/shared/lib/graph.js';
|
|
17
|
+
import { WorkSummaryParser } from '@assistkick/shared/lib/work_summary_parser.js';
|
|
18
18
|
|
|
19
19
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
20
|
-
// Navigate from packages/backend/src/services/ up to product-system/
|
|
20
|
+
// Navigate from packages/backend/src/services/ up to assistkick-product-system/
|
|
21
21
|
const SKILL_ROOT = join(__dirname, '..', '..', '..', '..');
|
|
22
22
|
const SHARED_DIR = join(SKILL_ROOT, 'packages', 'shared');
|
|
23
23
|
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import { randomBytes, randomUUID } from 'node:crypto';
|
|
7
7
|
import { hash, compare } from 'bcryptjs';
|
|
8
8
|
import { eq } from 'drizzle-orm';
|
|
9
|
-
import { users, invitations } from '@
|
|
9
|
+
import { users, invitations } from '@assistkick/shared/db/schema.js';
|
|
10
10
|
import type { EmailService } from './email_service.js';
|
|
11
11
|
import type { AuthService } from './auth_service.js';
|
|
12
12
|
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import { randomBytes, randomUUID } from 'node:crypto';
|
|
7
7
|
import { hash, compare } from 'bcryptjs';
|
|
8
8
|
import { eq, and } from 'drizzle-orm';
|
|
9
|
-
import { users, passwordResetTokens } from '@
|
|
9
|
+
import { users, passwordResetTokens } from '@assistkick/shared/db/schema.js';
|
|
10
10
|
import type { EmailService } from './email_service.js';
|
|
11
11
|
import type { AuthService } from './auth_service.js';
|
|
12
12
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { eq, isNull } from 'drizzle-orm';
|
|
7
|
-
import { projects, nodes, edges, kanban, sessions } from '@
|
|
7
|
+
import { projects, nodes, edges, kanban, sessions } from '@assistkick/shared/db/schema.js';
|
|
8
8
|
import { randomBytes } from 'node:crypto';
|
|
9
9
|
|
|
10
10
|
interface ProjectServiceDeps {
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import { eq, ne } from 'drizzle-orm';
|
|
6
|
-
import { users, invitations, refreshTokens } from '@
|
|
6
|
+
import { users, invitations, refreshTokens } from '@assistkick/shared/db/schema.js';
|
|
7
7
|
|
|
8
8
|
interface UserManagementServiceDeps {
|
|
9
9
|
getDb: () => any;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { defineConfig, loadEnv } from 'vite';
|
|
2
|
+
import react from '@vitejs/plugin-react';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { dirname, resolve } from 'node:path';
|
|
5
|
+
|
|
6
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
|
|
8
|
+
export default defineConfig(({ mode }) => {
|
|
9
|
+
const envDir = resolve(__dirname, '..', '..');
|
|
10
|
+
const env = loadEnv(mode, envDir, '');
|
|
11
|
+
const frontendPort = parseInt(env.FRONTEND_PORT || '5173', 10);
|
|
12
|
+
const backendPort = parseInt(env.PORT || '3000', 10);
|
|
13
|
+
|
|
14
|
+
return {
|
|
15
|
+
plugins: [react()],
|
|
16
|
+
build: {
|
|
17
|
+
outDir: 'dist',
|
|
18
|
+
emptyOutDir: true,
|
|
19
|
+
},
|
|
20
|
+
server: {
|
|
21
|
+
port: frontendPort,
|
|
22
|
+
strictPort: true,
|
|
23
|
+
proxy: {
|
|
24
|
+
'/api': {
|
|
25
|
+
target: `http://localhost:${backendPort}`,
|
|
26
|
+
ws: true,
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
});
|
|
@@ -14,7 +14,7 @@ import { existsSync, mkdirSync } from 'node:fs';
|
|
|
14
14
|
import * as schema from '../db/schema.js';
|
|
15
15
|
|
|
16
16
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
17
|
-
// Walk up from packages/shared/lib/ (or build/lib/) to find product-system/
|
|
17
|
+
// Walk up from packages/shared/lib/ (or build/lib/) to find assistkick-product-system/
|
|
18
18
|
let PROJECT_ROOT = join(__dirname, '..');
|
|
19
19
|
while (PROJECT_ROOT !== dirname(PROJECT_ROOT)) {
|
|
20
20
|
if (existsSync(join(PROJECT_ROOT, 'pnpm-workspace.yaml'))) break;
|
package/templates/{product-system → assistkick-product-system}/packages/shared/lib/prompt_builder.ts
RENAMED
|
@@ -32,7 +32,7 @@ export class PromptBuilder {
|
|
|
32
32
|
prompt += `- Example: cd ${mainSkillDir} && node tools/get_node.ts ${featureId}${pidFlag}\n`;
|
|
33
33
|
prompt += `- Example: cd ${mainSkillDir} && node tools/move_card.ts ${featureId} in_review${pidFlag}\n`;
|
|
34
34
|
prompt += `\n`;
|
|
35
|
-
prompt += `NEVER run tools from the worktree directory. NEVER use relative paths like \`product-system/tools/\`.\n`;
|
|
35
|
+
prompt += `NEVER run tools from the worktree directory. NEVER use relative paths like \`assistkick-product-system/tools/\`.\n`;
|
|
36
36
|
prompt += `ALWAYS \`cd ${mainSkillDir}\` before running any tool command.\n`;
|
|
37
37
|
if (projectId) {
|
|
38
38
|
prompt += `ALWAYS include --project-id ${projectId} when running any tool command.\n`;
|
|
@@ -153,7 +153,7 @@ export class PromptBuilder {
|
|
|
153
153
|
prompt += `- Example: cd ${mainSkillDir} && node tools/get_node.ts ${featureId}${pidFlag}\n`;
|
|
154
154
|
prompt += `- Example: cd ${mainSkillDir} && node tools/move_card.ts ${featureId} qa${pidFlag}\n`;
|
|
155
155
|
prompt += `\n`;
|
|
156
|
-
prompt += `NEVER run tools from the worktree directory. NEVER use relative paths like \`product-system/tools/\`.\n`;
|
|
156
|
+
prompt += `NEVER run tools from the worktree directory. NEVER use relative paths like \`assistkick-product-system/tools/\`.\n`;
|
|
157
157
|
prompt += `ALWAYS \`cd ${mainSkillDir}\` before running any tool command.\n`;
|
|
158
158
|
if (projectId) {
|
|
159
159
|
prompt += `ALWAYS include --project-id ${projectId} when running any tool command.\n`;
|
package/templates/{product-system → assistkick-product-system}/tests/db_sqlite_fallback.test.ts
RENAMED
|
@@ -8,7 +8,7 @@ import { join } from 'node:path';
|
|
|
8
8
|
|
|
9
9
|
describe('Local SQLite URL format', () => {
|
|
10
10
|
it('builds a file: URL from a data directory path', () => {
|
|
11
|
-
const projectRoot = '/home/user/myproject/product-system';
|
|
11
|
+
const projectRoot = '/home/user/myproject/assistkick-product-system';
|
|
12
12
|
const dataDir = join(projectRoot, 'data');
|
|
13
13
|
const connectionUrl = `file:${join(dataDir, 'local.db')}`;
|
|
14
14
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: assistkick-bootstrap
|
|
3
3
|
description: Bootstrap the product knowledge graph for an existing project by scanning the codebase and interviewing the user. Use when the user wants to onboard a project, bootstrap the graph, initialize the product system, or bring the knowledge graph up to speed for an existing codebase.
|
|
4
4
|
---
|
|
5
5
|
|
|
@@ -12,7 +12,7 @@ Your goal is to rapidly build a well-connected specification graph by
|
|
|
12
12
|
priorities, and preferences**. You interact with the graph exclusively
|
|
13
13
|
through the tools below.
|
|
14
14
|
|
|
15
|
-
All tools live in `product-system/packages/shared/tools/` and
|
|
15
|
+
All tools live in `assistkick-product-system/packages/shared/tools/` and
|
|
16
16
|
are run with `npx tsx`.
|
|
17
17
|
|
|
18
18
|
## Bootstrap Philosophy
|
|
@@ -300,7 +300,7 @@ The `search_nodes --query` tool returns graph-aware relevance-ranked results.
|
|
|
300
300
|
4. Nodes should reflect reality (codebase + user statements), not inferences —
|
|
301
301
|
use `assumption` node type for inferences
|
|
302
302
|
5. If the user contradicts something in the graph, update it and add a note
|
|
303
|
-
6. All tool commands must be run from the `product-system/`
|
|
303
|
+
6. All tool commands must be run from the `assistkick-product-system/`
|
|
304
304
|
directory
|
|
305
305
|
7. Set status to `defined` for features clearly implemented in the codebase;
|
|
306
306
|
use `draft` for planned/future work
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: assistkick-code-reviewer
|
|
3
3
|
description: Review implemented features against their specification, coding standards, and test coverage. Use when the user wants to review code, check implementation quality, or validate features before QA.
|
|
4
4
|
---
|
|
5
5
|
|
|
@@ -11,7 +11,7 @@ in the feature spec has actually been implemented. You pick up features from
|
|
|
11
11
|
the `in_review` column, validate them, and either approve or reject with
|
|
12
12
|
actionable feedback.
|
|
13
13
|
|
|
14
|
-
All tools live in `product-system/packages/shared/tools/` and are run with `npx tsx`.
|
|
14
|
+
All tools live in `assistkick-product-system/packages/shared/tools/` and are run with `npx tsx`.
|
|
15
15
|
|
|
16
16
|
## Session Start Protocol
|
|
17
17
|
1. Call `get_kanban --column in_review` — identify features awaiting review
|
|
@@ -142,6 +142,6 @@ npx tsx packages/shared/tools/get_status.ts
|
|
|
142
142
|
4. Always provide actionable rejection notes — reference specific acceptance criteria, integration issues, or connected node requirements
|
|
143
143
|
5. Never read or write graph.tson, kanban.tson, or node .md files directly — always use the tools
|
|
144
144
|
6. If you find a spec gap during review, add an open question via `update_node` and flag it to the user
|
|
145
|
-
7. All tool commands must be run from the `product-system/` directory
|
|
145
|
+
7. All tool commands must be run from the `assistkick-product-system/` directory
|
|
146
146
|
8. Review one feature at a time — complete the verdict before moving to the next
|
|
147
147
|
9. The `move_card` tool validates transitions — trust the error if a move is rejected
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: assistkick-debugger
|
|
3
3
|
description: Debug and investigate bugs reported by the user, find root causes, and create bugfix features with findings. Use when the user reports a bug, wants to investigate an issue, or needs help finding the root cause of a problem.
|
|
4
4
|
---
|
|
5
5
|
|
|
@@ -12,7 +12,7 @@ the root cause, and create a bugfix feature in the graph with your findings so
|
|
|
12
12
|
the developer knows exactly what to fix. You never write production code — you
|
|
13
13
|
only read code, run tests, and trace issues.
|
|
14
14
|
|
|
15
|
-
All tools live in `product-system/packages/shared/tools/` and are run with `npx tsx`.
|
|
15
|
+
All tools live in `assistkick-product-system/packages/shared/tools/` and are run with `npx tsx`.
|
|
16
16
|
|
|
17
17
|
## Session Start Protocol
|
|
18
18
|
1. Call `get_status` — understand current project state
|
|
@@ -52,7 +52,7 @@ When static code reading isn't enough to identify the root cause, **add temporar
|
|
|
52
52
|
- Never leave debug logs in the codebase
|
|
53
53
|
|
|
54
54
|
### 5. Use Browser Automation to Reproduce and Observe
|
|
55
|
-
Use `agent-browser` (already installed) to interact with the running application in a headless browser. See `.claude/skills/
|
|
55
|
+
Use `agent-browser` (already installed) to interact with the running application in a headless browser. See `.claude/skills/assistkick-debugger/references/agent-browser.md` for the full command reference.
|
|
56
56
|
|
|
57
57
|
**Core workflow:**
|
|
58
58
|
```bash
|
|
@@ -198,9 +198,9 @@ npx tsx packages/shared/tools/get_status.ts
|
|
|
198
198
|
4. Always create a bugfix feature with detailed findings — the developer should be able to fix it without re-investigating
|
|
199
199
|
5. Include specific file paths, line numbers, root cause analysis, and fix guidance in your bugfix notes
|
|
200
200
|
6. Always link bugfix features to the affected feature(s) via `add_edge`
|
|
201
|
-
7. All tool commands must be run from the `product-system/` directory
|
|
201
|
+
7. All tool commands must be run from the `assistkick-product-system/` directory
|
|
202
202
|
8. The `move_card` tool validates transitions — trust the error if a move is rejected
|
|
203
203
|
9. If the bug reveals a spec gap, add an open question via `update_node` on the affected feature and flag it to the user
|
|
204
204
|
10. Investigate one bug at a time — complete the investigation before moving to the next
|
|
205
205
|
11. Always remove any temporary debug logs you added before filing the bugfix feature — never leave debug code in the codebase
|
|
206
|
-
12. Use `agent-browser` for browser-based investigation — see `.claude/skills/
|
|
206
|
+
12. Use `agent-browser` for browser-based investigation — see `.claude/skills/assistkick-debugger/references/agent-browser.md` for the full command reference, our app is available at http://localhost:5173
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: assistkick-developer
|
|
3
3
|
description: Implement features from the specification knowledge graph following project coding standards. Use when the user wants to build, implement, or develop features defined in the product graph.
|
|
4
4
|
---
|
|
5
5
|
|
|
@@ -11,7 +11,7 @@ Your goal is to pick up features from the kanban board, implement them following
|
|
|
11
11
|
the project's coding standards, and move them through the pipeline. You interact
|
|
12
12
|
with the project spec and kanban exclusively through the tools below.
|
|
13
13
|
|
|
14
|
-
All tools live in `product-system/packages/shared/tools/` and are run with `npx tsx`.
|
|
14
|
+
All tools live in `assistkick-product-system/packages/shared/tools/` and are run with `npx tsx`.
|
|
15
15
|
|
|
16
16
|
## Session Start Protocol
|
|
17
17
|
1. Call `get_status` — understand current project state
|
|
@@ -178,5 +178,5 @@ npx tsx packages/shared/tools/rebuild_index.ts --dry-run
|
|
|
178
178
|
6. Write tests for every feature — test logic and data transformations
|
|
179
179
|
7. If a spec is ambiguous, add an open question to the node and ask the user — do not guess
|
|
180
180
|
8. Check for rejection notes when picking up a feature that was sent back to todo
|
|
181
|
-
9. All tool commands must be run from the `product-system/` directory
|
|
181
|
+
9. All tool commands must be run from the `assistkick-product-system/` directory
|
|
182
182
|
10. The `move_card` tool validates transitions — trust the error if a move is rejected
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: assistkick-interview
|
|
3
3
|
description: Conduct a structured requirements interview to build a specification knowledge graph. Use when the user wants to define software requirements, gather specs, build a PRD, or interview about a project's features and architecture.
|
|
4
4
|
---
|
|
5
5
|
|
|
@@ -10,7 +10,7 @@ You are conducting a structured requirements interview. Your goal is to
|
|
|
10
10
|
progressively build a complete specification graph by asking the user-focused questions. You interact with the project exclusively through
|
|
11
11
|
the tools below.
|
|
12
12
|
|
|
13
|
-
All tools live in `product-system/packages/shared/tools/` and are run with `npx tsx`.
|
|
13
|
+
All tools live in `assistkick-product-system/packages/shared/tools/` and are run with `npx tsx`.
|
|
14
14
|
|
|
15
15
|
## Session Start Protocol
|
|
16
16
|
1. Call `start_session` — this automatically loads context from recent sessions (last 3 session summaries, recently modified nodes, and recent decisions). Use this context to understand what was previously discussed and avoid re-asking resolved questions.
|
|
@@ -216,5 +216,5 @@ own codebase that you have full access to.
|
|
|
216
216
|
3. Always record answers via resolve_question — don't just add a note
|
|
217
217
|
4. Nodes you create should reflect what the user actually said, not your inferences — use assumption node type for inferences
|
|
218
218
|
5. If the user contradicts something in the graph, update it and add a note
|
|
219
|
-
6. All tool commands must be run from the `product-system/` directory
|
|
219
|
+
6. All tool commands must be run from the `assistkick-product-system/` directory
|
|
220
220
|
7. Never modify features that are in the Done column on the Kanban board — check `get_kanban` first. If a Done feature needs changes, create a new feature that `depends_on` the original and place it in Todo
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { defineConfig } from 'vite';
|
|
2
|
-
import react from '@vitejs/plugin-react';
|
|
3
|
-
|
|
4
|
-
export default defineConfig({
|
|
5
|
-
plugins: [react()],
|
|
6
|
-
build: {
|
|
7
|
-
outDir: 'dist',
|
|
8
|
-
emptyOutDir: true,
|
|
9
|
-
},
|
|
10
|
-
server: {
|
|
11
|
-
port: 5173,
|
|
12
|
-
strictPort: true,
|
|
13
|
-
proxy: {
|
|
14
|
-
'/api': {
|
|
15
|
-
target: 'http://localhost:3000',
|
|
16
|
-
ws: true,
|
|
17
|
-
},
|
|
18
|
-
},
|
|
19
|
-
},
|
|
20
|
-
});
|