@qotaq/lalphgram 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Events/package.json +6 -0
- package/LICENSE +21 -0
- package/Main/package.json +6 -0
- package/README.md +1 -0
- package/dist/cjs/Events.js +55 -0
- package/dist/cjs/Events.js.map +1 -0
- package/dist/cjs/LalphMain.js +59 -0
- package/dist/cjs/LalphMain.js.map +1 -0
- package/dist/cjs/Main.js +115 -0
- package/dist/cjs/Main.js.map +1 -0
- package/dist/cjs/index.js +281 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/lib/AnalysisPrompts.js +61 -0
- package/dist/cjs/lib/AnalysisPrompts.js.map +1 -0
- package/dist/cjs/lib/BranchParser.js +45 -0
- package/dist/cjs/lib/BranchParser.js.map +1 -0
- package/dist/cjs/lib/MermaidToPlantUml.js +96 -0
- package/dist/cjs/lib/MermaidToPlantUml.js.map +1 -0
- package/dist/cjs/lib/SpecHtmlGenerator.js +160 -0
- package/dist/cjs/lib/SpecHtmlGenerator.js.map +1 -0
- package/dist/cjs/lib/StreamJsonParser.js +88 -0
- package/dist/cjs/lib/StreamJsonParser.js.map +1 -0
- package/dist/cjs/lib/TelegramFormatter.js +122 -0
- package/dist/cjs/lib/TelegramFormatter.js.map +1 -0
- package/dist/cjs/lib/TelegraphHtml.js +65 -0
- package/dist/cjs/lib/TelegraphHtml.js.map +1 -0
- package/dist/cjs/lib/TelegraphMarkdown.js +346 -0
- package/dist/cjs/lib/TelegraphMarkdown.js.map +1 -0
- package/dist/cjs/schemas/CredentialSchemas.js +31 -0
- package/dist/cjs/schemas/CredentialSchemas.js.map +1 -0
- package/dist/cjs/schemas/GitHubSchemas.js +60 -0
- package/dist/cjs/schemas/GitHubSchemas.js.map +1 -0
- package/dist/cjs/schemas/LinearSchemas.js +63 -0
- package/dist/cjs/schemas/LinearSchemas.js.map +1 -0
- package/dist/cjs/schemas/ProjectSchemas.js +26 -0
- package/dist/cjs/schemas/ProjectSchemas.js.map +1 -0
- package/dist/cjs/schemas/TrackerSchemas.js +35 -0
- package/dist/cjs/schemas/TrackerSchemas.js.map +1 -0
- package/dist/cjs/services/AppContext.js +57 -0
- package/dist/cjs/services/AppContext.js.map +1 -0
- package/dist/cjs/services/AppRuntimeConfig.js +35 -0
- package/dist/cjs/services/AppRuntimeConfig.js.map +1 -0
- package/dist/cjs/services/AutoMerge.js +140 -0
- package/dist/cjs/services/AutoMerge.js.map +1 -0
- package/dist/cjs/services/ChatMachine.js +873 -0
- package/dist/cjs/services/ChatMachine.js.map +1 -0
- package/dist/cjs/services/CommentTimer.js +81 -0
- package/dist/cjs/services/CommentTimer.js.map +1 -0
- package/dist/cjs/services/CredentialStore.js +68 -0
- package/dist/cjs/services/CredentialStore.js.map +1 -0
- package/dist/cjs/services/CredentialWatcher.js +76 -0
- package/dist/cjs/services/CredentialWatcher.js.map +1 -0
- package/dist/cjs/services/Credentials.js +130 -0
- package/dist/cjs/services/Credentials.js.map +1 -0
- package/dist/cjs/services/EventLoop.js +203 -0
- package/dist/cjs/services/EventLoop.js.map +1 -0
- package/dist/cjs/services/GitHubClient/GitHubClient.js +236 -0
- package/dist/cjs/services/GitHubClient/GitHubClient.js.map +1 -0
- package/dist/cjs/services/GitHubClient/OctokitClient.js +329 -0
- package/dist/cjs/services/GitHubClient/OctokitClient.js.map +1 -0
- package/dist/cjs/services/GitHubClient.js +236 -0
- package/dist/cjs/services/GitHubClient.js.map +1 -0
- package/dist/cjs/services/GitHubEventSource.js +145 -0
- package/dist/cjs/services/GitHubEventSource.js.map +1 -0
- package/dist/cjs/services/GitHubIssueTracker.js +118 -0
- package/dist/cjs/services/GitHubIssueTracker.js.map +1 -0
- package/dist/cjs/services/LalphConfig.js +139 -0
- package/dist/cjs/services/LalphConfig.js.map +1 -0
- package/dist/cjs/services/LalphConfigReader.js +82 -0
- package/dist/cjs/services/LalphConfigReader.js.map +1 -0
- package/dist/cjs/services/LalphDirectory.js +45 -0
- package/dist/cjs/services/LalphDirectory.js.map +1 -0
- package/dist/cjs/services/LinearSdkClient.js +149 -0
- package/dist/cjs/services/LinearSdkClient.js.map +1 -0
- package/dist/cjs/services/LinearTracker.js +89 -0
- package/dist/cjs/services/LinearTracker.js.map +1 -0
- package/dist/cjs/services/MessengerAdapter/MessengerAdapter.js +30 -0
- package/dist/cjs/services/MessengerAdapter/MessengerAdapter.js.map +1 -0
- package/dist/cjs/services/MessengerAdapter/TelegramAdapter.js +131 -0
- package/dist/cjs/services/MessengerAdapter/TelegramAdapter.js.map +1 -0
- package/dist/cjs/services/MessengerAdapter/TelegramConfig.js +81 -0
- package/dist/cjs/services/MessengerAdapter/TelegramConfig.js.map +1 -0
- package/dist/cjs/services/MessengerAdapter.js +30 -0
- package/dist/cjs/services/MessengerAdapter.js.map +1 -0
- package/dist/cjs/services/OctokitClient.js +350 -0
- package/dist/cjs/services/OctokitClient.js.map +1 -0
- package/dist/cjs/services/PlanOverviewUploader.js +119 -0
- package/dist/cjs/services/PlanOverviewUploader.js.map +1 -0
- package/dist/cjs/services/PlanOverviewUploaderMap.js +25 -0
- package/dist/cjs/services/PlanOverviewUploaderMap.js.map +1 -0
- package/dist/cjs/services/PlanSession.js +489 -0
- package/dist/cjs/services/PlanSession.js.map +1 -0
- package/dist/cjs/services/ProjectStore.js +107 -0
- package/dist/cjs/services/ProjectStore.js.map +1 -0
- package/dist/cjs/services/PullRequestTracker.js +186 -0
- package/dist/cjs/services/PullRequestTracker.js.map +1 -0
- package/dist/cjs/services/SpecUploader.js +111 -0
- package/dist/cjs/services/SpecUploader.js.map +1 -0
- package/dist/cjs/services/SpecUploaderMap.js +25 -0
- package/dist/cjs/services/SpecUploaderMap.js.map +1 -0
- package/dist/cjs/services/TaskEventSource.js +58 -0
- package/dist/cjs/services/TaskEventSource.js.map +1 -0
- package/dist/cjs/services/TaskTracker/GitHubIssueTracker.js +155 -0
- package/dist/cjs/services/TaskTracker/GitHubIssueTracker.js.map +1 -0
- package/dist/cjs/services/TaskTracker/LinearSdkClient.js +149 -0
- package/dist/cjs/services/TaskTracker/LinearSdkClient.js.map +1 -0
- package/dist/cjs/services/TaskTracker/LinearTracker.js +126 -0
- package/dist/cjs/services/TaskTracker/LinearTracker.js.map +1 -0
- package/dist/cjs/services/TaskTracker/TaskTracker.js +20 -0
- package/dist/cjs/services/TaskTracker/TaskTracker.js.map +1 -0
- package/dist/cjs/services/TaskTracker/TrackerLayerMap.js +27 -0
- package/dist/cjs/services/TaskTracker/TrackerLayerMap.js.map +1 -0
- package/dist/cjs/services/TaskTracker/buildEventStream.js +55 -0
- package/dist/cjs/services/TaskTracker/buildEventStream.js.map +1 -0
- package/dist/cjs/services/TaskTracker.js +20 -0
- package/dist/cjs/services/TaskTracker.js.map +1 -0
- package/dist/cjs/services/TelegramAdapter.js +125 -0
- package/dist/cjs/services/TelegramAdapter.js.map +1 -0
- package/dist/cjs/services/TelegramConfig.js +81 -0
- package/dist/cjs/services/TelegramConfig.js.map +1 -0
- package/dist/cjs/services/TelegramConfigStore.js +81 -0
- package/dist/cjs/services/TelegramConfigStore.js.map +1 -0
- package/dist/cjs/services/TelegramNotifier.js +50 -0
- package/dist/cjs/services/TelegramNotifier.js.map +1 -0
- package/dist/cjs/services/TrackerLayerMap.js +27 -0
- package/dist/cjs/services/TrackerLayerMap.js.map +1 -0
- package/dist/cjs/services/TrackerResolver.js +45 -0
- package/dist/cjs/services/TrackerResolver.js.map +1 -0
- package/dist/cjs/services/messenger/MessengerAdapter.js +30 -0
- package/dist/cjs/services/messenger/MessengerAdapter.js.map +1 -0
- package/dist/cjs/services/messenger/TelegramAdapter.js +125 -0
- package/dist/cjs/services/messenger/TelegramAdapter.js.map +1 -0
- package/dist/cjs/services/task-tracker/GitHubIssueTracker.js +157 -0
- package/dist/cjs/services/task-tracker/GitHubIssueTracker.js.map +1 -0
- package/dist/cjs/services/task-tracker/LinearTracker.js +127 -0
- package/dist/cjs/services/task-tracker/LinearTracker.js.map +1 -0
- package/dist/cjs/services/task-tracker/TaskTracker.js +20 -0
- package/dist/cjs/services/task-tracker/TaskTracker.js.map +1 -0
- package/dist/cjs/services/task-tracker/TrackerLayerMap.js +27 -0
- package/dist/cjs/services/task-tracker/TrackerLayerMap.js.map +1 -0
- package/dist/cjs/shim/bin.js +31 -0
- package/dist/cjs/shim/bin.js.map +1 -0
- package/dist/cjs/shim/main.js +217 -0
- package/dist/cjs/shim/main.js.map +1 -0
- package/dist/cjs/shim/parseArgs.js +45 -0
- package/dist/cjs/shim/parseArgs.js.map +1 -0
- package/dist/cjs/shim/schemas.js +35 -0
- package/dist/cjs/shim/schemas.js.map +1 -0
- package/dist/dts/Events.d.ts +108 -0
- package/dist/dts/Events.d.ts.map +1 -0
- package/dist/dts/LalphMain.d.ts +2 -0
- package/dist/dts/LalphMain.d.ts.map +1 -0
- package/dist/dts/Main.d.ts +2 -0
- package/dist/dts/Main.d.ts.map +1 -0
- package/dist/dts/index.d.ts +101 -0
- package/dist/dts/index.d.ts.map +1 -0
- package/dist/dts/lib/AnalysisPrompts.d.ts +12 -0
- package/dist/dts/lib/AnalysisPrompts.d.ts.map +1 -0
- package/dist/dts/lib/BranchParser.d.ts +40 -0
- package/dist/dts/lib/BranchParser.d.ts.map +1 -0
- package/dist/dts/lib/MermaidToPlantUml.d.ts +19 -0
- package/dist/dts/lib/MermaidToPlantUml.d.ts.map +1 -0
- package/dist/dts/lib/SpecHtmlGenerator.d.ts +18 -0
- package/dist/dts/lib/SpecHtmlGenerator.d.ts.map +1 -0
- package/dist/dts/lib/StreamJsonParser.d.ts +147 -0
- package/dist/dts/lib/StreamJsonParser.d.ts.map +1 -0
- package/dist/dts/lib/TelegramFormatter.d.ts +35 -0
- package/dist/dts/lib/TelegramFormatter.d.ts.map +1 -0
- package/dist/dts/lib/TelegraphHtml.d.ts +11 -0
- package/dist/dts/lib/TelegraphHtml.d.ts.map +1 -0
- package/dist/dts/lib/TelegraphMarkdown.d.ts +21 -0
- package/dist/dts/lib/TelegraphMarkdown.d.ts.map +1 -0
- package/dist/dts/schemas/CredentialSchemas.d.ts +41 -0
- package/dist/dts/schemas/CredentialSchemas.d.ts.map +1 -0
- package/dist/dts/schemas/GitHubSchemas.d.ts +130 -0
- package/dist/dts/schemas/GitHubSchemas.d.ts.map +1 -0
- package/dist/dts/schemas/LinearSchemas.d.ts +121 -0
- package/dist/dts/schemas/LinearSchemas.d.ts.map +1 -0
- package/dist/dts/schemas/ProjectSchemas.d.ts +40 -0
- package/dist/dts/schemas/ProjectSchemas.d.ts.map +1 -0
- package/dist/dts/schemas/TrackerSchemas.d.ts +57 -0
- package/dist/dts/schemas/TrackerSchemas.d.ts.map +1 -0
- package/dist/dts/services/AppContext.d.ts +40 -0
- package/dist/dts/services/AppContext.d.ts.map +1 -0
- package/dist/dts/services/AppRuntimeConfig.d.ts +51 -0
- package/dist/dts/services/AppRuntimeConfig.d.ts.map +1 -0
- package/dist/dts/services/AutoMerge.d.ts +42 -0
- package/dist/dts/services/AutoMerge.d.ts.map +1 -0
- package/dist/dts/services/ChatMachine.d.ts +478 -0
- package/dist/dts/services/ChatMachine.d.ts.map +1 -0
- package/dist/dts/services/CommentTimer.d.ts +44 -0
- package/dist/dts/services/CommentTimer.d.ts.map +1 -0
- package/dist/dts/services/CredentialStore.d.ts +43 -0
- package/dist/dts/services/CredentialStore.d.ts.map +1 -0
- package/dist/dts/services/CredentialWatcher.d.ts +41 -0
- package/dist/dts/services/CredentialWatcher.d.ts.map +1 -0
- package/dist/dts/services/Credentials.d.ts +44 -0
- package/dist/dts/services/Credentials.d.ts.map +1 -0
- package/dist/dts/services/EventLoop.d.ts +26 -0
- package/dist/dts/services/EventLoop.d.ts.map +1 -0
- package/dist/dts/services/GitHubClient/GitHubClient.d.ts +69 -0
- package/dist/dts/services/GitHubClient/GitHubClient.d.ts.map +1 -0
- package/dist/dts/services/GitHubClient/OctokitClient.d.ts +214 -0
- package/dist/dts/services/GitHubClient/OctokitClient.d.ts.map +1 -0
- package/dist/dts/services/GitHubClient.d.ts +69 -0
- package/dist/dts/services/GitHubClient.d.ts.map +1 -0
- package/dist/dts/services/GitHubEventSource.d.ts +43 -0
- package/dist/dts/services/GitHubEventSource.d.ts.map +1 -0
- package/dist/dts/services/GitHubIssueTracker.d.ts +9 -0
- package/dist/dts/services/GitHubIssueTracker.d.ts.map +1 -0
- package/dist/dts/services/LalphConfig.d.ts +44 -0
- package/dist/dts/services/LalphConfig.d.ts.map +1 -0
- package/dist/dts/services/LalphConfigReader.d.ts +66 -0
- package/dist/dts/services/LalphConfigReader.d.ts.map +1 -0
- package/dist/dts/services/LalphDirectory.d.ts +39 -0
- package/dist/dts/services/LalphDirectory.d.ts.map +1 -0
- package/dist/dts/services/LinearSdkClient.d.ts +71 -0
- package/dist/dts/services/LinearSdkClient.d.ts.map +1 -0
- package/dist/dts/services/LinearTracker.d.ts +9 -0
- package/dist/dts/services/LinearTracker.d.ts.map +1 -0
- package/dist/dts/services/MessengerAdapter/MessengerAdapter.d.ts +69 -0
- package/dist/dts/services/MessengerAdapter/MessengerAdapter.d.ts.map +1 -0
- package/dist/dts/services/MessengerAdapter/TelegramAdapter.d.ts +13 -0
- package/dist/dts/services/MessengerAdapter/TelegramAdapter.d.ts.map +1 -0
- package/dist/dts/services/MessengerAdapter/TelegramConfig.d.ts +58 -0
- package/dist/dts/services/MessengerAdapter/TelegramConfig.d.ts.map +1 -0
- package/dist/dts/services/MessengerAdapter.d.ts +69 -0
- package/dist/dts/services/MessengerAdapter.d.ts.map +1 -0
- package/dist/dts/services/OctokitClient.d.ts +232 -0
- package/dist/dts/services/OctokitClient.d.ts.map +1 -0
- package/dist/dts/services/PlanOverviewUploader.d.ts +55 -0
- package/dist/dts/services/PlanOverviewUploader.d.ts.map +1 -0
- package/dist/dts/services/PlanOverviewUploaderMap.d.ts +14 -0
- package/dist/dts/services/PlanOverviewUploaderMap.d.ts.map +1 -0
- package/dist/dts/services/PlanSession.d.ts +169 -0
- package/dist/dts/services/PlanSession.d.ts.map +1 -0
- package/dist/dts/services/ProjectStore.d.ts +50 -0
- package/dist/dts/services/ProjectStore.d.ts.map +1 -0
- package/dist/dts/services/PullRequestTracker.d.ts +42 -0
- package/dist/dts/services/PullRequestTracker.d.ts.map +1 -0
- package/dist/dts/services/SpecUploader.d.ts +51 -0
- package/dist/dts/services/SpecUploader.d.ts.map +1 -0
- package/dist/dts/services/SpecUploaderMap.d.ts +14 -0
- package/dist/dts/services/SpecUploaderMap.d.ts.map +1 -0
- package/dist/dts/services/TaskEventSource.d.ts +21 -0
- package/dist/dts/services/TaskEventSource.d.ts.map +1 -0
- package/dist/dts/services/TaskTracker/GitHubIssueTracker.d.ts +10 -0
- package/dist/dts/services/TaskTracker/GitHubIssueTracker.d.ts.map +1 -0
- package/dist/dts/services/TaskTracker/LinearSdkClient.d.ts +71 -0
- package/dist/dts/services/TaskTracker/LinearSdkClient.d.ts.map +1 -0
- package/dist/dts/services/TaskTracker/LinearTracker.d.ts +10 -0
- package/dist/dts/services/TaskTracker/LinearTracker.d.ts.map +1 -0
- package/dist/dts/services/TaskTracker/TaskTracker.d.ts +39 -0
- package/dist/dts/services/TaskTracker/TaskTracker.d.ts.map +1 -0
- package/dist/dts/services/TaskTracker/TrackerLayerMap.d.ts +14 -0
- package/dist/dts/services/TaskTracker/TrackerLayerMap.d.ts.map +1 -0
- package/dist/dts/services/TaskTracker/buildEventStream.d.ts +16 -0
- package/dist/dts/services/TaskTracker/buildEventStream.d.ts.map +1 -0
- package/dist/dts/services/TaskTracker.d.ts +38 -0
- package/dist/dts/services/TaskTracker.d.ts.map +1 -0
- package/dist/dts/services/TelegramAdapter.d.ts +13 -0
- package/dist/dts/services/TelegramAdapter.d.ts.map +1 -0
- package/dist/dts/services/TelegramConfig.d.ts +58 -0
- package/dist/dts/services/TelegramConfig.d.ts.map +1 -0
- package/dist/dts/services/TelegramConfigStore.d.ts +57 -0
- package/dist/dts/services/TelegramConfigStore.d.ts.map +1 -0
- package/dist/dts/services/TelegramNotifier.d.ts +40 -0
- package/dist/dts/services/TelegramNotifier.d.ts.map +1 -0
- package/dist/dts/services/TrackerLayerMap.d.ts +14 -0
- package/dist/dts/services/TrackerLayerMap.d.ts.map +1 -0
- package/dist/dts/services/TrackerResolver.d.ts +43 -0
- package/dist/dts/services/TrackerResolver.d.ts.map +1 -0
- package/dist/dts/services/messenger/MessengerAdapter.d.ts +69 -0
- package/dist/dts/services/messenger/MessengerAdapter.d.ts.map +1 -0
- package/dist/dts/services/messenger/TelegramAdapter.d.ts +13 -0
- package/dist/dts/services/messenger/TelegramAdapter.d.ts.map +1 -0
- package/dist/dts/services/task-tracker/GitHubIssueTracker.d.ts +10 -0
- package/dist/dts/services/task-tracker/GitHubIssueTracker.d.ts.map +1 -0
- package/dist/dts/services/task-tracker/LinearTracker.d.ts +10 -0
- package/dist/dts/services/task-tracker/LinearTracker.d.ts.map +1 -0
- package/dist/dts/services/task-tracker/TaskTracker.d.ts +38 -0
- package/dist/dts/services/task-tracker/TaskTracker.d.ts.map +1 -0
- package/dist/dts/services/task-tracker/TrackerLayerMap.d.ts +14 -0
- package/dist/dts/services/task-tracker/TrackerLayerMap.d.ts.map +1 -0
- package/dist/dts/shim/bin.d.ts +3 -0
- package/dist/dts/shim/bin.d.ts.map +1 -0
- package/dist/dts/shim/main.d.ts +36 -0
- package/dist/dts/shim/main.d.ts.map +1 -0
- package/dist/dts/shim/parseArgs.d.ts +11 -0
- package/dist/dts/shim/parseArgs.d.ts.map +1 -0
- package/dist/dts/shim/schemas.d.ts +55 -0
- package/dist/dts/shim/schemas.d.ts.map +1 -0
- package/dist/esm/Events.js +41 -0
- package/dist/esm/Events.js.map +1 -0
- package/dist/esm/LalphMain.js +56 -0
- package/dist/esm/LalphMain.js.map +1 -0
- package/dist/esm/Main.js +112 -0
- package/dist/esm/Main.js.map +1 -0
- package/dist/esm/index.js +101 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/lib/AnalysisPrompts.js +54 -0
- package/dist/esm/lib/AnalysisPrompts.js.map +1 -0
- package/dist/esm/lib/BranchParser.js +36 -0
- package/dist/esm/lib/BranchParser.js.map +1 -0
- package/dist/esm/lib/MermaidToPlantUml.js +89 -0
- package/dist/esm/lib/MermaidToPlantUml.js.map +1 -0
- package/dist/esm/lib/SpecHtmlGenerator.js +153 -0
- package/dist/esm/lib/SpecHtmlGenerator.js.map +1 -0
- package/dist/esm/lib/StreamJsonParser.js +79 -0
- package/dist/esm/lib/StreamJsonParser.js.map +1 -0
- package/dist/esm/lib/TelegramFormatter.js +114 -0
- package/dist/esm/lib/TelegramFormatter.js.map +1 -0
- package/dist/esm/lib/TelegraphHtml.js +57 -0
- package/dist/esm/lib/TelegraphHtml.js.map +1 -0
- package/dist/esm/lib/TelegraphMarkdown.js +338 -0
- package/dist/esm/lib/TelegraphMarkdown.js.map +1 -0
- package/dist/esm/package.json +4 -0
- package/dist/esm/schemas/CredentialSchemas.js +22 -0
- package/dist/esm/schemas/CredentialSchemas.js.map +1 -0
- package/dist/esm/schemas/GitHubSchemas.js +50 -0
- package/dist/esm/schemas/GitHubSchemas.js.map +1 -0
- package/dist/esm/schemas/LinearSchemas.js +52 -0
- package/dist/esm/schemas/LinearSchemas.js.map +1 -0
- package/dist/esm/schemas/ProjectSchemas.js +18 -0
- package/dist/esm/schemas/ProjectSchemas.js.map +1 -0
- package/dist/esm/schemas/TrackerSchemas.js +26 -0
- package/dist/esm/schemas/TrackerSchemas.js.map +1 -0
- package/dist/esm/services/AppContext.js +48 -0
- package/dist/esm/services/AppContext.js.map +1 -0
- package/dist/esm/services/AppRuntimeConfig.js +26 -0
- package/dist/esm/services/AppRuntimeConfig.js.map +1 -0
- package/dist/esm/services/AutoMerge.js +131 -0
- package/dist/esm/services/AutoMerge.js.map +1 -0
- package/dist/esm/services/ChatMachine.js +855 -0
- package/dist/esm/services/ChatMachine.js.map +1 -0
- package/dist/esm/services/CommentTimer.js +72 -0
- package/dist/esm/services/CommentTimer.js.map +1 -0
- package/dist/esm/services/CredentialStore.js +59 -0
- package/dist/esm/services/CredentialStore.js.map +1 -0
- package/dist/esm/services/CredentialWatcher.js +67 -0
- package/dist/esm/services/CredentialWatcher.js.map +1 -0
- package/dist/esm/services/Credentials.js +121 -0
- package/dist/esm/services/Credentials.js.map +1 -0
- package/dist/esm/services/EventLoop.js +128 -0
- package/dist/esm/services/EventLoop.js.map +1 -0
- package/dist/esm/services/GitHubClient/GitHubClient.js +227 -0
- package/dist/esm/services/GitHubClient/GitHubClient.js.map +1 -0
- package/dist/esm/services/GitHubClient/OctokitClient.js +320 -0
- package/dist/esm/services/GitHubClient/OctokitClient.js.map +1 -0
- package/dist/esm/services/GitHubClient.js +227 -0
- package/dist/esm/services/GitHubClient.js.map +1 -0
- package/dist/esm/services/GitHubEventSource.js +136 -0
- package/dist/esm/services/GitHubEventSource.js.map +1 -0
- package/dist/esm/services/GitHubIssueTracker.js +111 -0
- package/dist/esm/services/GitHubIssueTracker.js.map +1 -0
- package/dist/esm/services/LalphConfig.js +130 -0
- package/dist/esm/services/LalphConfig.js.map +1 -0
- package/dist/esm/services/LalphConfigReader.js +71 -0
- package/dist/esm/services/LalphConfigReader.js.map +1 -0
- package/dist/esm/services/LalphDirectory.js +36 -0
- package/dist/esm/services/LalphDirectory.js.map +1 -0
- package/dist/esm/services/LinearSdkClient.js +140 -0
- package/dist/esm/services/LinearSdkClient.js.map +1 -0
- package/dist/esm/services/LinearTracker.js +82 -0
- package/dist/esm/services/LinearTracker.js.map +1 -0
- package/dist/esm/services/MessengerAdapter/MessengerAdapter.js +21 -0
- package/dist/esm/services/MessengerAdapter/MessengerAdapter.js.map +1 -0
- package/dist/esm/services/MessengerAdapter/TelegramAdapter.js +124 -0
- package/dist/esm/services/MessengerAdapter/TelegramAdapter.js.map +1 -0
- package/dist/esm/services/MessengerAdapter/TelegramConfig.js +71 -0
- package/dist/esm/services/MessengerAdapter/TelegramConfig.js.map +1 -0
- package/dist/esm/services/MessengerAdapter.js +21 -0
- package/dist/esm/services/MessengerAdapter.js.map +1 -0
- package/dist/esm/services/OctokitClient.js +341 -0
- package/dist/esm/services/OctokitClient.js.map +1 -0
- package/dist/esm/services/PlanOverviewUploader.js +109 -0
- package/dist/esm/services/PlanOverviewUploader.js.map +1 -0
- package/dist/esm/services/PlanOverviewUploaderMap.js +17 -0
- package/dist/esm/services/PlanOverviewUploaderMap.js.map +1 -0
- package/dist/esm/services/PlanSession.js +471 -0
- package/dist/esm/services/PlanSession.js.map +1 -0
- package/dist/esm/services/ProjectStore.js +98 -0
- package/dist/esm/services/ProjectStore.js.map +1 -0
- package/dist/esm/services/PullRequestTracker.js +177 -0
- package/dist/esm/services/PullRequestTracker.js.map +1 -0
- package/dist/esm/services/SpecUploader.js +101 -0
- package/dist/esm/services/SpecUploader.js.map +1 -0
- package/dist/esm/services/SpecUploaderMap.js +17 -0
- package/dist/esm/services/SpecUploaderMap.js.map +1 -0
- package/dist/esm/services/TaskEventSource.js +50 -0
- package/dist/esm/services/TaskEventSource.js.map +1 -0
- package/dist/esm/services/TaskTracker/GitHubIssueTracker.js +148 -0
- package/dist/esm/services/TaskTracker/GitHubIssueTracker.js.map +1 -0
- package/dist/esm/services/TaskTracker/LinearSdkClient.js +140 -0
- package/dist/esm/services/TaskTracker/LinearSdkClient.js.map +1 -0
- package/dist/esm/services/TaskTracker/LinearTracker.js +119 -0
- package/dist/esm/services/TaskTracker/LinearTracker.js.map +1 -0
- package/dist/esm/services/TaskTracker/TaskTracker.js +12 -0
- package/dist/esm/services/TaskTracker/TaskTracker.js.map +1 -0
- package/dist/esm/services/TaskTracker/TrackerLayerMap.js +19 -0
- package/dist/esm/services/TaskTracker/TrackerLayerMap.js.map +1 -0
- package/dist/esm/services/TaskTracker/buildEventStream.js +47 -0
- package/dist/esm/services/TaskTracker/buildEventStream.js.map +1 -0
- package/dist/esm/services/TaskTracker.js +12 -0
- package/dist/esm/services/TaskTracker.js.map +1 -0
- package/dist/esm/services/TelegramAdapter.js +118 -0
- package/dist/esm/services/TelegramAdapter.js.map +1 -0
- package/dist/esm/services/TelegramConfig.js +71 -0
- package/dist/esm/services/TelegramConfig.js.map +1 -0
- package/dist/esm/services/TelegramConfigStore.js +71 -0
- package/dist/esm/services/TelegramConfigStore.js.map +1 -0
- package/dist/esm/services/TelegramNotifier.js +41 -0
- package/dist/esm/services/TelegramNotifier.js.map +1 -0
- package/dist/esm/services/TrackerLayerMap.js +19 -0
- package/dist/esm/services/TrackerLayerMap.js.map +1 -0
- package/dist/esm/services/TrackerResolver.js +36 -0
- package/dist/esm/services/TrackerResolver.js.map +1 -0
- package/dist/esm/services/messenger/MessengerAdapter.js +21 -0
- package/dist/esm/services/messenger/MessengerAdapter.js.map +1 -0
- package/dist/esm/services/messenger/TelegramAdapter.js +118 -0
- package/dist/esm/services/messenger/TelegramAdapter.js.map +1 -0
- package/dist/esm/services/task-tracker/GitHubIssueTracker.js +150 -0
- package/dist/esm/services/task-tracker/GitHubIssueTracker.js.map +1 -0
- package/dist/esm/services/task-tracker/LinearTracker.js +120 -0
- package/dist/esm/services/task-tracker/LinearTracker.js.map +1 -0
- package/dist/esm/services/task-tracker/TaskTracker.js +12 -0
- package/dist/esm/services/task-tracker/TaskTracker.js.map +1 -0
- package/dist/esm/services/task-tracker/TrackerLayerMap.js +19 -0
- package/dist/esm/services/task-tracker/TrackerLayerMap.js.map +1 -0
- package/dist/esm/shim/bin.js +28 -0
- package/dist/esm/shim/bin.js.map +1 -0
- package/dist/esm/shim/main.js +196 -0
- package/dist/esm/shim/main.js.map +1 -0
- package/dist/esm/shim/parseArgs.js +39 -0
- package/dist/esm/shim/parseArgs.js.map +1 -0
- package/dist/esm/shim/schemas.js +28 -0
- package/dist/esm/shim/schemas.js.map +1 -0
- package/lib/AnalysisPrompts/package.json +6 -0
- package/lib/BranchParser/package.json +6 -0
- package/lib/MermaidToPlantUml/package.json +6 -0
- package/lib/SpecHtmlGenerator/package.json +6 -0
- package/lib/StreamJsonParser/package.json +6 -0
- package/lib/TelegramFormatter/package.json +6 -0
- package/lib/TelegraphMarkdown/package.json +6 -0
- package/package.json +360 -0
- package/schemas/CredentialSchemas/package.json +6 -0
- package/schemas/GitHubSchemas/package.json +6 -0
- package/schemas/LinearSchemas/package.json +6 -0
- package/schemas/ProjectSchemas/package.json +6 -0
- package/schemas/TrackerSchemas/package.json +6 -0
- package/services/AppContext/package.json +6 -0
- package/services/AppRuntimeConfig/package.json +6 -0
- package/services/AutoMerge/package.json +6 -0
- package/services/ChatMachine/package.json +6 -0
- package/services/CommentTimer/package.json +6 -0
- package/services/EventLoop/package.json +6 -0
- package/services/GitHubClient/package.json +6 -0
- package/services/LalphConfig/package.json +6 -0
- package/services/LinearSdkClient/package.json +6 -0
- package/services/MessengerAdapter/MessengerAdapter/package.json +6 -0
- package/services/MessengerAdapter/TelegramAdapter/package.json +6 -0
- package/services/OctokitClient/package.json +6 -0
- package/services/PlanOverviewUploader/package.json +6 -0
- package/services/PlanOverviewUploaderMap/package.json +6 -0
- package/services/PlanSession/package.json +6 -0
- package/services/ProjectStore/package.json +6 -0
- package/services/PullRequestTracker/package.json +6 -0
- package/services/TaskTracker/GitHubIssueTracker/package.json +6 -0
- package/services/TaskTracker/LinearTracker/package.json +6 -0
- package/services/TaskTracker/TaskTracker/package.json +6 -0
- package/services/TelegramConfig/package.json +6 -0
- package/services/TrackerLayerMap/package.json +6 -0
- package/shim/bin/package.json +6 -0
- package/shim/main/package.json +6 -0
- package/shim/parseArgs/package.json +6 -0
- package/shim/schemas/package.json +6 -0
- package/src/Events.ts +98 -0
- package/src/Main.ts +177 -0
- package/src/index.ts +124 -0
- package/src/lib/AnalysisPrompts.ts +54 -0
- package/src/lib/BranchParser.ts +58 -0
- package/src/lib/MermaidToPlantUml.ts +103 -0
- package/src/lib/SpecHtmlGenerator.ts +199 -0
- package/src/lib/StreamJsonParser.ts +99 -0
- package/src/lib/TelegramFormatter.ts +151 -0
- package/src/lib/TelegraphMarkdown.ts +305 -0
- package/src/schemas/CredentialSchemas.ts +23 -0
- package/src/schemas/GitHubSchemas.ts +50 -0
- package/src/schemas/LinearSchemas.ts +57 -0
- package/src/schemas/ProjectSchemas.ts +18 -0
- package/src/schemas/TrackerSchemas.ts +27 -0
- package/src/services/AppContext.ts +72 -0
- package/src/services/AppRuntimeConfig.ts +23 -0
- package/src/services/AutoMerge.ts +198 -0
- package/src/services/ChatMachine.ts +911 -0
- package/src/services/CommentTimer.ts +133 -0
- package/src/services/EventLoop.ts +321 -0
- package/src/services/GitHubClient.ts +282 -0
- package/src/services/LalphConfig.ts +218 -0
- package/src/services/LinearSdkClient.ts +181 -0
- package/src/services/MessengerAdapter/MessengerAdapter.ts +53 -0
- package/src/services/MessengerAdapter/TelegramAdapter.ts +145 -0
- package/src/services/OctokitClient.ts +628 -0
- package/src/services/PlanOverviewUploader.ts +160 -0
- package/src/services/PlanOverviewUploaderMap.ts +17 -0
- package/src/services/PlanSession.ts +589 -0
- package/src/services/ProjectStore.ts +140 -0
- package/src/services/PullRequestTracker.ts +253 -0
- package/src/services/TaskTracker/GitHubIssueTracker.ts +162 -0
- package/src/services/TaskTracker/LinearTracker.ts +141 -0
- package/src/services/TaskTracker/TaskTracker.ts +34 -0
- package/src/services/TelegramConfig.ts +120 -0
- package/src/services/TrackerLayerMap.ts +19 -0
- package/src/shim/bin.ts +36 -0
- package/src/shim/main.ts +255 -0
- package/src/shim/parseArgs.ts +43 -0
- package/src/shim/schemas.ts +38 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TaskTracker service interface for task tracking backends
|
|
3
|
+
* @since 1.0.0
|
|
4
|
+
*/
|
|
5
|
+
import type { Effect, Stream } from "effect"
|
|
6
|
+
import { Context, Data } from "effect"
|
|
7
|
+
import type { TaskTrackerEvent } from "../../Events.js"
|
|
8
|
+
import type { TrackerIssue } from "../../schemas/TrackerSchemas.js"
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @since 1.0.0
|
|
12
|
+
* @category errors
|
|
13
|
+
*/
|
|
14
|
+
export class TaskTrackerError extends Data.TaggedError("TaskTrackerError")<{
|
|
15
|
+
message: string
|
|
16
|
+
cause: unknown
|
|
17
|
+
}> {}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @since 1.0.0
|
|
21
|
+
* @category services
|
|
22
|
+
*/
|
|
23
|
+
export interface TaskTrackerService {
|
|
24
|
+
readonly eventStream: Stream.Stream<TaskTrackerEvent, TaskTrackerError>
|
|
25
|
+
readonly moveToTodo: (issueId: string) => Effect.Effect<void, TaskTrackerError>
|
|
26
|
+
readonly setPriorityUrgent: (issueId: string) => Effect.Effect<void, TaskTrackerError>
|
|
27
|
+
readonly getIssue: (issueId: string) => Effect.Effect<TrackerIssue, TaskTrackerError>
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* @since 1.0.0
|
|
32
|
+
* @category context
|
|
33
|
+
*/
|
|
34
|
+
export class TaskTracker extends Context.Tag("TaskTracker")<TaskTracker, TaskTrackerService>() {}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telegram config persistence service following lalph TokenManager pattern
|
|
3
|
+
* @since 1.0.0
|
|
4
|
+
*/
|
|
5
|
+
import { FileSystem, Path } from "@effect/platform"
|
|
6
|
+
import { Context, Data, Effect, Layer, Option, Schema } from "effect"
|
|
7
|
+
import { AppContext } from "./AppContext.js"
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @since 1.0.0
|
|
11
|
+
* @category schemas
|
|
12
|
+
*/
|
|
13
|
+
export class TelegramConfigSchema extends Schema.Class<TelegramConfigSchema>("TelegramConfigSchema")({
|
|
14
|
+
botToken: Schema.String,
|
|
15
|
+
chatId: Schema.NullOr(Schema.String)
|
|
16
|
+
}) {}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @since 1.0.0
|
|
20
|
+
* @category errors
|
|
21
|
+
*/
|
|
22
|
+
export class TelegramConfigError extends Data.TaggedError("TelegramConfigError")<{
|
|
23
|
+
message: string
|
|
24
|
+
cause: unknown
|
|
25
|
+
}> {}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* @since 1.0.0
|
|
29
|
+
* @category services
|
|
30
|
+
*/
|
|
31
|
+
export interface TelegramConfigService {
|
|
32
|
+
readonly get: Effect.Effect<Option.Option<TelegramConfigSchema>>
|
|
33
|
+
readonly set: (config: TelegramConfigSchema) => Effect.Effect<void, TelegramConfigError>
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* @since 1.0.0
|
|
38
|
+
* @category context
|
|
39
|
+
*/
|
|
40
|
+
export class TelegramConfig extends Context.Tag("TelegramConfig")<
|
|
41
|
+
TelegramConfig,
|
|
42
|
+
TelegramConfigService
|
|
43
|
+
>() {}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* @since 1.0.0
|
|
47
|
+
* @category layers
|
|
48
|
+
*/
|
|
49
|
+
export const TelegramConfigLive = Layer.effect(
|
|
50
|
+
TelegramConfig,
|
|
51
|
+
Effect.gen(function*() {
|
|
52
|
+
const fs = yield* FileSystem.FileSystem
|
|
53
|
+
const pathService = yield* Path.Path
|
|
54
|
+
const appContext = yield* AppContext
|
|
55
|
+
|
|
56
|
+
const filePath = pathService.join(appContext.configDir, encodeURIComponent("notify.telegram"))
|
|
57
|
+
|
|
58
|
+
let currentConfig: TelegramConfigSchema | null = null
|
|
59
|
+
|
|
60
|
+
const get = Effect.gen(function*() {
|
|
61
|
+
if (currentConfig !== null) return Option.some(currentConfig)
|
|
62
|
+
|
|
63
|
+
const content = yield* fs.readFileString(filePath).pipe(
|
|
64
|
+
Effect.mapError((err) =>
|
|
65
|
+
new TelegramConfigError({
|
|
66
|
+
message: "Failed to read telegram config",
|
|
67
|
+
cause: err
|
|
68
|
+
})
|
|
69
|
+
)
|
|
70
|
+
)
|
|
71
|
+
const json = yield* Effect.try({
|
|
72
|
+
try: () => JSON.parse(content),
|
|
73
|
+
catch: (err) =>
|
|
74
|
+
new TelegramConfigError({
|
|
75
|
+
message: "Failed to parse telegram config",
|
|
76
|
+
cause: err
|
|
77
|
+
})
|
|
78
|
+
})
|
|
79
|
+
const config = yield* Schema.decodeUnknown(TelegramConfigSchema)(json).pipe(
|
|
80
|
+
Effect.mapError((err) =>
|
|
81
|
+
new TelegramConfigError({
|
|
82
|
+
message: "Failed to decode telegram config",
|
|
83
|
+
cause: err
|
|
84
|
+
})
|
|
85
|
+
)
|
|
86
|
+
)
|
|
87
|
+
currentConfig = config
|
|
88
|
+
return Option.some(config)
|
|
89
|
+
}).pipe(
|
|
90
|
+
Effect.catchTag(
|
|
91
|
+
"TelegramConfigError",
|
|
92
|
+
(err) =>
|
|
93
|
+
Effect.logWarning(`No stored Telegram config: ${err.message}`).pipe(
|
|
94
|
+
Effect.map(() => Option.none<TelegramConfigSchema>())
|
|
95
|
+
)
|
|
96
|
+
)
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
const set = (config: TelegramConfigSchema) =>
|
|
100
|
+
Effect.gen(function*() {
|
|
101
|
+
yield* fs.writeFileString(
|
|
102
|
+
filePath,
|
|
103
|
+
JSON.stringify({
|
|
104
|
+
botToken: config.botToken,
|
|
105
|
+
chatId: config.chatId
|
|
106
|
+
})
|
|
107
|
+
).pipe(
|
|
108
|
+
Effect.mapError((err) =>
|
|
109
|
+
new TelegramConfigError({
|
|
110
|
+
message: "Failed to write telegram config",
|
|
111
|
+
cause: err
|
|
112
|
+
})
|
|
113
|
+
)
|
|
114
|
+
)
|
|
115
|
+
currentConfig = config
|
|
116
|
+
})
|
|
117
|
+
|
|
118
|
+
return TelegramConfig.of({ get, set })
|
|
119
|
+
})
|
|
120
|
+
)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dynamic layer map for selecting TaskTracker implementation at runtime
|
|
3
|
+
* @since 1.0.0
|
|
4
|
+
*/
|
|
5
|
+
import { Layer, LayerMap } from "effect"
|
|
6
|
+
import { LinearSdkClientLive } from "./LinearSdkClient.js"
|
|
7
|
+
import { GitHubIssueTrackerLive } from "./TaskTracker/GitHubIssueTracker.js"
|
|
8
|
+
import { LinearTrackerLive } from "./TaskTracker/LinearTracker.js"
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @since 1.0.0
|
|
12
|
+
* @category layer-map
|
|
13
|
+
*/
|
|
14
|
+
export class TrackerLayerMap extends LayerMap.Service<TrackerLayerMap>()("TrackerLayerMap", {
|
|
15
|
+
layers: {
|
|
16
|
+
linear: LinearTrackerLive.pipe(Layer.provide(LinearSdkClientLive)),
|
|
17
|
+
github: GitHubIssueTrackerLive
|
|
18
|
+
}
|
|
19
|
+
}) {}
|
package/src/shim/bin.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Entry point for the claude-shim binary.
|
|
4
|
+
* @since 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
import { query } from "@anthropic-ai/claude-agent-sdk"
|
|
7
|
+
import { NodeRuntime } from "@effect/platform-node"
|
|
8
|
+
import * as NodeSink from "@effect/platform-node/NodeSink"
|
|
9
|
+
import * as NodeStream from "@effect/platform-node/NodeStream"
|
|
10
|
+
import { Effect, Layer } from "effect"
|
|
11
|
+
import { ClaudeQuery, ShimDeps, ShimError, shimProgram } from "./main.js"
|
|
12
|
+
|
|
13
|
+
shimProgram.pipe(
|
|
14
|
+
Effect.tapError(() =>
|
|
15
|
+
Effect.sync(() => {
|
|
16
|
+
process.exitCode = 1
|
|
17
|
+
})
|
|
18
|
+
),
|
|
19
|
+
Effect.catchAll((err) => Effect.logError("claude-shim failed", err)),
|
|
20
|
+
Effect.provide(Layer.mergeAll(
|
|
21
|
+
Layer.succeed(ShimDeps, {
|
|
22
|
+
args: process.argv.slice(2),
|
|
23
|
+
stdin: NodeStream.stdin,
|
|
24
|
+
stdout: NodeSink.stdout,
|
|
25
|
+
stderr: NodeSink.stderr
|
|
26
|
+
}),
|
|
27
|
+
Layer.succeed(ClaudeQuery, {
|
|
28
|
+
create: (params) =>
|
|
29
|
+
Effect.try({
|
|
30
|
+
try: () => query(params),
|
|
31
|
+
catch: (err) => new ShimError({ message: "Failed to create query", cause: err })
|
|
32
|
+
})
|
|
33
|
+
})
|
|
34
|
+
)),
|
|
35
|
+
NodeRuntime.runMain
|
|
36
|
+
)
|
package/src/shim/main.ts
ADDED
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SDK-based claude binary replacement — outputs stream-json NDJSON to stdout
|
|
3
|
+
* for PlanSession to parse. Uses MCP tool for AskUserQuestion instead of hooks.
|
|
4
|
+
* @since 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
import { createSdkMcpServer, tool } from "@anthropic-ai/claude-agent-sdk"
|
|
7
|
+
import type { Query, query, SDKMessage, SDKUserMessage } from "@anthropic-ai/claude-agent-sdk"
|
|
8
|
+
|
|
9
|
+
import type { PlatformError } from "@effect/platform/Error"
|
|
10
|
+
import { Config, Context, Data, Effect, Either, Fiber, Queue, Ref, Stream } from "effect"
|
|
11
|
+
import type * as Sink from "effect/Sink"
|
|
12
|
+
import { z } from "zod/v4"
|
|
13
|
+
import { parseArgs } from "./parseArgs.js"
|
|
14
|
+
import { decodeShimMessage } from "./schemas.js"
|
|
15
|
+
|
|
16
|
+
export { parseArgs } from "./parseArgs.js"
|
|
17
|
+
export type { ParsedArgs } from "./parseArgs.js"
|
|
18
|
+
export { decodeShimMessage } from "./schemas.js"
|
|
19
|
+
|
|
20
|
+
export class ShimError extends Data.TaggedError("ShimError")<{
|
|
21
|
+
readonly message: string
|
|
22
|
+
readonly cause: unknown
|
|
23
|
+
}> {}
|
|
24
|
+
|
|
25
|
+
// --- Query Service ---
|
|
26
|
+
|
|
27
|
+
export type QueryParams = Parameters<typeof query>[0]
|
|
28
|
+
|
|
29
|
+
export class ClaudeQuery extends Context.Tag("ClaudeQuery")<ClaudeQuery, {
|
|
30
|
+
readonly create: (params: QueryParams) => Effect.Effect<Query, ShimError>
|
|
31
|
+
}>() {}
|
|
32
|
+
|
|
33
|
+
// --- Config ---
|
|
34
|
+
|
|
35
|
+
export const ShimConfig = Config.all({
|
|
36
|
+
realClaudePath: Config.string("REAL_CLAUDE_PATH"),
|
|
37
|
+
claudeModel: Config.withDefault(Config.string("CLAUDE_MODEL"), "claude-opus-4-6")
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
// --- IO Deps ---
|
|
41
|
+
|
|
42
|
+
export interface ShimDepsService {
|
|
43
|
+
readonly args: ReadonlyArray<string>
|
|
44
|
+
readonly stdin: Stream.Stream<Uint8Array>
|
|
45
|
+
readonly stdout: Sink.Sink<void, string, never, PlatformError>
|
|
46
|
+
readonly stderr: Sink.Sink<void, string, never, PlatformError>
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export class ShimDeps extends Context.Tag("ShimDeps")<ShimDeps, ShimDepsService>() {}
|
|
50
|
+
|
|
51
|
+
const askUserQuestionSchema = {
|
|
52
|
+
questions: z.array(z.object({
|
|
53
|
+
question: z.string().describe("The question to ask the user"),
|
|
54
|
+
header: z.string().optional().describe("Short label (max 12 chars) displayed as a tag, e.g. 'Auth method'"),
|
|
55
|
+
options: z.array(z.object({
|
|
56
|
+
label: z.string().describe("Concise display text (1-5 words)"),
|
|
57
|
+
description: z.string().optional().describe("Explanation of what this option means")
|
|
58
|
+
})).min(2).max(4).describe("The available choices. Must have 2-4 options."),
|
|
59
|
+
multiSelect: z.boolean().optional().describe("Allow multiple selections")
|
|
60
|
+
}))
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const FollowUpStop: unique symbol = Symbol.for("FollowUpStop")
|
|
64
|
+
type FollowUpItem = SDKUserMessage | typeof FollowUpStop
|
|
65
|
+
|
|
66
|
+
export const shimProgram = Effect.gen(function*() {
|
|
67
|
+
const deps = yield* ShimDeps
|
|
68
|
+
const queryService = yield* ClaudeQuery
|
|
69
|
+
const config = yield* ShimConfig
|
|
70
|
+
const parsed = parseArgs(deps.args)
|
|
71
|
+
|
|
72
|
+
const model = parsed.model ?? config.claudeModel
|
|
73
|
+
|
|
74
|
+
// Output queues, drained through sinks as a single stream each
|
|
75
|
+
const outQueue = yield* Queue.unbounded<string>()
|
|
76
|
+
const errQueue = yield* Queue.unbounded<string>()
|
|
77
|
+
const outFiber = yield* Stream.fromQueue(outQueue).pipe(
|
|
78
|
+
Stream.run(deps.stdout),
|
|
79
|
+
Effect.fork
|
|
80
|
+
)
|
|
81
|
+
const errFiber = yield* Stream.fromQueue(errQueue).pipe(
|
|
82
|
+
Stream.run(deps.stderr),
|
|
83
|
+
Effect.fork
|
|
84
|
+
)
|
|
85
|
+
yield* Effect.addFinalizer(() =>
|
|
86
|
+
Effect.all([Queue.shutdown(outQueue), Queue.shutdown(errQueue)]).pipe(
|
|
87
|
+
Effect.andThen(Fiber.joinAll([outFiber, errFiber]).pipe(Effect.ignore))
|
|
88
|
+
)
|
|
89
|
+
)
|
|
90
|
+
const writeStdout = (data: string) => Queue.offer(outQueue, data).pipe(Effect.asVoid)
|
|
91
|
+
const writeDebug = (msg: string) =>
|
|
92
|
+
Queue.offer(errQueue, JSON.stringify({ type: "debug", message: msg }) + "\n").pipe(Effect.asVoid)
|
|
93
|
+
|
|
94
|
+
// State refs
|
|
95
|
+
const answerQueue = yield* Queue.unbounded<string>()
|
|
96
|
+
const routingActive = yield* Ref.make(false)
|
|
97
|
+
const queryHandleRef = yield* Ref.make<{ interrupt: () => Promise<void> } | null>(null)
|
|
98
|
+
const sessionIdRef = yield* Ref.make("")
|
|
99
|
+
|
|
100
|
+
// Follow-up queue: messages or FollowUpStop to signal termination
|
|
101
|
+
const followUpQueue = yield* Queue.unbounded<FollowUpItem>()
|
|
102
|
+
|
|
103
|
+
const followUpIterable: AsyncIterable<SDKUserMessage> = Stream.fromQueue(followUpQueue).pipe(
|
|
104
|
+
Stream.takeWhile((item): item is SDKUserMessage => item !== FollowUpStop),
|
|
105
|
+
Stream.toAsyncIterable
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
const collectAnswers = (questionCount: number) =>
|
|
109
|
+
Stream.fromQueue(answerQueue).pipe(
|
|
110
|
+
Stream.map((line) => line.trim()),
|
|
111
|
+
Stream.filter((line) => line.length > 0),
|
|
112
|
+
Stream.take(questionCount),
|
|
113
|
+
Stream.runCollect,
|
|
114
|
+
Effect.map((chunk) => ({
|
|
115
|
+
content: [{ type: "text" as const, text: `User answered: ${Array.from(chunk).join("; ")}` }]
|
|
116
|
+
}))
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
const mcpServer = createSdkMcpServer({
|
|
120
|
+
name: "ask-user",
|
|
121
|
+
tools: [
|
|
122
|
+
tool(
|
|
123
|
+
"ask_user",
|
|
124
|
+
"Ask the user a question and wait for their response via Telegram. Always provide 2-4 options for the user to choose from.",
|
|
125
|
+
askUserQuestionSchema,
|
|
126
|
+
(args, _extra) => Effect.runPromise(collectAnswers(args.questions.length || 1))
|
|
127
|
+
)
|
|
128
|
+
]
|
|
129
|
+
})
|
|
130
|
+
|
|
131
|
+
// Fork stdin reader daemon
|
|
132
|
+
yield* deps.stdin.pipe(
|
|
133
|
+
Stream.decodeText(),
|
|
134
|
+
Stream.splitLines,
|
|
135
|
+
Stream.mapEffect((line) =>
|
|
136
|
+
Effect.gen(function*() {
|
|
137
|
+
const isRouting = yield* Ref.get(routingActive)
|
|
138
|
+
if (!isRouting) {
|
|
139
|
+
yield* Queue.offer(answerQueue, line)
|
|
140
|
+
return
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const decoded = decodeShimMessage(line)
|
|
144
|
+
if (Either.isLeft(decoded)) {
|
|
145
|
+
yield* Queue.offer(answerQueue, line)
|
|
146
|
+
return
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
const msg = decoded.right
|
|
150
|
+
const sessionId = yield* Ref.get(sessionIdRef)
|
|
151
|
+
|
|
152
|
+
switch (msg.type) {
|
|
153
|
+
case "follow_up": {
|
|
154
|
+
yield* writeDebug(`follow_up intercepted: ${msg.text.slice(0, 100)}`)
|
|
155
|
+
yield* Queue.offer(followUpQueue, {
|
|
156
|
+
type: "user",
|
|
157
|
+
message: { role: "user", content: msg.text },
|
|
158
|
+
parent_tool_use_id: null,
|
|
159
|
+
session_id: sessionId
|
|
160
|
+
})
|
|
161
|
+
return
|
|
162
|
+
}
|
|
163
|
+
case "shim_approve": {
|
|
164
|
+
yield* writeDebug("shim_approve intercepted")
|
|
165
|
+
yield* Queue.offer(followUpQueue, FollowUpStop)
|
|
166
|
+
return
|
|
167
|
+
}
|
|
168
|
+
case "shim_start": {
|
|
169
|
+
// shim_start after handshake is unexpected — ignore
|
|
170
|
+
return
|
|
171
|
+
}
|
|
172
|
+
case "shim_interrupt": {
|
|
173
|
+
yield* writeDebug("shim_interrupt intercepted")
|
|
174
|
+
const handle = yield* Ref.get(queryHandleRef)
|
|
175
|
+
if (handle !== null) {
|
|
176
|
+
yield* Effect.tryPromise({
|
|
177
|
+
try: () => handle.interrupt(),
|
|
178
|
+
catch: (err) => new ShimError({ message: "interrupt error", cause: err })
|
|
179
|
+
}).pipe(Effect.catchTag("ShimError", (err) => Effect.logError("interrupt error", err)))
|
|
180
|
+
}
|
|
181
|
+
if (msg.text != null) {
|
|
182
|
+
yield* Queue.offer(followUpQueue, {
|
|
183
|
+
type: "user",
|
|
184
|
+
message: { role: "user", content: msg.text },
|
|
185
|
+
parent_tool_use_id: null,
|
|
186
|
+
session_id: sessionId
|
|
187
|
+
})
|
|
188
|
+
}
|
|
189
|
+
return
|
|
190
|
+
}
|
|
191
|
+
case "shim_abort": {
|
|
192
|
+
yield* writeDebug("shim_abort intercepted")
|
|
193
|
+
yield* Queue.offer(followUpQueue, FollowUpStop)
|
|
194
|
+
return
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
})
|
|
198
|
+
),
|
|
199
|
+
Stream.runDrain,
|
|
200
|
+
Effect.forkScoped
|
|
201
|
+
)
|
|
202
|
+
|
|
203
|
+
// Handshake: signal readiness and wait for control message
|
|
204
|
+
yield* writeStdout(JSON.stringify({ type: "shim_ready" }) + "\n")
|
|
205
|
+
const controlLine = yield* Queue.take(answerQueue)
|
|
206
|
+
const controlDecoded = decodeShimMessage(controlLine)
|
|
207
|
+
|
|
208
|
+
if (Either.isRight(controlDecoded) && controlDecoded.right.type === "shim_abort") return
|
|
209
|
+
if (Either.isLeft(controlDecoded) || controlDecoded.right.type !== "shim_start") {
|
|
210
|
+
return yield* new ShimError({
|
|
211
|
+
message: `Unexpected control message: ${controlLine}`,
|
|
212
|
+
cause: null
|
|
213
|
+
})
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// Offer initial prompt to follow-up queue
|
|
217
|
+
yield* Queue.offer(followUpQueue, {
|
|
218
|
+
type: "user",
|
|
219
|
+
message: { role: "user", content: parsed.prompt },
|
|
220
|
+
parent_tool_use_id: null,
|
|
221
|
+
session_id: ""
|
|
222
|
+
})
|
|
223
|
+
|
|
224
|
+
const q = yield* queryService.create({
|
|
225
|
+
prompt: followUpIterable,
|
|
226
|
+
options: {
|
|
227
|
+
model,
|
|
228
|
+
pathToClaudeCodeExecutable: config.realClaudePath,
|
|
229
|
+
mcpServers: { "ask-user": mcpServer },
|
|
230
|
+
disallowedTools: ["AskUserQuestion"],
|
|
231
|
+
...(parsed.dangerouslySkipPermissions
|
|
232
|
+
? { permissionMode: "bypassPermissions" as const }
|
|
233
|
+
: {})
|
|
234
|
+
}
|
|
235
|
+
})
|
|
236
|
+
|
|
237
|
+
yield* Ref.set(queryHandleRef, { interrupt: () => q.interrupt() })
|
|
238
|
+
yield* Ref.set(routingActive, true)
|
|
239
|
+
|
|
240
|
+
yield* Effect.addFinalizer(() => Effect.sync(() => q.close()))
|
|
241
|
+
yield* Effect.addFinalizer(() => Queue.offer(followUpQueue, FollowUpStop))
|
|
242
|
+
yield* Effect.addFinalizer(() => Queue.shutdown(answerQueue))
|
|
243
|
+
|
|
244
|
+
yield* Stream.fromAsyncIterable(q, (err) => new ShimError({ message: "Stream error", cause: err })).pipe(
|
|
245
|
+
Stream.tap((msg: SDKMessage) =>
|
|
246
|
+
Effect.gen(function*() {
|
|
247
|
+
if (msg.type === "system" && msg.subtype === "init") {
|
|
248
|
+
yield* Ref.set(sessionIdRef, msg.session_id)
|
|
249
|
+
}
|
|
250
|
+
yield* writeStdout(JSON.stringify(msg) + "\n")
|
|
251
|
+
})
|
|
252
|
+
),
|
|
253
|
+
Stream.runDrain
|
|
254
|
+
)
|
|
255
|
+
}).pipe(Effect.scoped)
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI argument parsing for claude-shim.
|
|
3
|
+
* @since 1.0.0
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export interface ParsedArgs {
|
|
7
|
+
readonly prompt: string
|
|
8
|
+
readonly dangerouslySkipPermissions: boolean
|
|
9
|
+
readonly model: string | null
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function parseArgs(args: ReadonlyArray<string>): ParsedArgs {
|
|
13
|
+
let dangerouslySkipPermissions = false
|
|
14
|
+
let prompt = ""
|
|
15
|
+
let model: string | null = null
|
|
16
|
+
let skipNext = false
|
|
17
|
+
|
|
18
|
+
for (let i = 0; i < args.length; i++) {
|
|
19
|
+
if (skipNext) {
|
|
20
|
+
skipNext = false
|
|
21
|
+
continue
|
|
22
|
+
}
|
|
23
|
+
const arg = args[i]!
|
|
24
|
+
if (arg === "--dangerously-skip-permissions") {
|
|
25
|
+
dangerouslySkipPermissions = true
|
|
26
|
+
} else if (arg === "--output-format") {
|
|
27
|
+
skipNext = true
|
|
28
|
+
} else if (arg === "--model") {
|
|
29
|
+
model = args[i + 1] ?? null
|
|
30
|
+
skipNext = true
|
|
31
|
+
} else if (arg === "--verbose" || arg === "-p" || arg === "--print") {
|
|
32
|
+
// ignored — SDK handles output format and verbosity
|
|
33
|
+
} else if (arg === "--") {
|
|
34
|
+
// everything after -- is the prompt
|
|
35
|
+
prompt = args.slice(i + 1).join(" ")
|
|
36
|
+
break
|
|
37
|
+
} else if (!arg.startsWith("-")) {
|
|
38
|
+
prompt = arg
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return { prompt, dangerouslySkipPermissions, model }
|
|
43
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema definitions for claude-shim control messages.
|
|
3
|
+
* @since 1.0.0
|
|
4
|
+
*/
|
|
5
|
+
import { Schema } from "effect"
|
|
6
|
+
|
|
7
|
+
const ShimStart = Schema.Struct({
|
|
8
|
+
type: Schema.Literal("shim_start"),
|
|
9
|
+
text: Schema.optional(Schema.String)
|
|
10
|
+
})
|
|
11
|
+
|
|
12
|
+
const ShimAbort = Schema.Struct({
|
|
13
|
+
type: Schema.Literal("shim_abort")
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
const ShimInterrupt = Schema.Struct({
|
|
17
|
+
type: Schema.Literal("shim_interrupt"),
|
|
18
|
+
text: Schema.optional(Schema.String)
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
const ShimApprove = Schema.Struct({
|
|
22
|
+
type: Schema.Literal("shim_approve"),
|
|
23
|
+
text: Schema.optional(Schema.String)
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
export const ShimControl = Schema.Union(ShimStart, ShimAbort, ShimInterrupt, ShimApprove)
|
|
27
|
+
export type ShimControl = typeof ShimControl.Type
|
|
28
|
+
|
|
29
|
+
export const FollowUp = Schema.Struct({
|
|
30
|
+
type: Schema.Literal("follow_up"),
|
|
31
|
+
text: Schema.String
|
|
32
|
+
})
|
|
33
|
+
export type FollowUp = typeof FollowUp.Type
|
|
34
|
+
|
|
35
|
+
export const ShimMessage = Schema.Union(ShimStart, ShimAbort, ShimInterrupt, ShimApprove, FollowUp)
|
|
36
|
+
export type ShimMessage = typeof ShimMessage.Type
|
|
37
|
+
|
|
38
|
+
export const decodeShimMessage = Schema.decodeUnknownEither(Schema.parseJson(ShimMessage))
|