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.
@@ -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(title || "New task")},
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
- taskData.title || "New task",
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: taskData.title || "New task",
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
- taskData.title || "New task",
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.2",
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",