ara-cli 0.1.10.0__py3-none-any.whl → 0.1.10.4__py3-none-any.whl

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.

Potentially problematic release.


This version of ara-cli might be problematic. Click here for more details.

Files changed (49) hide show
  1. ara_cli/__main__.py +252 -97
  2. ara_cli/ara_command_action.py +11 -6
  3. ara_cli/ara_subcommands/__init__.py +0 -0
  4. ara_cli/ara_subcommands/autofix.py +26 -0
  5. ara_cli/ara_subcommands/chat.py +27 -0
  6. ara_cli/ara_subcommands/classifier_directory.py +16 -0
  7. ara_cli/ara_subcommands/common.py +100 -0
  8. ara_cli/ara_subcommands/create.py +75 -0
  9. ara_cli/ara_subcommands/delete.py +22 -0
  10. ara_cli/ara_subcommands/extract.py +22 -0
  11. ara_cli/ara_subcommands/fetch_templates.py +14 -0
  12. ara_cli/ara_subcommands/list.py +65 -0
  13. ara_cli/ara_subcommands/list_tags.py +25 -0
  14. ara_cli/ara_subcommands/load.py +48 -0
  15. ara_cli/ara_subcommands/prompt.py +136 -0
  16. ara_cli/ara_subcommands/read.py +47 -0
  17. ara_cli/ara_subcommands/read_status.py +20 -0
  18. ara_cli/ara_subcommands/read_user.py +20 -0
  19. ara_cli/ara_subcommands/reconnect.py +27 -0
  20. ara_cli/ara_subcommands/rename.py +22 -0
  21. ara_cli/ara_subcommands/scan.py +14 -0
  22. ara_cli/ara_subcommands/set_status.py +22 -0
  23. ara_cli/ara_subcommands/set_user.py +22 -0
  24. ara_cli/ara_subcommands/template.py +16 -0
  25. ara_cli/artefact_autofix.py +44 -6
  26. ara_cli/artefact_models/artefact_model.py +106 -25
  27. ara_cli/artefact_models/artefact_templates.py +18 -9
  28. ara_cli/artefact_models/epic_artefact_model.py +11 -2
  29. ara_cli/artefact_models/feature_artefact_model.py +31 -1
  30. ara_cli/artefact_models/userstory_artefact_model.py +15 -3
  31. ara_cli/artefact_scan.py +2 -2
  32. ara_cli/chat.py +1 -19
  33. ara_cli/commands/read_command.py +17 -4
  34. ara_cli/completers.py +144 -0
  35. ara_cli/file_loaders/text_file_loader.py +2 -2
  36. ara_cli/prompt_extractor.py +97 -79
  37. ara_cli/prompt_handler.py +160 -59
  38. ara_cli/tag_extractor.py +38 -18
  39. ara_cli/template_loader.py +1 -1
  40. ara_cli/version.py +1 -1
  41. {ara_cli-0.1.10.0.dist-info → ara_cli-0.1.10.4.dist-info}/METADATA +2 -1
  42. {ara_cli-0.1.10.0.dist-info → ara_cli-0.1.10.4.dist-info}/RECORD +48 -26
  43. tests/test_artefact_scan.py +1 -1
  44. tests/test_prompt_handler.py +12 -4
  45. tests/test_tag_extractor.py +19 -13
  46. ara_cli/ara_command_parser.py +0 -605
  47. {ara_cli-0.1.10.0.dist-info → ara_cli-0.1.10.4.dist-info}/WHEEL +0 -0
  48. {ara_cli-0.1.10.0.dist-info → ara_cli-0.1.10.4.dist-info}/entry_points.txt +0 -0
  49. {ara_cli-0.1.10.0.dist-info → ara_cli-0.1.10.4.dist-info}/top_level.txt +0 -0
ara_cli/tag_extractor.py CHANGED
@@ -6,18 +6,17 @@ from ara_cli.artefact_models.artefact_data_retrieval import (
6
6
  artefact_tags_retrieval,
7
7
  )
8
8
 
9
-
10
9
  class TagExtractor:
11
10
  def __init__(self, file_system=None):
12
11
  self.file_system = file_system or os
13
12
 
14
- def filter_column(self, tags_set, filtered_artefacts):
13
+ def filter_column(self, tag_groups, filtered_artefacts):
15
14
  status_tags = {"to-do", "in-progress", "review", "done", "closed"}
16
15
 
17
16
  artefacts_to_process = self._get_artefacts_without_status_tags(
18
17
  filtered_artefacts, status_tags
19
18
  )
20
- self._add_non_status_tags_to_set(tags_set, artefacts_to_process, status_tags)
19
+ self._add_non_status_tags_to_set(tag_groups, artefacts_to_process, status_tags)
21
20
 
22
21
  def _get_artefacts_without_status_tags(self, filtered_artefacts, status_tags):
23
22
  artefacts_to_process = []
@@ -32,7 +31,7 @@ class TagExtractor:
32
31
  tags = artefact.tags + [artefact.status] if artefact.status else artefact.tags
33
32
  return set(tag for tag in tags if tag is not None)
34
33
 
35
- def _add_non_status_tags_to_set(self, tags_set, artefacts, status_tags):
34
+ def _add_non_status_tags_to_set(self, tag_groups, artefacts, status_tags):
36
35
  for artefact in artefacts:
37
36
  tags = [
38
37
  tag for tag in (artefact.tags + [artefact.status]) if tag is not None
@@ -40,23 +39,45 @@ class TagExtractor:
40
39
  for tag in tags:
41
40
  if self._is_skipped_tag(tag, status_tags):
42
41
  continue
43
- tags_set.add(tag)
42
+ key = tag.lower()
43
+ if key not in tag_groups:
44
+ tag_groups[key] = set()
45
+ tag_groups[key].add(tag)
44
46
 
45
47
  def _is_skipped_tag(self, tag, status_tags):
46
48
  return (
47
49
  tag in status_tags or tag.startswith("priority_") or tag.startswith("user_")
48
50
  )
49
51
 
50
- def add_to_tags_set(self, tags_set, filtered_artefacts):
52
+ def _collect_all_tags(self, artefact):
53
+ """Collect all tags from an artefact including user tags and author."""
54
+ all_tags = []
55
+ all_tags.extend(artefact.tags)
56
+
57
+ if artefact.status:
58
+ all_tags.append(artefact.status)
59
+
60
+ user_tags = [f"user_{tag}" for tag in artefact.users]
61
+ all_tags.extend(user_tags)
62
+
63
+ if hasattr(artefact, 'author') and artefact.author:
64
+ all_tags.append(artefact.author)
65
+
66
+ return [tag for tag in all_tags if tag is not None]
67
+
68
+ def _add_tags_to_groups(self, tag_groups, tags):
69
+ """Add tags to tag groups."""
70
+ for tag in tags:
71
+ key = tag.lower()
72
+ if key not in tag_groups:
73
+ tag_groups[key] = set()
74
+ tag_groups[key].add(tag)
75
+
76
+ def add_to_tags_set(self, tag_groups, filtered_artefacts):
51
77
  for artefact_list in filtered_artefacts.values():
52
78
  for artefact in artefact_list:
53
- user_tags = [f"user_{tag}" for tag in artefact.users]
54
- tags = [
55
- tag
56
- for tag in (artefact.tags + [artefact.status] + user_tags)
57
- if tag is not None
58
- ]
59
- tags_set.update(tags)
79
+ all_tags = self._collect_all_tags(artefact)
80
+ self._add_tags_to_groups(tag_groups, all_tags)
60
81
 
61
82
  def extract_tags(
62
83
  self,
@@ -81,12 +102,11 @@ class TagExtractor:
81
102
  tag_retrieval=artefact_tags_retrieval,
82
103
  )
83
104
 
84
- unique_tags = set()
105
+ tag_groups = {}
85
106
 
86
107
  if filtered_extra_column:
87
- self.filter_column(unique_tags, filtered_artefacts)
108
+ self.filter_column(tag_groups, filtered_artefacts)
88
109
  else:
89
- self.add_to_tags_set(unique_tags, filtered_artefacts)
110
+ self.add_to_tags_set(tag_groups, filtered_artefacts)
90
111
 
91
- sorted_tags = sorted(unique_tags)
92
- return sorted_tags
112
+ return tag_groups
@@ -147,7 +147,7 @@ class TemplateLoader:
147
147
  # Direct file loading for CLI usage
148
148
  try:
149
149
  with open(file_path, 'r', encoding='utf-8') as template_file:
150
- template_content = template_file.read()
150
+ template_content = template_file.read().replace('\r\n', '\n')
151
151
 
152
152
  # Add prompt tag if needed
153
153
  self._add_prompt_tag_if_needed(chat_file_path)
ara_cli/version.py CHANGED
@@ -1,2 +1,2 @@
1
1
  # version.py
2
- __version__ = "0.1.10.0" # fith parameter like .0 for local install test purposes only. official numbers should be 4 digit numbers
2
+ __version__ = "0.1.10.4" # fith parameter like .0 for local install test purposes only. official numbers should be 4 digit numbers
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ara_cli
3
- Version: 0.1.10.0
3
+ Version: 0.1.10.4
4
4
  Summary: Powerful, open source command-line tool for managing, structuring and automating software development artifacts in line with Business-Driven Development (BDD) and AI-assisted processes
5
5
  Description-Content-Type: text/markdown
6
6
  Requires-Dist: langfuse
@@ -19,6 +19,7 @@ Requires-Dist: pydantic
19
19
  Requires-Dist: pydantic_ai
20
20
  Requires-Dist: python-docx
21
21
  Requires-Dist: pymupdf4llm
22
+ Requires-Dist: typer
22
23
  Dynamic: description
23
24
  Dynamic: description-content-type
24
25
  Dynamic: requires-dist
@@ -1,9 +1,8 @@
1
1
  ara_cli/__init__.py,sha256=DuzXKimZ6JtUEnp48qCQcnojDflBtYjT6Na_twO5EzM,505
2
- ara_cli/__main__.py,sha256=sumQaIYg6wJdcT-nQjJpK9DGaBUTszjPrgZLPN2bUVs,3520
3
- ara_cli/ara_command_action.py,sha256=VJSReKfgUQk62DeMcY4EN228FvgF1m8NiHf-ckrigdA,24450
4
- ara_cli/ara_command_parser.py,sha256=4_LXxj9w7eAY8d_s8pMlKmxtMr9cX9y2pD5azNeJjsg,22288
2
+ ara_cli/__main__.py,sha256=wtPH57qlVQVIJ1vC-W_B3JIReJvvsstfouaOA7NY-zA,12569
3
+ ara_cli/ara_command_action.py,sha256=yWtZXxwGp-n5kl-I6bMvwESfyRVGHHBYHVapu-8knl4,24618
5
4
  ara_cli/ara_config.py,sha256=vZsY2zYJdlSExRE84L5LqRH3DjveeuMSmG5fC8HDIVc,9794
6
- ara_cli/artefact_autofix.py,sha256=9j_bh0HGnN6HVT9OGKVp85VgDklpx3XpSc9MxBCldU4,25050
5
+ ara_cli/artefact_autofix.py,sha256=wLAWKGjhNqXZjsBqy98L3ZpDzg8S5OzFeroJBxGyAAw,26308
7
6
  ara_cli/artefact_creator.py,sha256=fRrDaGZvOqJqDb_DLXqMTed2XfIvQMIHjLgOuHOi3Qg,5973
8
7
  ara_cli/artefact_deleter.py,sha256=T1vS2s3k_BW86Sd8FExx8nC3BIL05xE9KZLkeZsZrKM,1891
9
8
  ara_cli/artefact_fuzzy_search.py,sha256=XMzbMBOJ2YrgFi566jYNB3XeRAmJh7-zqV2QJYbhtlc,3006
@@ -11,12 +10,13 @@ ara_cli/artefact_link_updater.py,sha256=nKdxTpDKqWTOAMD8viKmUaklSFGWzJZ8S8E8xW_A
11
10
  ara_cli/artefact_lister.py,sha256=M-ggazAgZ-OLeW9NB48r_sd6zPx0p4hEpeS63qHwI1A,4176
12
11
  ara_cli/artefact_reader.py,sha256=-6E1VhIlh2oJE1Rn8ARcHRc_E9N4uk8cEViKMoywm6E,7753
13
12
  ara_cli/artefact_renamer.py,sha256=8S4QWD19_FGKsKlWojnu_RUOxx0u9rmLugydM4s4VDc,4219
14
- ara_cli/artefact_scan.py,sha256=msPCm-vPWOAZ_e_z5GylXxq1MtNlmJ4zvKrsdOFCWF4,4813
15
- ara_cli/chat.py,sha256=Vp1HzSaaUsfOldOjxJc0ff68lQJWiIet0LJ22jjMYUs,40776
13
+ ara_cli/artefact_scan.py,sha256=qY2Gp4zVcqMXhtuP7rICW0UBG4pcj3W2ABofnL9SIG8,4806
14
+ ara_cli/chat.py,sha256=II3lnzuCWDnjTSWTO-XbhTgY3EoEbFimcRHg9wQjKq4,40270
16
15
  ara_cli/classifier.py,sha256=zWskj7rBYdqYBGjksBm46iTgVU5IIf2PZsJr4qeiwVU,1878
17
16
  ara_cli/codefusionretriever.py,sha256=fCHgXdIBRzkVAnapX-KI2NQ44XbrrF4tEQmn5J6clUI,1980
18
17
  ara_cli/codehierachieretriever.py,sha256=Xd3EgEWWhkSf1TmTWtf8X5_YvyE_4B66nRrqarwSiTU,1182
19
18
  ara_cli/commandline_completer.py,sha256=b00Dqb5n7SecpxYIDLxAfYhp8X6e3c8a5qYz6ko0i3E,1192
19
+ ara_cli/completers.py,sha256=V4bcmUnuFkdgMpJ3bLAL7cnxinxZb8wwB17WnRHIrHM,5404
20
20
  ara_cli/directory_navigator.py,sha256=6QbSAjJrJ5a6Lutol9J4HFgVDMiAQ672ny9TATrh04U,3318
21
21
  ara_cli/error_handler.py,sha256=nNaJSq82f3xiz_QFRKPg5kX_-oI-UoFdRJ2OTj1AR18,4019
22
22
  ara_cli/file_classifier.py,sha256=nUcNrhflUydCyCRbXHjEEXYwwwfUm65lYnNEvc86fpM,4026
@@ -26,38 +26,60 @@ ara_cli/global_file_lister.py,sha256=IIrtFoN5KYyJ3jVPanXZJ4UbYZfSdONRwxkZzvmq6-k
26
26
  ara_cli/list_filter.py,sha256=qKGwwQsrWe7L5FbdxEbBYD1bbbi8c-RMypjXqXvLbgs,5291
27
27
  ara_cli/output_suppressor.py,sha256=nwiHaQLwabOjMoJOeUESBnZszGMxrQZfJ3N2OvahX7Y,389
28
28
  ara_cli/prompt_chat.py,sha256=kd_OINDQFit6jN04bb7mzgY259JBbRaTaNp9F-webkc,1346
29
- ara_cli/prompt_extractor.py,sha256=WloRgfcEdIVq37BpdWAd2X3EMu0bcNN_Wuws1T2YiUg,8418
30
- ara_cli/prompt_handler.py,sha256=N0zH5k9T6udKAbMolxEAaAwiFo03h5aF-IY3BmMLEos,27924
29
+ ara_cli/prompt_extractor.py,sha256=KuJzx_heH3GbRr8PmbIk16ORGfttrV74aHY_iSe2OB4,9581
30
+ ara_cli/prompt_handler.py,sha256=3iSdEJe6RL496Gc1KncOREK_Nb9HYr7Ti9KTTwA_sTU,30393
31
31
  ara_cli/prompt_rag.py,sha256=ydlhe4CUqz0jdzlY7jBbpKaf_5fjMrAZKnriKea3ZAg,7485
32
32
  ara_cli/run_file_lister.py,sha256=XbrrDTJXp1LFGx9Lv91SNsEHZPP-PyEMBF_P4btjbDA,2360
33
- ara_cli/tag_extractor.py,sha256=k2yRl7dAMZ4YTARzUke4wgY0oEIOmWkOHGet7nXB6uw,3317
34
- ara_cli/template_loader.py,sha256=uEpYOchT5d-OO5r-W0-h605Xilvuv56i1VKSy4_9NaE,10734
33
+ ara_cli/tag_extractor.py,sha256=vjuPGGlT3mQpez6eY9LLgIBFQqPsTEgfAWODbXlgODc,4057
34
+ ara_cli/template_loader.py,sha256=nYQ4zadcXX6oXSNgFNlXx8u5961BZCj3dw0tSKHdNfE,10756
35
35
  ara_cli/template_manager.py,sha256=l2c785YHB7m0e2TjE0CX-nwXrS4v3EiT9qrS5KuatAc,7105
36
36
  ara_cli/update_config_prompt.py,sha256=moqj2Kha7S7fEGzTReU0v2y8UjXC8QfnoiieOQr35C4,5157
37
- ara_cli/version.py,sha256=AvikXK1EI29z3MY864MZ0oxZJZ4-tSdFYdogqQEkDac,146
37
+ ara_cli/version.py,sha256=VnqPJ_1-kTVTVdR9fygWODBR47iqfCLPlvi7bgxJ_9g,146
38
+ ara_cli/ara_subcommands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
+ ara_cli/ara_subcommands/autofix.py,sha256=h7-6hV97Q6PisUJ_U1Qs4sHYwkHsDpeYH63y_LQsfSc,1095
40
+ ara_cli/ara_subcommands/chat.py,sha256=9zorWKbM0ulu9xFhW2tzV5vl8hCLOCjcp2E9hYgZJ90,1239
41
+ ara_cli/ara_subcommands/classifier_directory.py,sha256=7GH3w4DtvFCM1Sr6Qqk_kjp0EC8jNJDieJJMshYJ_6k,620
42
+ ara_cli/ara_subcommands/common.py,sha256=6bAfPbFHx3CzDSQMm4vL7keFgVnOpqiupgDDWj7QdUQ,2898
43
+ ara_cli/ara_subcommands/create.py,sha256=2tIpzKgzytTIdVV26p6cvrcBo8WLm_3qK7GJyn47Jaw,2527
44
+ ara_cli/ara_subcommands/delete.py,sha256=DxWRQ5Z8h5ZpMhyjLHNuLxONgxIQ97hVkQ8VkX15FDk,827
45
+ ara_cli/ara_subcommands/extract.py,sha256=11atXek579W2RP6PYHlGuyVjWBTuyh1viondCjuce_k,765
46
+ ara_cli/ara_subcommands/fetch_templates.py,sha256=f1bXOTlM67hyf3oGPZEQQjSwUsTte7Cd9-yqq76Ud08,432
47
+ ara_cli/ara_subcommands/list.py,sha256=HtX3kKQ9nrfCcJPxJng0ZnoOqLQ11-aui2zxVei8PlI,3562
48
+ ara_cli/ara_subcommands/list_tags.py,sha256=drEzJgJa4OqqYfIuvT7XkjG4o7VB-ikHE0ArIdljoTI,1113
49
+ ara_cli/ara_subcommands/load.py,sha256=czaflU5Xv-TBlpgalvm6yn5oBBAnNfxSeoIFuLPfi-U,1825
50
+ ara_cli/ara_subcommands/prompt.py,sha256=A8L0lJNBm5zkwJJrzz1kpdycwpm1y8hzd2iVleylpck,4630
51
+ ara_cli/ara_subcommands/read.py,sha256=zTPNMvEPf1WvhtUiauXu5HFiXHRIBJVCkHu44L_scSk,2396
52
+ ara_cli/ara_subcommands/read_status.py,sha256=ZqdxuYXC-idJ2JtMIcZzT4XYI55PnqA6sYv2FcMuchw,695
53
+ ara_cli/ara_subcommands/read_user.py,sha256=NuhaC7dBbi8PUHnGGpqbBVSbQ__nT_L52c7tdKkxjlA,681
54
+ ara_cli/ara_subcommands/reconnect.py,sha256=5Q90rbSnYf7YO6n_9esWsYv7o8GQ-Fnzgy4d8S-X-DQ,1088
55
+ ara_cli/ara_subcommands/rename.py,sha256=IggQdvXjTbZ5CkqzebydVVTcaxO4SDOyORqXDL5jnY8,784
56
+ ara_cli/ara_subcommands/scan.py,sha256=XXwIzq4T9sDMXV0ZcMTSakQ7SyosuCfKjMiiTz7533A,363
57
+ ara_cli/ara_subcommands/set_status.py,sha256=6zzuqLR9k-V63e5UQBpsooftbYHuENEP2s3AdI2jyG0,786
58
+ ara_cli/ara_subcommands/set_user.py,sha256=ADgZIj9xIWK9QKY95lIW_GJGYZysALV--y8j6IuvGxs,755
59
+ ara_cli/ara_subcommands/template.py,sha256=gp_BzrNHcVylU5xav1vmPe3-0vQR7UHm44G7w2i370Q,552
38
60
  ara_cli/artefact_models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
61
  ara_cli/artefact_models/artefact_data_retrieval.py,sha256=CooXOJBYWSyiViN2xkC8baS8OUaslry3YGVVUeDxRAU,527
40
62
  ara_cli/artefact_models/artefact_load.py,sha256=IXzWxP-Q_j_oDGMno0m-OuXCQ7Vd5c_NctshGr4ROBw,621
41
63
  ara_cli/artefact_models/artefact_mapping.py,sha256=8aD0spBjkJ8toMAmFawc6UTUxB6-tEEViZXv2I-r88Q,1874
42
- ara_cli/artefact_models/artefact_model.py,sha256=qSbcrmFWAYgBqcNl9QARI1_uLQJm-TPVgP5q2AEFnjE,15983
43
- ara_cli/artefact_models/artefact_templates.py,sha256=CFa_vIA-cnbZEHuACd24vNJB_7LueQi-8x7ga_AyLKI,9830
64
+ ara_cli/artefact_models/artefact_model.py,sha256=Ek7CPzYyj5GajoSdb0G8_I9HbBXFAzRq7DB5CEyNZH0,18817
65
+ ara_cli/artefact_models/artefact_templates.py,sha256=8N1gJlS1KLd79y2nasEgU8xeK-WaP6IenBK5Ojcmn9Y,10028
44
66
  ara_cli/artefact_models/businessgoal_artefact_model.py,sha256=GYT5S2xEnQHwv-k-lEeX5NMSqA-UEfV3PhNjgPDUJpw,4698
45
67
  ara_cli/artefact_models/capability_artefact_model.py,sha256=SZqHx4O2mj4urn77Stnj4_Jxtlq3-LgBBU9SMkByppI,3079
46
- ara_cli/artefact_models/epic_artefact_model.py,sha256=h9pC00ZxCL-t_NMjwTCeOnIJZPa9hhB-R05wr110LXs,5619
68
+ ara_cli/artefact_models/epic_artefact_model.py,sha256=_HlFmOJqkDKj3SRpLI4H5rU-va-nFamxhMH4BCODR5c,6053
47
69
  ara_cli/artefact_models/example_artefact_model.py,sha256=UXrKbaPotg1jwcrVSdCeo-XH4tTD_-U1e3giaBn5_xg,1384
48
- ara_cli/artefact_models/feature_artefact_model.py,sha256=iUCrdgH_VhRCBVyCQARpl9cWzavC310lKZHWLofsq9s,20256
70
+ ara_cli/artefact_models/feature_artefact_model.py,sha256=PvvZDgwsHV1AMS2FXBxwWxkHFlJ0tyFPRX2NGnbnt1Q,21353
49
71
  ara_cli/artefact_models/issue_artefact_model.py,sha256=v6CpKnkqiUh6Wch2kkEmyyW49c8ysdy1qz8l1Ft9uJA,2552
50
72
  ara_cli/artefact_models/keyfeature_artefact_model.py,sha256=J9oXLsCAo22AW31D5Z104y02ss0S0O4tPCcd09zYCD0,4066
51
73
  ara_cli/artefact_models/serialize_helper.py,sha256=Wks30wy-UrwJURetydKykLgJkdGRgXFHkDT24vHe5tU,595
52
74
  ara_cli/artefact_models/task_artefact_model.py,sha256=1BSMbz9D-RXvdpdd0RlAr9hUx84Rcuysk2YfQC8Qy14,6046
53
- ara_cli/artefact_models/userstory_artefact_model.py,sha256=2awH31ROtm7j4T44Bv4cylQDYLQtnfgXZMhDu_pgw-k,6435
75
+ ara_cli/artefact_models/userstory_artefact_model.py,sha256=P5an9UrZ1QrQ57TxSJ48F2OwKxhqEz1B-QxTtHeSZFI,7172
54
76
  ara_cli/artefact_models/vision_artefact_model.py,sha256=frjaUJj-mmIlVHEhzAQztCGs-CtvNu_odSborgztfzo,5251
55
77
  ara_cli/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
56
78
  ara_cli/commands/command.py,sha256=Y_2dNeuxRjbyI3ScXNv55lptSe8Hs_ya78L0nPYNZHA,154
57
79
  ara_cli/commands/extract_command.py,sha256=CzUOwDembG587PYbxg5rge4XSfdsuTyOPUvkobkXCIs,573
58
80
  ara_cli/commands/load_command.py,sha256=H3CfeHIL-criDU5oi4BONTSpyzJ4m8DzJ0ZCIiAZFeI,2204
59
81
  ara_cli/commands/load_image_command.py,sha256=g9-PXAYdqx5Ed1PdVo-FIb4CyJGEpRFbgQf9Dxg6DmM,886
60
- ara_cli/commands/read_command.py,sha256=bo1BvRWuNKdFqBNN1EWORNrX_yuFAOyBruDUolHq1Vc,3791
82
+ ara_cli/commands/read_command.py,sha256=xne8jlertuJNcsyzjR0bJeUUHi4NkEfd0h0DRbU9rC4,4347
61
83
  ara_cli/file_loaders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
62
84
  ara_cli/file_loaders/binary_file_loader.py,sha256=1HHH1Nk4lEM83CTnf4z9wYz6rMLgpxydFoRcSgkBHmQ,940
63
85
  ara_cli/file_loaders/document_file_loader.py,sha256=VxGFChYyM9K-e6eOCK3yk5jQuEXgz01Mh_NoA6CA_RM,1017
@@ -67,7 +89,7 @@ ara_cli/file_loaders/file_loader.py,sha256=bc1BrMG4pEtwsZLm3Ct53YsMPgnbSaEvZEd8i
67
89
  ara_cli/file_loaders/file_loaders.py,sha256=9QqArTRDmcUUar58JEr-qnpiAtH9ySP-MV9bvooQNpI,4290
68
90
  ara_cli/file_loaders/image_processor.py,sha256=laPThh-i0-obYyS_linQTMcTUwuxMxrSjedGRYb8cIA,3462
69
91
  ara_cli/file_loaders/markdown_reader.py,sha256=R-hvvc9Sj9pWwENqJ0j6wrW0eN1tUqEKWcK2YUFsvsU,2542
70
- ara_cli/file_loaders/text_file_loader.py,sha256=62U59RkWgAML0U0P-sUeFsK51mJM8Fu54gGlnmMwYpY,6804
92
+ ara_cli/file_loaders/text_file_loader.py,sha256=nD0MmjMlr-suMrK7GNwaMd0qv2lJyt4XBijx8SsFvEI,6848
71
93
  ara_cli/templates/agile.artefacts,sha256=nTA8dp98HWKAD-0qhmNpVYIfkVGoJshZqMJGnphiOsE,7932
72
94
  ara_cli/templates/template.businessgoal.prompt_log.md,sha256=xF6bkgj_GqAAqHxJWJiQNt11mEuSGemIqoZ2wOo6dI0,214
73
95
  ara_cli/templates/template.capability.prompt_log.md,sha256=eO8EzrHgb2vYJ-DP1jGzAfDlMo8nY75hZDfhh0s40uQ,208
@@ -150,7 +172,7 @@ tests/test_artefact_link_updater.py,sha256=biqbEp2jCOz8giv72hu2P2hDfeJfJ9OrVGdAv
150
172
  tests/test_artefact_lister.py,sha256=35R13UU-YsX1HOsEN8M2-vIiCUA9RSBm6SwestDaFhE,20388
151
173
  tests/test_artefact_reader.py,sha256=660K-d8ed-j8hulsUB_7baPD2-hhbg9TffUR5yVc4Uo,927
152
174
  tests/test_artefact_renamer.py,sha256=lSnKCCfoFGgKhTdDZrEaeBq1xJAak1QoqH5aSeOe9Ro,3494
153
- tests/test_artefact_scan.py,sha256=uNWgrt7ieZ4ogKACsPqzAsh59JF2BhTKSag31hpVrTQ,16887
175
+ tests/test_artefact_scan.py,sha256=SzMtJeh8_oOBec9yzy3vJRHxs9i1E5gEU2RfF6CJZqE,16888
154
176
  tests/test_chat.py,sha256=D2HRRTdnvcDvB9TWz4O91ZONbLJL6w4v8TRTDwjtzzI,86104
155
177
  tests/test_classifier.py,sha256=grYGPksydNdPsaEBQxYHZTuTdcJWz7VQtikCKA6BNaQ,1920
156
178
  tests/test_directory_navigator.py,sha256=7G0MVrBbtBvbrFUpL0zb_9EkEWi1dulWuHsrQxMJxDY,140
@@ -159,13 +181,13 @@ tests/test_file_creator.py,sha256=tgBCq6KPv-qMSDhj9AZvQIJABiAqgpFRnEg1fqbVrTI,20
159
181
  tests/test_file_lister.py,sha256=Q9HwhKKx540EPzTmfzOCnvtAgON0aMmpJE2eOe1J3EA,4324
160
182
  tests/test_global_file_lister.py,sha256=ycvf2YL8q5QSEMwcnQfUdoWnQQ8xTSyEtccAeXwl6QU,5487
161
183
  tests/test_list_filter.py,sha256=fJA3d_SdaOAUkE7jn68MOVS0THXGghy1fye_64Zvo1U,7964
162
- tests/test_prompt_handler.py,sha256=9s1zavcW81uz8wOBM_2X2KqdLNoc3E9bt0Oqt2-Sgmk,33926
163
- tests/test_tag_extractor.py,sha256=nSiAYlTKZ7TLAOtcJpwK5zTWHhFYU0tI5xKnivLc1dU,2712
184
+ tests/test_prompt_handler.py,sha256=4__q8Ap2hVGXVF1DvvWqq-K630buC7yjccoWkk_FG18,34255
185
+ tests/test_tag_extractor.py,sha256=7eVD10Y1uLkoSrEgqkXzRvPFs8lJ1RiaJzDu7ml_FZE,3118
164
186
  tests/test_template_loader.py,sha256=R7s8HJZbKqja-1TRBMBkVKPTgajofUjjRKUJq7a3_Oc,7427
165
187
  tests/test_template_manager.py,sha256=qliEeYgAEakn8JIqIHa8u0Ht6DY4L3T6DcHBXkjzR4I,4167
166
188
  tests/test_update_config_prompt.py,sha256=xsqj1WTn4BsG5Q2t-sNPfu7EoMURFcS-hfb5VSXUnJc,6765
167
- ara_cli-0.1.10.0.dist-info/METADATA,sha256=9DcNT8mkoI9D6aDt0gRORWFl_MagH7yTw_ISo4uc_Tw,6813
168
- ara_cli-0.1.10.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
169
- ara_cli-0.1.10.0.dist-info/entry_points.txt,sha256=v4h7MzysTgSIDYfEo3oj4Kz_8lzsRa3hq-KJHEcLVX8,45
170
- ara_cli-0.1.10.0.dist-info/top_level.txt,sha256=WM4cLHT5DYUaWzLtRj-gu3yVNFpGQ6lLRI3FMmC-38I,14
171
- ara_cli-0.1.10.0.dist-info/RECORD,,
189
+ ara_cli-0.1.10.4.dist-info/METADATA,sha256=azNT8SFuAIl_AydpLM9v3Gd8utN4g8vTbgO8m7_3fG8,6834
190
+ ara_cli-0.1.10.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
191
+ ara_cli-0.1.10.4.dist-info/entry_points.txt,sha256=v4h7MzysTgSIDYfEo3oj4Kz_8lzsRa3hq-KJHEcLVX8,45
192
+ ara_cli-0.1.10.4.dist-info/top_level.txt,sha256=WM4cLHT5DYUaWzLtRj-gu3yVNFpGQ6lLRI3FMmC-38I,14
193
+ ara_cli-0.1.10.4.dist-info/RECORD,,
@@ -132,7 +132,7 @@ def test_is_rule_valid_rule_is_none():
132
132
  "parent,expected",
133
133
  [
134
134
  (None, True), # parent is None
135
- (MagicMock(rules=None), True), # parent.rules is None
135
+ (MagicMock(rules=None), False), # parent.rules is None
136
136
  ],
137
137
  )
138
138
  def test_is_rule_valid_parent_or_rules_none(parent, expected):
@@ -698,16 +698,24 @@ class TestArtefactAndTemplateHandling:
698
698
 
699
699
  mock_collect.return_value = ("### GIVENS\ncontent", [{"type": "image_url"}])
700
700
 
701
- final_message_list = [{'role': 'user', 'content': ['### GIVENS\ncontent', {'type': 'image_url'}]}]
702
- mock_append_images.return_value = final_message_list
701
+ # append_images_to_message returns a single dict, not a list of dicts.
702
+ returned_message_dict = {'role': 'user', 'content': ['### GIVENS\ncontent', {'type': 'image_url'}]}
703
+ mock_append_images.return_value = returned_message_dict
703
704
 
704
705
  mock_send.return_value = iter([MagicMock(choices=[MagicMock(delta=MagicMock(content="llm response"))])])
705
706
 
706
707
  prompt_handler.create_and_send_custom_prompt(self.mock_classifier, self.mock_param)
707
708
 
708
709
  mock_collect.assert_called_once()
709
- mock_append_images.assert_called_once_with([{'role': 'user', 'content': '### GIVENS\ncontent'}], [{'type': 'image_url'}])
710
- mock_send.assert_called_once_with(final_message_list)
710
+
711
+ # Assert that append_images_to_message was called with a single dict (the bug fix)
712
+ mock_append_images.assert_called_once_with(
713
+ {'role': 'user', 'content': '### GIVENS\ncontent'},
714
+ [{'type': 'image_url'}]
715
+ )
716
+
717
+ # Assert that send_prompt was called with a list containing the dict returned from append_images_to_message
718
+ mock_send.assert_called_once_with([returned_message_dict])
711
719
 
712
720
  log_file = self.root / "ara" / self.mock_classifier / f"{self.mock_param}.data" / f"{self.mock_classifier}.prompt_log.md"
713
721
  assert "llm response" in log_file.read_text()
@@ -8,10 +8,11 @@ from ara_cli.list_filter import ListFilter
8
8
  def artefact():
9
9
  """Fixture to create a mock artefact object."""
10
10
  class Artefact:
11
- def __init__(self, tags, status, users, path="dummy.md", content=""):
11
+ def __init__(self, tags, status, users, author="creator_unknown", path="dummy.md", content=""):
12
12
  self.tags = tags
13
13
  self.status = status
14
14
  self.users = users
15
+ self.author = author
15
16
  self.path = path
16
17
  self.content = content
17
18
  return Artefact
@@ -21,33 +22,33 @@ def artefact():
21
22
  (
22
23
  False, False, None,
23
24
  {'artefacts': [
24
- (['tag1', 'tag2'], 'in-progress', ['user1']),
25
- (['tag3'], 'done', ['user2'])
25
+ (['tag1', 'tag2'], 'in-progress', ['user1'], "creator_unknown"),
26
+ (['tag3'], 'done', ['user2'], "creator_unknown")
26
27
  ]},
27
- ['done', 'in-progress', 'tag1', 'tag2', 'tag3', 'user_user1', 'user_user2']
28
+ ['creator_unknown', 'done', 'in-progress', 'tag1', 'tag2', 'tag3', 'user_user1', 'user_user2']
28
29
  ),
29
30
  (
30
31
  False, True, None,
31
32
  {'artefacts': [
32
- (['project_a', 'priority_high'], None, ['user1']),
33
- (['feature_x'], 'done', ['user2'])
33
+ (['project_a', 'priority_high'], None, ['user1'], "creator_unknown"),
34
+ (['feature_x'], 'done', ['user2'], "creator_unknown")
34
35
  ]},
35
36
  ['project_a']
36
37
  ),
37
38
  (
38
- False, False, ListFilter(include_tags=['@kritik']),
39
+ False, False, ListFilter(include_tags=['kritik']),
39
40
  {'artefacts': [
40
- (['release', 'kritik'], 'review', ['dev1']),
41
- (['bugfix'], 'to-do', ['dev2'])
41
+ (['release', 'kritik'], 'review', ['dev1'], "creator_unknown"),
42
+ (['bugfix'], 'to-do', ['dev2'], "creator_unknown")
42
43
  ]},
43
- ['kritik', 'release', 'review', 'user_dev1']
44
+ ['creator_unknown', 'kritik', 'release', 'review', 'user_dev1']
44
45
  ),
45
46
  (
46
47
  True, False, None,
47
48
  {'artefacts': [
48
- (['tag3'], 'status2', ['user3'])
49
+ (['tag3'], 'status2', ['user3'], "creator_unknown")
49
50
  ]},
50
- ['status2', 'tag3', 'user_user3']
51
+ ['creator_unknown', 'status2', 'tag3', 'user_user3']
51
52
  ),
52
53
  (
53
54
  False, False, None,
@@ -80,4 +81,9 @@ def test_extract_tags(mock_directory_navigator, mock_artefact_reader, artefact,
80
81
 
81
82
  mock_artefact_reader.read_artefacts.assert_called_once()
82
83
 
83
- assert sorted(result) == sorted(expected_tags)
84
+ # Convert dictionary result to flat list for comparison
85
+ actual_tags = []
86
+ for group in result.values():
87
+ actual_tags.extend(group)
88
+
89
+ assert sorted(actual_tags) == sorted(expected_tags)