@assistkick/create 1.0.1 → 1.3.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 +3 -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/assistkick-product-system/packages/backend/src/routes/git.ts +231 -0
- 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 +6 -6
- package/templates/assistkick-product-system/packages/backend/src/routes/pipeline.ts +88 -0
- package/templates/assistkick-product-system/packages/backend/src/routes/terminal.ts +82 -0
- package/templates/{product-system → assistkick-product-system}/packages/backend/src/server.ts +23 -10
- package/templates/{product-system → assistkick-product-system}/packages/backend/src/services/coherence-review.ts +4 -4
- package/templates/assistkick-product-system/packages/backend/src/services/github_app_service.ts +146 -0
- package/templates/assistkick-product-system/packages/backend/src/services/init.ts +147 -0
- 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 +72 -1
- package/templates/assistkick-product-system/packages/backend/src/services/project_workspace_service.test.ts +87 -0
- package/templates/assistkick-product-system/packages/backend/src/services/project_workspace_service.ts +194 -0
- package/templates/assistkick-product-system/packages/backend/src/services/pty_session_manager.test.ts +159 -0
- package/templates/{product-system → assistkick-product-system}/packages/backend/src/services/pty_session_manager.ts +114 -39
- package/templates/{product-system → assistkick-product-system}/packages/backend/src/services/terminal_ws_handler.ts +28 -14
- 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/{product-system → assistkick-product-system}/packages/frontend/src/App.tsx +1 -1
- package/templates/{product-system → assistkick-product-system}/packages/frontend/src/api/client.ts +151 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/GitRepoModal.tsx +352 -0
- package/templates/{product-system → assistkick-product-system}/packages/frontend/src/components/KanbanView.tsx +208 -95
- package/templates/{product-system → assistkick-product-system}/packages/frontend/src/components/ProjectSelector.tsx +17 -1
- package/templates/assistkick-product-system/packages/frontend/src/components/TerminalView.tsx +333 -0
- package/templates/{product-system → assistkick-product-system}/packages/frontend/src/components/Toolbar.tsx +15 -13
- package/templates/{product-system → assistkick-product-system}/packages/frontend/src/constants/graph.ts +1 -0
- package/templates/{product-system → assistkick-product-system}/packages/frontend/src/hooks/useProjects.ts +4 -0
- package/templates/{product-system → assistkick-product-system}/packages/frontend/src/routes/dashboard.tsx +22 -4
- package/templates/{product-system → assistkick-product-system}/packages/frontend/src/styles/index.css +486 -38
- package/templates/assistkick-product-system/packages/frontend/vite.config.ts +31 -0
- package/templates/assistkick-product-system/packages/shared/db/migrations/0001_vengeful_wallop.sql +1 -0
- package/templates/assistkick-product-system/packages/shared/db/migrations/0002_greedy_excalibur.sql +4 -0
- package/templates/assistkick-product-system/packages/shared/db/migrations/meta/0001_snapshot.json +826 -0
- package/templates/assistkick-product-system/packages/shared/db/migrations/meta/0002_snapshot.json +854 -0
- package/templates/assistkick-product-system/packages/shared/db/migrations/meta/_journal.json +27 -0
- package/templates/{product-system → assistkick-product-system}/packages/shared/db/schema.ts +5 -0
- package/templates/{product-system → assistkick-product-system}/packages/shared/lib/claude-service.ts +54 -1
- package/templates/{product-system → assistkick-product-system}/packages/shared/lib/db.ts +1 -1
- package/templates/{product-system → assistkick-product-system}/packages/shared/lib/git_workflow.ts +25 -0
- package/templates/{product-system → assistkick-product-system}/packages/shared/lib/pipeline-state-store.ts +4 -0
- package/templates/{product-system → assistkick-product-system}/packages/shared/lib/pipeline.ts +329 -89
- package/templates/assistkick-product-system/packages/shared/lib/pipeline_orchestrator.ts +186 -0
- 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/assistkick-product-system/packages/shared/tools/db_explorer.ts +275 -0
- package/templates/{product-system → assistkick-product-system}/packages/shared/tools/get_kanban.ts +2 -1
- package/templates/{product-system → assistkick-product-system}/packages/shared/tools/move_card.ts +3 -2
- package/templates/{product-system → assistkick-product-system}/packages/shared/tools/update_node.ts +2 -2
- package/templates/{product-system → assistkick-product-system}/tests/db_sqlite_fallback.test.ts +1 -1
- package/templates/{product-system → assistkick-product-system}/tests/kanban.test.ts +1 -1
- package/templates/{product-system → assistkick-product-system}/tests/pipeline_stats_all_cards.test.ts +1 -1
- package/templates/{product-system → assistkick-product-system}/tests/web_terminal.test.ts +189 -150
- package/templates/skills/{product-bootstrap → assistkick-bootstrap}/SKILL.md +36 -28
- package/templates/skills/{product-code-reviewer → assistkick-code-reviewer}/SKILL.md +26 -18
- package/templates/skills/assistkick-db-explorer/SKILL.md +86 -0
- package/templates/skills/{product-debugger → assistkick-debugger}/SKILL.md +35 -27
- package/templates/skills/{product-developer → assistkick-developer}/SKILL.md +40 -32
- package/templates/skills/{product-interview → assistkick-interview}/SKILL.md +37 -29
- package/templates/product-system/packages/backend/src/routes/pipeline.ts +0 -41
- package/templates/product-system/packages/backend/src/services/init.ts +0 -80
- package/templates/product-system/packages/backend/src/services/pty_session_manager.test.ts +0 -88
- package/templates/product-system/packages/frontend/src/components/TerminalView.tsx +0 -200
- package/templates/product-system/packages/frontend/vite.config.ts +0 -20
- package/templates/product-system/packages/shared/db/migrations/meta/_journal.json +0 -13
- /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/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/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/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/LoginPage.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/UsersView.tsx +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/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/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/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/drizzle.config.js +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/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/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_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/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/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/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/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/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
|
@@ -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
|
|
@@ -72,18 +72,26 @@ Features may be sent back to `todo` with rejection notes:
|
|
|
72
72
|
### Browser Support
|
|
73
73
|
- Latest Chrome and Firefox
|
|
74
74
|
|
|
75
|
+
## Project ID
|
|
76
|
+
|
|
77
|
+
All tools require `--project-id <project_id>`. Resolve it at session start:
|
|
78
|
+
- If the user passed a project ID in the invocation arguments → use it directly
|
|
79
|
+
- Otherwise → ask the user: "Which project ID should I use?"
|
|
80
|
+
|
|
81
|
+
Use the same `<project_id>` on **every** tool call in this session.
|
|
82
|
+
|
|
75
83
|
## Tool Reference
|
|
76
84
|
|
|
77
85
|
### get_kanban
|
|
78
86
|
```
|
|
79
|
-
npx tsx packages/shared/tools/get_kanban.ts # show all columns
|
|
80
|
-
npx tsx packages/shared/tools/get_kanban.ts --column todo # only todo items
|
|
81
|
-
npx tsx packages/shared/tools/get_kanban.ts --column qa # only qa items
|
|
87
|
+
npx tsx packages/shared/tools/get_kanban.ts --project-id <project_id> # show all columns
|
|
88
|
+
npx tsx packages/shared/tools/get_kanban.ts --project-id <project_id> --column todo # only todo items
|
|
89
|
+
npx tsx packages/shared/tools/get_kanban.ts --project-id <project_id> --column qa # only qa items
|
|
82
90
|
```
|
|
83
91
|
|
|
84
92
|
### move_card
|
|
85
93
|
```
|
|
86
|
-
npx tsx packages/shared/tools/move_card.ts <feature_id> <target_column>
|
|
94
|
+
npx tsx packages/shared/tools/move_card.ts <feature_id> <target_column> --project-id <project_id>
|
|
87
95
|
```
|
|
88
96
|
Your allowed transitions:
|
|
89
97
|
- `todo` → `in_progress`
|
|
@@ -91,32 +99,32 @@ Your allowed transitions:
|
|
|
91
99
|
|
|
92
100
|
### start_session
|
|
93
101
|
```
|
|
94
|
-
npx tsx packages/shared/tools/start_session.ts
|
|
102
|
+
npx tsx packages/shared/tools/start_session.ts --project-id <project_id>
|
|
95
103
|
```
|
|
96
104
|
|
|
97
105
|
### end_session
|
|
98
106
|
```
|
|
99
|
-
npx tsx packages/shared/tools/end_session.ts --summary "..." --nodes-touched "feat_001,dec_001" --questions-resolved 3
|
|
107
|
+
npx tsx packages/shared/tools/end_session.ts --project-id <project_id> --summary "..." --nodes-touched "feat_001,dec_001" --questions-resolved 3
|
|
100
108
|
```
|
|
101
109
|
|
|
102
110
|
### search_nodes
|
|
103
111
|
```
|
|
104
|
-
npx tsx packages/shared/tools/search_nodes.ts --query "keyword"
|
|
105
|
-
npx tsx packages/shared/tools/search_nodes.ts --type feature
|
|
106
|
-
npx tsx packages/shared/tools/search_nodes.ts --has-open-questions
|
|
107
|
-
npx tsx packages/shared/tools/search_nodes.ts --completeness-below 0.5
|
|
112
|
+
npx tsx packages/shared/tools/search_nodes.ts --project-id <project_id> --query "keyword"
|
|
113
|
+
npx tsx packages/shared/tools/search_nodes.ts --project-id <project_id> --type feature
|
|
114
|
+
npx tsx packages/shared/tools/search_nodes.ts --project-id <project_id> --has-open-questions
|
|
115
|
+
npx tsx packages/shared/tools/search_nodes.ts --project-id <project_id> --completeness-below 0.5
|
|
108
116
|
```
|
|
109
117
|
|
|
110
118
|
### get_node
|
|
111
119
|
```
|
|
112
|
-
npx tsx packages/shared/tools/get_node.ts <node_id>
|
|
113
|
-
npx tsx packages/shared/tools/get_node.ts --name "Node Name"
|
|
120
|
+
npx tsx packages/shared/tools/get_node.ts <node_id> --project-id <project_id>
|
|
121
|
+
npx tsx packages/shared/tools/get_node.ts --name "Node Name" --project-id <project_id>
|
|
114
122
|
```
|
|
115
123
|
Returns full .md content plus a Relations section listing all connected nodes with direction, relation type, name, type, and status.
|
|
116
124
|
|
|
117
125
|
### add_node
|
|
118
126
|
```
|
|
119
|
-
npx tsx packages/shared/tools/add_node.ts --type <type> --name "Name" --description "..."
|
|
127
|
+
npx tsx packages/shared/tools/add_node.ts --project-id <project_id> --type <type> --name "Name" --description "..."
|
|
120
128
|
```
|
|
121
129
|
Valid types: feature, component, data_entity, decision, tech_choice,
|
|
122
130
|
non_functional_requirement, design_token, design_pattern, user_role,
|
|
@@ -124,23 +132,23 @@ flow, assumption, open_question
|
|
|
124
132
|
|
|
125
133
|
### update_node
|
|
126
134
|
```
|
|
127
|
-
npx tsx packages/shared/tools/update_node.ts <id> --add-acceptance-criteria "..."
|
|
128
|
-
npx tsx packages/shared/tools/update_node.ts <id> --add-open-question "..."
|
|
129
|
-
npx tsx packages/shared/tools/update_node.ts <id> --add-note "Session N: ..."
|
|
130
|
-
npx tsx packages/shared/tools/update_node.ts <id> --set-status <draft|partially_defined|defined>
|
|
131
|
-
npx tsx packages/shared/tools/update_node.ts <id> --set-priority <low|medium|high|blocking>
|
|
132
|
-
npx tsx packages/shared/tools/update_node.ts <id> --set-description "..."
|
|
133
|
-
npx tsx packages/shared/tools/update_node.ts <id> --set-section "SectionName=content"
|
|
135
|
+
npx tsx packages/shared/tools/update_node.ts <id> --project-id <project_id> --add-acceptance-criteria "..."
|
|
136
|
+
npx tsx packages/shared/tools/update_node.ts <id> --project-id <project_id> --add-open-question "..."
|
|
137
|
+
npx tsx packages/shared/tools/update_node.ts <id> --project-id <project_id> --add-note "Session N: ..."
|
|
138
|
+
npx tsx packages/shared/tools/update_node.ts <id> --project-id <project_id> --set-status <draft|partially_defined|defined>
|
|
139
|
+
npx tsx packages/shared/tools/update_node.ts <id> --project-id <project_id> --set-priority <low|medium|high|blocking>
|
|
140
|
+
npx tsx packages/shared/tools/update_node.ts <id> --project-id <project_id> --set-description "..."
|
|
141
|
+
npx tsx packages/shared/tools/update_node.ts <id> --project-id <project_id> --set-section "SectionName=content"
|
|
134
142
|
```
|
|
135
143
|
|
|
136
144
|
### resolve_question
|
|
137
145
|
```
|
|
138
|
-
npx tsx packages/shared/tools/resolve_question.ts <id> --question "..." --answer "..."
|
|
146
|
+
npx tsx packages/shared/tools/resolve_question.ts <id> --project-id <project_id> --question "..." --answer "..."
|
|
139
147
|
```
|
|
140
148
|
|
|
141
149
|
### add_edge
|
|
142
150
|
```
|
|
143
|
-
npx tsx packages/shared/tools/add_edge.ts <from_id> <relation> <to_id>
|
|
151
|
+
npx tsx packages/shared/tools/add_edge.ts <from_id> <relation> <to_id> --project-id <project_id>
|
|
144
152
|
```
|
|
145
153
|
Valid relations: contains, depends_on, governed_by, constrained_by,
|
|
146
154
|
implemented_with, reads_writes, exposes, consumes, performed_by,
|
|
@@ -148,25 +156,25 @@ escalates_to, relates_to
|
|
|
148
156
|
|
|
149
157
|
### remove_edge
|
|
150
158
|
```
|
|
151
|
-
npx tsx packages/shared/tools/remove_edge.ts <from_id> <relation> <to_id>
|
|
159
|
+
npx tsx packages/shared/tools/remove_edge.ts <from_id> <relation> <to_id> --project-id <project_id>
|
|
152
160
|
```
|
|
153
161
|
|
|
154
162
|
### get_gaps
|
|
155
163
|
```
|
|
156
|
-
npx tsx packages/shared/tools/get_gaps.ts
|
|
157
|
-
npx tsx packages/shared/tools/get_gaps.ts --blocking-only
|
|
158
|
-
npx tsx packages/shared/tools/get_gaps.ts --type feature
|
|
164
|
+
npx tsx packages/shared/tools/get_gaps.ts --project-id <project_id>
|
|
165
|
+
npx tsx packages/shared/tools/get_gaps.ts --project-id <project_id> --blocking-only
|
|
166
|
+
npx tsx packages/shared/tools/get_gaps.ts --project-id <project_id> --type feature
|
|
159
167
|
```
|
|
160
168
|
|
|
161
169
|
### get_status
|
|
162
170
|
```
|
|
163
|
-
npx tsx packages/shared/tools/get_status.ts
|
|
171
|
+
npx tsx packages/shared/tools/get_status.ts --project-id <project_id>
|
|
164
172
|
```
|
|
165
173
|
|
|
166
174
|
### rebuild_index
|
|
167
175
|
```
|
|
168
|
-
npx tsx packages/shared/tools/rebuild_index.ts
|
|
169
|
-
npx tsx packages/shared/tools/rebuild_index.ts --dry-run
|
|
176
|
+
npx tsx packages/shared/tools/rebuild_index.ts --project-id <project_id>
|
|
177
|
+
npx tsx packages/shared/tools/rebuild_index.ts --project-id <project_id> --dry-run
|
|
170
178
|
```
|
|
171
179
|
|
|
172
180
|
## Rules
|
|
@@ -178,5 +186,5 @@ npx tsx packages/shared/tools/rebuild_index.ts --dry-run
|
|
|
178
186
|
6. Write tests for every feature — test logic and data transformations
|
|
179
187
|
7. If a spec is ambiguous, add an open question to the node and ask the user — do not guess
|
|
180
188
|
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
|
|
189
|
+
9. All tool commands must be run from the `assistkick-product-system/` directory
|
|
182
190
|
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.
|
|
@@ -61,36 +61,44 @@ either the user has no more topics, or you've processed all their answers.
|
|
|
61
61
|
3. Call `end_session` with summary
|
|
62
62
|
4. Summarize what was covered this session in 3-5 sentences
|
|
63
63
|
|
|
64
|
+
## Project ID
|
|
65
|
+
|
|
66
|
+
All tools require `--project-id <project_id>`. Resolve it at session start:
|
|
67
|
+
- If the user passed a project ID in the invocation arguments → use it directly
|
|
68
|
+
- Otherwise → ask the user: "Which project ID should I use?"
|
|
69
|
+
|
|
70
|
+
Use the same `<project_id>` on **every** tool call in this session.
|
|
71
|
+
|
|
64
72
|
## Tool Reference
|
|
65
73
|
|
|
66
74
|
### start_session
|
|
67
75
|
```
|
|
68
|
-
npx tsx packages/shared/tools/start_session.ts
|
|
76
|
+
npx tsx packages/shared/tools/start_session.ts --project-id <project_id>
|
|
69
77
|
```
|
|
70
78
|
|
|
71
79
|
### end_session
|
|
72
80
|
```
|
|
73
|
-
npx tsx packages/shared/tools/end_session.ts --summary "..." --nodes-touched "feat_001,dec_001" --questions-resolved 3
|
|
81
|
+
npx tsx packages/shared/tools/end_session.ts --project-id <project_id> --summary "..." --nodes-touched "feat_001,dec_001" --questions-resolved 3
|
|
74
82
|
```
|
|
75
83
|
|
|
76
84
|
### search_nodes
|
|
77
85
|
```
|
|
78
|
-
npx tsx packages/shared/tools/search_nodes.ts --query "keyword"
|
|
79
|
-
npx tsx packages/shared/tools/search_nodes.ts --type feature
|
|
80
|
-
npx tsx packages/shared/tools/search_nodes.ts --has-open-questions
|
|
81
|
-
npx tsx packages/shared/tools/search_nodes.ts --completeness-below 0.5
|
|
86
|
+
npx tsx packages/shared/tools/search_nodes.ts --project-id <project_id> --query "keyword"
|
|
87
|
+
npx tsx packages/shared/tools/search_nodes.ts --project-id <project_id> --type feature
|
|
88
|
+
npx tsx packages/shared/tools/search_nodes.ts --project-id <project_id> --has-open-questions
|
|
89
|
+
npx tsx packages/shared/tools/search_nodes.ts --project-id <project_id> --completeness-below 0.5
|
|
82
90
|
```
|
|
83
91
|
|
|
84
92
|
### get_node
|
|
85
93
|
```
|
|
86
|
-
npx tsx packages/shared/tools/get_node.ts <node_id>
|
|
87
|
-
npx tsx packages/shared/tools/get_node.ts --name "Node Name"
|
|
94
|
+
npx tsx packages/shared/tools/get_node.ts <node_id> --project-id <project_id>
|
|
95
|
+
npx tsx packages/shared/tools/get_node.ts --name "Node Name" --project-id <project_id>
|
|
88
96
|
```
|
|
89
97
|
Returns full .md content plus a Relations section listing all connected nodes with direction, relation type, name, type, and status.
|
|
90
98
|
|
|
91
99
|
### add_node
|
|
92
100
|
```
|
|
93
|
-
npx tsx packages/shared/tools/add_node.ts --type <type> --name "Name" --description "..."
|
|
101
|
+
npx tsx packages/shared/tools/add_node.ts --project-id <project_id> --type <type> --name "Name" --description "..."
|
|
94
102
|
```
|
|
95
103
|
Valid types: feature, component, data_entity, decision, tech_choice,
|
|
96
104
|
non_functional_requirement, design_token, design_pattern, user_role,
|
|
@@ -98,23 +106,23 @@ flow, assumption, open_question
|
|
|
98
106
|
|
|
99
107
|
### update_node
|
|
100
108
|
```
|
|
101
|
-
npx tsx packages/shared/tools/update_node.ts <id> --add-acceptance-criteria "..."
|
|
102
|
-
npx tsx packages/shared/tools/update_node.ts <id> --add-open-question "..."
|
|
103
|
-
npx tsx packages/shared/tools/update_node.ts <id> --add-note "Session N: ..."
|
|
104
|
-
npx tsx packages/shared/tools/update_node.ts <id> --set-status <draft|partially_defined|defined>
|
|
105
|
-
npx tsx packages/shared/tools/update_node.ts <id> --set-priority <low|medium|high|blocking>
|
|
106
|
-
npx tsx packages/shared/tools/update_node.ts <id> --set-description "..."
|
|
107
|
-
npx tsx packages/shared/tools/update_node.ts <id> --set-section "SectionName=content"
|
|
109
|
+
npx tsx packages/shared/tools/update_node.ts <id> --project-id <project_id> --add-acceptance-criteria "..."
|
|
110
|
+
npx tsx packages/shared/tools/update_node.ts <id> --project-id <project_id> --add-open-question "..."
|
|
111
|
+
npx tsx packages/shared/tools/update_node.ts <id> --project-id <project_id> --add-note "Session N: ..."
|
|
112
|
+
npx tsx packages/shared/tools/update_node.ts <id> --project-id <project_id> --set-status <draft|partially_defined|defined>
|
|
113
|
+
npx tsx packages/shared/tools/update_node.ts <id> --project-id <project_id> --set-priority <low|medium|high|blocking>
|
|
114
|
+
npx tsx packages/shared/tools/update_node.ts <id> --project-id <project_id> --set-description "..."
|
|
115
|
+
npx tsx packages/shared/tools/update_node.ts <id> --project-id <project_id> --set-section "SectionName=content"
|
|
108
116
|
```
|
|
109
117
|
|
|
110
118
|
### resolve_question
|
|
111
119
|
```
|
|
112
|
-
npx tsx packages/shared/tools/resolve_question.ts <id> --question "..." --answer "..."
|
|
120
|
+
npx tsx packages/shared/tools/resolve_question.ts <id> --project-id <project_id> --question "..." --answer "..."
|
|
113
121
|
```
|
|
114
122
|
|
|
115
123
|
### add_edge
|
|
116
124
|
```
|
|
117
|
-
npx tsx packages/shared/tools/add_edge.ts <from_id> <relation> <to_id>
|
|
125
|
+
npx tsx packages/shared/tools/add_edge.ts <from_id> <relation> <to_id> --project-id <project_id>
|
|
118
126
|
```
|
|
119
127
|
Valid relations: contains, depends_on, governed_by, constrained_by,
|
|
120
128
|
implemented_with, reads_writes, exposes, consumes, performed_by,
|
|
@@ -122,25 +130,25 @@ escalates_to, relates_to
|
|
|
122
130
|
|
|
123
131
|
### remove_edge
|
|
124
132
|
```
|
|
125
|
-
npx tsx packages/shared/tools/remove_edge.ts <from_id> <relation> <to_id>
|
|
133
|
+
npx tsx packages/shared/tools/remove_edge.ts <from_id> <relation> <to_id> --project-id <project_id>
|
|
126
134
|
```
|
|
127
135
|
|
|
128
136
|
### get_gaps
|
|
129
137
|
```
|
|
130
|
-
npx tsx packages/shared/tools/get_gaps.ts
|
|
131
|
-
npx tsx packages/shared/tools/get_gaps.ts --blocking-only
|
|
132
|
-
npx tsx packages/shared/tools/get_gaps.ts --type feature
|
|
138
|
+
npx tsx packages/shared/tools/get_gaps.ts --project-id <project_id>
|
|
139
|
+
npx tsx packages/shared/tools/get_gaps.ts --project-id <project_id> --blocking-only
|
|
140
|
+
npx tsx packages/shared/tools/get_gaps.ts --project-id <project_id> --type feature
|
|
133
141
|
```
|
|
134
142
|
|
|
135
143
|
### get_status
|
|
136
144
|
```
|
|
137
|
-
npx tsx packages/shared/tools/get_status.ts
|
|
145
|
+
npx tsx packages/shared/tools/get_status.ts --project-id <project_id>
|
|
138
146
|
```
|
|
139
147
|
|
|
140
148
|
### rebuild_index
|
|
141
149
|
```
|
|
142
|
-
npx tsx packages/shared/tools/rebuild_index.ts
|
|
143
|
-
npx tsx packages/shared/tools/rebuild_index.ts --dry-run
|
|
150
|
+
npx tsx packages/shared/tools/rebuild_index.ts --project-id <project_id>
|
|
151
|
+
npx tsx packages/shared/tools/rebuild_index.ts --project-id <project_id> --dry-run
|
|
144
152
|
```
|
|
145
153
|
|
|
146
154
|
## Search Strategy
|
|
@@ -216,5 +224,5 @@ own codebase that you have full access to.
|
|
|
216
224
|
3. Always record answers via resolve_question — don't just add a note
|
|
217
225
|
4. Nodes you create should reflect what the user actually said, not your inferences — use assumption node type for inferences
|
|
218
226
|
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
|
|
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
|
|
227
|
+
6. All tool commands must be run from the `assistkick-product-system/` directory
|
|
228
|
+
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 Backlog
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Pipeline API routes — start/status/unblock dev pipeline.
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { Router } from 'express';
|
|
6
|
-
import { log, pipeline } from '../services/init.js';
|
|
7
|
-
|
|
8
|
-
const router: Router = Router();
|
|
9
|
-
|
|
10
|
-
// POST /api/kanban/:id/develop
|
|
11
|
-
router.post('/:id/develop', async (req, res) => {
|
|
12
|
-
const featureId = req.params.id;
|
|
13
|
-
try {
|
|
14
|
-
const result = await pipeline.start(featureId);
|
|
15
|
-
res.status(result.status).json(result.error ? { error: result.error } : { started: result.started, feature_id: result.feature_id });
|
|
16
|
-
} catch (err: any) {
|
|
17
|
-
log('DEVELOP', `UNEXPECTED ERROR: ${err.message}`);
|
|
18
|
-
res.status(500).json({ error: err.message });
|
|
19
|
-
}
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
// GET /api/kanban/:id/pipeline
|
|
23
|
-
router.get('/:id/pipeline', async (req, res) => {
|
|
24
|
-
const featureId = req.params.id;
|
|
25
|
-
const result = await pipeline.getStatus(featureId);
|
|
26
|
-
res.json(result);
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
// POST /api/kanban/:id/unblock
|
|
30
|
-
router.post('/:id/unblock', async (req, res) => {
|
|
31
|
-
const featureId = req.params.id;
|
|
32
|
-
try {
|
|
33
|
-
const result = await pipeline.unblock(featureId);
|
|
34
|
-
res.status(result.status).json(result.error ? { error: result.error } : { unblocked: result.unblocked, feature_id: result.feature_id });
|
|
35
|
-
} catch (err: any) {
|
|
36
|
-
log('UNBLOCK', `ERROR: ${err.message}`);
|
|
37
|
-
res.status(500).json({ error: err.message });
|
|
38
|
-
}
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
export default router;
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Service initialization — creates pipeline, claude service, and related instances.
|
|
3
|
-
* Deferred until VERBOSE flag is set at startup.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { join, dirname } from 'node:path';
|
|
7
|
-
import { fileURLToPath } from 'node:url';
|
|
8
|
-
import { existsSync } from 'node:fs';
|
|
9
|
-
import { createClaudeService } from '@interview-system/shared/lib/claude-service.js';
|
|
10
|
-
import { Pipeline } from '@interview-system/shared/lib/pipeline.js';
|
|
11
|
-
import { PipelineStateStore } from '@interview-system/shared/lib/pipeline-state-store.js';
|
|
12
|
-
import { PromptBuilder } from '@interview-system/shared/lib/prompt_builder.js';
|
|
13
|
-
import { GitWorkflow } from '@interview-system/shared/lib/git_workflow.js';
|
|
14
|
-
import { getDb } from '@interview-system/shared/lib/db.js';
|
|
15
|
-
import { getKanbanEntry, saveKanbanEntry } from '@interview-system/shared/lib/kanban.js';
|
|
16
|
-
import { getNode } from '@interview-system/shared/lib/graph.js';
|
|
17
|
-
import { WorkSummaryParser } from '@interview-system/shared/lib/work_summary_parser.js';
|
|
18
|
-
|
|
19
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
20
|
-
// Navigate from packages/backend/src/services/ up to product-system/
|
|
21
|
-
const SKILL_ROOT = join(__dirname, '..', '..', '..', '..');
|
|
22
|
-
const SHARED_DIR = join(SKILL_ROOT, 'packages', 'shared');
|
|
23
|
-
|
|
24
|
-
const IS_DEV = import.meta.url.endsWith('.ts');
|
|
25
|
-
const TOOL_EXT = IS_DEV ? '.ts' : '.js';
|
|
26
|
-
const TOOL_RUNNER = IS_DEV ? 'tsx' : 'node';
|
|
27
|
-
const TOOLS_DIR = IS_DEV ? join(SHARED_DIR, 'tools') : join(__dirname, '..', '..', '..', 'shared', 'build', 'tools');
|
|
28
|
-
const DATA_DIR = SHARED_DIR;
|
|
29
|
-
const PROJECT_ROOT = join(SKILL_ROOT, '..');
|
|
30
|
-
const SKILLS_DIR = join(PROJECT_ROOT, '.claude', 'skills');
|
|
31
|
-
const WORKTREES_DIR = join(PROJECT_ROOT, '.worktrees');
|
|
32
|
-
const DEVELOPER_SKILL_PATH = join(SKILLS_DIR, 'product-developer', 'SKILL.md');
|
|
33
|
-
const REVIEWER_SKILL_PATH = join(SKILLS_DIR, 'product-code-reviewer', 'SKILL.md');
|
|
34
|
-
const DEBUGGER_SKILL_PATH = join(SKILLS_DIR, 'product-debugger', 'SKILL.md');
|
|
35
|
-
|
|
36
|
-
export const log = (tag: string, ...args: any[]) => {
|
|
37
|
-
const ts = new Date().toISOString().slice(11, 23);
|
|
38
|
-
console.log(`[${ts}] [${tag}]`, ...args);
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
export let claudeService: any;
|
|
42
|
-
export let pipeline: any;
|
|
43
|
-
export let pipelineStateStore: any;
|
|
44
|
-
|
|
45
|
-
export const paths = {
|
|
46
|
-
projectRoot: PROJECT_ROOT,
|
|
47
|
-
worktreesDir: WORKTREES_DIR,
|
|
48
|
-
skillsDir: SKILLS_DIR,
|
|
49
|
-
toolsDir: TOOLS_DIR,
|
|
50
|
-
dataDir: DATA_DIR,
|
|
51
|
-
developerSkillPath: DEVELOPER_SKILL_PATH,
|
|
52
|
-
reviewerSkillPath: REVIEWER_SKILL_PATH,
|
|
53
|
-
debuggerSkillPath: DEBUGGER_SKILL_PATH,
|
|
54
|
-
toolExt: TOOL_EXT,
|
|
55
|
-
toolRunner: TOOL_RUNNER,
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
export const initServices = (verbose: boolean) => {
|
|
59
|
-
claudeService = createClaudeService({ verbose, log });
|
|
60
|
-
pipelineStateStore = new PipelineStateStore({ getDb });
|
|
61
|
-
const promptBuilder = new PromptBuilder({ paths, log });
|
|
62
|
-
const gitWorkflow = new GitWorkflow({ claudeService, projectRoot: PROJECT_ROOT, worktreesDir: WORKTREES_DIR, log });
|
|
63
|
-
const workSummaryParser = new WorkSummaryParser();
|
|
64
|
-
pipeline = new Pipeline({
|
|
65
|
-
promptBuilder,
|
|
66
|
-
gitWorkflow,
|
|
67
|
-
claudeService,
|
|
68
|
-
kanban: { getKanbanEntry, saveKanbanEntry },
|
|
69
|
-
paths,
|
|
70
|
-
log,
|
|
71
|
-
stateStore: pipelineStateStore,
|
|
72
|
-
workSummaryParser,
|
|
73
|
-
getNode,
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
// Mark any active pipeline states as interrupted (server restart recovery)
|
|
77
|
-
pipelineStateStore.markInterrupted().catch((err: any) => {
|
|
78
|
-
log('STARTUP', `Failed to mark interrupted pipelines: ${err.message}`);
|
|
79
|
-
});
|
|
80
|
-
};
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import { describe, it, mock, beforeEach } from 'node:test';
|
|
2
|
-
import assert from 'node:assert/strict';
|
|
3
|
-
import { PtySessionManager } from './pty_session_manager.ts';
|
|
4
|
-
|
|
5
|
-
const createMockPty = () => {
|
|
6
|
-
const listeners: Record<string, Function> = {};
|
|
7
|
-
return {
|
|
8
|
-
onData: mock.fn((cb: Function) => { listeners.data = cb; }),
|
|
9
|
-
onExit: mock.fn((cb: Function) => { listeners.exit = cb; }),
|
|
10
|
-
write: mock.fn(),
|
|
11
|
-
resize: mock.fn(),
|
|
12
|
-
kill: mock.fn(),
|
|
13
|
-
_emit: (event: string, data: unknown) => listeners[event]?.(data),
|
|
14
|
-
};
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
describe('PtySessionManager', () => {
|
|
18
|
-
let manager: PtySessionManager;
|
|
19
|
-
let spawnMock: ReturnType<typeof mock.fn>;
|
|
20
|
-
let logMock: ReturnType<typeof mock.fn>;
|
|
21
|
-
let mockPty: ReturnType<typeof createMockPty>;
|
|
22
|
-
const PROJECT_ROOT = '/test/project/root';
|
|
23
|
-
|
|
24
|
-
beforeEach(() => {
|
|
25
|
-
mockPty = createMockPty();
|
|
26
|
-
spawnMock = mock.fn(() => mockPty);
|
|
27
|
-
logMock = mock.fn();
|
|
28
|
-
manager = new PtySessionManager({ spawn: spawnMock as any, log: logMock, projectRoot: PROJECT_ROOT });
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
describe('spawnCommand uses projectRoot as cwd', () => {
|
|
32
|
-
it('passes projectRoot as cwd when spawning a command', () => {
|
|
33
|
-
manager.createSession('user1', 80, 24);
|
|
34
|
-
|
|
35
|
-
// Simulate typing "claude" + Enter
|
|
36
|
-
manager.writeToSession('user1', 'claude\r');
|
|
37
|
-
|
|
38
|
-
assert.equal(spawnMock.mock.calls.length, 1);
|
|
39
|
-
const spawnOptions = spawnMock.mock.calls[0].arguments[2] as Record<string, unknown>;
|
|
40
|
-
assert.equal(spawnOptions.cwd, PROJECT_ROOT);
|
|
41
|
-
});
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
describe('validateCommand', () => {
|
|
45
|
-
it('allows "claude" command', () => {
|
|
46
|
-
const result = manager.validateCommand('claude');
|
|
47
|
-
assert.equal(result.valid, true);
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
it('allows "claude" with arguments', () => {
|
|
51
|
-
const result = manager.validateCommand('claude --help');
|
|
52
|
-
assert.equal(result.valid, true);
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
it('rejects disallowed commands', () => {
|
|
56
|
-
const result = manager.validateCommand('rm -rf /');
|
|
57
|
-
assert.equal(result.valid, false);
|
|
58
|
-
assert.ok(result.error?.includes('not allowed'));
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
it('rejects empty command', () => {
|
|
62
|
-
const result = manager.validateCommand('');
|
|
63
|
-
assert.equal(result.valid, false);
|
|
64
|
-
});
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
describe('session lifecycle', () => {
|
|
68
|
-
it('creates a new session', () => {
|
|
69
|
-
const session = manager.createSession('user1', 80, 24);
|
|
70
|
-
assert.equal(session.userId, 'user1');
|
|
71
|
-
assert.equal(session.state, 'idle');
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
it('reuses existing session', () => {
|
|
75
|
-
const s1 = manager.createSession('user1', 80, 24);
|
|
76
|
-
const s2 = manager.createSession('user1', 80, 24);
|
|
77
|
-
assert.strictEqual(s1, s2);
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
it('destroys session and kills pty', () => {
|
|
81
|
-
manager.createSession('user1', 80, 24);
|
|
82
|
-
manager.writeToSession('user1', 'claude\r');
|
|
83
|
-
manager.destroySession('user1');
|
|
84
|
-
assert.equal(mockPty.kill.mock.calls.length, 1);
|
|
85
|
-
assert.equal(manager.getSession('user1'), undefined);
|
|
86
|
-
});
|
|
87
|
-
});
|
|
88
|
-
});
|