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.
- ara_cli/__main__.py +252 -97
- ara_cli/ara_command_action.py +11 -6
- ara_cli/ara_subcommands/__init__.py +0 -0
- ara_cli/ara_subcommands/autofix.py +26 -0
- ara_cli/ara_subcommands/chat.py +27 -0
- ara_cli/ara_subcommands/classifier_directory.py +16 -0
- ara_cli/ara_subcommands/common.py +100 -0
- ara_cli/ara_subcommands/create.py +75 -0
- ara_cli/ara_subcommands/delete.py +22 -0
- ara_cli/ara_subcommands/extract.py +22 -0
- ara_cli/ara_subcommands/fetch_templates.py +14 -0
- ara_cli/ara_subcommands/list.py +65 -0
- ara_cli/ara_subcommands/list_tags.py +25 -0
- ara_cli/ara_subcommands/load.py +48 -0
- ara_cli/ara_subcommands/prompt.py +136 -0
- ara_cli/ara_subcommands/read.py +47 -0
- ara_cli/ara_subcommands/read_status.py +20 -0
- ara_cli/ara_subcommands/read_user.py +20 -0
- ara_cli/ara_subcommands/reconnect.py +27 -0
- ara_cli/ara_subcommands/rename.py +22 -0
- ara_cli/ara_subcommands/scan.py +14 -0
- ara_cli/ara_subcommands/set_status.py +22 -0
- ara_cli/ara_subcommands/set_user.py +22 -0
- ara_cli/ara_subcommands/template.py +16 -0
- ara_cli/artefact_autofix.py +44 -6
- ara_cli/artefact_models/artefact_model.py +106 -25
- ara_cli/artefact_models/artefact_templates.py +18 -9
- ara_cli/artefact_models/epic_artefact_model.py +11 -2
- ara_cli/artefact_models/feature_artefact_model.py +31 -1
- ara_cli/artefact_models/userstory_artefact_model.py +15 -3
- ara_cli/artefact_scan.py +2 -2
- ara_cli/chat.py +1 -19
- ara_cli/commands/read_command.py +17 -4
- ara_cli/completers.py +144 -0
- ara_cli/file_loaders/text_file_loader.py +2 -2
- ara_cli/prompt_extractor.py +97 -79
- ara_cli/prompt_handler.py +160 -59
- ara_cli/tag_extractor.py +38 -18
- ara_cli/template_loader.py +1 -1
- ara_cli/version.py +1 -1
- {ara_cli-0.1.10.0.dist-info → ara_cli-0.1.10.4.dist-info}/METADATA +2 -1
- {ara_cli-0.1.10.0.dist-info → ara_cli-0.1.10.4.dist-info}/RECORD +48 -26
- tests/test_artefact_scan.py +1 -1
- tests/test_prompt_handler.py +12 -4
- tests/test_tag_extractor.py +19 -13
- ara_cli/ara_command_parser.py +0 -605
- {ara_cli-0.1.10.0.dist-info → ara_cli-0.1.10.4.dist-info}/WHEEL +0 -0
- {ara_cli-0.1.10.0.dist-info → ara_cli-0.1.10.4.dist-info}/entry_points.txt +0 -0
- {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,
|
|
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(
|
|
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,
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
54
|
-
|
|
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
|
-
|
|
105
|
+
tag_groups = {}
|
|
85
106
|
|
|
86
107
|
if filtered_extra_column:
|
|
87
|
-
self.filter_column(
|
|
108
|
+
self.filter_column(tag_groups, filtered_artefacts)
|
|
88
109
|
else:
|
|
89
|
-
self.add_to_tags_set(
|
|
110
|
+
self.add_to_tags_set(tag_groups, filtered_artefacts)
|
|
90
111
|
|
|
91
|
-
|
|
92
|
-
return sorted_tags
|
|
112
|
+
return tag_groups
|
ara_cli/template_loader.py
CHANGED
|
@@ -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.
|
|
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.
|
|
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=
|
|
3
|
-
ara_cli/ara_command_action.py,sha256=
|
|
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=
|
|
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=
|
|
15
|
-
ara_cli/chat.py,sha256=
|
|
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=
|
|
30
|
-
ara_cli/prompt_handler.py,sha256=
|
|
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=
|
|
34
|
-
ara_cli/template_loader.py,sha256=
|
|
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=
|
|
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=
|
|
43
|
-
ara_cli/artefact_models/artefact_templates.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
163
|
-
tests/test_tag_extractor.py,sha256=
|
|
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.
|
|
168
|
-
ara_cli-0.1.10.
|
|
169
|
-
ara_cli-0.1.10.
|
|
170
|
-
ara_cli-0.1.10.
|
|
171
|
-
ara_cli-0.1.10.
|
|
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,,
|
tests/test_artefact_scan.py
CHANGED
|
@@ -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),
|
|
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):
|
tests/test_prompt_handler.py
CHANGED
|
@@ -698,16 +698,24 @@ class TestArtefactAndTemplateHandling:
|
|
|
698
698
|
|
|
699
699
|
mock_collect.return_value = ("### GIVENS\ncontent", [{"type": "image_url"}])
|
|
700
700
|
|
|
701
|
-
|
|
702
|
-
|
|
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
|
-
|
|
710
|
-
|
|
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()
|
tests/test_tag_extractor.py
CHANGED
|
@@ -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=['
|
|
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
|
-
|
|
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)
|