@intrect/openswarm 0.14.0 → 0.16.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/README.md +9 -6
- package/dist/adapters/agenticLoop.d.ts +2 -0
- package/dist/adapters/agenticLoop.d.ts.map +1 -1
- package/dist/adapters/agenticLoop.js +8 -5
- package/dist/adapters/agenticLoop.js.map +1 -1
- package/dist/adapters/codexResponses.d.ts.map +1 -1
- package/dist/adapters/codexResponses.js +1 -0
- package/dist/adapters/codexResponses.js.map +1 -1
- package/dist/adapters/gpt.d.ts.map +1 -1
- package/dist/adapters/gpt.js +1 -0
- package/dist/adapters/gpt.js.map +1 -1
- package/dist/adapters/local.d.ts.map +1 -1
- package/dist/adapters/local.js +1 -0
- package/dist/adapters/local.js.map +1 -1
- package/dist/adapters/openrouter.d.ts.map +1 -1
- package/dist/adapters/openrouter.js +1 -0
- package/dist/adapters/openrouter.js.map +1 -1
- package/dist/adapters/tools.d.ts +2 -0
- package/dist/adapters/tools.d.ts.map +1 -1
- package/dist/adapters/tools.js +7 -0
- package/dist/adapters/tools.js.map +1 -1
- package/dist/adapters/types.d.ts +2 -0
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/automation/autonomousRunner.d.ts +5 -5
- package/dist/automation/ciWorker.d.ts.map +1 -1
- package/dist/automation/ciWorker.js +16 -11
- package/dist/automation/ciWorker.js.map +1 -1
- package/dist/automation/dailyReporter.d.ts.map +1 -1
- package/dist/automation/dailyReporter.js +7 -2
- package/dist/automation/dailyReporter.js.map +1 -1
- package/dist/automation/longRunningMonitor.d.ts.map +1 -1
- package/dist/automation/longRunningMonitor.js +17 -27
- package/dist/automation/longRunningMonitor.js.map +1 -1
- package/dist/automation/prProcessor.d.ts.map +1 -1
- package/dist/automation/prProcessor.js +103 -24
- package/dist/automation/prProcessor.js.map +1 -1
- package/dist/automation/runnerState.d.ts.map +1 -1
- package/dist/automation/runnerState.js +13 -5
- package/dist/automation/runnerState.js.map +1 -1
- package/dist/automation/scheduler.d.ts.map +1 -1
- package/dist/automation/scheduler.js +76 -76
- package/dist/automation/scheduler.js.map +1 -1
- package/dist/automation/taskSource.d.ts +1 -1
- package/dist/automation/taskSource.d.ts.map +1 -1
- package/dist/automation/taskSource.js +95 -8
- package/dist/automation/taskSource.js.map +1 -1
- package/dist/automation/workerAuditLog.d.ts.map +1 -1
- package/dist/automation/workerAuditLog.js +4 -1
- package/dist/automation/workerAuditLog.js.map +1 -1
- package/dist/cli/authHandler.d.ts.map +1 -1
- package/dist/cli/authHandler.js +10 -12
- package/dist/cli/authHandler.js.map +1 -1
- package/dist/cli/checkHandler.d.ts.map +1 -1
- package/dist/cli/checkHandler.js +12 -10
- package/dist/cli/checkHandler.js.map +1 -1
- package/dist/cli/daemon.d.ts.map +1 -1
- package/dist/cli/daemon.js +24 -9
- package/dist/cli/daemon.js.map +1 -1
- package/dist/cli/fixCommand.d.ts +31 -1
- package/dist/cli/fixCommand.d.ts.map +1 -1
- package/dist/cli/fixCommand.js +121 -3
- package/dist/cli/fixCommand.js.map +1 -1
- package/dist/cli/initWizard.d.ts.map +1 -1
- package/dist/cli/initWizard.js +6 -1
- package/dist/cli/initWizard.js.map +1 -1
- package/dist/cli/projectHandler.d.ts.map +1 -1
- package/dist/cli/projectHandler.js +3 -2
- package/dist/cli/projectHandler.js.map +1 -1
- package/dist/cli/promptHandler.d.ts.map +1 -1
- package/dist/cli/promptHandler.js +21 -10
- package/dist/cli/promptHandler.js.map +1 -1
- package/dist/cli/reviewAudit.d.ts +2 -2
- package/dist/cli/reviewAudit.js +3 -3
- package/dist/cli/reviewAudit.js.map +1 -1
- package/dist/cli/reviewMaxCommand.d.ts.map +1 -1
- package/dist/cli/reviewMaxCommand.js +10 -2
- package/dist/cli/reviewMaxCommand.js.map +1 -1
- package/dist/cli/scheduleCommand.d.ts.map +1 -1
- package/dist/cli/scheduleCommand.js +20 -5
- package/dist/cli/scheduleCommand.js.map +1 -1
- package/dist/cli.js +16 -5
- package/dist/cli.js.map +1 -1
- package/dist/core/config.d.ts +33 -13
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +18 -0
- package/dist/core/config.js.map +1 -1
- package/dist/discord/discordCore.d.ts.map +1 -1
- package/dist/discord/discordCore.js +20 -4
- package/dist/discord/discordCore.js.map +1 -1
- package/dist/discord/discordPair.js +12 -0
- package/dist/discord/discordPair.js.map +1 -1
- package/dist/github/github.d.ts +1 -1
- package/dist/github/github.d.ts.map +1 -1
- package/dist/github/github.js +41 -11
- package/dist/github/github.js.map +1 -1
- package/dist/index.js +15 -6
- package/dist/index.js.map +1 -1
- package/dist/issues/graphql/resolvers.d.ts +4 -4
- package/dist/issues/graphql/resolvers.d.ts.map +1 -1
- package/dist/issues/graphql/resolvers.js +43 -3
- package/dist/issues/graphql/resolvers.js.map +1 -1
- package/dist/issues/graphql/server.d.ts.map +1 -1
- package/dist/issues/graphql/server.js +76 -5
- package/dist/issues/graphql/server.js.map +1 -1
- package/dist/issues/graphql/typeDefs.d.ts +1 -1
- package/dist/issues/graphql/typeDefs.d.ts.map +1 -1
- package/dist/issues/graphql/typeDefs.js +0 -5
- package/dist/issues/graphql/typeDefs.js.map +1 -1
- package/dist/issues/issueBoardHtml.d.ts +1 -1
- package/dist/issues/issueBoardHtml.d.ts.map +1 -1
- package/dist/issues/issueBoardHtml.js +40 -20
- package/dist/issues/issueBoardHtml.js.map +1 -1
- package/dist/issues/linearBridge.d.ts +1 -1
- package/dist/issues/linearBridge.d.ts.map +1 -1
- package/dist/issues/linearBridge.js +14 -5
- package/dist/issues/linearBridge.js.map +1 -1
- package/dist/issues/memoryBridge.d.ts.map +1 -1
- package/dist/issues/memoryBridge.js +23 -11
- package/dist/issues/memoryBridge.js.map +1 -1
- package/dist/issues/schema.d.ts +3 -3
- package/dist/issues/sqliteStore.d.ts +3 -0
- package/dist/issues/sqliteStore.d.ts.map +1 -1
- package/dist/issues/sqliteStore.js +124 -19
- package/dist/issues/sqliteStore.js.map +1 -1
- package/dist/knowledge/graphqlExporter.d.ts.map +1 -1
- package/dist/knowledge/graphqlExporter.js +38 -9
- package/dist/knowledge/graphqlExporter.js.map +1 -1
- package/dist/knowledge/scanner.js +65 -26
- package/dist/knowledge/scanner.js.map +1 -1
- package/dist/linear/linear.d.ts.map +1 -1
- package/dist/linear/linear.js +11 -11
- package/dist/linear/linear.js.map +1 -1
- package/dist/linear/projectUpdater.js +12 -2
- package/dist/linear/projectUpdater.js.map +1 -1
- package/dist/locale/en.d.ts.map +1 -1
- package/dist/locale/en.js +4 -0
- package/dist/locale/en.js.map +1 -1
- package/dist/locale/index.d.ts +7 -2
- package/dist/locale/index.d.ts.map +1 -1
- package/dist/locale/index.js.map +1 -1
- package/dist/locale/ko.d.ts.map +1 -1
- package/dist/locale/ko.js +4 -0
- package/dist/locale/ko.js.map +1 -1
- package/dist/locale/prompts/en.d.ts.map +1 -1
- package/dist/locale/prompts/en.js +111 -42
- package/dist/locale/prompts/en.js.map +1 -1
- package/dist/locale/prompts/ko.d.ts.map +1 -1
- package/dist/locale/prompts/ko.js +111 -42
- package/dist/locale/prompts/ko.js.map +1 -1
- package/dist/locale/types.d.ts +4 -0
- package/dist/locale/types.d.ts.map +1 -1
- package/dist/mcp/mcpClient.d.ts.map +1 -1
- package/dist/mcp/mcpClient.js +68 -6
- package/dist/mcp/mcpClient.js.map +1 -1
- package/dist/mcp/memoryServer.js +3 -0
- package/dist/mcp/memoryServer.js.map +1 -1
- package/dist/memory/codex.d.ts.map +1 -1
- package/dist/memory/codex.js +3 -2
- package/dist/memory/codex.js.map +1 -1
- package/dist/memory/compaction.d.ts.map +1 -1
- package/dist/memory/compaction.js +36 -6
- package/dist/memory/compaction.js.map +1 -1
- package/dist/memory/memoryCore.d.ts +1 -0
- package/dist/memory/memoryCore.d.ts.map +1 -1
- package/dist/memory/memoryCore.js +43 -25
- package/dist/memory/memoryCore.js.map +1 -1
- package/dist/memory/memoryOps.d.ts.map +1 -1
- package/dist/memory/memoryOps.js +54 -58
- package/dist/memory/memoryOps.js.map +1 -1
- package/dist/notify/notifier.d.ts.map +1 -1
- package/dist/notify/notifier.js +31 -7
- package/dist/notify/notifier.js.map +1 -1
- package/dist/orchestration/conflictDetector.d.ts.map +1 -1
- package/dist/orchestration/conflictDetector.js +15 -4
- package/dist/orchestration/conflictDetector.js.map +1 -1
- package/dist/orchestration/decisionEngine.d.ts +3 -2
- package/dist/orchestration/decisionEngine.d.ts.map +1 -1
- package/dist/orchestration/decisionEngine.js +28 -12
- package/dist/orchestration/decisionEngine.js.map +1 -1
- package/dist/orchestration/taskParser.d.ts.map +1 -1
- package/dist/orchestration/taskParser.js +21 -3
- package/dist/orchestration/taskParser.js.map +1 -1
- package/dist/orchestration/taskScheduler.d.ts.map +1 -1
- package/dist/orchestration/taskScheduler.js +35 -18
- package/dist/orchestration/taskScheduler.js.map +1 -1
- package/dist/orchestration/workflow.d.ts.map +1 -1
- package/dist/orchestration/workflow.js +22 -5
- package/dist/orchestration/workflow.js.map +1 -1
- package/dist/registry/bsDetector.js +2 -2
- package/dist/registry/bsDetector.js.map +1 -1
- package/dist/registry/entityScanner.d.ts.map +1 -1
- package/dist/registry/entityScanner.js +25 -6
- package/dist/registry/entityScanner.js.map +1 -1
- package/dist/registry/graphql/resolvers.d.ts +23 -8
- package/dist/registry/graphql/resolvers.d.ts.map +1 -1
- package/dist/registry/graphql/resolvers.js +126 -32
- package/dist/registry/graphql/resolvers.js.map +1 -1
- package/dist/registry/graphql/typeDefs.d.ts +1 -1
- package/dist/registry/graphql/typeDefs.d.ts.map +1 -1
- package/dist/registry/graphql/typeDefs.js +9 -8
- package/dist/registry/graphql/typeDefs.js.map +1 -1
- package/dist/registry/issueBridge.d.ts +1 -1
- package/dist/registry/issueBridge.d.ts.map +1 -1
- package/dist/registry/issueBridge.js +2 -2
- package/dist/registry/issueBridge.js.map +1 -1
- package/dist/registry/sqliteStore.d.ts +2 -2
- package/dist/registry/sqliteStore.d.ts.map +1 -1
- package/dist/registry/sqliteStore.js +24 -10
- package/dist/registry/sqliteStore.js.map +1 -1
- package/dist/runners/cliRunner.d.ts.map +1 -1
- package/dist/runners/cliRunner.js +42 -19
- package/dist/runners/cliRunner.js.map +1 -1
- package/dist/support/apiCache.d.ts +15 -1
- package/dist/support/apiCache.d.ts.map +1 -1
- package/dist/support/apiCache.js +42 -7
- package/dist/support/apiCache.js.map +1 -1
- package/dist/support/chatBackend.d.ts.map +1 -1
- package/dist/support/chatBackend.js +2 -3
- package/dist/support/chatBackend.js.map +1 -1
- package/dist/support/chatSession.d.ts.map +1 -1
- package/dist/support/chatSession.js +21 -3
- package/dist/support/chatSession.js.map +1 -1
- package/dist/support/dashboardHtml.d.ts +1 -1
- package/dist/support/dashboardHtml.d.ts.map +1 -1
- package/dist/support/dashboardHtml.js +19 -14
- package/dist/support/dashboardHtml.js.map +1 -1
- package/dist/support/delete-beliefs.d.ts +3 -1
- package/dist/support/delete-beliefs.d.ts.map +1 -1
- package/dist/support/delete-beliefs.js +18 -7
- package/dist/support/delete-beliefs.js.map +1 -1
- package/dist/support/editParser.d.ts.map +1 -1
- package/dist/support/editParser.js +46 -12
- package/dist/support/editParser.js.map +1 -1
- package/dist/support/gitTracker.d.ts +2 -2
- package/dist/support/gitTracker.d.ts.map +1 -1
- package/dist/support/gitTracker.js +10 -5
- package/dist/support/gitTracker.js.map +1 -1
- package/dist/support/planner.d.ts.map +1 -1
- package/dist/support/planner.js +1 -0
- package/dist/support/planner.js.map +1 -1
- package/dist/support/projectMapper.d.ts.map +1 -1
- package/dist/support/projectMapper.js +21 -16
- package/dist/support/projectMapper.js.map +1 -1
- package/dist/support/rateLimiter.d.ts.map +1 -1
- package/dist/support/rateLimiter.js +3 -0
- package/dist/support/rateLimiter.js.map +1 -1
- package/dist/support/repoMetadata.d.ts +1 -0
- package/dist/support/repoMetadata.d.ts.map +1 -1
- package/dist/support/repoMetadata.js +6 -0
- package/dist/support/repoMetadata.js.map +1 -1
- package/dist/support/rollback.d.ts.map +1 -1
- package/dist/support/rollback.js +57 -8
- package/dist/support/rollback.js.map +1 -1
- package/dist/support/stuckDetector.d.ts.map +1 -1
- package/dist/support/stuckDetector.js +8 -6
- package/dist/support/stuckDetector.js.map +1 -1
- package/dist/support/timeWindow.d.ts +1 -1
- package/dist/support/timeWindow.d.ts.map +1 -1
- package/dist/support/timeWindow.js +18 -7
- package/dist/support/timeWindow.js.map +1 -1
- package/dist/support/web.d.ts.map +1 -1
- package/dist/support/web.js +872 -791
- package/dist/support/web.js.map +1 -1
- package/dist/support/workflowLinear.d.ts.map +1 -1
- package/dist/support/workflowLinear.js +8 -6
- package/dist/support/workflowLinear.js.map +1 -1
- package/dist/support/worktreeManager.d.ts.map +1 -1
- package/dist/support/worktreeManager.js +33 -9
- package/dist/support/worktreeManager.js.map +1 -1
- package/dist/taskState/store.d.ts +7 -2
- package/dist/taskState/store.d.ts.map +1 -1
- package/dist/taskState/store.js +77 -21
- package/dist/taskState/store.js.map +1 -1
- package/dist/telemetry/telemetry.d.ts.map +1 -1
- package/dist/telemetry/telemetry.js +18 -4
- package/dist/telemetry/telemetry.js.map +1 -1
- package/dist/tui/components/ChatInput.d.ts +1 -0
- package/dist/tui/components/ChatInput.d.ts.map +1 -1
- package/dist/tui/components/ChatInput.js +14 -1
- package/dist/tui/components/ChatInput.js.map +1 -1
- package/dist/tui/components/SubagentTree.d.ts.map +1 -1
- package/dist/tui/components/SubagentTree.js +14 -2
- package/dist/tui/components/SubagentTree.js.map +1 -1
- package/dist/tui/hooks/useMonitor.d.ts.map +1 -1
- package/dist/tui/hooks/useMonitor.js +5 -0
- package/dist/tui/hooks/useMonitor.js.map +1 -1
- package/dist/tui/hooks/usePipelineEvents.d.ts.map +1 -1
- package/dist/tui/hooks/usePipelineEvents.js +12 -2
- package/dist/tui/hooks/usePipelineEvents.js.map +1 -1
- package/dist/tui/markdown.d.ts.map +1 -1
- package/dist/tui/markdown.js +11 -3
- package/dist/tui/markdown.js.map +1 -1
- package/dist/tui/monitorApi.d.ts.map +1 -1
- package/dist/tui/monitorApi.js +21 -0
- package/dist/tui/monitorApi.js.map +1 -1
- package/dist/tui/monitorRows.d.ts +2 -2
- package/dist/tui/monitorRows.d.ts.map +1 -1
- package/dist/tui/monitorRows.js +7 -1
- package/dist/tui/monitorRows.js.map +1 -1
- package/dist/tui/panels/ChatPanel.d.ts.map +1 -1
- package/dist/tui/panels/ChatPanel.js +30 -3
- package/dist/tui/panels/ChatPanel.js.map +1 -1
- package/dist/tui/sse.d.ts +1 -0
- package/dist/tui/sse.d.ts.map +1 -1
- package/dist/tui/sse.js +6 -1
- package/dist/tui/sse.js.map +1 -1
- package/dist/tui/subagentTree.d.ts.map +1 -1
- package/dist/tui/subagentTree.js +16 -5
- package/dist/tui/subagentTree.js.map +1 -1
- package/dist/tui/tabs.d.ts.map +1 -1
- package/dist/tui/tabs.js +7 -1
- package/dist/tui/tabs.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/issues/graphql/server.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,2CAA2C;AAC3C,sBAAsB;AACtB,2CAA2C;AAC3C,+CAA+C;AAE/C,OAAO,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/issues/graphql/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const typeDefs = "\n type Query {\n # \uC774\uC288\n issue(id: ID!): Issue\n issues(filter: IssueFilterInput): IssueConnection!\n\n # \uB77C\uBCA8 & \uB9C8\uC77C\uC2A4\uD1A4\n labels: [Label!]!\n milestones: [Milestone!]!\n\n # \uC774\uBCA4\uD2B8 \uB85C\uADF8\n issueEvents(issueId: ID!, limit: Int): [IssueEvent!]!\n recentEvents(limit: Int): [IssueEvent!]!\n\n # \uD1B5\uACC4\n issueStats(projectId: String): IssueStats!\n\n # \uBA54\uBAA8\uB9AC \uC5F0\uB3D9\n linkedMemories(issueId: ID!): [String!]!\n issueContext(issueId: ID!): IssueContext!\n }\n\n type Mutation {\n # \uC774\uC288 CRUD\n createIssue(input: CreateIssueInput!): Issue!\n updateIssue(id: ID!, input: UpdateIssueInput!): Issue\n deleteIssue(id: ID!): Boolean!\n\n # \uC0C1\uD0DC \uC804\uC774\n changeIssueStatus(id: ID!, status: IssueStatus!, actor: String): Issue\n\n # \uC774\uBCA4\uD2B8\n addComment(issueId: ID!, content: String!, actor: String): IssueEvent!\n\n # \uB77C\uBCA8\n createLabel(name: String!, color: String, description: String): Label!\n deleteLabel(id: ID!): Boolean!\n\n # \uB9C8\uC77C\uC2A4\uD1A4\n createMilestone(name: String!, description: String, dueDate: String): Milestone!\n\n # \uBA54\uBAA8\uB9AC \uC5F0\uB3D9\n linkMemory(issueId: ID!, memoryId: String!): Boolean!\n autoLinkMemories(issueId: ID!): [String!]!\n }\n\n
|
|
1
|
+
export declare const typeDefs = "\n type Query {\n # \uC774\uC288\n issue(id: ID!): Issue\n issues(filter: IssueFilterInput): IssueConnection!\n\n # \uB77C\uBCA8 & \uB9C8\uC77C\uC2A4\uD1A4\n labels: [Label!]!\n milestones: [Milestone!]!\n\n # \uC774\uBCA4\uD2B8 \uB85C\uADF8\n issueEvents(issueId: ID!, limit: Int): [IssueEvent!]!\n recentEvents(limit: Int): [IssueEvent!]!\n\n # \uD1B5\uACC4\n issueStats(projectId: String): IssueStats!\n\n # \uBA54\uBAA8\uB9AC \uC5F0\uB3D9\n linkedMemories(issueId: ID!): [String!]!\n issueContext(issueId: ID!): IssueContext!\n }\n\n type Mutation {\n # \uC774\uC288 CRUD\n createIssue(input: CreateIssueInput!): Issue!\n updateIssue(id: ID!, input: UpdateIssueInput!): Issue\n deleteIssue(id: ID!): Boolean!\n\n # \uC0C1\uD0DC \uC804\uC774\n changeIssueStatus(id: ID!, status: IssueStatus!, actor: String): Issue\n\n # \uC774\uBCA4\uD2B8\n addComment(issueId: ID!, content: String!, actor: String): IssueEvent!\n\n # \uB77C\uBCA8\n createLabel(name: String!, color: String, description: String): Label!\n deleteLabel(id: ID!): Boolean!\n\n # \uB9C8\uC77C\uC2A4\uD1A4\n createMilestone(name: String!, description: String, dueDate: String): Milestone!\n\n # \uBA54\uBAA8\uB9AC \uC5F0\uB3D9\n linkMemory(issueId: ID!, memoryId: String!): Boolean!\n autoLinkMemories(issueId: ID!): [String!]!\n }\n\n # ---- Types ----\n\n type Issue {\n id: ID!\n projectId: String!\n title: String!\n description: String!\n status: IssueStatus!\n priority: IssuePriority!\n source: IssueSource!\n labels: [String!]!\n assignee: String\n milestone: String\n relevantFiles: [String!]!\n acceptanceCriteria: [String!]!\n estimateMinutes: Int\n complexity: Complexity\n dependencies: [String!]!\n parentId: String\n childIds: [String!]!\n linearId: String\n linearIdentifier: String\n linearUrl: String\n memoryIds: [String!]!\n createdAt: String!\n updatedAt: String!\n closedAt: String\n }\n\n type IssueConnection {\n issues: [Issue!]!\n total: Int!\n }\n\n type IssueEvent {\n id: ID!\n issueId: String!\n type: IssueEventType!\n oldValue: String\n newValue: String\n content: String\n memoryId: String\n actor: String!\n createdAt: String!\n }\n\n type Label {\n id: ID!\n name: String!\n color: String!\n description: String\n }\n\n type Milestone {\n id: ID!\n name: String!\n description: String\n dueDate: String\n status: String!\n createdAt: String!\n }\n\n type IssueStats {\n total: Int!\n byStatus: [StatusCount!]!\n byPriority: [PriorityCount!]!\n byProject: [ProjectCount!]!\n recentlyCreated: Int!\n recentlyClosed: Int!\n }\n\n type StatusCount {\n status: String!\n count: Int!\n }\n\n type PriorityCount {\n priority: String!\n count: Int!\n }\n\n type ProjectCount {\n projectId: String!\n count: Int!\n }\n\n type IssueContext {\n linkedMemories: [MemoryRef!]!\n similarIssues: [Issue!]!\n }\n\n type MemoryRef {\n id: String!\n content: String!\n score: Float!\n }\n\n # ---- Enums ----\n\n enum IssueStatus {\n backlog\n todo\n in_progress\n in_review\n done\n cancelled\n }\n\n enum IssuePriority {\n urgent\n high\n medium\n low\n none\n }\n\n enum IssueSource {\n local\n linear\n github\n discord\n }\n\n enum Complexity {\n simple\n moderate\n complex\n very_complex\n }\n\n enum IssueEventType {\n created\n status_changed\n priority_changed\n assigned\n commented\n labeled\n linked\n memory_linked\n closed\n reopened\n }\n\n # ---- Inputs ----\n\n input CreateIssueInput {\n projectId: String!\n title: String!\n description: String\n status: IssueStatus\n priority: IssuePriority\n source: IssueSource\n labels: [String!]\n assignee: String\n milestone: String\n relevantFiles: [String!]\n acceptanceCriteria: [String!]\n estimateMinutes: Int\n complexity: Complexity\n dependencies: [String!]\n parentId: String\n linearId: String\n linearIdentifier: String\n linearUrl: String\n }\n\n input UpdateIssueInput {\n title: String\n description: String\n priority: IssuePriority\n labels: [String!]\n assignee: String\n milestone: String\n relevantFiles: [String!]\n acceptanceCriteria: [String!]\n estimateMinutes: Int\n complexity: Complexity\n dependencies: [String!]\n parentId: String\n }\n\n input IssueFilterInput {\n projectId: String\n status: [IssueStatus!]\n priority: [IssuePriority!]\n labels: [String!]\n assignee: String\n source: IssueSource\n parentId: String\n search: String\n limit: Int\n offset: Int\n }\n";
|
|
2
2
|
//# sourceMappingURL=typeDefs.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typeDefs.d.ts","sourceRoot":"","sources":["../../../src/issues/graphql/typeDefs.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,QAAQ,
|
|
1
|
+
{"version":3,"file":"typeDefs.d.ts","sourceRoot":"","sources":["../../../src/issues/graphql/typeDefs.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,QAAQ,wwJA+OpB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typeDefs.js","sourceRoot":"","sources":["../../../src/issues/graphql/typeDefs.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,qDAAqD;AACrD,sBAAsB;AACtB,0BAA0B;AAC1B,+CAA+C;AAE/C,MAAM,CAAC,MAAM,QAAQ,GAAG,aAAa,CAAC
|
|
1
|
+
{"version":3,"file":"typeDefs.js","sourceRoot":"","sources":["../../../src/issues/graphql/typeDefs.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,qDAAqD;AACrD,sBAAsB;AACtB,0BAA0B;AAC1B,+CAA+C;AAE/C,MAAM,CAAC,MAAM,QAAQ,GAAG,aAAa,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+OrC,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const ISSUE_BOARD_HTML = "<!DOCTYPE html>\n<html lang=\"ko\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>OpenSwarm :: Issues</title>\n <style>\n :root {\n --bg: #0a0c0a;\n --bg2: #0d100d;\n --bg3: #111411;\n --green: #00ff41;\n --green-dim: #003a00;\n --green-mid: #00aa00;\n --green-lo: #005500;\n --cyan: #00ccdd;\n --cyan-dim: #003344;\n --amber: #ffaa00;\n --red: #ff3333;\n --white: #ccddcc;\n --dim: #445544;\n --border: #1a2a1a;\n }\n * { box-sizing: border-box; margin: 0; padding: 0; }\n body {\n font-family: 'Cascadia Code', 'JetBrains Mono', 'Fira Code', monospace;\n background: var(--bg);\n color: var(--white);\n font-size: 13px;\n line-height: 1.4;\n height: 100vh;\n display: flex;\n flex-direction: column;\n }\n\n /* Header */\n header {\n height: 38px;\n background: var(--bg2);\n border-bottom: 1px solid var(--border);\n display: flex;\n align-items: center;\n padding: 0 1rem;\n gap: 0.75rem;\n flex-shrink: 0;\n }\n .hdr-logo { color: var(--green); font-weight: bold; font-size: 14px; letter-spacing: 0.15em; text-decoration: none; }\n .hdr-sep { color: var(--dim); margin: 0 0.5rem; }\n .hdr-sub { color: var(--cyan); font-size: 12px; letter-spacing: 0.1em; }\n .hdr-right { margin-left: auto; display: flex; align-items: center; gap: 0.5rem; }\n\n /* Toolbar */\n .toolbar {\n background: var(--bg2);\n border-bottom: 1px solid var(--border);\n padding: 6px 1rem;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n flex-shrink: 0;\n }\n .btn {\n background: var(--bg3);\n color: var(--green);\n border: 1px solid var(--green-dim);\n padding: 3px 10px;\n font-family: inherit;\n font-size: 11px;\n cursor: pointer;\n border-radius: 3px;\n }\n .btn:hover { background: var(--green-dim); }\n .btn-primary { color: var(--cyan); border-color: var(--cyan-dim); }\n .btn-primary:hover { background: var(--cyan-dim); }\n .filter-select {\n background: var(--bg3);\n color: var(--white);\n border: 1px solid var(--border);\n padding: 3px 6px;\n font-family: inherit;\n font-size: 11px;\n border-radius: 3px;\n }\n .search-input {\n background: var(--bg3);\n color: var(--white);\n border: 1px solid var(--border);\n padding: 3px 8px;\n font-family: inherit;\n font-size: 11px;\n width: 200px;\n border-radius: 3px;\n }\n .search-input::placeholder { color: var(--dim); }\n .stats-bar { margin-left: auto; color: var(--dim); font-size: 11px; }\n .stats-bar span { margin: 0 0.5rem; }\n .stats-val { color: var(--green); }\n\n /* Kanban Board */\n .board {\n flex: 1;\n display: flex;\n gap: 2px;\n padding: 8px;\n overflow-x: auto;\n min-height: 0;\n }\n .column {\n flex: 1;\n min-width: 220px;\n max-width: 320px;\n background: var(--bg2);\n border: 1px solid var(--border);\n border-radius: 4px;\n display: flex;\n flex-direction: column;\n }\n .col-header {\n padding: 6px 10px;\n background: var(--bg3);\n border-bottom: 1px solid var(--border);\n font-size: 11px;\n letter-spacing: 0.1em;\n display: flex;\n align-items: center;\n gap: 6px;\n }\n .col-header .count {\n background: var(--green-dim);\n color: var(--green);\n padding: 1px 6px;\n border-radius: 8px;\n font-size: 10px;\n }\n .col-body {\n flex: 1;\n overflow-y: auto;\n padding: 4px;\n }\n\n /* Issue Card */\n .card {\n background: var(--bg3);\n border: 1px solid var(--border);\n border-radius: 3px;\n padding: 8px;\n margin-bottom: 4px;\n cursor: pointer;\n transition: border-color 0.15s;\n }\n .card:hover { border-color: var(--green-lo); }\n .card-title { font-size: 12px; color: var(--white); margin-bottom: 4px; }\n .card-meta { font-size: 10px; color: var(--dim); display: flex; gap: 6px; flex-wrap: wrap; }\n .card-priority {\n display: inline-block;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n margin-right: 4px;\n }\n .p-urgent { background: var(--red); }\n .p-high { background: var(--amber); }\n .p-medium { background: var(--cyan); }\n .p-low { background: var(--dim); }\n .p-none { background: transparent; border: 1px solid var(--dim); }\n .card-label {\n font-size: 9px;\n padding: 1px 4px;\n border-radius: 2px;\n background: var(--green-dim);\n color: var(--green-mid);\n }\n .card-id { color: var(--dim); font-size: 9px; }\n\n /* Modal */\n .modal-overlay {\n display: none;\n position: fixed;\n inset: 0;\n background: rgba(0,0,0,0.7);\n z-index: 100;\n justify-content: center;\n align-items: center;\n }\n .modal-overlay.active { display: flex; }\n .modal {\n background: var(--bg2);\n border: 1px solid var(--green-dim);\n border-radius: 6px;\n width: 90%;\n max-width: 600px;\n max-height: 85vh;\n overflow-y: auto;\n padding: 1.5rem;\n }\n .modal h3 { color: var(--green); font-size: 14px; margin-bottom: 1rem; letter-spacing: 0.1em; }\n .form-group { margin-bottom: 0.75rem; }\n .form-group label { display: block; color: var(--dim); font-size: 10px; margin-bottom: 3px; letter-spacing: 0.05em; }\n .form-group input, .form-group textarea, .form-group select {\n width: 100%;\n background: var(--bg3);\n color: var(--white);\n border: 1px solid var(--border);\n padding: 6px 8px;\n font-family: inherit;\n font-size: 12px;\n border-radius: 3px;\n }\n .form-group textarea { min-height: 80px; resize: vertical; }\n .form-actions { display: flex; gap: 0.5rem; margin-top: 1rem; justify-content: flex-end; }\n .form-actions .btn { padding: 5px 16px; }\n\n /* Detail panel */\n .detail-panel {\n display: none;\n position: fixed;\n top: 0;\n right: 0;\n width: 420px;\n height: 100%;\n background: var(--bg2);\n border-left: 1px solid var(--green-dim);\n z-index: 90;\n overflow-y: auto;\n padding: 1rem;\n }\n .detail-panel.active { display: block; }\n .detail-close { float: right; cursor: pointer; color: var(--dim); font-size: 16px; }\n .detail-title { color: var(--green); font-size: 14px; margin-bottom: 0.5rem; margin-right: 2rem; }\n .detail-section { margin-top: 1rem; }\n .detail-section h4 { color: var(--cyan); font-size: 11px; letter-spacing: 0.05em; margin-bottom: 0.25rem; }\n .detail-section p, .detail-section ul { color: var(--white); font-size: 12px; }\n .detail-section ul { padding-left: 1rem; }\n .event-item { font-size: 11px; color: var(--dim); padding: 3px 0; border-bottom: 1px solid var(--border); }\n .event-item .ev-type { color: var(--amber); }\n </style>\n</head>\n<body>\n <header>\n <a href=\"/\" class=\"hdr-logo\">OpenSwarm</a>\n <span class=\"hdr-sep\">::</span>\n <span class=\"hdr-sub\">ISSUE TRACKER</span>\n <div class=\"hdr-right\">\n <span id=\"stats-summary\" style=\"color:var(--dim);font-size:11px\"></span>\n </div>\n </header>\n\n <div class=\"toolbar\">\n <button class=\"btn btn-primary\" onclick=\"openCreateModal()\">+ NEW ISSUE</button>\n <select class=\"filter-select\" id=\"filter-project\" onchange=\"applyFilter()\">\n <option value=\"\">all projects</option>\n </select>\n <select class=\"filter-select\" id=\"filter-priority\" onchange=\"applyFilter()\">\n <option value=\"\">all priorities</option>\n <option value=\"urgent\">urgent</option>\n <option value=\"high\">high</option>\n <option value=\"medium\">medium</option>\n <option value=\"low\">low</option>\n </select>\n <input type=\"text\" class=\"search-input\" id=\"search-input\" placeholder=\"search issues...\" oninput=\"debounceSearch()\">\n <div class=\"stats-bar\">\n <span>total: <span class=\"stats-val\" id=\"stat-total\">0</span></span>\n <span>open: <span class=\"stats-val\" id=\"stat-open\">0</span></span>\n <span>done: <span class=\"stats-val\" id=\"stat-done\">0</span></span>\n </div>\n </div>\n\n <div class=\"board\" id=\"board\">\n <!-- \uCE78\uBC18 \uCE7C\uB7FC\uC740 JS\uC5D0\uC11C \uB3D9\uC801 \uC0DD\uC131 -->\n </div>\n\n <!-- \uC774\uC288 \uC0DD\uC131 \uBAA8\uB2EC -->\n <div class=\"modal-overlay\" id=\"create-modal\">\n <div class=\"modal\">\n <h3>NEW ISSUE</h3>\n <div class=\"form-group\">\n <label>PROJECT</label>\n <select id=\"new-project\"></select>\n </div>\n <div class=\"form-group\">\n <label>TITLE</label>\n <input type=\"text\" id=\"new-title\" placeholder=\"\uC774\uC288 \uC81C\uBAA9\">\n </div>\n <div class=\"form-group\">\n <label>DESCRIPTION</label>\n <textarea id=\"new-desc\" placeholder=\"\uC0C1\uC138 \uC124\uBA85...\"></textarea>\n </div>\n <div style=\"display:flex;gap:0.75rem\">\n <div class=\"form-group\" style=\"flex:1\">\n <label>PRIORITY</label>\n <select id=\"new-priority\">\n <option value=\"medium\">medium</option>\n <option value=\"urgent\">urgent</option>\n <option value=\"high\">high</option>\n <option value=\"low\">low</option>\n <option value=\"none\">none</option>\n </select>\n </div>\n <div class=\"form-group\" style=\"flex:1\">\n <label>STATUS</label>\n <select id=\"new-status\">\n <option value=\"backlog\">backlog</option>\n <option value=\"todo\">todo</option>\n <option value=\"in_progress\">in_progress</option>\n </select>\n </div>\n </div>\n <div class=\"form-group\">\n <label>LABELS (comma separated)</label>\n <input type=\"text\" id=\"new-labels\" placeholder=\"bug, feature, ...\">\n </div>\n <div class=\"form-group\">\n <label>RELEVANT FILES (comma separated)</label>\n <input type=\"text\" id=\"new-files\" placeholder=\"src/foo.ts, src/bar.ts\">\n </div>\n <div class=\"form-actions\">\n <button class=\"btn\" onclick=\"closeCreateModal()\">CANCEL</button>\n <button class=\"btn btn-primary\" onclick=\"createIssue()\">CREATE</button>\n </div>\n </div>\n </div>\n\n <!-- \uC774\uC288 \uC0C1\uC138 \uD328\uB110 -->\n <div class=\"detail-panel\" id=\"detail-panel\">\n <span class=\"detail-close\" onclick=\"closeDetail()\">×</span>\n <div id=\"detail-content\"></div>\n </div>\n\n <script>\n const COLUMNS = [\n { status: 'backlog', label: 'BACKLOG', color: 'var(--dim)' },\n { status: 'todo', label: 'TODO', color: 'var(--white)' },\n { status: 'in_progress', label: 'IN PROGRESS', color: 'var(--amber)' },\n { status: 'in_review', label: 'IN REVIEW', color: 'var(--cyan)' },\n { status: 'done', label: 'DONE', color: 'var(--green)' },\n ];\n\n let allIssues = [];\n let projects = new Set();\n\n // GraphQL helper\n async function gql(query, variables = {}) {\n const res = await fetch('/graphql', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ query, variables }),\n });\n const json = await res.json();\n if (json.errors) {\n console.error('GraphQL errors:', json.errors);\n throw new Error(json.errors[0].message);\n }\n return json.data;\n }\n\n // \uC774\uC288 \uBAA9\uB85D \uB85C\uB4DC\n async function loadIssues() {\n const projectId = document.getElementById('filter-project').value || undefined;\n const priority = document.getElementById('filter-priority').value || undefined;\n const search = document.getElementById('search-input').value || undefined;\n\n const filter = {};\n if (projectId) filter.projectId = projectId;\n if (priority) filter.priority = [priority];\n if (search) filter.search = search;\n\n const data = await gql(`\n query ListIssues($filter: IssueFilterInput) {\n issues(filter: $filter) {\n issues {\n id projectId title description status priority source\n labels assignee relevantFiles dependencies childIds\n linearIdentifier memoryIds createdAt updatedAt closedAt\n }\n total\n }\n issueStats {\n total\n byStatus { status count }\n }\n }\n `, { filter: Object.keys(filter).length > 0 ? filter : null });\n\n allIssues = data.issues.issues;\n\n // \uD504\uB85C\uC81D\uD2B8 \uBAA9\uB85D \uAC31\uC2E0\n for (const iss of allIssues) projects.add(iss.projectId);\n updateProjectFilter();\n\n // \uD1B5\uACC4 \uAC31\uC2E0\n const stats = data.issueStats;\n document.getElementById('stat-total').textContent = stats.total;\n const openCount = stats.byStatus\n .filter(s => !['done', 'cancelled'].includes(s.status))\n .reduce((a, s) => a + s.count, 0);\n const doneCount = stats.byStatus.find(s => s.status === 'done')?.count || 0;\n document.getElementById('stat-open').textContent = openCount;\n document.getElementById('stat-done').textContent = doneCount;\n\n renderBoard();\n }\n\n function updateProjectFilter() {\n const sel = document.getElementById('filter-project');\n const current = sel.value;\n const opts = ['<option value=\"\">all projects</option>'];\n for (const p of projects) {\n opts.push('<option value=\"' + p + '\"' + (p === current ? ' selected' : '') + '>' + p + '</option>');\n }\n sel.innerHTML = opts.join('');\n }\n\n // \uCE78\uBC18 \uBCF4\uB4DC \uB80C\uB354\uB9C1\n function renderBoard() {\n const board = document.getElementById('board');\n board.innerHTML = '';\n\n for (const col of COLUMNS) {\n const issues = allIssues.filter(i => i.status === col.status);\n const colEl = document.createElement('div');\n colEl.className = 'column';\n colEl.innerHTML = `\n <div class=\"col-header\">\n <span style=\"color:${col.color}\">${col.label}</span>\n <span class=\"count\">${issues.length}</span>\n </div>\n <div class=\"col-body\" data-status=\"${col.status}\"></div>\n `;\n\n const body = colEl.querySelector('.col-body');\n for (const iss of issues) {\n body.appendChild(createCard(iss));\n }\n\n // \uB4DC\uB798\uADF8 \uB4DC\uB86D \uC218\uC2E0\n body.addEventListener('dragover', e => { e.preventDefault(); body.style.background = 'var(--green-dim)'; });\n body.addEventListener('dragleave', () => { body.style.background = ''; });\n body.addEventListener('drop', async e => {\n e.preventDefault();\n body.style.background = '';\n const issueId = e.dataTransfer.getData('text/plain');\n if (issueId && col.status) {\n await gql(`mutation($id:ID!,$s:IssueStatus!){changeIssueStatus(id:$id,status:$s){id}}`,\n { id: issueId, s: col.status });\n loadIssues();\n }\n });\n\n board.appendChild(colEl);\n }\n }\n\n function createCard(iss) {\n const card = document.createElement('div');\n card.className = 'card';\n card.draggable = true;\n card.addEventListener('dragstart', e => { e.dataTransfer.setData('text/plain', iss.id); });\n card.addEventListener('click', () => openDetail(iss.id));\n\n const priorityClass = 'p-' + iss.priority;\n const labels = (iss.labels || []).map(l => '<span class=\"card-label\">' + l + '</span>').join('');\n const timeAgo = formatTimeAgo(iss.updatedAt);\n\n card.innerHTML = `\n <div class=\"card-title\"><span class=\"card-priority ${priorityClass}\"></span>${escHtml(iss.title)}</div>\n <div class=\"card-meta\">\n <span class=\"card-id\">${iss.id.slice(0, 6)}</span>\n <span>${iss.projectId}</span>\n ${iss.assignee ? '<span>' + iss.assignee + '</span>' : ''}\n <span>${timeAgo}</span>\n </div>\n ${labels ? '<div class=\"card-meta\" style=\"margin-top:3px\">' + labels + '</div>' : ''}\n `;\n return card;\n }\n\n // \uC774\uC288 \uC0C1\uC138 \uD328\uB110\n async function openDetail(id) {\n const data = await gql(`\n query IssueDetail($id:ID!) {\n issue(id:$id) {\n id projectId title description status priority source\n labels assignee relevantFiles acceptanceCriteria\n dependencies childIds memoryIds createdAt updatedAt closedAt\n linearIdentifier linearUrl\n }\n issueEvents(issueId:$id, limit:20) {\n id type oldValue newValue content actor createdAt\n }\n }\n `, { id });\n\n const iss = data.issue;\n if (!iss) return;\n const events = data.issueEvents;\n\n const panel = document.getElementById('detail-panel');\n const content = document.getElementById('detail-content');\n\n const statusOptions = COLUMNS.map(c =>\n '<option value=\"' + c.status + '\"' + (c.status === iss.status ? ' selected' : '') + '>' + c.label + '</option>'\n ).join('');\n\n content.innerHTML = `\n <div class=\"detail-title\">${escHtml(iss.title)}</div>\n <div style=\"color:var(--dim);font-size:10px;margin-bottom:1rem\">\n ${iss.id} | ${iss.projectId}\n ${iss.linearIdentifier ? ' | <a href=\"' + iss.linearUrl + '\" style=\"color:var(--cyan)\" target=\"_blank\">' + iss.linearIdentifier + '</a>' : ''}\n </div>\n\n <div class=\"detail-section\">\n <h4>STATUS</h4>\n <select class=\"filter-select\" onchange=\"changeStatus('${iss.id}', this.value)\" style=\"width:100%\">\n ${statusOptions}\n <option value=\"cancelled\"${iss.status==='cancelled'?' selected':''}>CANCELLED</option>\n </select>\n </div>\n\n <div class=\"detail-section\">\n <h4>DESCRIPTION</h4>\n <p style=\"white-space:pre-wrap\">${escHtml(iss.description) || '<span style=\"color:var(--dim)\">no description</span>'}</p>\n </div>\n\n ${iss.relevantFiles.length ? '<div class=\"detail-section\"><h4>RELEVANT FILES</h4><ul>' + iss.relevantFiles.map(f => '<li>' + escHtml(f) + '</li>').join('') + '</ul></div>' : ''}\n\n ${iss.acceptanceCriteria.length ? '<div class=\"detail-section\"><h4>ACCEPTANCE CRITERIA</h4><ul>' + iss.acceptanceCriteria.map(c => '<li>' + escHtml(c) + '</li>').join('') + '</ul></div>' : ''}\n\n ${iss.dependencies.length ? '<div class=\"detail-section\"><h4>DEPENDENCIES</h4><p>' + iss.dependencies.join(', ') + '</p></div>' : ''}\n\n <div class=\"detail-section\">\n <h4>ACTIVITY (${events.length})</h4>\n ${events.map(ev => `\n <div class=\"event-item\">\n <span class=\"ev-type\">${ev.type}</span>\n ${ev.content ? ': ' + escHtml(ev.content).slice(0, 100) : ''}\n ${ev.oldValue && ev.newValue ? ': ' + ev.oldValue + ' \u2192 ' + ev.newValue : ''}\n <span style=\"float:right\">${formatTimeAgo(ev.createdAt)}</span>\n </div>\n `).join('')}\n </div>\n\n <div class=\"detail-section\" style=\"margin-top:1.5rem\">\n <h4>ADD COMMENT</h4>\n <textarea id=\"comment-input\" style=\"width:100%;background:var(--bg3);color:var(--white);border:1px solid var(--border);padding:6px;font-family:inherit;font-size:12px;min-height:60px;border-radius:3px\" placeholder=\"\uCF54\uBA58\uD2B8 \uC785\uB825...\"></textarea>\n <button class=\"btn btn-primary\" style=\"margin-top:4px\" onclick=\"addComment('${iss.id}')\">COMMENT</button>\n </div>\n\n <div class=\"form-actions\" style=\"margin-top:1.5rem;justify-content:flex-start\">\n <button class=\"btn\" style=\"color:var(--red);border-color:var(--red)\" onclick=\"deleteIssue('${iss.id}')\">DELETE</button>\n </div>\n `;\n\n panel.classList.add('active');\n }\n\n function closeDetail() {\n document.getElementById('detail-panel').classList.remove('active');\n }\n\n async function changeStatus(id, status) {\n await gql(`mutation($id:ID!,$s:IssueStatus!){changeIssueStatus(id:$id,status:$s){id}}`, { id, s: status });\n loadIssues();\n }\n\n async function addComment(id) {\n const input = document.getElementById('comment-input');\n const content = input.value.trim();\n if (!content) return;\n await gql(`mutation($id:ID!,$c:String!){addComment(issueId:$id,content:$c){id}}`, { id, c: content });\n input.value = '';\n openDetail(id);\n }\n\n async function deleteIssue(id) {\n if (!confirm('Delete this issue?')) return;\n await gql(`mutation($id:ID!){deleteIssue(id:$id)}`, { id });\n closeDetail();\n loadIssues();\n }\n\n // \uC774\uC288 \uC0DD\uC131\n function openCreateModal() {\n const sel = document.getElementById('new-project');\n sel.innerHTML = [...projects].map(p => '<option value=\"' + p + '\">' + p + '</option>').join('');\n if (sel.options.length === 0) {\n sel.innerHTML = '<option value=\"default\">default</option>';\n }\n document.getElementById('create-modal').classList.add('active');\n document.getElementById('new-title').focus();\n }\n\n function closeCreateModal() {\n document.getElementById('create-modal').classList.remove('active');\n }\n\n async function createIssue() {\n const title = document.getElementById('new-title').value.trim();\n if (!title) { alert('Title required'); return; }\n\n const input = {\n projectId: document.getElementById('new-project').value || 'default',\n title,\n description: document.getElementById('new-desc').value,\n priority: document.getElementById('new-priority').value,\n status: document.getElementById('new-status').value,\n labels: document.getElementById('new-labels').value.split(',').map(s => s.trim()).filter(Boolean),\n relevantFiles: document.getElementById('new-files').value.split(',').map(s => s.trim()).filter(Boolean),\n };\n\n await gql(`\n mutation CreateIssue($input: CreateIssueInput!) {\n createIssue(input: $input) { id }\n }\n `, { input });\n\n closeCreateModal();\n // \uD3FC \uCD08\uAE30\uD654\n document.getElementById('new-title').value = '';\n document.getElementById('new-desc').value = '';\n document.getElementById('new-labels').value = '';\n document.getElementById('new-files').value = '';\n loadIssues();\n }\n\n // \uC720\uD2F8\n function escHtml(s) {\n if (!s) return '';\n return s.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/\"/g,'"');\n }\n\n function formatTimeAgo(iso) {\n if (!iso) return '';\n const diff = Date.now() - new Date(iso).getTime();\n const mins = Math.floor(diff / 60000);\n if (mins < 1) return 'just now';\n if (mins < 60) return mins + 'm ago';\n const hrs = Math.floor(mins / 60);\n if (hrs < 24) return hrs + 'h ago';\n const days = Math.floor(hrs / 24);\n return days + 'd ago';\n }\n\n let searchTimer;\n function debounceSearch() {\n clearTimeout(searchTimer);\n searchTimer = setTimeout(loadIssues, 300);\n }\n\n function applyFilter() {\n loadIssues();\n }\n\n // \uD0A4\uBCF4\uB4DC \uB2E8\uCD95\uD0A4\n document.addEventListener('keydown', e => {\n if (e.key === 'Escape') {\n closeCreateModal();\n closeDetail();\n }\n if (e.key === 'n' && !e.target.closest('input,textarea,select')) {\n e.preventDefault();\n openCreateModal();\n }\n });\n\n // \uCD08\uAE30 \uB85C\uB4DC\n loadIssues();\n // 30\uCD08 \uAC04\uACA9 \uC790\uB3D9 \uC0C8\uB85C\uACE0\uCE68\n setInterval(loadIssues, 30000);\n </script>\n</body>\n</html>";
|
|
1
|
+
export declare const ISSUE_BOARD_HTML = "<!DOCTYPE html>\n<html lang=\"ko\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>OpenSwarm :: Issues</title>\n <style>\n :root {\n --bg: #0a0c0a;\n --bg2: #0d100d;\n --bg3: #111411;\n --green: #00ff41;\n --green-dim: #003a00;\n --green-mid: #00aa00;\n --green-lo: #005500;\n --cyan: #00ccdd;\n --cyan-dim: #003344;\n --amber: #ffaa00;\n --red: #ff3333;\n --white: #ccddcc;\n --dim: #445544;\n --border: #1a2a1a;\n }\n * { box-sizing: border-box; margin: 0; padding: 0; }\n body {\n font-family: 'Cascadia Code', 'JetBrains Mono', 'Fira Code', monospace;\n background: var(--bg);\n color: var(--white);\n font-size: 13px;\n line-height: 1.4;\n height: 100vh;\n display: flex;\n flex-direction: column;\n }\n\n /* Header */\n header {\n height: 38px;\n background: var(--bg2);\n border-bottom: 1px solid var(--border);\n display: flex;\n align-items: center;\n padding: 0 1rem;\n gap: 0.75rem;\n flex-shrink: 0;\n }\n .hdr-logo { color: var(--green); font-weight: bold; font-size: 14px; letter-spacing: 0.15em; text-decoration: none; }\n .hdr-sep { color: var(--dim); margin: 0 0.5rem; }\n .hdr-sub { color: var(--cyan); font-size: 12px; letter-spacing: 0.1em; }\n .hdr-right { margin-left: auto; display: flex; align-items: center; gap: 0.5rem; }\n\n /* Toolbar */\n .toolbar {\n background: var(--bg2);\n border-bottom: 1px solid var(--border);\n padding: 6px 1rem;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n flex-shrink: 0;\n }\n .btn {\n background: var(--bg3);\n color: var(--green);\n border: 1px solid var(--green-dim);\n padding: 3px 10px;\n font-family: inherit;\n font-size: 11px;\n cursor: pointer;\n border-radius: 3px;\n }\n .btn:hover { background: var(--green-dim); }\n .btn-primary { color: var(--cyan); border-color: var(--cyan-dim); }\n .btn-primary:hover { background: var(--cyan-dim); }\n .filter-select {\n background: var(--bg3);\n color: var(--white);\n border: 1px solid var(--border);\n padding: 3px 6px;\n font-family: inherit;\n font-size: 11px;\n border-radius: 3px;\n }\n .search-input {\n background: var(--bg3);\n color: var(--white);\n border: 1px solid var(--border);\n padding: 3px 8px;\n font-family: inherit;\n font-size: 11px;\n width: 200px;\n border-radius: 3px;\n }\n .search-input::placeholder { color: var(--dim); }\n .stats-bar { margin-left: auto; color: var(--dim); font-size: 11px; }\n .stats-bar span { margin: 0 0.5rem; }\n .stats-val { color: var(--green); }\n\n /* Kanban Board */\n .board {\n flex: 1;\n display: flex;\n gap: 2px;\n padding: 8px;\n overflow-x: auto;\n min-height: 0;\n }\n .column {\n flex: 1;\n min-width: 220px;\n max-width: 320px;\n background: var(--bg2);\n border: 1px solid var(--border);\n border-radius: 4px;\n display: flex;\n flex-direction: column;\n }\n .col-header {\n padding: 6px 10px;\n background: var(--bg3);\n border-bottom: 1px solid var(--border);\n font-size: 11px;\n letter-spacing: 0.1em;\n display: flex;\n align-items: center;\n gap: 6px;\n }\n .col-header .count {\n background: var(--green-dim);\n color: var(--green);\n padding: 1px 6px;\n border-radius: 8px;\n font-size: 10px;\n }\n .col-body {\n flex: 1;\n overflow-y: auto;\n padding: 4px;\n }\n\n /* Issue Card */\n .card {\n background: var(--bg3);\n border: 1px solid var(--border);\n border-radius: 3px;\n padding: 8px;\n margin-bottom: 4px;\n cursor: pointer;\n transition: border-color 0.15s;\n }\n .card:hover { border-color: var(--green-lo); }\n .card-title { font-size: 12px; color: var(--white); margin-bottom: 4px; }\n .card-meta { font-size: 10px; color: var(--dim); display: flex; gap: 6px; flex-wrap: wrap; }\n .card-priority {\n display: inline-block;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n margin-right: 4px;\n }\n .p-urgent { background: var(--red); }\n .p-high { background: var(--amber); }\n .p-medium { background: var(--cyan); }\n .p-low { background: var(--dim); }\n .p-none { background: transparent; border: 1px solid var(--dim); }\n .card-label {\n font-size: 9px;\n padding: 1px 4px;\n border-radius: 2px;\n background: var(--green-dim);\n color: var(--green-mid);\n }\n .card-id { color: var(--dim); font-size: 9px; }\n\n /* Modal */\n .modal-overlay {\n display: none;\n position: fixed;\n inset: 0;\n background: rgba(0,0,0,0.7);\n z-index: 100;\n justify-content: center;\n align-items: center;\n }\n .modal-overlay.active { display: flex; }\n .modal {\n background: var(--bg2);\n border: 1px solid var(--green-dim);\n border-radius: 6px;\n width: 90%;\n max-width: 600px;\n max-height: 85vh;\n overflow-y: auto;\n padding: 1.5rem;\n }\n .modal h3 { color: var(--green); font-size: 14px; margin-bottom: 1rem; letter-spacing: 0.1em; }\n .form-group { margin-bottom: 0.75rem; }\n .form-group label { display: block; color: var(--dim); font-size: 10px; margin-bottom: 3px; letter-spacing: 0.05em; }\n .form-group input, .form-group textarea, .form-group select {\n width: 100%;\n background: var(--bg3);\n color: var(--white);\n border: 1px solid var(--border);\n padding: 6px 8px;\n font-family: inherit;\n font-size: 12px;\n border-radius: 3px;\n }\n .form-group textarea { min-height: 80px; resize: vertical; }\n .form-actions { display: flex; gap: 0.5rem; margin-top: 1rem; justify-content: flex-end; }\n .form-actions .btn { padding: 5px 16px; }\n\n /* Detail panel */\n .detail-panel {\n display: none;\n position: fixed;\n top: 0;\n right: 0;\n width: 420px;\n height: 100%;\n background: var(--bg2);\n border-left: 1px solid var(--green-dim);\n z-index: 90;\n overflow-y: auto;\n padding: 1rem;\n }\n .detail-panel.active { display: block; }\n .detail-close { float: right; cursor: pointer; color: var(--dim); font-size: 16px; }\n .detail-title { color: var(--green); font-size: 14px; margin-bottom: 0.5rem; margin-right: 2rem; }\n .detail-section { margin-top: 1rem; }\n .detail-section h4 { color: var(--cyan); font-size: 11px; letter-spacing: 0.05em; margin-bottom: 0.25rem; }\n .detail-section p, .detail-section ul { color: var(--white); font-size: 12px; }\n .detail-section ul { padding-left: 1rem; }\n .event-item { font-size: 11px; color: var(--dim); padding: 3px 0; border-bottom: 1px solid var(--border); }\n .event-item .ev-type { color: var(--amber); }\n </style>\n</head>\n<body>\n <header>\n <a href=\"/\" class=\"hdr-logo\">OpenSwarm</a>\n <span class=\"hdr-sep\">::</span>\n <span class=\"hdr-sub\">ISSUE TRACKER</span>\n <div class=\"hdr-right\">\n <span id=\"stats-summary\" style=\"color:var(--dim);font-size:11px\"></span>\n </div>\n </header>\n\n <div class=\"toolbar\">\n <button class=\"btn btn-primary\" onclick=\"openCreateModal()\">+ NEW ISSUE</button>\n <select class=\"filter-select\" id=\"filter-project\" onchange=\"applyFilter()\">\n <option value=\"\">all projects</option>\n </select>\n <select class=\"filter-select\" id=\"filter-priority\" onchange=\"applyFilter()\">\n <option value=\"\">all priorities</option>\n <option value=\"urgent\">urgent</option>\n <option value=\"high\">high</option>\n <option value=\"medium\">medium</option>\n <option value=\"low\">low</option>\n </select>\n <input type=\"text\" class=\"search-input\" id=\"search-input\" placeholder=\"search issues...\" oninput=\"debounceSearch()\">\n <div class=\"stats-bar\">\n <span>total: <span class=\"stats-val\" id=\"stat-total\">0</span></span>\n <span>open: <span class=\"stats-val\" id=\"stat-open\">0</span></span>\n <span>done: <span class=\"stats-val\" id=\"stat-done\">0</span></span>\n </div>\n </div>\n\n <div class=\"board\" id=\"board\">\n <!-- \uCE78\uBC18 \uCE7C\uB7FC\uC740 JS\uC5D0\uC11C \uB3D9\uC801 \uC0DD\uC131 -->\n </div>\n\n <!-- \uC774\uC288 \uC0DD\uC131 \uBAA8\uB2EC -->\n <div class=\"modal-overlay\" id=\"create-modal\">\n <div class=\"modal\">\n <h3>NEW ISSUE</h3>\n <div class=\"form-group\">\n <label>PROJECT</label>\n <select id=\"new-project\"></select>\n </div>\n <div class=\"form-group\">\n <label>TITLE</label>\n <input type=\"text\" id=\"new-title\" placeholder=\"\uC774\uC288 \uC81C\uBAA9\">\n </div>\n <div class=\"form-group\">\n <label>DESCRIPTION</label>\n <textarea id=\"new-desc\" placeholder=\"\uC0C1\uC138 \uC124\uBA85...\"></textarea>\n </div>\n <div style=\"display:flex;gap:0.75rem\">\n <div class=\"form-group\" style=\"flex:1\">\n <label>PRIORITY</label>\n <select id=\"new-priority\">\n <option value=\"medium\">medium</option>\n <option value=\"urgent\">urgent</option>\n <option value=\"high\">high</option>\n <option value=\"low\">low</option>\n <option value=\"none\">none</option>\n </select>\n </div>\n <div class=\"form-group\" style=\"flex:1\">\n <label>STATUS</label>\n <select id=\"new-status\">\n <option value=\"backlog\">backlog</option>\n <option value=\"todo\">todo</option>\n <option value=\"in_progress\">in_progress</option>\n </select>\n </div>\n </div>\n <div class=\"form-group\">\n <label>LABELS (comma separated)</label>\n <input type=\"text\" id=\"new-labels\" placeholder=\"bug, feature, ...\">\n </div>\n <div class=\"form-group\">\n <label>RELEVANT FILES (comma separated)</label>\n <input type=\"text\" id=\"new-files\" placeholder=\"src/foo.ts, src/bar.ts\">\n </div>\n <div class=\"form-actions\">\n <button class=\"btn\" onclick=\"closeCreateModal()\">CANCEL</button>\n <button class=\"btn btn-primary\" onclick=\"createIssue()\">CREATE</button>\n </div>\n </div>\n </div>\n\n <!-- \uC774\uC288 \uC0C1\uC138 \uD328\uB110 -->\n <div class=\"detail-panel\" id=\"detail-panel\">\n <span class=\"detail-close\" onclick=\"closeDetail()\">×</span>\n <div id=\"detail-content\"></div>\n </div>\n\n <script>\n const COLUMNS = [\n { status: 'backlog', label: 'BACKLOG', color: 'var(--dim)' },\n { status: 'todo', label: 'TODO', color: 'var(--white)' },\n { status: 'in_progress', label: 'IN PROGRESS', color: 'var(--amber)' },\n { status: 'in_review', label: 'IN REVIEW', color: 'var(--cyan)' },\n { status: 'done', label: 'DONE', color: 'var(--green)' },\n { status: 'cancelled', label: 'CANCELLED', color: 'var(--red)' },\n ];\n\n let allIssues = [];\n let projects = new Set();\n\n // GraphQL helper\n async function gql(query, variables = {}) {\n const res = await fetch('/graphql', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ query, variables }),\n });\n const json = await res.json();\n if (json.errors) {\n console.error('GraphQL errors:', json.errors);\n throw new Error(json.errors[0].message);\n }\n return json.data;\n }\n\n // \uC774\uC288 \uBAA9\uB85D \uB85C\uB4DC\n async function loadIssues() {\n const projectId = document.getElementById('filter-project').value || undefined;\n const priority = document.getElementById('filter-priority').value || undefined;\n const search = document.getElementById('search-input').value || undefined;\n\n const filter = {};\n if (projectId) filter.projectId = projectId;\n if (priority) filter.priority = [priority];\n if (search) filter.search = search;\n\n const data = await gql(`\n query ListIssues($filter: IssueFilterInput) {\n issues(filter: $filter) {\n issues {\n id projectId title description status priority source\n labels assignee relevantFiles dependencies childIds\n linearIdentifier memoryIds createdAt updatedAt closedAt\n }\n total\n }\n issueStats {\n total\n byStatus { status count }\n }\n }\n `, { filter: Object.keys(filter).length > 0 ? filter : null });\n\n allIssues = data.issues.issues;\n\n // \uD504\uB85C\uC81D\uD2B8 \uBAA9\uB85D \uAC31\uC2E0\n for (const iss of allIssues) projects.add(iss.projectId);\n updateProjectFilter();\n\n // \uD1B5\uACC4 \uAC31\uC2E0\n const stats = data.issueStats;\n document.getElementById('stat-total').textContent = stats.total;\n const openCount = stats.byStatus\n .filter(s => !['done', 'cancelled'].includes(s.status))\n .reduce((a, s) => a + s.count, 0);\n const doneCount = stats.byStatus.find(s => s.status === 'done')?.count || 0;\n document.getElementById('stat-open').textContent = openCount;\n document.getElementById('stat-done').textContent = doneCount;\n\n renderBoard();\n }\n\n function updateProjectFilter() {\n const sel = document.getElementById('filter-project');\n const current = sel.value;\n const opts = ['<option value=\"\">all projects</option>'];\n for (const p of projects) {\n opts.push('<option value=\"' + escAttr(p) + '\"' + (p === current ? ' selected' : '') + '>' + escHtml(p) + '</option>');\n }\n sel.innerHTML = opts.join('');\n }\n\n // \uCE78\uBC18 \uBCF4\uB4DC \uB80C\uB354\uB9C1\n function renderBoard() {\n const board = document.getElementById('board');\n board.innerHTML = '';\n\n for (const col of COLUMNS) {\n const issues = allIssues.filter(i => i.status === col.status);\n const colEl = document.createElement('div');\n colEl.className = 'column';\n colEl.innerHTML = `\n <div class=\"col-header\">\n <span style=\"color:${col.color}\">${col.label}</span>\n <span class=\"count\">${issues.length}</span>\n </div>\n <div class=\"col-body\" data-status=\"${col.status}\"></div>\n `;\n\n const body = colEl.querySelector('.col-body');\n for (const iss of issues) {\n body.appendChild(createCard(iss));\n }\n\n // \uB4DC\uB798\uADF8 \uB4DC\uB86D \uC218\uC2E0\n body.addEventListener('dragover', e => { e.preventDefault(); body.style.background = 'var(--green-dim)'; });\n body.addEventListener('dragleave', () => { body.style.background = ''; });\n body.addEventListener('drop', async e => {\n e.preventDefault();\n body.style.background = '';\n const issueId = e.dataTransfer.getData('text/plain');\n if (issueId && col.status) {\n await gql(`mutation($id:ID!,$s:IssueStatus!){changeIssueStatus(id:$id,status:$s){id}}`,\n { id: issueId, s: col.status });\n loadIssues();\n }\n });\n\n board.appendChild(colEl);\n }\n }\n\n function createCard(iss) {\n const card = document.createElement('div');\n card.className = 'card';\n card.draggable = true;\n card.addEventListener('dragstart', e => { e.dataTransfer.setData('text/plain', iss.id); });\n card.addEventListener('click', () => openDetail(iss.id));\n\n const priorityClass = 'p-' + iss.priority;\n const labels = (iss.labels || []).map(l => '<span class=\"card-label\">' + escHtml(l) + '</span>').join('');\n const timeAgo = formatTimeAgo(iss.updatedAt);\n\n card.innerHTML = `\n <div class=\"card-title\"><span class=\"card-priority ${escAttr(priorityClass)}\"></span>${escHtml(iss.title)}</div>\n <div class=\"card-meta\">\n <span class=\"card-id\">${escHtml(iss.id.slice(0, 6))}</span>\n <span>${escHtml(iss.projectId)}</span>\n ${iss.assignee ? '<span>' + escHtml(iss.assignee) + '</span>' : ''}\n <span>${escHtml(timeAgo)}</span>\n </div>\n ${labels ? '<div class=\"card-meta\" style=\"margin-top:3px\">' + labels + '</div>' : ''}\n `;\n return card;\n }\n\n // \uC774\uC288 \uC0C1\uC138 \uD328\uB110\n async function openDetail(id) {\n const data = await gql(`\n query IssueDetail($id:ID!) {\n issue(id:$id) {\n id projectId title description status priority source\n labels assignee relevantFiles acceptanceCriteria\n dependencies childIds memoryIds createdAt updatedAt closedAt\n linearIdentifier linearUrl\n }\n issueEvents(issueId:$id, limit:20) {\n id type oldValue newValue content actor createdAt\n }\n }\n `, { id });\n\n const iss = data.issue;\n if (!iss) return;\n const events = data.issueEvents;\n\n const panel = document.getElementById('detail-panel');\n const content = document.getElementById('detail-content');\n\n const statusOptions = COLUMNS.map(c =>\n '<option value=\"' + escAttr(c.status) + '\"' + (c.status === iss.status ? ' selected' : '') + '>' + escHtml(c.label) + '</option>'\n ).join('');\n const linearLink = iss.linearIdentifier && iss.linearUrl\n ? ' | <a href=\"' + escAttr(safeUrl(iss.linearUrl)) + '\" style=\"color:var(--cyan)\" target=\"_blank\" rel=\"noopener noreferrer\">' + escHtml(iss.linearIdentifier) + '</a>'\n : '';\n\n content.innerHTML = `\n <div class=\"detail-title\">${escHtml(iss.title)}</div>\n <div style=\"color:var(--dim);font-size:10px;margin-bottom:1rem\">\n ${escHtml(iss.id)} | ${escHtml(iss.projectId)}\n ${linearLink}\n </div>\n\n <div class=\"detail-section\">\n <h4>STATUS</h4>\n <select class=\"filter-select\" onchange=\"changeStatus('${escJsArg(iss.id)}', this.value)\" style=\"width:100%\">\n ${statusOptions}\n </select>\n </div>\n\n <div class=\"detail-section\">\n <h4>DESCRIPTION</h4>\n <p style=\"white-space:pre-wrap\">${escHtml(iss.description) || '<span style=\"color:var(--dim)\">no description</span>'}</p>\n </div>\n\n ${iss.relevantFiles.length ? '<div class=\"detail-section\"><h4>RELEVANT FILES</h4><ul>' + iss.relevantFiles.map(f => '<li>' + escHtml(f) + '</li>').join('') + '</ul></div>' : ''}\n\n ${iss.acceptanceCriteria.length ? '<div class=\"detail-section\"><h4>ACCEPTANCE CRITERIA</h4><ul>' + iss.acceptanceCriteria.map(c => '<li>' + escHtml(c) + '</li>').join('') + '</ul></div>' : ''}\n\n ${iss.dependencies.length ? '<div class=\"detail-section\"><h4>DEPENDENCIES</h4><p>' + iss.dependencies.map(d => escHtml(d)).join(', ') + '</p></div>' : ''}\n\n <div class=\"detail-section\">\n <h4>ACTIVITY (${events.length})</h4>\n ${events.map(ev => `\n <div class=\"event-item\">\n <span class=\"ev-type\">${escHtml(ev.type)}</span>\n ${ev.content ? ': ' + escHtml(ev.content).slice(0, 100) : ''}\n ${ev.oldValue && ev.newValue ? ': ' + escHtml(ev.oldValue) + ' \u2192 ' + escHtml(ev.newValue) : ''}\n <span style=\"float:right\">${escHtml(formatTimeAgo(ev.createdAt))}</span>\n </div>\n `).join('')}\n </div>\n\n <div class=\"detail-section\" style=\"margin-top:1.5rem\">\n <h4>ADD COMMENT</h4>\n <textarea id=\"comment-input\" style=\"width:100%;background:var(--bg3);color:var(--white);border:1px solid var(--border);padding:6px;font-family:inherit;font-size:12px;min-height:60px;border-radius:3px\" placeholder=\"\uCF54\uBA58\uD2B8 \uC785\uB825...\"></textarea>\n <button class=\"btn btn-primary\" style=\"margin-top:4px\" onclick=\"addComment('${escJsArg(iss.id)}')\">COMMENT</button>\n </div>\n\n <div class=\"form-actions\" style=\"margin-top:1.5rem;justify-content:flex-start\">\n <button class=\"btn\" style=\"color:var(--red);border-color:var(--red)\" onclick=\"deleteIssue('${escJsArg(iss.id)}')\">DELETE</button>\n </div>\n `;\n\n panel.classList.add('active');\n }\n\n function closeDetail() {\n document.getElementById('detail-panel').classList.remove('active');\n }\n\n async function changeStatus(id, status) {\n await gql(`mutation($id:ID!,$s:IssueStatus!){changeIssueStatus(id:$id,status:$s){id}}`, { id, s: status });\n loadIssues();\n }\n\n async function addComment(id) {\n const input = document.getElementById('comment-input');\n const content = input.value.trim();\n if (!content) return;\n await gql(`mutation($id:ID!,$c:String!){addComment(issueId:$id,content:$c){id}}`, { id, c: content });\n input.value = '';\n openDetail(id);\n }\n\n async function deleteIssue(id) {\n if (!confirm('Delete this issue?')) return;\n await gql(`mutation($id:ID!){deleteIssue(id:$id)}`, { id });\n closeDetail();\n loadIssues();\n }\n\n // \uC774\uC288 \uC0DD\uC131\n function openCreateModal() {\n const sel = document.getElementById('new-project');\n sel.innerHTML = [...projects].map(p => '<option value=\"' + escAttr(p) + '\">' + escHtml(p) + '</option>').join('');\n if (sel.options.length === 0) {\n sel.innerHTML = '<option value=\"default\">default</option>';\n }\n document.getElementById('create-modal').classList.add('active');\n document.getElementById('new-title').focus();\n }\n\n function closeCreateModal() {\n document.getElementById('create-modal').classList.remove('active');\n }\n\n async function createIssue() {\n const title = document.getElementById('new-title').value.trim();\n if (!title) { alert('Title required'); return; }\n\n const input = {\n projectId: document.getElementById('new-project').value || 'default',\n title,\n description: document.getElementById('new-desc').value,\n priority: document.getElementById('new-priority').value,\n status: document.getElementById('new-status').value,\n labels: document.getElementById('new-labels').value.split(',').map(s => s.trim()).filter(Boolean),\n relevantFiles: document.getElementById('new-files').value.split(',').map(s => s.trim()).filter(Boolean),\n };\n\n await gql(`\n mutation CreateIssue($input: CreateIssueInput!) {\n createIssue(input: $input) { id }\n }\n `, { input });\n\n closeCreateModal();\n // \uD3FC \uCD08\uAE30\uD654\n document.getElementById('new-title').value = '';\n document.getElementById('new-desc').value = '';\n document.getElementById('new-labels').value = '';\n document.getElementById('new-files').value = '';\n loadIssues();\n }\n\n // \uC720\uD2F8\n function escHtml(s) {\n if (!s) return '';\n return String(s).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/\"/g,'"').replace(/'/g,''');\n }\n\n function escAttr(s) {\n return escHtml(s);\n }\n\n function escJsArg(s) {\n return escAttr(String(s).replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\"));\n }\n\n function safeUrl(url) {\n try {\n const parsed = new URL(url, window.location.origin);\n return ['http:', 'https:'].includes(parsed.protocol) ? parsed.href : '#';\n } catch {\n return '#';\n }\n }\n\n function formatTimeAgo(iso) {\n if (!iso) return '';\n const diff = Date.now() - new Date(iso).getTime();\n const mins = Math.floor(diff / 60000);\n if (mins < 1) return 'just now';\n if (mins < 60) return mins + 'm ago';\n const hrs = Math.floor(mins / 60);\n if (hrs < 24) return hrs + 'h ago';\n const days = Math.floor(hrs / 24);\n return days + 'd ago';\n }\n\n let searchTimer;\n function debounceSearch() {\n clearTimeout(searchTimer);\n searchTimer = setTimeout(loadIssues, 300);\n }\n\n function applyFilter() {\n loadIssues();\n }\n\n // \uD0A4\uBCF4\uB4DC \uB2E8\uCD95\uD0A4\n document.addEventListener('keydown', e => {\n if (e.key === 'Escape') {\n closeCreateModal();\n closeDetail();\n }\n if (e.key === 'n' && !e.target.closest('input,textarea,select')) {\n e.preventDefault();\n openCreateModal();\n }\n });\n\n // \uCD08\uAE30 \uB85C\uB4DC\n loadIssues();\n // 30\uCD08 \uAC04\uACA9 \uC790\uB3D9 \uC0C8\uB85C\uACE0\uCE68\n setInterval(loadIssues, 30000);\n </script>\n</body>\n</html>";
|
|
2
2
|
//# sourceMappingURL=issueBoardHtml.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"issueBoardHtml.d.ts","sourceRoot":"","sources":["../../src/issues/issueBoardHtml.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,gBAAgB
|
|
1
|
+
{"version":3,"file":"issueBoardHtml.d.ts","sourceRoot":"","sources":["../../src/issues/issueBoardHtml.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,gBAAgB,m4xBAkrBrB,CAAC"}
|
|
@@ -338,6 +338,7 @@ export const ISSUE_BOARD_HTML = `<!DOCTYPE html>
|
|
|
338
338
|
{ status: 'in_progress', label: 'IN PROGRESS', color: 'var(--amber)' },
|
|
339
339
|
{ status: 'in_review', label: 'IN REVIEW', color: 'var(--cyan)' },
|
|
340
340
|
{ status: 'done', label: 'DONE', color: 'var(--green)' },
|
|
341
|
+
{ status: 'cancelled', label: 'CANCELLED', color: 'var(--red)' },
|
|
341
342
|
];
|
|
342
343
|
|
|
343
344
|
let allIssues = [];
|
|
@@ -410,7 +411,7 @@ export const ISSUE_BOARD_HTML = `<!DOCTYPE html>
|
|
|
410
411
|
const current = sel.value;
|
|
411
412
|
const opts = ['<option value="">all projects</option>'];
|
|
412
413
|
for (const p of projects) {
|
|
413
|
-
opts.push('<option value="' + p + '"' + (p === current ? ' selected' : '') + '>' + p + '</option>');
|
|
414
|
+
opts.push('<option value="' + escAttr(p) + '"' + (p === current ? ' selected' : '') + '>' + escHtml(p) + '</option>');
|
|
414
415
|
}
|
|
415
416
|
sel.innerHTML = opts.join('');
|
|
416
417
|
}
|
|
@@ -463,16 +464,16 @@ export const ISSUE_BOARD_HTML = `<!DOCTYPE html>
|
|
|
463
464
|
card.addEventListener('click', () => openDetail(iss.id));
|
|
464
465
|
|
|
465
466
|
const priorityClass = 'p-' + iss.priority;
|
|
466
|
-
const labels = (iss.labels || []).map(l => '<span class="card-label">' + l + '</span>').join('');
|
|
467
|
+
const labels = (iss.labels || []).map(l => '<span class="card-label">' + escHtml(l) + '</span>').join('');
|
|
467
468
|
const timeAgo = formatTimeAgo(iss.updatedAt);
|
|
468
469
|
|
|
469
470
|
card.innerHTML = \`
|
|
470
|
-
<div class="card-title"><span class="card-priority \${priorityClass}"></span>\${escHtml(iss.title)}</div>
|
|
471
|
+
<div class="card-title"><span class="card-priority \${escAttr(priorityClass)}"></span>\${escHtml(iss.title)}</div>
|
|
471
472
|
<div class="card-meta">
|
|
472
|
-
<span class="card-id">\${iss.id.slice(0, 6)}</span>
|
|
473
|
-
<span>\${iss.projectId}</span>
|
|
474
|
-
\${iss.assignee ? '<span>' + iss.assignee + '</span>' : ''}
|
|
475
|
-
<span>\${timeAgo}</span>
|
|
473
|
+
<span class="card-id">\${escHtml(iss.id.slice(0, 6))}</span>
|
|
474
|
+
<span>\${escHtml(iss.projectId)}</span>
|
|
475
|
+
\${iss.assignee ? '<span>' + escHtml(iss.assignee) + '</span>' : ''}
|
|
476
|
+
<span>\${escHtml(timeAgo)}</span>
|
|
476
477
|
</div>
|
|
477
478
|
\${labels ? '<div class="card-meta" style="margin-top:3px">' + labels + '</div>' : ''}
|
|
478
479
|
\`;
|
|
@@ -503,21 +504,23 @@ export const ISSUE_BOARD_HTML = `<!DOCTYPE html>
|
|
|
503
504
|
const content = document.getElementById('detail-content');
|
|
504
505
|
|
|
505
506
|
const statusOptions = COLUMNS.map(c =>
|
|
506
|
-
'<option value="' + c.status + '"' + (c.status === iss.status ? ' selected' : '') + '>' + c.label + '</option>'
|
|
507
|
+
'<option value="' + escAttr(c.status) + '"' + (c.status === iss.status ? ' selected' : '') + '>' + escHtml(c.label) + '</option>'
|
|
507
508
|
).join('');
|
|
509
|
+
const linearLink = iss.linearIdentifier && iss.linearUrl
|
|
510
|
+
? ' | <a href="' + escAttr(safeUrl(iss.linearUrl)) + '" style="color:var(--cyan)" target="_blank" rel="noopener noreferrer">' + escHtml(iss.linearIdentifier) + '</a>'
|
|
511
|
+
: '';
|
|
508
512
|
|
|
509
513
|
content.innerHTML = \`
|
|
510
514
|
<div class="detail-title">\${escHtml(iss.title)}</div>
|
|
511
515
|
<div style="color:var(--dim);font-size:10px;margin-bottom:1rem">
|
|
512
|
-
\${iss.id} | \${iss.projectId}
|
|
513
|
-
\${
|
|
516
|
+
\${escHtml(iss.id)} | \${escHtml(iss.projectId)}
|
|
517
|
+
\${linearLink}
|
|
514
518
|
</div>
|
|
515
519
|
|
|
516
520
|
<div class="detail-section">
|
|
517
521
|
<h4>STATUS</h4>
|
|
518
|
-
<select class="filter-select" onchange="changeStatus('\${iss.id}', this.value)" style="width:100%">
|
|
522
|
+
<select class="filter-select" onchange="changeStatus('\${escJsArg(iss.id)}', this.value)" style="width:100%">
|
|
519
523
|
\${statusOptions}
|
|
520
|
-
<option value="cancelled"\${iss.status==='cancelled'?' selected':''}>CANCELLED</option>
|
|
521
524
|
</select>
|
|
522
525
|
</div>
|
|
523
526
|
|
|
@@ -530,16 +533,16 @@ export const ISSUE_BOARD_HTML = `<!DOCTYPE html>
|
|
|
530
533
|
|
|
531
534
|
\${iss.acceptanceCriteria.length ? '<div class="detail-section"><h4>ACCEPTANCE CRITERIA</h4><ul>' + iss.acceptanceCriteria.map(c => '<li>' + escHtml(c) + '</li>').join('') + '</ul></div>' : ''}
|
|
532
535
|
|
|
533
|
-
\${iss.dependencies.length ? '<div class="detail-section"><h4>DEPENDENCIES</h4><p>' + iss.dependencies.join(', ') + '</p></div>' : ''}
|
|
536
|
+
\${iss.dependencies.length ? '<div class="detail-section"><h4>DEPENDENCIES</h4><p>' + iss.dependencies.map(d => escHtml(d)).join(', ') + '</p></div>' : ''}
|
|
534
537
|
|
|
535
538
|
<div class="detail-section">
|
|
536
539
|
<h4>ACTIVITY (\${events.length})</h4>
|
|
537
540
|
\${events.map(ev => \`
|
|
538
541
|
<div class="event-item">
|
|
539
|
-
<span class="ev-type">\${ev.type}</span>
|
|
542
|
+
<span class="ev-type">\${escHtml(ev.type)}</span>
|
|
540
543
|
\${ev.content ? ': ' + escHtml(ev.content).slice(0, 100) : ''}
|
|
541
|
-
\${ev.oldValue && ev.newValue ? ': ' + ev.oldValue + ' → ' + ev.newValue : ''}
|
|
542
|
-
<span style="float:right">\${formatTimeAgo(ev.createdAt)}</span>
|
|
544
|
+
\${ev.oldValue && ev.newValue ? ': ' + escHtml(ev.oldValue) + ' → ' + escHtml(ev.newValue) : ''}
|
|
545
|
+
<span style="float:right">\${escHtml(formatTimeAgo(ev.createdAt))}</span>
|
|
543
546
|
</div>
|
|
544
547
|
\`).join('')}
|
|
545
548
|
</div>
|
|
@@ -547,11 +550,11 @@ export const ISSUE_BOARD_HTML = `<!DOCTYPE html>
|
|
|
547
550
|
<div class="detail-section" style="margin-top:1.5rem">
|
|
548
551
|
<h4>ADD COMMENT</h4>
|
|
549
552
|
<textarea id="comment-input" style="width:100%;background:var(--bg3);color:var(--white);border:1px solid var(--border);padding:6px;font-family:inherit;font-size:12px;min-height:60px;border-radius:3px" placeholder="코멘트 입력..."></textarea>
|
|
550
|
-
<button class="btn btn-primary" style="margin-top:4px" onclick="addComment('\${iss.id}')">COMMENT</button>
|
|
553
|
+
<button class="btn btn-primary" style="margin-top:4px" onclick="addComment('\${escJsArg(iss.id)}')">COMMENT</button>
|
|
551
554
|
</div>
|
|
552
555
|
|
|
553
556
|
<div class="form-actions" style="margin-top:1.5rem;justify-content:flex-start">
|
|
554
|
-
<button class="btn" style="color:var(--red);border-color:var(--red)" onclick="deleteIssue('\${iss.id}')">DELETE</button>
|
|
557
|
+
<button class="btn" style="color:var(--red);border-color:var(--red)" onclick="deleteIssue('\${escJsArg(iss.id)}')">DELETE</button>
|
|
555
558
|
</div>
|
|
556
559
|
\`;
|
|
557
560
|
|
|
@@ -586,7 +589,7 @@ export const ISSUE_BOARD_HTML = `<!DOCTYPE html>
|
|
|
586
589
|
// 이슈 생성
|
|
587
590
|
function openCreateModal() {
|
|
588
591
|
const sel = document.getElementById('new-project');
|
|
589
|
-
sel.innerHTML = [...projects].map(p => '<option value="' + p + '">' + p + '</option>').join('');
|
|
592
|
+
sel.innerHTML = [...projects].map(p => '<option value="' + escAttr(p) + '">' + escHtml(p) + '</option>').join('');
|
|
590
593
|
if (sel.options.length === 0) {
|
|
591
594
|
sel.innerHTML = '<option value="default">default</option>';
|
|
592
595
|
}
|
|
@@ -630,7 +633,24 @@ export const ISSUE_BOARD_HTML = `<!DOCTYPE html>
|
|
|
630
633
|
// 유틸
|
|
631
634
|
function escHtml(s) {
|
|
632
635
|
if (!s) return '';
|
|
633
|
-
return s.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"');
|
|
636
|
+
return String(s).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"').replace(/'/g,''');
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
function escAttr(s) {
|
|
640
|
+
return escHtml(s);
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
function escJsArg(s) {
|
|
644
|
+
return escAttr(String(s).replace(/\\\\/g, '\\\\\\\\').replace(/'/g, "\\\\'"));
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
function safeUrl(url) {
|
|
648
|
+
try {
|
|
649
|
+
const parsed = new URL(url, window.location.origin);
|
|
650
|
+
return ['http:', 'https:'].includes(parsed.protocol) ? parsed.href : '#';
|
|
651
|
+
} catch {
|
|
652
|
+
return '#';
|
|
653
|
+
}
|
|
634
654
|
}
|
|
635
655
|
|
|
636
656
|
function formatTimeAgo(iso) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"issueBoardHtml.js","sourceRoot":"","sources":["../../src/issues/issueBoardHtml.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,wCAAwC;AACxC,sBAAsB;AACtB,iCAAiC;AACjC,+CAA+C;AAE/C,MAAM,CAAC,MAAM,gBAAgB,GAAG
|
|
1
|
+
{"version":3,"file":"issueBoardHtml.js","sourceRoot":"","sources":["../../src/issues/issueBoardHtml.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,wCAAwC;AACxC,sBAAsB;AACtB,iCAAiC;AACjC,+CAA+C;AAE/C,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAkrBxB,CAAC"}
|
|
@@ -4,7 +4,7 @@ import type { IssueStatus } from './schema.js';
|
|
|
4
4
|
* Linear 브릿지 초기화
|
|
5
5
|
* config.yaml에서 linear.enabled: true 일 때만 호출
|
|
6
6
|
*/
|
|
7
|
-
export declare function initLinearBridge(apiKey: string, teamId: string): void
|
|
7
|
+
export declare function initLinearBridge(apiKey: string, teamId: string): Promise<void>;
|
|
8
8
|
/**
|
|
9
9
|
* Linear → 로컬: Linear 이슈를 로컬 DB에 동기화
|
|
10
10
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"linearBridge.d.ts","sourceRoot":"","sources":["../../src/issues/linearBridge.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAS,WAAW,EAAiB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"linearBridge.d.ts","sourceRoot":"","sources":["../../src/issues/linearBridge.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAS,WAAW,EAAiB,MAAM,aAAa,CAAC;AAOrE;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAY9E;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,gBAAgB,EACvB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9C,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAkD/C;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,gBAAgB,EACvB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA2CxB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,gBAAgB,EACvB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,WAAW,GACrB,OAAO,CAAC,OAAO,CAAC,CAgBlB;AA8FD,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C"}
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
// Linear SDK는 동적 import (Linear 미사용 시 로드 안 함)
|
|
8
8
|
let linearClient = null;
|
|
9
9
|
let linearTeamId = '';
|
|
10
|
+
let linearInitPromise = null;
|
|
10
11
|
/**
|
|
11
12
|
* Linear 브릿지 초기화
|
|
12
13
|
* config.yaml에서 linear.enabled: true 일 때만 호출
|
|
@@ -14,17 +15,21 @@ let linearTeamId = '';
|
|
|
14
15
|
export function initLinearBridge(apiKey, teamId) {
|
|
15
16
|
// 기존 linear.ts의 클라이언트를 재사용하기 위해 동적 import
|
|
16
17
|
linearTeamId = teamId;
|
|
17
|
-
|
|
18
|
+
linearClient = null;
|
|
19
|
+
linearInitPromise = import('@linear/sdk').then(({ LinearClient }) => {
|
|
18
20
|
linearClient = new LinearClient({ apiKey });
|
|
19
21
|
console.log('[LinearBridge] 초기화 완료 — team:', teamId);
|
|
20
22
|
}).catch((err) => {
|
|
23
|
+
linearClient = null;
|
|
21
24
|
console.warn('[LinearBridge] Linear SDK 로드 실패:', err);
|
|
22
25
|
});
|
|
26
|
+
return linearInitPromise;
|
|
23
27
|
}
|
|
24
28
|
/**
|
|
25
29
|
* Linear → 로컬: Linear 이슈를 로컬 DB에 동기화
|
|
26
30
|
*/
|
|
27
31
|
export async function syncFromLinear(store, projectId, options) {
|
|
32
|
+
await waitForLinearBridgeInit();
|
|
28
33
|
if (!linearClient) {
|
|
29
34
|
console.warn('[LinearBridge] 클라이언트 미초기화');
|
|
30
35
|
return { created: 0, updated: 0 };
|
|
@@ -73,6 +78,7 @@ export async function syncFromLinear(store, projectId, options) {
|
|
|
73
78
|
* 로컬 → Linear: 로컬 이슈를 Linear에 생성
|
|
74
79
|
*/
|
|
75
80
|
export async function pushToLinear(store, issueId) {
|
|
81
|
+
await waitForLinearBridgeInit();
|
|
76
82
|
if (!linearClient) {
|
|
77
83
|
console.warn('[LinearBridge] 클라이언트 미초기화');
|
|
78
84
|
return null;
|
|
@@ -116,6 +122,7 @@ export async function pushToLinear(store, issueId) {
|
|
|
116
122
|
* 상태 동기화: 로컬 상태 변경 → Linear 반영
|
|
117
123
|
*/
|
|
118
124
|
export async function syncStatusToLinear(store, issueId, newStatus) {
|
|
125
|
+
await waitForLinearBridgeInit();
|
|
119
126
|
if (!linearClient)
|
|
120
127
|
return false;
|
|
121
128
|
const issue = store.getIssue(issueId);
|
|
@@ -133,11 +140,13 @@ export async function syncStatusToLinear(store, issueId, newStatus) {
|
|
|
133
140
|
}
|
|
134
141
|
}
|
|
135
142
|
// ============ 매핑 유틸 ============
|
|
143
|
+
async function waitForLinearBridgeInit() {
|
|
144
|
+
if (linearInitPromise) {
|
|
145
|
+
await linearInitPromise;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
136
148
|
function findByLinearId(store, linearId) {
|
|
137
|
-
|
|
138
|
-
// 간단히 전체 목록에서 찾기 (비효율적이지만 동기화는 드물게 실행)
|
|
139
|
-
const { issues: all } = store.listIssues({ limit: 1000, offset: 0 });
|
|
140
|
-
return all.find((i) => i.linearId === linearId) ?? null;
|
|
149
|
+
return store.getIssueByLinearId(linearId);
|
|
141
150
|
}
|
|
142
151
|
async function mapLinearToLocal(linearIssue, projectId) {
|
|
143
152
|
const state = await linearIssue.state;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"linearBridge.js","sourceRoot":"","sources":["../../src/issues/linearBridge.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,0CAA0C;AAC1C,sBAAsB;AACtB,gDAAgD;AAChD,yCAAyC;AACzC,+CAA+C;AAK/C,8CAA8C;AAC9C,IAAI,YAAY,GAAQ,IAAI,CAAC;AAC7B,IAAI,YAAY,GAAW,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"linearBridge.js","sourceRoot":"","sources":["../../src/issues/linearBridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memoryBridge.d.ts","sourceRoot":"","sources":["../../src/issues/memoryBridge.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,gBAAgB,EACvB,KAAK,EAAE,KAAK,GACX,OAAO,CAAC,MAAM,EAAE,CAAC,CAoBnB;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,gBAAgB,EACvB,KAAK,EAAE,KAAK,GACX,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAqDxB;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,gBAAgB,EACvB,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAkBxB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,gBAAgB,EACvB,KAAK,EAAE,KAAK,GACX,OAAO,CAAC;IACT,cAAc,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtE,aAAa,EAAE,KAAK,EAAE,CAAC;CACxB,CAAC,
|
|
1
|
+
{"version":3,"file":"memoryBridge.d.ts","sourceRoot":"","sources":["../../src/issues/memoryBridge.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,gBAAgB,EACvB,KAAK,EAAE,KAAK,GACX,OAAO,CAAC,MAAM,EAAE,CAAC,CAoBnB;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,gBAAgB,EACvB,KAAK,EAAE,KAAK,GACX,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAqDxB;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,gBAAgB,EACvB,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAkBxB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,gBAAgB,EACvB,KAAK,EAAE,KAAK,GACX,OAAO,CAAC;IACT,cAAc,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtE,aAAa,EAAE,KAAK,EAAE,CAAC;CACxB,CAAC,CAgDD;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,gBAAgB,EACvB,KAAK,SAAK,GACT,OAAO,CAAC,MAAM,CAAC,CA0CjB"}
|
|
@@ -126,14 +126,24 @@ export async function enrichIssueContext(store, issue) {
|
|
|
126
126
|
const searchTerms = issue.title.split(/\s+/).filter((t) => t.length > 2).slice(0, 3);
|
|
127
127
|
const similarIssues = [];
|
|
128
128
|
if (searchTerms.length > 0) {
|
|
129
|
-
const
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
129
|
+
const seen = new Set([issue.id]);
|
|
130
|
+
for (const term of searchTerms) {
|
|
131
|
+
const { issues } = store.listIssues({
|
|
132
|
+
search: term,
|
|
133
|
+
limit: 5,
|
|
134
|
+
offset: 0,
|
|
135
|
+
});
|
|
136
|
+
for (const si of issues) {
|
|
137
|
+
if (!seen.has(si.id)) {
|
|
138
|
+
seen.add(si.id);
|
|
139
|
+
similarIssues.push(si);
|
|
140
|
+
}
|
|
141
|
+
if (similarIssues.length >= 5) {
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (similarIssues.length >= 5) {
|
|
146
|
+
break;
|
|
137
147
|
}
|
|
138
148
|
}
|
|
139
149
|
}
|
|
@@ -147,11 +157,13 @@ export async function digestRecentEvents(store, limit = 50) {
|
|
|
147
157
|
const events = store.getRecentEvents(limit);
|
|
148
158
|
if (events.length === 0)
|
|
149
159
|
return 0;
|
|
150
|
-
// 패턴 분석: 반복
|
|
151
|
-
|
|
160
|
+
// 패턴 분석: 반복 블로킹. IssueStatus에는 blocked가 없으므로,
|
|
161
|
+
// 로컬 자동화가 실제로 남기는 blocked/stuck 코멘트 이벤트를 기준으로 본다.
|
|
162
|
+
const blockEvents = events.filter((e) => (e.type === 'commented'
|
|
163
|
+
&& (/\b(blocked|stuck)\b/i.test(e.content ?? '') || /블로킹|차단/.test(e.content ?? ''))));
|
|
152
164
|
if (blockEvents.length >= 3) {
|
|
153
165
|
const reasons = blockEvents
|
|
154
|
-
.map((e) => e.content ||
|
|
166
|
+
.map((e) => e.content || '')
|
|
155
167
|
.filter(Boolean);
|
|
156
168
|
if (reasons.length > 0) {
|
|
157
169
|
await saveCognitiveMemory('strategy', [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memoryBridge.js","sourceRoot":"","sources":["../../src/issues/memoryBridge.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"memoryBridge.js","sourceRoot":"","sources":["../../src/issues/memoryBridge.ts"],"names":[],"mappings":"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"}
|
package/dist/issues/schema.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
export declare const IssueStatusSchema: z.ZodEnum<{
|
|
3
|
-
in_progress: "in_progress";
|
|
4
3
|
cancelled: "cancelled";
|
|
4
|
+
in_progress: "in_progress";
|
|
5
5
|
backlog: "backlog";
|
|
6
6
|
todo: "todo";
|
|
7
7
|
in_review: "in_review";
|
|
@@ -60,8 +60,8 @@ export declare const IssueSchema: z.ZodObject<{
|
|
|
60
60
|
title: z.ZodString;
|
|
61
61
|
description: z.ZodDefault<z.ZodString>;
|
|
62
62
|
status: z.ZodDefault<z.ZodEnum<{
|
|
63
|
-
in_progress: "in_progress";
|
|
64
63
|
cancelled: "cancelled";
|
|
64
|
+
in_progress: "in_progress";
|
|
65
65
|
backlog: "backlog";
|
|
66
66
|
todo: "todo";
|
|
67
67
|
in_review: "in_review";
|
|
@@ -123,8 +123,8 @@ export declare const MilestoneSchema: z.ZodObject<{
|
|
|
123
123
|
export declare const IssueFilterSchema: z.ZodObject<{
|
|
124
124
|
projectId: z.ZodOptional<z.ZodString>;
|
|
125
125
|
status: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
126
|
-
in_progress: "in_progress";
|
|
127
126
|
cancelled: "cancelled";
|
|
127
|
+
in_progress: "in_progress";
|
|
128
128
|
backlog: "backlog";
|
|
129
129
|
todo: "todo";
|
|
130
130
|
in_review: "in_review";
|