@industry-theme/backlogmd-kanban-panel 1.0.31 → 1.0.33

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.
@@ -3740,70 +3740,83 @@ const createLucideIcon = (iconName, iconNode) => {
3740
3740
  * This source code is licensed under the ISC license.
3741
3741
  * See the LICENSE file in the root directory of this source tree.
3742
3742
  */
3743
- const __iconNode$m = [
3744
- ["path", { d: "M8 2v4", key: "1cmpym" }],
3745
- ["path", { d: "M16 2v4", key: "4m81vk" }],
3746
- ["rect", { width: "18", height: "18", x: "3", y: "4", rx: "2", key: "1hopcy" }],
3747
- ["path", { d: "M3 10h18", key: "8toen8" }]
3743
+ const __iconNode$j = [
3744
+ ["path", { d: "M12 8V4H8", key: "hb8ula" }],
3745
+ ["rect", { width: "16", height: "12", x: "4", y: "8", rx: "2", key: "enze0r" }],
3746
+ ["path", { d: "M2 14h2", key: "vft8re" }],
3747
+ ["path", { d: "M20 14h2", key: "4cs60a" }],
3748
+ ["path", { d: "M15 13v2", key: "1xurst" }],
3749
+ ["path", { d: "M9 13v2", key: "rq6x2g" }]
3748
3750
  ];
3749
- const Calendar = createLucideIcon("calendar", __iconNode$m);
3751
+ const Bot = createLucideIcon("bot", __iconNode$j);
3750
3752
  /**
3751
3753
  * @license lucide-react v0.552.0 - ISC
3752
3754
  *
3753
3755
  * This source code is licensed under the ISC license.
3754
3756
  * See the LICENSE file in the root directory of this source tree.
3755
3757
  */
3756
- const __iconNode$l = [["path", { d: "M20 6 9 17l-5-5", key: "1gmf2c" }]];
3757
- const Check = createLucideIcon("check", __iconNode$l);
3758
+ const __iconNode$i = [["path", { d: "M20 6 9 17l-5-5", key: "1gmf2c" }]];
3759
+ const Check = createLucideIcon("check", __iconNode$i);
3758
3760
  /**
3759
3761
  * @license lucide-react v0.552.0 - ISC
3760
3762
  *
3761
3763
  * This source code is licensed under the ISC license.
3762
3764
  * See the LICENSE file in the root directory of this source tree.
3763
3765
  */
3764
- const __iconNode$k = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
3765
- const ChevronDown = createLucideIcon("chevron-down", __iconNode$k);
3766
+ const __iconNode$h = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
3767
+ const ChevronDown = createLucideIcon("chevron-down", __iconNode$h);
3766
3768
  /**
3767
3769
  * @license lucide-react v0.552.0 - ISC
3768
3770
  *
3769
3771
  * This source code is licensed under the ISC license.
3770
3772
  * See the LICENSE file in the root directory of this source tree.
3771
3773
  */
3772
- const __iconNode$j = [
3774
+ const __iconNode$g = [
3773
3775
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
3774
3776
  ["line", { x1: "12", x2: "12", y1: "8", y2: "12", key: "1pkeuh" }],
3775
3777
  ["line", { x1: "12", x2: "12.01", y1: "16", y2: "16", key: "4dfq90" }]
3776
3778
  ];
3777
- const CircleAlert = createLucideIcon("circle-alert", __iconNode$j);
3779
+ const CircleAlert = createLucideIcon("circle-alert", __iconNode$g);
3780
+ /**
3781
+ * @license lucide-react v0.552.0 - ISC
3782
+ *
3783
+ * This source code is licensed under the ISC license.
3784
+ * See the LICENSE file in the root directory of this source tree.
3785
+ */
3786
+ const __iconNode$f = [
3787
+ ["path", { d: "M21.801 10A10 10 0 1 1 17 3.335", key: "yps3ct" }],
3788
+ ["path", { d: "m9 11 3 3L22 4", key: "1pflzl" }]
3789
+ ];
3790
+ const CircleCheckBig = createLucideIcon("circle-check-big", __iconNode$f);
3778
3791
  /**
3779
3792
  * @license lucide-react v0.552.0 - ISC
3780
3793
  *
3781
3794
  * This source code is licensed under the ISC license.
3782
3795
  * See the LICENSE file in the root directory of this source tree.
3783
3796
  */
3784
- const __iconNode$i = [
3797
+ const __iconNode$e = [
3785
3798
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
3786
3799
  ["path", { d: "m9 12 2 2 4-4", key: "dzmm74" }]
3787
3800
  ];
3788
- const CircleCheck = createLucideIcon("circle-check", __iconNode$i);
3801
+ const CircleCheck = createLucideIcon("circle-check", __iconNode$e);
3789
3802
  /**
3790
3803
  * @license lucide-react v0.552.0 - ISC
3791
3804
  *
3792
3805
  * This source code is licensed under the ISC license.
3793
3806
  * See the LICENSE file in the root directory of this source tree.
3794
3807
  */
3795
- const __iconNode$h = [
3808
+ const __iconNode$d = [
3796
3809
  ["rect", { width: "14", height: "14", x: "8", y: "8", rx: "2", ry: "2", key: "17jyea" }],
3797
3810
  ["path", { d: "M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2", key: "zix9uf" }]
3798
3811
  ];
3799
- const Copy = createLucideIcon("copy", __iconNode$h);
3812
+ const Copy = createLucideIcon("copy", __iconNode$d);
3800
3813
  /**
3801
3814
  * @license lucide-react v0.552.0 - ISC
3802
3815
  *
3803
3816
  * This source code is licensed under the ISC license.
3804
3817
  * See the LICENSE file in the root directory of this source tree.
3805
3818
  */
3806
- const __iconNode$g = [
3819
+ const __iconNode$c = [
3807
3820
  ["path", { d: "m15 15 6 6", key: "1s409w" }],
3808
3821
  ["path", { d: "m15 9 6-6", key: "ko1vev" }],
3809
3822
  ["path", { d: "M21 16v5h-5", key: "1ck2sf" }],
@@ -3813,26 +3826,26 @@ const __iconNode$g = [
3813
3826
  ["path", { d: "M3 8V3h5", key: "1ln10m" }],
3814
3827
  ["path", { d: "M9 9 3 3", key: "v551iv" }]
3815
3828
  ];
3816
- const Expand = createLucideIcon("expand", __iconNode$g);
3829
+ const Expand = createLucideIcon("expand", __iconNode$c);
3817
3830
  /**
3818
3831
  * @license lucide-react v0.552.0 - ISC
3819
3832
  *
3820
3833
  * This source code is licensed under the ISC license.
3821
3834
  * See the LICENSE file in the root directory of this source tree.
3822
3835
  */
3823
- const __iconNode$f = [
3836
+ const __iconNode$b = [
3824
3837
  ["path", { d: "M15 3h6v6", key: "1q9fwt" }],
3825
3838
  ["path", { d: "M10 14 21 3", key: "gplh6r" }],
3826
3839
  ["path", { d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6", key: "a6xqqp" }]
3827
3840
  ];
3828
- const ExternalLink = createLucideIcon("external-link", __iconNode$f);
3841
+ const ExternalLink = createLucideIcon("external-link", __iconNode$b);
3829
3842
  /**
3830
3843
  * @license lucide-react v0.552.0 - ISC
3831
3844
  *
3832
3845
  * This source code is licensed under the ISC license.
3833
3846
  * See the LICENSE file in the root directory of this source tree.
3834
3847
  */
3835
- const __iconNode$e = [
3848
+ const __iconNode$a = [
3836
3849
  [
3837
3850
  "path",
3838
3851
  {
@@ -3845,30 +3858,14 @@ const __iconNode$e = [
3845
3858
  ["path", { d: "M16 13H8", key: "t4e002" }],
3846
3859
  ["path", { d: "M16 17H8", key: "z1uh3a" }]
3847
3860
  ];
3848
- const FileText = createLucideIcon("file-text", __iconNode$e);
3861
+ const FileText = createLucideIcon("file-text", __iconNode$a);
3849
3862
  /**
3850
3863
  * @license lucide-react v0.552.0 - ISC
3851
3864
  *
3852
3865
  * This source code is licensed under the ISC license.
3853
3866
  * See the LICENSE file in the root directory of this source tree.
3854
3867
  */
3855
- const __iconNode$d = [
3856
- [
3857
- "path",
3858
- {
3859
- d: "M4 22V4a1 1 0 0 1 .4-.8A6 6 0 0 1 8 2c3 0 5 2 7.333 2q2 0 3.067-.8A1 1 0 0 1 20 4v10a1 1 0 0 1-.4.8A6 6 0 0 1 16 16c-3 0-5-2-8-2a6 6 0 0 0-4 1.528",
3860
- key: "1jaruq"
3861
- }
3862
- ]
3863
- ];
3864
- const Flag = createLucideIcon("flag", __iconNode$d);
3865
- /**
3866
- * @license lucide-react v0.552.0 - ISC
3867
- *
3868
- * This source code is licensed under the ISC license.
3869
- * See the LICENSE file in the root directory of this source tree.
3870
- */
3871
- const __iconNode$c = [
3868
+ const __iconNode$9 = [
3872
3869
  ["path", { d: "M12 10v6", key: "1bos4e" }],
3873
3870
  ["path", { d: "M9 13h6", key: "1uhe8q" }],
3874
3871
  [
@@ -3879,35 +3876,22 @@ const __iconNode$c = [
3879
3876
  }
3880
3877
  ]
3881
3878
  ];
3882
- const FolderPlus = createLucideIcon("folder-plus", __iconNode$c);
3883
- /**
3884
- * @license lucide-react v0.552.0 - ISC
3885
- *
3886
- * This source code is licensed under the ISC license.
3887
- * See the LICENSE file in the root directory of this source tree.
3888
- */
3889
- const __iconNode$b = [
3890
- ["line", { x1: "6", x2: "6", y1: "3", y2: "15", key: "17qcm7" }],
3891
- ["circle", { cx: "18", cy: "6", r: "3", key: "1h7g24" }],
3892
- ["circle", { cx: "6", cy: "18", r: "3", key: "fqmcym" }],
3893
- ["path", { d: "M18 9a9 9 0 0 1-9 9", key: "n2h4wq" }]
3894
- ];
3895
- const GitBranch = createLucideIcon("git-branch", __iconNode$b);
3879
+ const FolderPlus = createLucideIcon("folder-plus", __iconNode$9);
3896
3880
  /**
3897
3881
  * @license lucide-react v0.552.0 - ISC
3898
3882
  *
3899
3883
  * This source code is licensed under the ISC license.
3900
3884
  * See the LICENSE file in the root directory of this source tree.
3901
3885
  */
3902
- const __iconNode$a = [["path", { d: "M21 12a9 9 0 1 1-6.219-8.56", key: "13zald" }]];
3903
- const LoaderCircle = createLucideIcon("loader-circle", __iconNode$a);
3886
+ const __iconNode$8 = [["path", { d: "M21 12a9 9 0 1 1-6.219-8.56", key: "13zald" }]];
3887
+ const LoaderCircle = createLucideIcon("loader-circle", __iconNode$8);
3904
3888
  /**
3905
3889
  * @license lucide-react v0.552.0 - ISC
3906
3890
  *
3907
3891
  * This source code is licensed under the ISC license.
3908
3892
  * See the LICENSE file in the root directory of this source tree.
3909
3893
  */
3910
- const __iconNode$9 = [
3894
+ const __iconNode$7 = [
3911
3895
  ["path", { d: "M12 13v8", key: "1l5pq0" }],
3912
3896
  ["path", { d: "M12 3v3", key: "1n5kay" }],
3913
3897
  [
@@ -3918,37 +3902,37 @@ const __iconNode$9 = [
3918
3902
  }
3919
3903
  ]
3920
3904
  ];
3921
- const Milestone = createLucideIcon("milestone", __iconNode$9);
3905
+ const Milestone = createLucideIcon("milestone", __iconNode$7);
3922
3906
  /**
3923
3907
  * @license lucide-react v0.552.0 - ISC
3924
3908
  *
3925
3909
  * This source code is licensed under the ISC license.
3926
3910
  * See the LICENSE file in the root directory of this source tree.
3927
3911
  */
3928
- const __iconNode$8 = [
3912
+ const __iconNode$6 = [
3929
3913
  ["rect", { width: "20", height: "14", x: "2", y: "3", rx: "2", key: "48i651" }],
3930
3914
  ["line", { x1: "8", x2: "16", y1: "21", y2: "21", key: "1svkeh" }],
3931
3915
  ["line", { x1: "12", x2: "12", y1: "17", y2: "21", key: "vw1qmm" }]
3932
3916
  ];
3933
- const Monitor = createLucideIcon("monitor", __iconNode$8);
3917
+ const Monitor = createLucideIcon("monitor", __iconNode$6);
3934
3918
  /**
3935
3919
  * @license lucide-react v0.552.0 - ISC
3936
3920
  *
3937
3921
  * This source code is licensed under the ISC license.
3938
3922
  * See the LICENSE file in the root directory of this source tree.
3939
3923
  */
3940
- const __iconNode$7 = [
3924
+ const __iconNode$5 = [
3941
3925
  ["path", { d: "M18 8L22 12L18 16", key: "1r0oui" }],
3942
3926
  ["path", { d: "M2 12H22", key: "1m8cig" }]
3943
3927
  ];
3944
- const MoveRight = createLucideIcon("move-right", __iconNode$7);
3928
+ const MoveRight = createLucideIcon("move-right", __iconNode$5);
3945
3929
  /**
3946
3930
  * @license lucide-react v0.552.0 - ISC
3947
3931
  *
3948
3932
  * This source code is licensed under the ISC license.
3949
3933
  * See the LICENSE file in the root directory of this source tree.
3950
3934
  */
3951
- const __iconNode$6 = [
3935
+ const __iconNode$4 = [
3952
3936
  [
3953
3937
  "path",
3954
3938
  {
@@ -3957,70 +3941,42 @@ const __iconNode$6 = [
3957
3941
  }
3958
3942
  ]
3959
3943
  ];
3960
- const Play = createLucideIcon("play", __iconNode$6);
3944
+ const Play = createLucideIcon("play", __iconNode$4);
3961
3945
  /**
3962
3946
  * @license lucide-react v0.552.0 - ISC
3963
3947
  *
3964
3948
  * This source code is licensed under the ISC license.
3965
3949
  * See the LICENSE file in the root directory of this source tree.
3966
3950
  */
3967
- const __iconNode$5 = [
3951
+ const __iconNode$3 = [
3968
3952
  ["path", { d: "M5 12h14", key: "1ays0h" }],
3969
3953
  ["path", { d: "M12 5v14", key: "s699le" }]
3970
3954
  ];
3971
- const Plus = createLucideIcon("plus", __iconNode$5);
3955
+ const Plus = createLucideIcon("plus", __iconNode$3);
3972
3956
  /**
3973
3957
  * @license lucide-react v0.552.0 - ISC
3974
3958
  *
3975
3959
  * This source code is licensed under the ISC license.
3976
3960
  * See the LICENSE file in the root directory of this source tree.
3977
3961
  */
3978
- const __iconNode$4 = [
3962
+ const __iconNode$2 = [
3979
3963
  ["path", { d: "M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8", key: "v9h5vc" }],
3980
3964
  ["path", { d: "M21 3v5h-5", key: "1q7to0" }],
3981
3965
  ["path", { d: "M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16", key: "3uifl3" }],
3982
3966
  ["path", { d: "M8 16H3v5", key: "1cv678" }]
3983
3967
  ];
3984
- const RefreshCw = createLucideIcon("refresh-cw", __iconNode$4);
3968
+ const RefreshCw = createLucideIcon("refresh-cw", __iconNode$2);
3985
3969
  /**
3986
3970
  * @license lucide-react v0.552.0 - ISC
3987
3971
  *
3988
3972
  * This source code is licensed under the ISC license.
3989
3973
  * See the LICENSE file in the root directory of this source tree.
3990
3974
  */
3991
- const __iconNode$3 = [
3975
+ const __iconNode$1 = [
3992
3976
  ["path", { d: "m21 21-4.34-4.34", key: "14j7rj" }],
3993
3977
  ["circle", { cx: "11", cy: "11", r: "8", key: "4ej97u" }]
3994
3978
  ];
3995
- const Search = createLucideIcon("search", __iconNode$3);
3996
- /**
3997
- * @license lucide-react v0.552.0 - ISC
3998
- *
3999
- * This source code is licensed under the ISC license.
4000
- * See the LICENSE file in the root directory of this source tree.
4001
- */
4002
- const __iconNode$2 = [
4003
- [
4004
- "path",
4005
- {
4006
- d: "M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z",
4007
- key: "vktsd0"
4008
- }
4009
- ],
4010
- ["circle", { cx: "7.5", cy: "7.5", r: ".5", fill: "currentColor", key: "kqv944" }]
4011
- ];
4012
- const Tag = createLucideIcon("tag", __iconNode$2);
4013
- /**
4014
- * @license lucide-react v0.552.0 - ISC
4015
- *
4016
- * This source code is licensed under the ISC license.
4017
- * See the LICENSE file in the root directory of this source tree.
4018
- */
4019
- const __iconNode$1 = [
4020
- ["path", { d: "M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2", key: "975kel" }],
4021
- ["circle", { cx: "12", cy: "7", r: "4", key: "17ys0d" }]
4022
- ];
4023
- const User = createLucideIcon("user", __iconNode$1);
3979
+ const Search = createLucideIcon("search", __iconNode$1);
4024
3980
  /**
4025
3981
  * @license lucide-react v0.552.0 - ISC
4026
3982
  *
@@ -4070,6 +4026,7 @@ function parseTaskMarkdown(content2, filePath) {
4070
4026
  labels: frontmatter.labels || [],
4071
4027
  milestone: frontmatter.milestone,
4072
4028
  dependencies: frontmatter.dependencies || [],
4029
+ references: frontmatter.references || [],
4073
4030
  parentTaskId: frontmatter.parentTaskId,
4074
4031
  subtasks: frontmatter.subtasks,
4075
4032
  branch: frontmatter.branch,
@@ -4102,6 +4059,9 @@ function serializeTaskMarkdown(task) {
4102
4059
  if (task.dependencies && task.dependencies.length > 0) {
4103
4060
  lines.push(`dependencies: [${task.dependencies.join(", ")}]`);
4104
4061
  }
4062
+ if (task.references && task.references.length > 0) {
4063
+ lines.push(`references: [${task.references.join(", ")}]`);
4064
+ }
4105
4065
  if (task.parentTaskId) {
4106
4066
  lines.push(`parentTaskId: ${task.parentTaskId}`);
4107
4067
  }
@@ -4197,6 +4157,7 @@ function parseFrontmatter(raw2) {
4197
4157
  case "assignee":
4198
4158
  case "labels":
4199
4159
  case "dependencies":
4160
+ case "references":
4200
4161
  case "subtasks":
4201
4162
  result[key2] = parseArrayValue(value);
4202
4163
  break;
@@ -5469,6 +5430,7 @@ class Core {
5469
5430
  labels: input.labels || [],
5470
5431
  milestone: input.milestone,
5471
5432
  dependencies: input.dependencies || [],
5433
+ references: input.references || [],
5472
5434
  parentTaskId: input.parentTaskId,
5473
5435
  description: input.description,
5474
5436
  implementationPlan: input.implementationPlan,
@@ -5520,7 +5482,8 @@ class Core {
5520
5482
  implementationPlan: input.clearImplementationPlan ? void 0 : input.implementationPlan ?? existing.implementationPlan,
5521
5483
  implementationNotes: input.clearImplementationNotes ? void 0 : input.implementationNotes ?? existing.implementationNotes,
5522
5484
  ordinal: input.ordinal ?? existing.ordinal,
5523
- dependencies: input.dependencies ?? existing.dependencies
5485
+ dependencies: input.dependencies ?? existing.dependencies,
5486
+ references: input.references ?? existing.references ?? []
5524
5487
  };
5525
5488
  if (input.labels) {
5526
5489
  updated.labels = input.labels;
@@ -5547,6 +5510,15 @@ class Core {
5547
5510
  return !((_a = input.removeDependencies) == null ? void 0 : _a.includes(d));
5548
5511
  });
5549
5512
  }
5513
+ if (input.addReferences) {
5514
+ updated.references = [.../* @__PURE__ */ new Set([...updated.references || [], ...input.addReferences])];
5515
+ }
5516
+ if (input.removeReferences) {
5517
+ updated.references = (updated.references || []).filter((r2) => {
5518
+ var _a;
5519
+ return !((_a = input.removeReferences) == null ? void 0 : _a.includes(r2));
5520
+ });
5521
+ }
5550
5522
  if (input.acceptanceCriteria) {
5551
5523
  updated.acceptanceCriteriaItems = input.acceptanceCriteria.map((ac, i) => ({
5552
5524
  index: i + 1,
@@ -5867,7 +5839,8 @@ function useKanbanData(options) {
5867
5839
  const {
5868
5840
  context,
5869
5841
  actions,
5870
- tasksLimit = DEFAULT_TASKS_LIMIT
5842
+ tasksLimit = DEFAULT_TASKS_LIMIT,
5843
+ events: events2
5871
5844
  } = options || {};
5872
5845
  const [tasks, setTasks] = useState([]);
5873
5846
  const [isLoading, setIsLoading] = useState(true);
@@ -6012,6 +5985,19 @@ function useKanbanData(options) {
6012
5985
  useEffect(() => {
6013
5986
  loadBacklogData();
6014
5987
  }, [loadBacklogData]);
5988
+ useEffect(() => {
5989
+ if (!events2) return;
5990
+ const unsubscribe = events2.on("file:write-complete", (event) => {
5991
+ const payload = event.payload || {};
5992
+ const filePath = payload.path || "";
5993
+ if (filePath.includes("backlog/tasks/")) {
5994
+ console.log("[useKanbanData] Task file written, refreshing data:", filePath);
5995
+ fileTreeVersionRef.current = null;
5996
+ loadBacklogData();
5997
+ }
5998
+ });
5999
+ return unsubscribe;
6000
+ }, [events2, loadBacklogData]);
6015
6001
  const loadMoreTasks = useCallback(async () => {
6016
6002
  const core2 = coreRef.current;
6017
6003
  if (!core2) {
@@ -6135,6 +6121,16 @@ function useKanbanData(options) {
6135
6121
  core: coreRef.current
6136
6122
  };
6137
6123
  }
6124
+ function getGitHubIssueFromRefs$1(references) {
6125
+ if (!references) return null;
6126
+ for (const ref of references) {
6127
+ const match = ref.match(/github\.com\/[^/]+\/[^/]+\/issues\/(\d+)/);
6128
+ if (match) {
6129
+ return { number: parseInt(match[1], 10), url: ref };
6130
+ }
6131
+ }
6132
+ return null;
6133
+ }
6138
6134
  const TaskCard = ({
6139
6135
  task,
6140
6136
  onClick,
@@ -6285,15 +6281,44 @@ const TaskCard = ({
6285
6281
  color: theme2.colors.textMuted
6286
6282
  },
6287
6283
  children: [
6288
- /* @__PURE__ */ jsx(
6289
- "span",
6290
- {
6291
- style: {
6292
- fontFamily: theme2.fonts.monospace
6293
- },
6294
- children: task.id
6295
- }
6296
- ),
6284
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: "8px" }, children: [
6285
+ /* @__PURE__ */ jsx(
6286
+ "span",
6287
+ {
6288
+ style: {
6289
+ fontFamily: theme2.fonts.monospace
6290
+ },
6291
+ children: task.id
6292
+ }
6293
+ ),
6294
+ (() => {
6295
+ const issue = getGitHubIssueFromRefs$1(task.references);
6296
+ if (!issue) return null;
6297
+ return /* @__PURE__ */ jsxs(
6298
+ "a",
6299
+ {
6300
+ href: issue.url,
6301
+ target: "_blank",
6302
+ rel: "noopener noreferrer",
6303
+ onClick: (e) => e.stopPropagation(),
6304
+ style: {
6305
+ display: "inline-flex",
6306
+ alignItems: "center",
6307
+ gap: "3px",
6308
+ color: theme2.colors.primary,
6309
+ textDecoration: "none",
6310
+ fontSize: theme2.fontSizes[0]
6311
+ },
6312
+ title: `View issue #${issue.number} on GitHub`,
6313
+ children: [
6314
+ /* @__PURE__ */ jsx(ExternalLink, { size: 10 }),
6315
+ "#",
6316
+ issue.number
6317
+ ]
6318
+ }
6319
+ );
6320
+ })()
6321
+ ] }),
6297
6322
  task.assignee && task.assignee.length > 0 && /* @__PURE__ */ jsxs(
6298
6323
  "span",
6299
6324
  {
@@ -7847,6 +7872,7 @@ const KanbanPanel = ({
7847
7872
  } = useKanbanData({
7848
7873
  context,
7849
7874
  actions,
7875
+ events: events2,
7850
7876
  tasksLimit: 20
7851
7877
  });
7852
7878
  const {
@@ -52770,6 +52796,16 @@ var DocumentView = ({
52770
52796
  editable
52771
52797
  })));
52772
52798
  };
52799
+ function getGitHubIssueFromRefs(references) {
52800
+ if (!references) return null;
52801
+ for (const ref of references) {
52802
+ const match = ref.match(/github\.com\/[^/]+\/[^/]+\/issues\/(\d+)/);
52803
+ if (match) {
52804
+ return { number: parseInt(match[1], 10), url: ref };
52805
+ }
52806
+ }
52807
+ return null;
52808
+ }
52773
52809
  function getTaskBodyMarkdown(task, options = {}) {
52774
52810
  const { includeTitle = false } = options;
52775
52811
  if (task.rawContent) {
@@ -52848,36 +52884,45 @@ const StatusBadge = ({ status }) => {
52848
52884
  }
52849
52885
  );
52850
52886
  };
52851
- const MetadataRow = ({ icon, label, value }) => {
52852
- const { theme: theme2 } = useTheme();
52853
- return /* @__PURE__ */ jsxs(
52854
- "div",
52855
- {
52856
- style: {
52857
- display: "flex",
52858
- alignItems: "center",
52859
- gap: "8px",
52860
- fontSize: theme2.fontSizes[1]
52861
- },
52862
- children: [
52863
- /* @__PURE__ */ jsx("span", { style: { color: theme2.colors.textMuted, display: "flex", alignItems: "center" }, children: icon }),
52864
- /* @__PURE__ */ jsxs("span", { style: { color: theme2.colors.textSecondary }, children: [
52865
- label,
52866
- ":"
52867
- ] }),
52868
- /* @__PURE__ */ jsx("span", { style: { color: theme2.colors.text }, children: value })
52869
- ]
52870
- }
52871
- );
52872
- };
52873
52887
  const TaskDetailPanel = ({ context, actions, events: events2, config }) => {
52888
+ var _a;
52874
52889
  const { theme: theme2 } = useTheme();
52875
52890
  const [selectedTask, setSelectedTask] = useState(null);
52891
+ const [claudeAssignment, setClaudeAssignment] = useState({ status: "idle" });
52876
52892
  const { editable = false } = config ?? {};
52893
+ const repoCapabilities = context.getRepositorySlice("repoCapabilities");
52894
+ const hasClaudeWorkflow = ((_a = repoCapabilities == null ? void 0 : repoCapabilities.data) == null ? void 0 : _a.hasClaudeWorkflow) ?? false;
52895
+ const handleAssignToClaude = useCallback(() => {
52896
+ if (!events2 || !selectedTask) return;
52897
+ setClaudeAssignment({ status: "loading" });
52898
+ events2.emit({
52899
+ type: "task:assign-to-claude",
52900
+ source: "task-detail-panel",
52901
+ timestamp: Date.now(),
52902
+ payload: {
52903
+ taskId: selectedTask.id,
52904
+ task: {
52905
+ id: selectedTask.id,
52906
+ title: selectedTask.title,
52907
+ description: selectedTask.description,
52908
+ priority: selectedTask.priority,
52909
+ labels: selectedTask.labels,
52910
+ assignee: selectedTask.assignee,
52911
+ acceptanceCriteria: selectedTask.acceptanceCriteriaItems,
52912
+ implementationPlan: selectedTask.implementationPlan,
52913
+ rawContent: selectedTask.rawContent,
52914
+ filePath: selectedTask.filePath,
52915
+ status: selectedTask.status,
52916
+ references: selectedTask.references
52917
+ }
52918
+ }
52919
+ });
52920
+ }, [events2, selectedTask]);
52877
52921
  useEffect(() => {
52878
52922
  if (!events2) return;
52879
52923
  const handleTaskSelected = (event) => {
52880
52924
  setSelectedTask(event.payload.task);
52925
+ setClaudeAssignment({ status: "idle" });
52881
52926
  };
52882
52927
  const unsubscribe = events2.on("task:selected", handleTaskSelected);
52883
52928
  return () => {
@@ -52886,6 +52931,35 @@ const TaskDetailPanel = ({ context, actions, events: events2, config }) => {
52886
52931
  }
52887
52932
  };
52888
52933
  }, [events2]);
52934
+ useEffect(() => {
52935
+ if (!events2) return;
52936
+ const unsubscribers = [
52937
+ events2.on("task:assigned-to-claude", (event) => {
52938
+ const payload = event.payload;
52939
+ if (payload.taskId === (selectedTask == null ? void 0 : selectedTask.id)) {
52940
+ setClaudeAssignment({
52941
+ status: "success",
52942
+ issueNumber: payload.issueNumber,
52943
+ issueUrl: payload.issueUrl
52944
+ });
52945
+ }
52946
+ }),
52947
+ events2.on("task:assign-to-claude:error", (event) => {
52948
+ const payload = event.payload;
52949
+ if (payload.taskId === (selectedTask == null ? void 0 : selectedTask.id)) {
52950
+ setClaudeAssignment({
52951
+ status: "error",
52952
+ error: payload.error
52953
+ });
52954
+ }
52955
+ })
52956
+ ];
52957
+ return () => {
52958
+ unsubscribers.forEach((unsub) => {
52959
+ if (typeof unsub === "function") unsub();
52960
+ });
52961
+ };
52962
+ }, [events2, selectedTask == null ? void 0 : selectedTask.id]);
52889
52963
  const handleBack = () => {
52890
52964
  setSelectedTask(null);
52891
52965
  if (events2) {
@@ -52988,40 +53062,202 @@ const TaskDetailPanel = ({ context, actions, events: events2, config }) => {
52988
53062
  children: selectedTask.id
52989
53063
  }
52990
53064
  ),
53065
+ selectedTask.priority && /* @__PURE__ */ jsx("span", { style: getPriorityStyles(theme2, selectedTask.priority), children: selectedTask.priority }),
52991
53066
  /* @__PURE__ */ jsx(StatusBadge, { status: selectedTask.status })
52992
53067
  ] }),
52993
- /* @__PURE__ */ jsx(
52994
- "button",
52995
- {
52996
- onClick: handleBack,
52997
- style: {
52998
- display: "flex",
52999
- alignItems: "center",
53000
- justifyContent: "center",
53001
- width: "32px",
53002
- height: "32px",
53003
- border: `1px solid ${theme2.colors.border}`,
53004
- borderRadius: theme2.radii[1],
53005
- background: theme2.colors.surface,
53006
- cursor: "pointer",
53007
- color: theme2.colors.textSecondary,
53008
- transition: "all 0.2s ease"
53009
- },
53010
- onMouseEnter: (e) => {
53011
- e.currentTarget.style.background = theme2.colors.backgroundSecondary;
53012
- e.currentTarget.style.color = theme2.colors.text;
53013
- },
53014
- onMouseLeave: (e) => {
53015
- e.currentTarget.style.background = theme2.colors.surface;
53016
- e.currentTarget.style.color = theme2.colors.textSecondary;
53017
- },
53018
- title: "Close",
53019
- children: /* @__PURE__ */ jsx(X, { size: 16 })
53020
- }
53021
- )
53068
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: "8px" }, children: [
53069
+ hasClaudeWorkflow && claudeAssignment.status === "idle" && !getGitHubIssueFromRefs(selectedTask.references) && /* @__PURE__ */ jsxs(
53070
+ "button",
53071
+ {
53072
+ onClick: handleAssignToClaude,
53073
+ style: {
53074
+ display: "flex",
53075
+ alignItems: "center",
53076
+ gap: "6px",
53077
+ padding: "6px 12px",
53078
+ border: `1px solid ${theme2.colors.primary}`,
53079
+ borderRadius: theme2.radii[1],
53080
+ background: "transparent",
53081
+ cursor: "pointer",
53082
+ color: theme2.colors.primary,
53083
+ fontSize: theme2.fontSizes[1],
53084
+ fontWeight: theme2.fontWeights.medium,
53085
+ transition: "all 0.2s ease"
53086
+ },
53087
+ onMouseEnter: (e) => {
53088
+ e.currentTarget.style.background = theme2.colors.primary;
53089
+ e.currentTarget.style.color = theme2.colors.background;
53090
+ },
53091
+ onMouseLeave: (e) => {
53092
+ e.currentTarget.style.background = "transparent";
53093
+ e.currentTarget.style.color = theme2.colors.primary;
53094
+ },
53095
+ title: "Assign to Claude",
53096
+ children: [
53097
+ /* @__PURE__ */ jsx(Bot, { size: 14 }),
53098
+ "Assign to Claude"
53099
+ ]
53100
+ }
53101
+ ),
53102
+ (() => {
53103
+ const existingIssue = getGitHubIssueFromRefs(selectedTask.references);
53104
+ if (!existingIssue || claudeAssignment.status !== "idle") return null;
53105
+ return /* @__PURE__ */ jsxs(
53106
+ "a",
53107
+ {
53108
+ href: existingIssue.url,
53109
+ target: "_blank",
53110
+ rel: "noopener noreferrer",
53111
+ style: {
53112
+ display: "flex",
53113
+ alignItems: "center",
53114
+ gap: "6px",
53115
+ padding: "6px 12px",
53116
+ border: `1px solid ${theme2.colors.primary}`,
53117
+ borderRadius: theme2.radii[1],
53118
+ background: "transparent",
53119
+ color: theme2.colors.primary,
53120
+ fontSize: theme2.fontSizes[1],
53121
+ fontWeight: theme2.fontWeights.medium,
53122
+ textDecoration: "none",
53123
+ transition: "all 0.2s ease"
53124
+ },
53125
+ onMouseEnter: (e) => {
53126
+ e.currentTarget.style.background = theme2.colors.primary;
53127
+ e.currentTarget.style.color = theme2.colors.background;
53128
+ },
53129
+ onMouseLeave: (e) => {
53130
+ e.currentTarget.style.background = "transparent";
53131
+ e.currentTarget.style.color = theme2.colors.primary;
53132
+ },
53133
+ title: `View issue #${existingIssue.number} on GitHub`,
53134
+ children: [
53135
+ /* @__PURE__ */ jsx(Bot, { size: 14 }),
53136
+ "View Progress",
53137
+ /* @__PURE__ */ jsx(ExternalLink, { size: 12 })
53138
+ ]
53139
+ }
53140
+ );
53141
+ })(),
53142
+ claudeAssignment.status === "loading" && /* @__PURE__ */ jsxs(
53143
+ "div",
53144
+ {
53145
+ style: {
53146
+ display: "flex",
53147
+ alignItems: "center",
53148
+ gap: "6px",
53149
+ padding: "6px 12px",
53150
+ color: theme2.colors.textSecondary,
53151
+ fontSize: theme2.fontSizes[1]
53152
+ },
53153
+ children: [
53154
+ /* @__PURE__ */ jsx(LoaderCircle, { size: 14, style: { animation: "spin 1s linear infinite" } }),
53155
+ "Assigning..."
53156
+ ]
53157
+ }
53158
+ ),
53159
+ claudeAssignment.status === "success" && /* @__PURE__ */ jsxs(
53160
+ "a",
53161
+ {
53162
+ href: claudeAssignment.issueUrl,
53163
+ target: "_blank",
53164
+ rel: "noopener noreferrer",
53165
+ style: {
53166
+ display: "flex",
53167
+ alignItems: "center",
53168
+ gap: "6px",
53169
+ padding: "6px 12px",
53170
+ border: `1px solid ${theme2.colors.success}`,
53171
+ borderRadius: theme2.radii[1],
53172
+ background: `${theme2.colors.success}15`,
53173
+ color: theme2.colors.success,
53174
+ fontSize: theme2.fontSizes[1],
53175
+ fontWeight: theme2.fontWeights.medium,
53176
+ textDecoration: "none",
53177
+ transition: "all 0.2s ease"
53178
+ },
53179
+ children: [
53180
+ /* @__PURE__ */ jsx(CircleCheckBig, { size: 14 }),
53181
+ "Issue #",
53182
+ claudeAssignment.issueNumber
53183
+ ]
53184
+ }
53185
+ ),
53186
+ claudeAssignment.status === "error" && /* @__PURE__ */ jsxs(
53187
+ "div",
53188
+ {
53189
+ style: {
53190
+ display: "flex",
53191
+ alignItems: "center",
53192
+ gap: "6px",
53193
+ padding: "6px 12px",
53194
+ border: `1px solid ${theme2.colors.error}`,
53195
+ borderRadius: theme2.radii[1],
53196
+ background: `${theme2.colors.error}15`,
53197
+ color: theme2.colors.error,
53198
+ fontSize: theme2.fontSizes[1]
53199
+ },
53200
+ title: claudeAssignment.error,
53201
+ children: [
53202
+ /* @__PURE__ */ jsx(CircleAlert, { size: 14 }),
53203
+ "Failed",
53204
+ /* @__PURE__ */ jsx(
53205
+ "button",
53206
+ {
53207
+ onClick: () => setClaudeAssignment({ status: "idle" }),
53208
+ style: {
53209
+ background: "none",
53210
+ border: "none",
53211
+ color: theme2.colors.error,
53212
+ cursor: "pointer",
53213
+ padding: "0 0 0 4px",
53214
+ fontSize: theme2.fontSizes[0],
53215
+ textDecoration: "underline"
53216
+ },
53217
+ children: "Retry"
53218
+ }
53219
+ )
53220
+ ]
53221
+ }
53222
+ ),
53223
+ /* @__PURE__ */ jsx(
53224
+ "button",
53225
+ {
53226
+ onClick: handleBack,
53227
+ style: {
53228
+ display: "flex",
53229
+ alignItems: "center",
53230
+ justifyContent: "center",
53231
+ width: "32px",
53232
+ height: "32px",
53233
+ border: `1px solid ${theme2.colors.border}`,
53234
+ borderRadius: theme2.radii[1],
53235
+ background: theme2.colors.surface,
53236
+ cursor: "pointer",
53237
+ color: theme2.colors.textSecondary,
53238
+ transition: "all 0.2s ease"
53239
+ },
53240
+ onMouseEnter: (e) => {
53241
+ e.currentTarget.style.background = theme2.colors.backgroundSecondary;
53242
+ e.currentTarget.style.color = theme2.colors.text;
53243
+ },
53244
+ onMouseLeave: (e) => {
53245
+ e.currentTarget.style.background = theme2.colors.surface;
53246
+ e.currentTarget.style.color = theme2.colors.textSecondary;
53247
+ },
53248
+ title: "Close",
53249
+ children: /* @__PURE__ */ jsx(X, { size: 16 })
53250
+ }
53251
+ )
53252
+ ] })
53022
53253
  ]
53023
53254
  }
53024
53255
  ),
53256
+ /* @__PURE__ */ jsx("style", { children: `
53257
+ @keyframes spin {
53258
+ to { transform: rotate(360deg); }
53259
+ }
53260
+ ` }),
53025
53261
  /* @__PURE__ */ jsx(
53026
53262
  "h1",
53027
53263
  {
@@ -53034,80 +53270,6 @@ const TaskDetailPanel = ({ context, actions, events: events2, config }) => {
53034
53270
  },
53035
53271
  children: selectedTask.title
53036
53272
  }
53037
- ),
53038
- /* @__PURE__ */ jsxs(
53039
- "div",
53040
- {
53041
- style: {
53042
- display: "grid",
53043
- gridTemplateColumns: "repeat(auto-fit, minmax(200px, 1fr))",
53044
- gap: "12px"
53045
- },
53046
- children: [
53047
- selectedTask.priority && /* @__PURE__ */ jsx(
53048
- MetadataRow,
53049
- {
53050
- icon: /* @__PURE__ */ jsx(Flag, { size: 14 }),
53051
- label: "Priority",
53052
- value: /* @__PURE__ */ jsx("span", { style: getPriorityStyles(theme2, selectedTask.priority), children: selectedTask.priority })
53053
- }
53054
- ),
53055
- selectedTask.assignee && selectedTask.assignee.length > 0 && /* @__PURE__ */ jsx(
53056
- MetadataRow,
53057
- {
53058
- icon: /* @__PURE__ */ jsx(User, { size: 14 }),
53059
- label: "Assignee",
53060
- value: selectedTask.assignee.join(", ")
53061
- }
53062
- ),
53063
- selectedTask.createdDate && /* @__PURE__ */ jsx(
53064
- MetadataRow,
53065
- {
53066
- icon: /* @__PURE__ */ jsx(Calendar, { size: 14 }),
53067
- label: "Created",
53068
- value: selectedTask.createdDate
53069
- }
53070
- ),
53071
- selectedTask.branch && /* @__PURE__ */ jsx(
53072
- MetadataRow,
53073
- {
53074
- icon: /* @__PURE__ */ jsx(GitBranch, { size: 14 }),
53075
- label: "Branch",
53076
- value: selectedTask.branch
53077
- }
53078
- )
53079
- ]
53080
- }
53081
- ),
53082
- selectedTask.labels && selectedTask.labels.length > 0 && /* @__PURE__ */ jsxs(
53083
- "div",
53084
- {
53085
- style: {
53086
- display: "flex",
53087
- alignItems: "center",
53088
- gap: "8px",
53089
- marginTop: "12px",
53090
- flexWrap: "wrap"
53091
- },
53092
- children: [
53093
- /* @__PURE__ */ jsx(Tag, { size: 14, color: theme2.colors.textMuted }),
53094
- selectedTask.labels.map((label) => /* @__PURE__ */ jsx(
53095
- "span",
53096
- {
53097
- style: {
53098
- padding: "2px 8px",
53099
- borderRadius: theme2.radii[1],
53100
- fontSize: theme2.fontSizes[0],
53101
- fontWeight: theme2.fontWeights.medium,
53102
- background: `${theme2.colors.primary}15`,
53103
- color: theme2.colors.primary
53104
- },
53105
- children: label
53106
- },
53107
- label
53108
- ))
53109
- ]
53110
- }
53111
53273
  )
53112
53274
  ]
53113
53275
  }