bosun 0.40.2 → 0.40.4
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 +4 -0
- package/cli.mjs +127 -69
- package/config/config.mjs +35 -15
- package/desktop/package.json +2 -2
- package/infra/monitor.mjs +52 -16
- package/infra/session-tracker.mjs +1 -0
- package/infra/sync-engine.mjs +6 -1
- package/infra/update-check.mjs +16 -10
- package/kanban/kanban-adapter.mjs +19 -4
- package/kanban/ve-orchestrator.ps1 +25 -0
- package/package.json +1 -1
- package/server/ui-server.mjs +502 -39
- package/task/task-executor.mjs +690 -6
- package/task/task-store.mjs +116 -1
- package/ui/components/kanban-board.js +137 -9
- package/ui/components/shared.js +107 -45
- package/ui/demo-defaults.js +20 -20
- package/ui/demo.html +26 -1
- package/ui/modules/mui.js +600 -397
- package/ui/styles/components.css +43 -3
- package/ui/styles/kanban.css +66 -11
- package/ui/styles.monolith.css +89 -0
- package/ui/tabs/agents.js +194 -20
- package/ui/tabs/tasks.js +673 -162
- package/workflow/workflow-engine.mjs +30 -29
- package/workflow/workflow-nodes.mjs +321 -22
- package/workflow/workflow-templates.mjs +1 -1
- package/workflow-templates/task-batch.mjs +10 -10
- package/workspace/workspace-manager.mjs +25 -0
- package/workspace/worktree-manager.mjs +8 -2
|
@@ -792,11 +792,18 @@ class InternalAdapter {
|
|
|
792
792
|
taskUrl: task.taskUrl || null,
|
|
793
793
|
createdAt: task.createdAt || null,
|
|
794
794
|
updatedAt: task.updatedAt || null,
|
|
795
|
+
lastActivityAt: task.lastActivityAt || task.updatedAt || null,
|
|
796
|
+
timeline: Array.isArray(task.timeline) ? task.timeline : [],
|
|
797
|
+
workflowRuns: Array.isArray(task.workflowRuns) ? task.workflowRuns : [],
|
|
798
|
+
statusHistory: Array.isArray(task.statusHistory) ? task.statusHistory : [],
|
|
795
799
|
backend: "internal",
|
|
796
800
|
attachments: mergedAttachments,
|
|
797
801
|
comments: normalizedComments,
|
|
798
802
|
meta: {
|
|
799
803
|
...(task.meta || {}),
|
|
804
|
+
timeline: Array.isArray(task.timeline) ? task.timeline : (Array.isArray(task.meta?.timeline) ? task.meta.timeline : []),
|
|
805
|
+
workflowRuns: Array.isArray(task.workflowRuns) ? task.workflowRuns : (Array.isArray(task.meta?.workflowRuns) ? task.meta.workflowRuns : []),
|
|
806
|
+
statusHistory: Array.isArray(task.statusHistory) ? task.statusHistory : (Array.isArray(task.meta?.statusHistory) ? task.meta.statusHistory : []),
|
|
800
807
|
comments: normalizedComments,
|
|
801
808
|
attachments: mergedAttachments,
|
|
802
809
|
},
|
|
@@ -3501,6 +3508,10 @@ class GitHubIssuesAdapter {
|
|
|
3501
3508
|
}
|
|
3502
3509
|
|
|
3503
3510
|
async addProjectV2DraftIssue(projectNumber, title, body = "") {
|
|
3511
|
+
const normalizedTitle = String(title || "").trim();
|
|
3512
|
+
if (!normalizedTitle) {
|
|
3513
|
+
throw new Error("[kanban] github createTask requires non-empty title");
|
|
3514
|
+
}
|
|
3504
3515
|
const projectId = await this.getProjectNodeId(projectNumber);
|
|
3505
3516
|
if (!projectId) return null;
|
|
3506
3517
|
const mutation = `
|
|
@@ -3508,7 +3519,7 @@ class GitHubIssuesAdapter {
|
|
|
3508
3519
|
addProjectV2DraftIssue(
|
|
3509
3520
|
input: {
|
|
3510
3521
|
projectId: ${this._escapeGraphQLString(projectId)},
|
|
3511
|
-
title: ${this._escapeGraphQLString(
|
|
3522
|
+
title: ${this._escapeGraphQLString(normalizedTitle)},
|
|
3512
3523
|
body: ${this._escapeGraphQLString(body)}
|
|
3513
3524
|
}
|
|
3514
3525
|
) {
|
|
@@ -3550,6 +3561,10 @@ class GitHubIssuesAdapter {
|
|
|
3550
3561
|
}
|
|
3551
3562
|
|
|
3552
3563
|
async createTask(_projectId, taskData) {
|
|
3564
|
+
const normalizedTitle = String(taskData?.title || "").trim();
|
|
3565
|
+
if (!normalizedTitle) {
|
|
3566
|
+
throw new Error("[kanban] github createTask requires non-empty title");
|
|
3567
|
+
}
|
|
3553
3568
|
const wantsDraftCreate = Boolean(taskData?.draft || taskData?.createDraft);
|
|
3554
3569
|
const shouldConvertDraft = Boolean(
|
|
3555
3570
|
taskData?.convertDraft || taskData?.convertToIssue,
|
|
@@ -3563,7 +3578,7 @@ class GitHubIssuesAdapter {
|
|
|
3563
3578
|
if (wantsDraftCreate && projectNumber) {
|
|
3564
3579
|
const draftItemId = await this.addProjectV2DraftIssue(
|
|
3565
3580
|
projectNumber,
|
|
3566
|
-
|
|
3581
|
+
normalizedTitle,
|
|
3567
3582
|
taskData.description || "",
|
|
3568
3583
|
);
|
|
3569
3584
|
if (!draftItemId) {
|
|
@@ -3572,7 +3587,7 @@ class GitHubIssuesAdapter {
|
|
|
3572
3587
|
if (!shouldConvertDraft) {
|
|
3573
3588
|
return {
|
|
3574
3589
|
id: `draft:${draftItemId}`,
|
|
3575
|
-
title:
|
|
3590
|
+
title: normalizedTitle,
|
|
3576
3591
|
description: taskData.description || "",
|
|
3577
3592
|
status: requestedStatus,
|
|
3578
3593
|
assignee: null,
|
|
@@ -3665,7 +3680,7 @@ class GitHubIssuesAdapter {
|
|
|
3665
3680
|
"--repo",
|
|
3666
3681
|
`${this._owner}/${this._repo}`,
|
|
3667
3682
|
"--title",
|
|
3668
|
-
|
|
3683
|
+
normalizedTitle,
|
|
3669
3684
|
"--body",
|
|
3670
3685
|
taskData.description || "",
|
|
3671
3686
|
];
|
|
@@ -640,6 +640,30 @@ function Get-OrchestratorMutexName {
|
|
|
640
640
|
return "$BaseName.$suffix"
|
|
641
641
|
}
|
|
642
642
|
|
|
643
|
+
function Repair-MainRepoGitConfigCorruption {
|
|
644
|
+
$repoRoot = $null
|
|
645
|
+
try {
|
|
646
|
+
$repoRoot = (Resolve-Path (Join-Path $PSScriptRoot "..")).Path
|
|
647
|
+
}
|
|
648
|
+
catch {
|
|
649
|
+
return
|
|
650
|
+
}
|
|
651
|
+
if (-not $repoRoot) {
|
|
652
|
+
return
|
|
653
|
+
}
|
|
654
|
+
try {
|
|
655
|
+
$bareValue = git -C $repoRoot config --bool --get core.bare 2>$null
|
|
656
|
+
if ($LASTEXITCODE -eq 0 -and "$bareValue".Trim().ToLowerInvariant() -eq "true") {
|
|
657
|
+
Write-Log "Detected core.bare=true on main repo; repairing git config corruption" -Level "WARN"
|
|
658
|
+
git -C $repoRoot config --local core.bare false 2>&1 | Out-Null
|
|
659
|
+
git -C $repoRoot config --local --unset-all core.worktree 2>&1 | Out-Null
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
catch {
|
|
663
|
+
Write-Log "Failed to repair main repo git config corruption: $($_.Exception.Message)" -Level "WARN"
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
|
|
643
667
|
function Enter-OrchestratorMutex {
|
|
644
668
|
param([string]$Name = (Get-OrchestratorMutexName))
|
|
645
669
|
$createdNew = $false
|
|
@@ -3274,6 +3298,7 @@ function Invoke-DirectRebaseIsolatedWorktree {
|
|
|
3274
3298
|
throw "git worktree add failed: $addOut"
|
|
3275
3299
|
}
|
|
3276
3300
|
$addedWorktree = $true
|
|
3301
|
+
Repair-MainRepoGitConfigCorruption
|
|
3277
3302
|
|
|
3278
3303
|
# Hard-clean the isolated worktree to remove any stale filesystem residue.
|
|
3279
3304
|
git -C $tempWorktreePath reset --hard HEAD 2>&1 | Out-Null
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bosun",
|
|
3
|
-
"version": "0.40.
|
|
3
|
+
"version": "0.40.4",
|
|
4
4
|
"description": "Bosun Autonomous Engineering — manages AI agent executors with failover, extremely powerful workflow builder, and a massive amount of included default workflow templates for autonomous engineering, creates PRs via Vibe-Kanban API, and sends Telegram notifications. Supports N executors with weighted distribution, multi-repo projects, and auto-setup.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|