aircana 5.0.0 → 5.1.1
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.
- checksums.yaml +4 -4
- data/.rspec_status +220 -159
- data/CHANGELOG.md +31 -0
- data/README.md +34 -0
- data/exe/aircana +3 -0
- data/lib/aircana/checksum.rb +19 -0
- data/lib/aircana/cli/commands/kb.rb +11 -2
- data/lib/aircana/configuration.rb +9 -1
- data/lib/aircana/contexts/confluence.rb +30 -5
- data/lib/aircana/contexts/manifest.rb +16 -6
- data/lib/aircana/contexts/web.rb +38 -15
- data/lib/aircana/generators/agents_generator.rb +3 -3
- data/lib/aircana/llm/base.rb +44 -0
- data/lib/aircana/llm/bedrock_client.rb +73 -0
- data/lib/aircana/llm/claude_client.rb +2 -25
- data/lib/aircana/version.rb +1 -1
- data/lib/aircana.rb +25 -0
- metadata +18 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 95a938c77f6d8d15d1cba3b11908ab82032e795e25c8dacdbea56f376b614f5f
|
|
4
|
+
data.tar.gz: ec70c8c5b5c068230259acec3e2196e888cb2e5a667f5745d5e003f547bad6a4
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: cdbddc4bbf185b70b50236cd64c7014f2767c0e068d8940bd9e431b1f46df960ec5d42f45470bf0d91d929166d61522ca9d89b16b3efc9eace4d2e2ef114a986
|
|
7
|
+
data.tar.gz: 05b1846d8afdd1a1c3bbf98536fc38a693bd10a252958eab253c9acd4628f22ff96eb8991b0dc144bab06f13b695b66f832d7e0cd5030d8200657537a2000b50
|
data/.rspec_status
CHANGED
|
@@ -1,187 +1,248 @@
|
|
|
1
1
|
example_id | status | run_time |
|
|
2
2
|
--------------------------------------------------------------- | ------ | --------------- |
|
|
3
|
-
./spec/aircana/
|
|
4
|
-
./spec/aircana/
|
|
5
|
-
./spec/aircana/
|
|
6
|
-
./spec/aircana/
|
|
7
|
-
./spec/aircana/
|
|
8
|
-
./spec/aircana/
|
|
9
|
-
./spec/aircana/
|
|
10
|
-
./spec/aircana/
|
|
11
|
-
./spec/aircana/
|
|
12
|
-
./spec/aircana/
|
|
13
|
-
./spec/aircana/cli/commands/init_spec.rb[1:
|
|
14
|
-
./spec/aircana/cli/commands/init_spec.rb[1:
|
|
15
|
-
./spec/aircana/cli/commands/init_spec.rb[1:
|
|
16
|
-
./spec/aircana/cli/commands/init_spec.rb[1:
|
|
17
|
-
./spec/aircana/cli/commands/init_spec.rb[1:
|
|
18
|
-
./spec/aircana/cli/commands/init_spec.rb[1:
|
|
3
|
+
./spec/aircana/checksum_spec.rb[1:1:1] | passed | 0.00411 seconds |
|
|
4
|
+
./spec/aircana/checksum_spec.rb[1:1:2] | passed | 0.00004 seconds |
|
|
5
|
+
./spec/aircana/checksum_spec.rb[1:1:3] | passed | 0.00003 seconds |
|
|
6
|
+
./spec/aircana/checksum_spec.rb[1:1:4] | passed | 0.00057 seconds |
|
|
7
|
+
./spec/aircana/checksum_spec.rb[1:1:5] | passed | 0.00003 seconds |
|
|
8
|
+
./spec/aircana/checksum_spec.rb[1:2:1] | passed | 0.00043 seconds |
|
|
9
|
+
./spec/aircana/checksum_spec.rb[1:2:2] | passed | 0.00003 seconds |
|
|
10
|
+
./spec/aircana/checksum_spec.rb[1:2:3] | passed | 0.00003 seconds |
|
|
11
|
+
./spec/aircana/checksum_spec.rb[1:2:4] | passed | 0.00003 seconds |
|
|
12
|
+
./spec/aircana/checksum_spec.rb[1:2:5] | passed | 0.00002 seconds |
|
|
13
|
+
./spec/aircana/cli/commands/init_spec.rb[1:1:1] | passed | 0.00897 seconds |
|
|
14
|
+
./spec/aircana/cli/commands/init_spec.rb[1:1:2] | passed | 0.00305 seconds |
|
|
15
|
+
./spec/aircana/cli/commands/init_spec.rb[1:2:1:1] | passed | 0.00473 seconds |
|
|
16
|
+
./spec/aircana/cli/commands/init_spec.rb[1:3:1] | passed | 0.00341 seconds |
|
|
17
|
+
./spec/aircana/cli/commands/init_spec.rb[1:3:2:1] | passed | 0.00325 seconds |
|
|
18
|
+
./spec/aircana/cli/commands/init_spec.rb[1:3:3:1] | passed | 0.00316 seconds |
|
|
19
|
+
./spec/aircana/cli/commands/init_spec.rb[1:3:4:1] | passed | 0.00343 seconds |
|
|
20
|
+
./spec/aircana/cli/commands/init_spec.rb[1:4:1] | passed | 0.00424 seconds |
|
|
21
|
+
./spec/aircana/cli/commands/init_spec.rb[1:4:2] | passed | 0.00139 seconds |
|
|
22
|
+
./spec/aircana/cli/commands/init_spec.rb[1:4:3] | passed | 0.00171 seconds |
|
|
23
|
+
./spec/aircana/cli/commands/init_spec.rb[1:4:4] | passed | 0.00126 seconds |
|
|
24
|
+
./spec/aircana/cli/commands/init_spec.rb[1:4:5] | passed | 0.00176 seconds |
|
|
25
|
+
./spec/aircana/cli/commands/init_spec.rb[1:5:1] | passed | 0.00329 seconds |
|
|
26
|
+
./spec/aircana/cli/commands/init_spec.rb[1:5:2] | passed | 0.00426 seconds |
|
|
27
|
+
./spec/aircana/cli/commands/init_spec.rb[1:5:3] | passed | 0.0043 seconds |
|
|
28
|
+
./spec/aircana/cli/commands/init_spec.rb[1:5:4] | passed | 0.00434 seconds |
|
|
19
29
|
./spec/aircana/cli/commands/kb_spec.rb[1:1:1:1] | passed | 0.00045 seconds |
|
|
20
|
-
./spec/aircana/cli/commands/kb_spec.rb[1:1:2:1] | passed | 0.
|
|
21
|
-
./spec/aircana/cli/commands/kb_spec.rb[1:2:1] | passed | 0.
|
|
22
|
-
./spec/aircana/cli/commands/kb_spec.rb[1:3:1] | passed | 0.
|
|
23
|
-
./spec/aircana/cli/commands/kb_spec.rb[1:3:2] | passed | 0.
|
|
24
|
-
./spec/aircana/cli/commands/kb_spec.rb[1:4:1:1] | passed | 0.
|
|
25
|
-
./spec/aircana/cli/commands/kb_spec.rb[1:4:2:1] | passed | 0.
|
|
26
|
-
./spec/aircana/cli/commands/kb_spec.rb[1:5:1:1] | passed | 0.
|
|
27
|
-
./spec/aircana/cli/commands/kb_spec.rb[1:5:1:2] | passed | 0.
|
|
28
|
-
./spec/aircana/cli/commands/kb_spec.rb[1:5:2:1] | passed | 0.
|
|
29
|
-
./spec/aircana/cli/commands/kb_spec.rb[1:5:2:2] | passed | 0.
|
|
30
|
-
./spec/aircana/cli/commands/kb_spec.rb[1:5:2:3] | passed | 0.
|
|
31
|
-
./spec/aircana/configuration_spec.rb[1:1:1] | passed | 0.
|
|
32
|
-
./spec/aircana/configuration_spec.rb[1:2:1] | passed | 0.
|
|
30
|
+
./spec/aircana/cli/commands/kb_spec.rb[1:1:2:1] | passed | 0.00192 seconds |
|
|
31
|
+
./spec/aircana/cli/commands/kb_spec.rb[1:2:1] | passed | 0.00173 seconds |
|
|
32
|
+
./spec/aircana/cli/commands/kb_spec.rb[1:3:1] | passed | 0.00228 seconds |
|
|
33
|
+
./spec/aircana/cli/commands/kb_spec.rb[1:3:2] | passed | 0.00148 seconds |
|
|
34
|
+
./spec/aircana/cli/commands/kb_spec.rb[1:4:1:1] | passed | 0.00029 seconds |
|
|
35
|
+
./spec/aircana/cli/commands/kb_spec.rb[1:4:2:1] | passed | 0.00152 seconds |
|
|
36
|
+
./spec/aircana/cli/commands/kb_spec.rb[1:5:1:1] | passed | 0.00067 seconds |
|
|
37
|
+
./spec/aircana/cli/commands/kb_spec.rb[1:5:1:2] | passed | 0.0002 seconds |
|
|
38
|
+
./spec/aircana/cli/commands/kb_spec.rb[1:5:2:1] | passed | 0.00019 seconds |
|
|
39
|
+
./spec/aircana/cli/commands/kb_spec.rb[1:5:2:2] | passed | 0.00192 seconds |
|
|
40
|
+
./spec/aircana/cli/commands/kb_spec.rb[1:5:2:3] | passed | 0.0009 seconds |
|
|
41
|
+
./spec/aircana/configuration_spec.rb[1:1:1] | passed | 0.00018 seconds |
|
|
42
|
+
./spec/aircana/configuration_spec.rb[1:2:1] | passed | 0.00008 seconds |
|
|
33
43
|
./spec/aircana/configuration_spec.rb[1:3:1] | passed | 0.00007 seconds |
|
|
34
44
|
./spec/aircana/configuration_spec.rb[1:4:1] | passed | 0.00008 seconds |
|
|
35
|
-
./spec/aircana/configuration_spec.rb[1:5:1] | passed | 0.
|
|
36
|
-
./spec/aircana/configuration_spec.rb[1:6:1] | passed | 0.
|
|
45
|
+
./spec/aircana/configuration_spec.rb[1:5:1] | passed | 0.00007 seconds |
|
|
46
|
+
./spec/aircana/configuration_spec.rb[1:6:1] | passed | 0.00007 seconds |
|
|
37
47
|
./spec/aircana/configuration_spec.rb[1:6:2] | passed | 0.00007 seconds |
|
|
38
|
-
./spec/aircana/configuration_spec.rb[1:7:1
|
|
39
|
-
./spec/aircana/configuration_spec.rb[1:7:2
|
|
40
|
-
./spec/aircana/configuration_spec.rb[1:7:3
|
|
41
|
-
./spec/aircana/configuration_spec.rb[1:7:4
|
|
42
|
-
./spec/aircana/
|
|
43
|
-
./spec/aircana/
|
|
44
|
-
./spec/aircana/
|
|
45
|
-
./spec/aircana/
|
|
46
|
-
./spec/aircana/
|
|
47
|
-
./spec/aircana/
|
|
48
|
-
./spec/aircana/contexts/confluence_spec.rb[1:1:
|
|
49
|
-
./spec/aircana/contexts/confluence_spec.rb[1:1:
|
|
50
|
-
./spec/aircana/contexts/
|
|
51
|
-
./spec/aircana/contexts/
|
|
52
|
-
./spec/aircana/contexts/
|
|
53
|
-
./spec/aircana/contexts/
|
|
54
|
-
./spec/aircana/contexts/
|
|
55
|
-
./spec/aircana/contexts/
|
|
56
|
-
./spec/aircana/contexts/
|
|
57
|
-
./spec/aircana/contexts/
|
|
58
|
-
./spec/aircana/contexts/
|
|
59
|
-
./spec/aircana/contexts/
|
|
60
|
-
./spec/aircana/contexts/
|
|
61
|
-
./spec/aircana/contexts/
|
|
62
|
-
./spec/aircana/contexts/
|
|
63
|
-
./spec/aircana/contexts/
|
|
64
|
-
./spec/aircana/contexts/
|
|
65
|
-
./spec/aircana/contexts/
|
|
66
|
-
./spec/aircana/contexts/
|
|
48
|
+
./spec/aircana/configuration_spec.rb[1:7:1] | passed | 0.00007 seconds |
|
|
49
|
+
./spec/aircana/configuration_spec.rb[1:7:2] | passed | 0.00007 seconds |
|
|
50
|
+
./spec/aircana/configuration_spec.rb[1:7:3] | passed | 0.00007 seconds |
|
|
51
|
+
./spec/aircana/configuration_spec.rb[1:7:4] | passed | 0.00007 seconds |
|
|
52
|
+
./spec/aircana/configuration_spec.rb[1:7:5] | passed | 0.00007 seconds |
|
|
53
|
+
./spec/aircana/configuration_spec.rb[1:7:6] | passed | 0.00007 seconds |
|
|
54
|
+
./spec/aircana/configuration_spec.rb[1:8:1:1] | passed | 0.00051 seconds |
|
|
55
|
+
./spec/aircana/configuration_spec.rb[1:8:2:1] | passed | 0.00028 seconds |
|
|
56
|
+
./spec/aircana/configuration_spec.rb[1:8:3:1] | passed | 0.00026 seconds |
|
|
57
|
+
./spec/aircana/configuration_spec.rb[1:8:4:1] | passed | 0.00011 seconds |
|
|
58
|
+
./spec/aircana/contexts/confluence_spec.rb[1:1:1:1] | passed | 0.00308 seconds |
|
|
59
|
+
./spec/aircana/contexts/confluence_spec.rb[1:1:1:2] | passed | 0.00065 seconds |
|
|
60
|
+
./spec/aircana/contexts/confluence_spec.rb[1:1:1:3] | passed | 0.00151 seconds |
|
|
61
|
+
./spec/aircana/contexts/confluence_spec.rb[1:1:2:1] | passed | 0.00032 seconds |
|
|
62
|
+
./spec/aircana/contexts/confluence_spec.rb[1:1:2:2] | passed | 0.00029 seconds |
|
|
63
|
+
./spec/aircana/contexts/confluence_spec.rb[1:1:2:3] | passed | 0.00021 seconds |
|
|
64
|
+
./spec/aircana/contexts/confluence_spec.rb[1:1:3:1] | passed | 0.00048 seconds |
|
|
65
|
+
./spec/aircana/contexts/confluence_spec.rb[1:1:3:2] | passed | 0.00049 seconds |
|
|
66
|
+
./spec/aircana/contexts/confluence_spec.rb[1:2:1:1] | passed | 0.00048 seconds |
|
|
67
|
+
./spec/aircana/contexts/confluence_spec.rb[1:2:1:2] | passed | 0.00033 seconds |
|
|
68
|
+
./spec/aircana/contexts/confluence_spec.rb[1:2:1:3] | passed | 0.00031 seconds |
|
|
69
|
+
./spec/aircana/contexts/confluence_spec.rb[1:2:1:4] | passed | 0.00061 seconds |
|
|
70
|
+
./spec/aircana/contexts/confluence_spec.rb[1:2:2:1] | passed | 0.00026 seconds |
|
|
71
|
+
./spec/aircana/contexts/confluence_spec.rb[1:2:2:2] | passed | 0.00024 seconds |
|
|
72
|
+
./spec/aircana/contexts/local_spec.rb[1:1:1] | passed | 0.00062 seconds |
|
|
73
|
+
./spec/aircana/contexts/local_spec.rb[1:1:2] | passed | 0.00036 seconds |
|
|
74
|
+
./spec/aircana/contexts/local_spec.rb[1:1:3] | passed | 0.00038 seconds |
|
|
75
|
+
./spec/aircana/contexts/local_spec.rb[1:1:4] | passed | 0.00033 seconds |
|
|
76
|
+
./spec/aircana/contexts/local_spec.rb[1:1:5] | passed | 0.00032 seconds |
|
|
77
|
+
./spec/aircana/contexts/local_spec.rb[1:1:6] | passed | 0.00031 seconds |
|
|
78
|
+
./spec/aircana/contexts/local_spec.rb[1:1:7] | passed | 0.00063 seconds |
|
|
79
|
+
./spec/aircana/contexts/local_spec.rb[1:1:8] | passed | 0.00046 seconds |
|
|
80
|
+
./spec/aircana/contexts/manifest_spec.rb[1:1:1] | passed | 0.00108 seconds |
|
|
81
|
+
./spec/aircana/contexts/manifest_spec.rb[1:1:2] | passed | 0.00087 seconds |
|
|
82
|
+
./spec/aircana/contexts/manifest_spec.rb[1:1:3] | passed | 0.0009 seconds |
|
|
83
|
+
./spec/aircana/contexts/manifest_spec.rb[1:1:4] | passed | 0.00086 seconds |
|
|
84
|
+
./spec/aircana/contexts/manifest_spec.rb[1:2:1] | passed | 0.00098 seconds |
|
|
85
|
+
./spec/aircana/contexts/manifest_spec.rb[1:2:2] | passed | 0.00089 seconds |
|
|
86
|
+
./spec/aircana/contexts/manifest_spec.rb[1:2:3] | passed | 0.00098 seconds |
|
|
87
|
+
./spec/aircana/contexts/manifest_spec.rb[1:2:4] | passed | 0.00111 seconds |
|
|
88
|
+
./spec/aircana/contexts/manifest_spec.rb[1:2:5] | passed | 0.00131 seconds |
|
|
89
|
+
./spec/aircana/contexts/manifest_spec.rb[1:3:1] | passed | 0.00097 seconds |
|
|
90
|
+
./spec/aircana/contexts/manifest_spec.rb[1:3:2] | passed | 0.0002 seconds |
|
|
91
|
+
./spec/aircana/contexts/manifest_spec.rb[1:3:3] | passed | 0.00098 seconds |
|
|
92
|
+
./spec/aircana/contexts/manifest_spec.rb[1:3:4] | passed | 0.00087 seconds |
|
|
93
|
+
./spec/aircana/contexts/manifest_spec.rb[1:4:1] | passed | 0.00088 seconds |
|
|
67
94
|
./spec/aircana/contexts/manifest_spec.rb[1:4:2] | passed | 0.00021 seconds |
|
|
68
|
-
./spec/aircana/contexts/manifest_spec.rb[1:5:1] | passed | 0.
|
|
69
|
-
./spec/aircana/contexts/manifest_spec.rb[1:5:2] | passed | 0.
|
|
70
|
-
./spec/aircana/contexts/manifest_spec.rb[1:
|
|
71
|
-
./spec/aircana/contexts/manifest_spec.rb[1:6:
|
|
72
|
-
./spec/aircana/contexts/manifest_spec.rb[1:6:
|
|
73
|
-
./spec/aircana/contexts/manifest_spec.rb[1:
|
|
74
|
-
./spec/aircana/contexts/manifest_spec.rb[1:
|
|
75
|
-
./spec/aircana/contexts/manifest_spec.rb[1:
|
|
76
|
-
./spec/aircana/contexts/manifest_spec.rb[1:
|
|
77
|
-
./spec/aircana/contexts/manifest_spec.rb[1:
|
|
78
|
-
./spec/aircana/contexts/manifest_spec.rb[1:6
|
|
79
|
-
./spec/aircana/contexts/manifest_spec.rb[1:
|
|
80
|
-
./spec/aircana/contexts/manifest_spec.rb[1:
|
|
81
|
-
./spec/aircana/contexts/manifest_spec.rb[1:
|
|
82
|
-
./spec/aircana/contexts/
|
|
83
|
-
./spec/aircana/contexts/
|
|
95
|
+
./spec/aircana/contexts/manifest_spec.rb[1:5:1] | passed | 0.00089 seconds |
|
|
96
|
+
./spec/aircana/contexts/manifest_spec.rb[1:5:2] | passed | 0.00089 seconds |
|
|
97
|
+
./spec/aircana/contexts/manifest_spec.rb[1:5:3] | passed | 0.00022 seconds |
|
|
98
|
+
./spec/aircana/contexts/manifest_spec.rb[1:6:1] | passed | 0.00088 seconds |
|
|
99
|
+
./spec/aircana/contexts/manifest_spec.rb[1:6:2] | passed | 0.00022 seconds |
|
|
100
|
+
./spec/aircana/contexts/manifest_spec.rb[1:7:1] | passed | 0.00023 seconds |
|
|
101
|
+
./spec/aircana/contexts/manifest_spec.rb[1:7:2] | passed | 0.00022 seconds |
|
|
102
|
+
./spec/aircana/contexts/manifest_spec.rb[1:7:3] | passed | 0.00022 seconds |
|
|
103
|
+
./spec/aircana/contexts/manifest_spec.rb[1:7:4] | passed | 0.00022 seconds |
|
|
104
|
+
./spec/aircana/contexts/manifest_spec.rb[1:7:5] | passed | 0.00028 seconds |
|
|
105
|
+
./spec/aircana/contexts/manifest_spec.rb[1:7:6] | passed | 0.00021 seconds |
|
|
106
|
+
./spec/aircana/contexts/manifest_spec.rb[1:7:7] | passed | 0.00019 seconds |
|
|
107
|
+
./spec/aircana/contexts/manifest_spec.rb[1:7:8] | passed | 0.0002 seconds |
|
|
108
|
+
./spec/aircana/contexts/manifest_spec.rb[1:7:9] | passed | 0.0002 seconds |
|
|
109
|
+
./spec/aircana/contexts/manifest_spec.rb[1:7:10] | passed | 0.00017 seconds |
|
|
110
|
+
./spec/aircana/contexts/manifest_spec.rb[1:7:11] | passed | 0.00082 seconds |
|
|
111
|
+
./spec/aircana/contexts/manifest_spec.rb[1:7:12] | passed | 0.00081 seconds |
|
|
112
|
+
./spec/aircana/contexts/web_spec.rb[1:1:1] | passed | 0.00032 seconds |
|
|
113
|
+
./spec/aircana/contexts/web_spec.rb[1:2:1] | passed | 0.0002 seconds |
|
|
84
114
|
./spec/aircana/contexts/web_spec.rb[1:3:1:1] | passed | 0.00012 seconds |
|
|
85
|
-
./spec/aircana/contexts/web_spec.rb[1:3:1:2] | passed | 0.
|
|
86
|
-
./spec/aircana/contexts/web_spec.rb[1:3:1:3] | passed | 0.
|
|
115
|
+
./spec/aircana/contexts/web_spec.rb[1:3:1:2] | passed | 0.00012 seconds |
|
|
116
|
+
./spec/aircana/contexts/web_spec.rb[1:3:1:3] | passed | 0.00017 seconds |
|
|
87
117
|
./spec/aircana/contexts/web_spec.rb[1:3:2:1] | passed | 0.00015 seconds |
|
|
88
118
|
./spec/aircana/contexts/web_spec.rb[1:3:2:2] | passed | 0.00011 seconds |
|
|
89
|
-
./spec/aircana/contexts/web_spec.rb[1:3:3:1] | passed | 0.
|
|
90
|
-
./spec/aircana/contexts/web_spec.rb[1:3:3:2] | passed | 0.
|
|
119
|
+
./spec/aircana/contexts/web_spec.rb[1:3:3:1] | passed | 0.00015 seconds |
|
|
120
|
+
./spec/aircana/contexts/web_spec.rb[1:3:3:2] | passed | 0.00027 seconds |
|
|
91
121
|
./spec/aircana/contexts/web_spec.rb[1:3:3:3] | passed | 0.00023 seconds |
|
|
92
122
|
./spec/aircana/contexts/web_spec.rb[1:3:3:4] | passed | 0.00015 seconds |
|
|
93
123
|
./spec/aircana/contexts/web_spec.rb[1:3:3:5] | passed | 0.00027 seconds |
|
|
94
|
-
./spec/aircana/contexts/web_spec.rb[1:3:4:1] | passed | 0.
|
|
95
|
-
./spec/aircana/contexts/web_spec.rb[1:3:4:2] | passed | 0.
|
|
124
|
+
./spec/aircana/contexts/web_spec.rb[1:3:4:1] | passed | 0.0002 seconds |
|
|
125
|
+
./spec/aircana/contexts/web_spec.rb[1:3:4:2] | passed | 0.00012 seconds |
|
|
96
126
|
./spec/aircana/contexts/web_spec.rb[1:3:4:3] | passed | 0.00011 seconds |
|
|
97
|
-
./spec/aircana/contexts/web_spec.rb[1:3:5:1] | passed | 0.
|
|
98
|
-
./spec/aircana/contexts/web_spec.rb[1:3:5:2] | passed | 0.
|
|
99
|
-
./spec/aircana/contexts/web_spec.rb[1:3:5:3] | passed | 0.
|
|
100
|
-
./spec/aircana/contexts/web_spec.rb[1:3:6:1] | passed | 0.
|
|
101
|
-
./spec/aircana/contexts/web_spec.rb[1:3:6:2] | passed | 0.
|
|
102
|
-
./spec/aircana/contexts/web_spec.rb[1:3:6:3] | passed | 0.
|
|
103
|
-
./spec/aircana/contexts/web_spec.rb[1:3:7:1] | passed | 0.
|
|
104
|
-
./spec/aircana/contexts/web_spec.rb[1:3:7:2] | passed | 0.
|
|
105
|
-
./spec/aircana/
|
|
106
|
-
./spec/aircana/
|
|
107
|
-
./spec/aircana/
|
|
108
|
-
./spec/aircana/
|
|
109
|
-
./spec/aircana/
|
|
110
|
-
./spec/aircana/
|
|
127
|
+
./spec/aircana/contexts/web_spec.rb[1:3:5:1] | passed | 0.00118 seconds |
|
|
128
|
+
./spec/aircana/contexts/web_spec.rb[1:3:5:2] | passed | 0.00015 seconds |
|
|
129
|
+
./spec/aircana/contexts/web_spec.rb[1:3:5:3] | passed | 0.00041 seconds |
|
|
130
|
+
./spec/aircana/contexts/web_spec.rb[1:3:6:1] | passed | 0.00025 seconds |
|
|
131
|
+
./spec/aircana/contexts/web_spec.rb[1:3:6:2] | passed | 0.00024 seconds |
|
|
132
|
+
./spec/aircana/contexts/web_spec.rb[1:3:6:3] | passed | 0.00021 seconds |
|
|
133
|
+
./spec/aircana/contexts/web_spec.rb[1:3:7:1] | passed | 0.00011 seconds |
|
|
134
|
+
./spec/aircana/contexts/web_spec.rb[1:3:7:2] | passed | 0.00023 seconds |
|
|
135
|
+
./spec/aircana/contexts/web_spec.rb[1:4:1:1] | passed | 0.00023 seconds |
|
|
136
|
+
./spec/aircana/contexts/web_spec.rb[1:4:1:2] | passed | 0.00028 seconds |
|
|
137
|
+
./spec/aircana/contexts/web_spec.rb[1:4:1:3] | passed | 0.00022 seconds |
|
|
138
|
+
./spec/aircana/contexts/web_spec.rb[1:4:1:4] | passed | 0.00022 seconds |
|
|
139
|
+
./spec/aircana/contexts/web_spec.rb[1:4:2:1] | passed | 0.00018 seconds |
|
|
140
|
+
./spec/aircana/contexts/web_spec.rb[1:4:2:2] | passed | 0.00017 seconds |
|
|
141
|
+
./spec/aircana/fzf_helper_spec.rb[1:1:1:1] | passed | 0.00016 seconds |
|
|
142
|
+
./spec/aircana/fzf_helper_spec.rb[1:1:1:2] | passed | 0.00015 seconds |
|
|
143
|
+
./spec/aircana/fzf_helper_spec.rb[1:1:1:3] | passed | 0.00018 seconds |
|
|
144
|
+
./spec/aircana/fzf_helper_spec.rb[1:1:2:1] | passed | 0.0002 seconds |
|
|
145
|
+
./spec/aircana/fzf_helper_spec.rb[1:1:3:1] | passed | 0.0002 seconds |
|
|
146
|
+
./spec/aircana/fzf_helper_spec.rb[1:2:1:1] | passed | 0.00011 seconds |
|
|
111
147
|
./spec/aircana/fzf_helper_spec.rb[1:2:1:2] | passed | 0.0001 seconds |
|
|
112
148
|
./spec/aircana/fzf_helper_spec.rb[1:2:1:3] | passed | 0.0001 seconds |
|
|
113
149
|
./spec/aircana/fzf_helper_spec.rb[1:2:2:1] | passed | 0.0001 seconds |
|
|
114
|
-
./spec/aircana/fzf_helper_spec.rb[1:2:2:2] | passed | 0.
|
|
150
|
+
./spec/aircana/fzf_helper_spec.rb[1:2:2:2] | passed | 0.00007 seconds |
|
|
115
151
|
./spec/aircana/generators/hooks_generator_spec.rb[1:1:1] | passed | 0.00003 seconds |
|
|
116
152
|
./spec/aircana/generators/hooks_generator_spec.rb[1:2:1] | passed | 0.00003 seconds |
|
|
117
|
-
./spec/aircana/generators/hooks_generator_spec.rb[1:3:1] | passed | 0.
|
|
118
|
-
./spec/aircana/generators/hooks_generator_spec.rb[1:3:2] | passed | 0.
|
|
153
|
+
./spec/aircana/generators/hooks_generator_spec.rb[1:3:1] | passed | 0.00038 seconds |
|
|
154
|
+
./spec/aircana/generators/hooks_generator_spec.rb[1:3:2] | passed | 0.0002 seconds |
|
|
119
155
|
./spec/aircana/generators/hooks_generator_spec.rb[1:4:1] | passed | 0.00009 seconds |
|
|
120
|
-
./spec/aircana/generators/hooks_generator_spec.rb[1:5:1:1] | passed | 0.
|
|
121
|
-
./spec/aircana/generators/hooks_generator_spec.rb[1:5:2:1] | passed | 0.
|
|
122
|
-
./spec/aircana/generators/hooks_generator_spec.rb[1:6:1] | passed | 0.
|
|
123
|
-
./spec/aircana/generators/hooks_generator_spec.rb[1:7:1] | passed | 0.
|
|
124
|
-
./spec/aircana/generators/plan_command_generator_spec.rb[1:1:1] | passed | 0.
|
|
125
|
-
./spec/aircana/generators/plan_command_generator_spec.rb[1:1:2] | passed | 0.
|
|
126
|
-
./spec/aircana/generators/plan_command_generator_spec.rb[1:1:3] | passed | 0.
|
|
156
|
+
./spec/aircana/generators/hooks_generator_spec.rb[1:5:1:1] | passed | 0.0001 seconds |
|
|
157
|
+
./spec/aircana/generators/hooks_generator_spec.rb[1:5:2:1] | passed | 0.00004 seconds |
|
|
158
|
+
./spec/aircana/generators/hooks_generator_spec.rb[1:6:1] | passed | 0.00054 seconds |
|
|
159
|
+
./spec/aircana/generators/hooks_generator_spec.rb[1:7:1] | passed | 0.00015 seconds |
|
|
160
|
+
./spec/aircana/generators/plan_command_generator_spec.rb[1:1:1] | passed | 0.00054 seconds |
|
|
161
|
+
./spec/aircana/generators/plan_command_generator_spec.rb[1:1:2] | passed | 0.0003 seconds |
|
|
162
|
+
./spec/aircana/generators/plan_command_generator_spec.rb[1:1:3] | passed | 0.0003 seconds |
|
|
127
163
|
./spec/aircana/generators/plan_command_generator_spec.rb[1:2:1] | passed | 0.00009 seconds |
|
|
128
164
|
./spec/aircana/generators/plan_command_generator_spec.rb[1:2:2] | passed | 0.00007 seconds |
|
|
129
|
-
./spec/aircana/generators/skills_generator_spec.rb[1:1:1] | passed | 0.
|
|
130
|
-
./spec/aircana/generators/skills_generator_spec.rb[1:1:2] | passed | 0.
|
|
131
|
-
./spec/aircana/generators/skills_generator_spec.rb[1:1:3] | passed | 0.
|
|
132
|
-
./spec/aircana/generators/skills_generator_spec.rb[1:2:1] | passed | 0.
|
|
133
|
-
./spec/aircana/generators/skills_generator_spec.rb[1:2:2] | passed | 0.
|
|
134
|
-
./spec/aircana/generators/skills_generator_spec.rb[1:2:3] | passed | 0.
|
|
135
|
-
./spec/aircana/generators/skills_generator_spec.rb[1:3:1] | passed | 0.
|
|
136
|
-
./spec/aircana/generators/skills_generator_spec.rb[1:3:2] | passed | 0.
|
|
137
|
-
./spec/aircana/generators/skills_generator_spec.rb[1:3:3] | passed | 0.
|
|
138
|
-
./spec/aircana/generators/skills_generator_spec.rb[1:3:4] | passed | 0.
|
|
139
|
-
./spec/aircana/generators/skills_generator_spec.rb[1:3:5] | passed | 0.
|
|
140
|
-
./spec/aircana/generators/skills_generator_spec.rb[1:4:1] | passed | 0.
|
|
141
|
-
./spec/aircana/generators/skills_generator_spec.rb[1:4:2] | passed | 0.
|
|
142
|
-
./spec/aircana/generators/skills_generator_spec.rb[1:4:3] | passed | 0.
|
|
143
|
-
./spec/aircana/generators/skills_generator_spec.rb[1:5:1] | passed | 0.
|
|
144
|
-
./spec/aircana/generators/skills_generator_spec.rb[1:6:1] | passed | 0.
|
|
145
|
-
./spec/aircana/generators/skills_generator_spec.rb[1:6:2] | passed | 0.
|
|
146
|
-
./spec/aircana/generators/skills_generator_spec.rb[1:6:3] | passed | 0.
|
|
147
|
-
./spec/aircana/generators/skills_generator_spec.rb[1:6:4] | passed | 0.
|
|
148
|
-
./spec/aircana/generators/skills_generator_spec.rb[1:6:5] | passed | 0.
|
|
149
|
-
./spec/aircana/generators/skills_generator_spec.rb[1:6:6] | passed | 0.
|
|
150
|
-
./spec/aircana/generators/skills_generator_spec.rb[1:6:7] | passed | 0.
|
|
151
|
-
./spec/aircana/generators/skills_generator_spec.rb[1:7:1] | passed | 0.
|
|
152
|
-
./spec/aircana/generators/skills_generator_spec.rb[1:7:2] | passed | 0.
|
|
153
|
-
./spec/aircana/human_logger_spec.rb[1:1:1] | passed | 0.
|
|
165
|
+
./spec/aircana/generators/skills_generator_spec.rb[1:1:1] | passed | 0.00034 seconds |
|
|
166
|
+
./spec/aircana/generators/skills_generator_spec.rb[1:1:2] | passed | 0.00022 seconds |
|
|
167
|
+
./spec/aircana/generators/skills_generator_spec.rb[1:1:3] | passed | 0.0002 seconds |
|
|
168
|
+
./spec/aircana/generators/skills_generator_spec.rb[1:2:1] | passed | 0.00033 seconds |
|
|
169
|
+
./spec/aircana/generators/skills_generator_spec.rb[1:2:2] | passed | 0.00032 seconds |
|
|
170
|
+
./spec/aircana/generators/skills_generator_spec.rb[1:2:3] | passed | 0.00028 seconds |
|
|
171
|
+
./spec/aircana/generators/skills_generator_spec.rb[1:3:1] | passed | 0.00019 seconds |
|
|
172
|
+
./spec/aircana/generators/skills_generator_spec.rb[1:3:2] | passed | 0.0002 seconds |
|
|
173
|
+
./spec/aircana/generators/skills_generator_spec.rb[1:3:3] | passed | 0.00021 seconds |
|
|
174
|
+
./spec/aircana/generators/skills_generator_spec.rb[1:3:4] | passed | 0.00036 seconds |
|
|
175
|
+
./spec/aircana/generators/skills_generator_spec.rb[1:3:5] | passed | 0.00024 seconds |
|
|
176
|
+
./spec/aircana/generators/skills_generator_spec.rb[1:4:1] | passed | 0.00033 seconds |
|
|
177
|
+
./spec/aircana/generators/skills_generator_spec.rb[1:4:2] | passed | 0.00018 seconds |
|
|
178
|
+
./spec/aircana/generators/skills_generator_spec.rb[1:4:3] | passed | 0.00017 seconds |
|
|
179
|
+
./spec/aircana/generators/skills_generator_spec.rb[1:5:1] | passed | 0.00016 seconds |
|
|
180
|
+
./spec/aircana/generators/skills_generator_spec.rb[1:6:1] | passed | 0.00018 seconds |
|
|
181
|
+
./spec/aircana/generators/skills_generator_spec.rb[1:6:2] | passed | 0.00017 seconds |
|
|
182
|
+
./spec/aircana/generators/skills_generator_spec.rb[1:6:3] | passed | 0.00017 seconds |
|
|
183
|
+
./spec/aircana/generators/skills_generator_spec.rb[1:6:4] | passed | 0.00017 seconds |
|
|
184
|
+
./spec/aircana/generators/skills_generator_spec.rb[1:6:5] | passed | 0.00021 seconds |
|
|
185
|
+
./spec/aircana/generators/skills_generator_spec.rb[1:6:6] | passed | 0.00023 seconds |
|
|
186
|
+
./spec/aircana/generators/skills_generator_spec.rb[1:6:7] | passed | 0.00024 seconds |
|
|
187
|
+
./spec/aircana/generators/skills_generator_spec.rb[1:7:1] | passed | 0.00195 seconds |
|
|
188
|
+
./spec/aircana/generators/skills_generator_spec.rb[1:7:2] | passed | 0.00115 seconds |
|
|
189
|
+
./spec/aircana/human_logger_spec.rb[1:1:1] | passed | 0.00007 seconds |
|
|
154
190
|
./spec/aircana/human_logger_spec.rb[1:2:1] | passed | 0.00004 seconds |
|
|
155
|
-
./spec/aircana/human_logger_spec.rb[1:3:1] | passed | 0.
|
|
191
|
+
./spec/aircana/human_logger_spec.rb[1:3:1] | passed | 0.00004 seconds |
|
|
156
192
|
./spec/aircana/human_logger_spec.rb[1:4:1] | passed | 0.00004 seconds |
|
|
157
193
|
./spec/aircana/human_logger_spec.rb[1:5:1] | passed | 0.00003 seconds |
|
|
158
|
-
./spec/aircana/human_logger_spec.rb[1:5:2] | passed | 0.
|
|
194
|
+
./spec/aircana/human_logger_spec.rb[1:5:2] | passed | 0.00003 seconds |
|
|
159
195
|
./spec/aircana/human_logger_spec.rb[1:5:3] | passed | 0.00003 seconds |
|
|
160
|
-
./spec/aircana/human_logger_spec.rb[1:5:4] | passed | 0.
|
|
161
|
-
./spec/aircana/human_logger_spec.rb[1:5:5] | passed | 0.
|
|
196
|
+
./spec/aircana/human_logger_spec.rb[1:5:4] | passed | 0.00003 seconds |
|
|
197
|
+
./spec/aircana/human_logger_spec.rb[1:5:5] | passed | 0.00003 seconds |
|
|
162
198
|
./spec/aircana/human_logger_spec.rb[1:5:6] | passed | 0.00003 seconds |
|
|
163
|
-
./spec/aircana/human_logger_spec.rb[1:5:7] | passed | 0.
|
|
199
|
+
./spec/aircana/human_logger_spec.rb[1:5:7] | passed | 0.00003 seconds |
|
|
164
200
|
./spec/aircana/human_logger_spec.rb[1:6:1] | passed | 0.00003 seconds |
|
|
165
|
-
./spec/aircana/llm/
|
|
166
|
-
./spec/aircana/llm/
|
|
167
|
-
./spec/aircana/llm/
|
|
168
|
-
./spec/aircana/llm/
|
|
169
|
-
./spec/aircana/llm/
|
|
170
|
-
./spec/aircana/llm/
|
|
171
|
-
./spec/aircana/llm/
|
|
172
|
-
./spec/aircana/llm/
|
|
173
|
-
./spec/aircana/llm/
|
|
174
|
-
./spec/aircana/llm/
|
|
175
|
-
./spec/aircana/llm/
|
|
176
|
-
./spec/aircana/
|
|
177
|
-
./spec/aircana/
|
|
178
|
-
./spec/aircana/
|
|
179
|
-
./spec/aircana/
|
|
180
|
-
./spec/aircana/
|
|
181
|
-
./spec/aircana/
|
|
182
|
-
./spec/aircana/
|
|
183
|
-
./spec/aircana/
|
|
184
|
-
./spec/aircana/
|
|
185
|
-
./spec/aircana/
|
|
186
|
-
./spec/
|
|
187
|
-
./spec/
|
|
201
|
+
./spec/aircana/llm/base_spec.rb[1:1:1] | passed | 0.00041 seconds |
|
|
202
|
+
./spec/aircana/llm/base_spec.rb[1:2:1] | passed | 0.00017 seconds |
|
|
203
|
+
./spec/aircana/llm/base_spec.rb[1:2:2] | passed | 0.00015 seconds |
|
|
204
|
+
./spec/aircana/llm/base_spec.rb[1:2:3] | passed | 0.00015 seconds |
|
|
205
|
+
./spec/aircana/llm/base_spec.rb[1:3:1:1] | passed | 0.00025 seconds |
|
|
206
|
+
./spec/aircana/llm/base_spec.rb[1:3:2:1] | passed | 0.00023 seconds |
|
|
207
|
+
./spec/aircana/llm/base_spec.rb[1:3:2:2] | passed | 0.00026 seconds |
|
|
208
|
+
./spec/aircana/llm/base_spec.rb[1:3:3:1] | passed | 0.00021 seconds |
|
|
209
|
+
./spec/aircana/llm/base_spec.rb[1:3:3:2] | passed | 0.00015 seconds |
|
|
210
|
+
./spec/aircana/llm/bedrock_client_spec.rb[1:1:1:1] | passed | 0.08743 seconds |
|
|
211
|
+
./spec/aircana/llm/bedrock_client_spec.rb[1:1:1:2] | passed | 0.00056 seconds |
|
|
212
|
+
./spec/aircana/llm/bedrock_client_spec.rb[1:1:1:3] | passed | 0.00032 seconds |
|
|
213
|
+
./spec/aircana/llm/bedrock_client_spec.rb[1:1:1:4] | passed | 0.00035 seconds |
|
|
214
|
+
./spec/aircana/llm/bedrock_client_spec.rb[1:1:1:5] | passed | 0.00041 seconds |
|
|
215
|
+
./spec/aircana/llm/bedrock_client_spec.rb[1:1:1:6] | passed | 0.00035 seconds |
|
|
216
|
+
./spec/aircana/llm/bedrock_client_spec.rb[1:1:1:7] | passed | 0.00036 seconds |
|
|
217
|
+
./spec/aircana/llm/bedrock_client_spec.rb[1:1:2:1] | passed | 0.00032 seconds |
|
|
218
|
+
./spec/aircana/llm/bedrock_client_spec.rb[1:1:2:2] | passed | 0.00027 seconds |
|
|
219
|
+
./spec/aircana/llm/bedrock_client_spec.rb[1:1:3:1] | passed | 0.00032 seconds |
|
|
220
|
+
./spec/aircana/llm/bedrock_client_spec.rb[1:2:1] | passed | 0.00016 seconds |
|
|
221
|
+
./spec/aircana/llm/claude_client_spec.rb[1:1:1:1] | passed | 0.00034 seconds |
|
|
222
|
+
./spec/aircana/llm/claude_client_spec.rb[1:1:1:2] | passed | 0.00033 seconds |
|
|
223
|
+
./spec/aircana/llm/claude_client_spec.rb[1:1:1:3] | passed | 0.0011 seconds |
|
|
224
|
+
./spec/aircana/llm/claude_client_spec.rb[1:1:1:4] | passed | 0.00118 seconds |
|
|
225
|
+
./spec/aircana/llm/claude_client_spec.rb[1:1:2:1] | passed | 0.00141 seconds |
|
|
226
|
+
./spec/aircana/llm/claude_client_spec.rb[1:1:2:2] | passed | 0.00224 seconds |
|
|
227
|
+
./spec/aircana/llm/claude_client_spec.rb[1:1:3:1] | passed | 0.00129 seconds |
|
|
228
|
+
./spec/aircana/llm/claude_client_spec.rb[1:2:1] | passed | 0.0019 seconds |
|
|
229
|
+
./spec/aircana/llm/claude_client_spec.rb[1:2:2] | passed | 0.00238 seconds |
|
|
230
|
+
./spec/aircana/llm/claude_client_spec.rb[1:3:1:1] | passed | 0.00086 seconds |
|
|
231
|
+
./spec/aircana/llm/claude_client_spec.rb[1:3:1:2] | passed | 0.00079 seconds |
|
|
232
|
+
./spec/aircana/llm_spec.rb[1:1:1:1] | passed | 0.00012 seconds |
|
|
233
|
+
./spec/aircana/llm_spec.rb[1:1:1:2] | passed | 0.00008 seconds |
|
|
234
|
+
./spec/aircana/llm_spec.rb[1:1:2:1] | passed | 0.00008 seconds |
|
|
235
|
+
./spec/aircana/llm_spec.rb[1:1:3:1] | passed | 0.00015 seconds |
|
|
236
|
+
./spec/aircana/llm_spec.rb[1:1:3:2] | passed | 0.00012 seconds |
|
|
237
|
+
./spec/aircana/system_checker_spec.rb[1:1:1:1] | passed | 0.00044 seconds |
|
|
238
|
+
./spec/aircana/system_checker_spec.rb[1:1:2:1] | passed | 0.0004 seconds |
|
|
239
|
+
./spec/aircana/system_checker_spec.rb[1:1:3:1] | passed | 0.00069 seconds |
|
|
240
|
+
./spec/aircana/system_checker_spec.rb[1:2:1] | passed | 0.00022 seconds |
|
|
241
|
+
./spec/aircana/system_checker_spec.rb[1:2:2] | passed | 0.0002 seconds |
|
|
242
|
+
./spec/aircana/system_checker_spec.rb[1:3:1] | passed | 0.00036 seconds |
|
|
243
|
+
./spec/aircana/system_checker_spec.rb[1:3:2] | passed | 0.00022 seconds |
|
|
244
|
+
./spec/aircana/system_checker_spec.rb[1:3:3] | passed | 0.00023 seconds |
|
|
245
|
+
./spec/aircana/system_checker_spec.rb[1:3:4] | passed | 0.00027 seconds |
|
|
246
|
+
./spec/aircana/system_checker_spec.rb[1:3:5] | passed | 0.00016 seconds |
|
|
247
|
+
./spec/aircana_spec.rb[1:1] | passed | 0.00003 seconds |
|
|
248
|
+
./spec/aircana_spec.rb[1:2] | passed | 0.00106 seconds |
|
data/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,37 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [5.1.1]
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
- Fixed agent color changing randomly on KB refresh
|
|
12
|
+
- Colors are now persisted in manifest.json
|
|
13
|
+
- On first refresh after upgrade, the generated color is stored in the manifest
|
|
14
|
+
- Subsequent refreshes read the color from manifest, ensuring consistency
|
|
15
|
+
- Added `color` field to manifest schema (backward compatible)
|
|
16
|
+
- Added `color_from_manifest()` helper method to Manifest class
|
|
17
|
+
|
|
18
|
+
## [5.1.0]
|
|
19
|
+
|
|
20
|
+
### Added
|
|
21
|
+
- Configurable LLM provider for summary/title generation
|
|
22
|
+
- New environment variable `AIRCANA_LLM_PROVIDER` to switch between providers
|
|
23
|
+
- Supports `claude` (default) and `bedrock` providers
|
|
24
|
+
- Claude provider uses Claude Code CLI for LLM calls
|
|
25
|
+
- Bedrock provider uses AWS Bedrock Runtime API with configurable region and model
|
|
26
|
+
- AWS Bedrock integration as alternative LLM provider
|
|
27
|
+
- New environment variables: `AIRCANA_BEDROCK_REGION` (default: `us-east-1`), `AIRCANA_BEDROCK_MODEL` (default: `anthropic.claude-3-haiku-20240307-v1:0`)
|
|
28
|
+
- Uses standard AWS credential chain for authentication
|
|
29
|
+
- Added `aws-sdk-bedrockruntime` as a bundled dependency
|
|
30
|
+
- New `Aircana::LLM` module with factory pattern
|
|
31
|
+
- `Aircana::LLM.client` returns configured provider instance
|
|
32
|
+
- Base class with shared functionality (spinner, content truncation)
|
|
33
|
+
- Unknown providers fall back to Claude with warning
|
|
34
|
+
|
|
35
|
+
### Changed
|
|
36
|
+
- Refactored `ClaudeClient` to inherit from new `LLM::Base` class
|
|
37
|
+
- Web and Confluence contexts now use `Aircana::LLM.client` factory instead of direct `ClaudeClient` instantiation
|
|
38
|
+
|
|
8
39
|
## [5.0.0]
|
|
9
40
|
|
|
10
41
|
### Removed
|
data/README.md
CHANGED
|
@@ -458,6 +458,40 @@ export CONFLUENCE_USERNAME="your.email@company.com"
|
|
|
458
458
|
export CONFLUENCE_API_TOKEN="your-generated-token"
|
|
459
459
|
```
|
|
460
460
|
|
|
461
|
+
### LLM Provider Setup (Optional)
|
|
462
|
+
|
|
463
|
+
Aircana uses an LLM to generate summaries and titles for knowledge base content. By default, it uses the Claude Code CLI, but you can configure it to use AWS Bedrock instead.
|
|
464
|
+
|
|
465
|
+
#### Environment Variables
|
|
466
|
+
|
|
467
|
+
```bash
|
|
468
|
+
# Provider selection (default: claude)
|
|
469
|
+
export AIRCANA_LLM_PROVIDER="claude" # or "bedrock"
|
|
470
|
+
|
|
471
|
+
# Bedrock-specific settings (only used when provider is "bedrock")
|
|
472
|
+
export AIRCANA_BEDROCK_REGION="us-east-1" # default
|
|
473
|
+
export AIRCANA_BEDROCK_MODEL="anthropic.claude-3-haiku-20240307-v1:0" # default
|
|
474
|
+
```
|
|
475
|
+
|
|
476
|
+
#### Using AWS Bedrock
|
|
477
|
+
|
|
478
|
+
To use Bedrock instead of the Claude Code CLI:
|
|
479
|
+
|
|
480
|
+
1. **Configure AWS credentials** using any standard method (environment variables, IAM role, credentials file, etc.)
|
|
481
|
+
|
|
482
|
+
2. **Set the provider:**
|
|
483
|
+
```bash
|
|
484
|
+
export AIRCANA_LLM_PROVIDER="bedrock"
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
3. **Optionally configure region and model:**
|
|
488
|
+
```bash
|
|
489
|
+
export AIRCANA_BEDROCK_REGION="us-west-2"
|
|
490
|
+
export AIRCANA_BEDROCK_MODEL="anthropic.claude-3-sonnet-20240229-v1:0"
|
|
491
|
+
```
|
|
492
|
+
|
|
493
|
+
The Bedrock provider is useful in environments where the Claude Code CLI is not available or when you prefer to use your AWS infrastructure for LLM calls.
|
|
494
|
+
|
|
461
495
|
### SQS Notifications Setup (Optional)
|
|
462
496
|
|
|
463
497
|
To enable SQS notifications for Claude Code events (useful for Slack/Teams integration):
|
data/exe/aircana
CHANGED
|
@@ -8,6 +8,9 @@ Aircana.configure do |config|
|
|
|
8
8
|
config.confluence_base_url = ENV.fetch("CONFLUENCE_BASE_URL", nil)
|
|
9
9
|
config.confluence_username = ENV.fetch("CONFLUENCE_USERNAME", nil)
|
|
10
10
|
config.confluence_api_token = ENV.fetch("CONFLUENCE_API_TOKEN", nil)
|
|
11
|
+
config.llm_provider = ENV.fetch("AIRCANA_LLM_PROVIDER", nil)
|
|
12
|
+
config.bedrock_region = ENV.fetch("AIRCANA_BEDROCK_REGION", nil)
|
|
13
|
+
config.bedrock_model = ENV.fetch("AIRCANA_BEDROCK_MODEL", nil)
|
|
11
14
|
end
|
|
12
15
|
|
|
13
16
|
Aircana::CLI::App.start(ARGV)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "digest"
|
|
4
|
+
|
|
5
|
+
module Aircana
|
|
6
|
+
module Checksum
|
|
7
|
+
def self.compute(content)
|
|
8
|
+
return nil if content.nil? || content.empty?
|
|
9
|
+
|
|
10
|
+
"sha256:#{Digest::SHA256.hexdigest(content)}"
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def self.match?(stored_checksum, content)
|
|
14
|
+
return false if stored_checksum.nil? || content.nil?
|
|
15
|
+
|
|
16
|
+
compute(content) == stored_checksum
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -189,15 +189,24 @@ module Aircana
|
|
|
189
189
|
def regenerate_agent_md(kb_name)
|
|
190
190
|
return unless Aircana::Contexts::Manifest.manifest_exists?(kb_name)
|
|
191
191
|
|
|
192
|
-
# Generate agent from manifest
|
|
193
192
|
generator = Generators::AgentsGenerator.from_manifest(kb_name)
|
|
194
|
-
|
|
195
193
|
generator.generate
|
|
194
|
+
|
|
195
|
+
persist_color_if_needed(kb_name, generator.color)
|
|
196
|
+
|
|
196
197
|
Aircana.human_logger.success "Generated agent for '#{kb_name}'"
|
|
197
198
|
rescue StandardError => e
|
|
198
199
|
Aircana.human_logger.warn "Failed to generate agent: #{e.message}"
|
|
199
200
|
end
|
|
200
201
|
|
|
202
|
+
def persist_color_if_needed(kb_name, color)
|
|
203
|
+
existing_color = Aircana::Contexts::Manifest.color_from_manifest(kb_name)
|
|
204
|
+
return if existing_color
|
|
205
|
+
|
|
206
|
+
sources = Aircana::Contexts::Manifest.sources_from_manifest(kb_name)
|
|
207
|
+
Aircana::Contexts::Manifest.update_manifest(kb_name, sources, color: color)
|
|
208
|
+
end
|
|
209
|
+
|
|
201
210
|
def log_no_pages_found(normalized_kb_name)
|
|
202
211
|
Aircana.human_logger.info "No pages found for KB '#{normalized_kb_name}'. " \
|
|
203
212
|
"Make sure pages are labeled with '#{normalized_kb_name}' in Confluence."
|
|
@@ -7,7 +7,8 @@ module Aircana
|
|
|
7
7
|
attr_accessor :global_dir, :project_dir, :stream, :output_dir,
|
|
8
8
|
:claude_code_config_path, :claude_code_project_config_path, :kb_knowledge_dir,
|
|
9
9
|
:hooks_dir, :scripts_dir, :confluence_base_url, :confluence_username, :confluence_api_token,
|
|
10
|
-
:plugin_root, :plugin_manifest_dir, :commands_dir, :skills_dir, :agents_dir
|
|
10
|
+
:plugin_root, :plugin_manifest_dir, :commands_dir, :skills_dir, :agents_dir,
|
|
11
|
+
:llm_provider, :bedrock_region, :bedrock_model
|
|
11
12
|
|
|
12
13
|
def initialize
|
|
13
14
|
setup_directory_paths
|
|
@@ -15,6 +16,7 @@ module Aircana
|
|
|
15
16
|
setup_claude_code_paths
|
|
16
17
|
setup_stream
|
|
17
18
|
setup_confluence_config
|
|
19
|
+
setup_llm_config
|
|
18
20
|
end
|
|
19
21
|
|
|
20
22
|
# Returns true if the current directory is a plugin (has .claude-plugin/plugin.json)
|
|
@@ -116,5 +118,11 @@ module Aircana
|
|
|
116
118
|
@confluence_username = nil
|
|
117
119
|
@confluence_api_token = nil
|
|
118
120
|
end
|
|
121
|
+
|
|
122
|
+
def setup_llm_config
|
|
123
|
+
@llm_provider = nil
|
|
124
|
+
@bedrock_region = nil
|
|
125
|
+
@bedrock_model = nil
|
|
126
|
+
end
|
|
119
127
|
end
|
|
120
128
|
end
|
|
@@ -81,10 +81,11 @@ module Aircana
|
|
|
81
81
|
|
|
82
82
|
def process_pages_with_manifest(pages, kb_name, label = nil)
|
|
83
83
|
page_metadata = []
|
|
84
|
+
existing_metadata = load_existing_page_metadata(kb_name)
|
|
84
85
|
|
|
85
86
|
ProgressTracker.with_batch_progress(pages, "Processing pages") do |page, _index|
|
|
86
87
|
store_page_as_markdown(page, kb_name)
|
|
87
|
-
page_metadata << extract_page_metadata(page)
|
|
88
|
+
page_metadata << extract_page_metadata(page, existing_metadata: existing_metadata)
|
|
88
89
|
end
|
|
89
90
|
|
|
90
91
|
build_source_metadata(kb_name, page_metadata, label)
|
|
@@ -92,22 +93,46 @@ module Aircana
|
|
|
92
93
|
|
|
93
94
|
private
|
|
94
95
|
|
|
95
|
-
def
|
|
96
|
+
def load_existing_page_metadata(kb_name)
|
|
97
|
+
sources = Manifest.sources_from_manifest(kb_name)
|
|
98
|
+
confluence_sources = sources.select { |s| s["type"] == "confluence" }
|
|
99
|
+
return {} if confluence_sources.empty?
|
|
100
|
+
|
|
101
|
+
metadata = {}
|
|
102
|
+
confluence_sources.each do |source|
|
|
103
|
+
(source["pages"] || []).each do |page|
|
|
104
|
+
metadata[page["id"]] = page
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
metadata
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def extract_page_metadata(page, existing_metadata: nil)
|
|
111
|
+
existing_metadata ||= {}
|
|
96
112
|
content = page&.dig("body", "storage", "value") || ""
|
|
97
113
|
markdown_content = convert_to_markdown(content)
|
|
98
114
|
title = page["title"] || "Confluence page"
|
|
99
|
-
|
|
115
|
+
content_checksum = Aircana::Checksum.compute(markdown_content)
|
|
116
|
+
|
|
117
|
+
existing = existing_metadata[page["id"]]
|
|
118
|
+
summary = if existing && Aircana::Checksum.match?(existing["content_checksum"], markdown_content)
|
|
119
|
+
Aircana.human_logger.info("Content unchanged for '#{title}', reusing summary")
|
|
120
|
+
existing["summary"]
|
|
121
|
+
else
|
|
122
|
+
generate_summary(markdown_content, title)
|
|
123
|
+
end
|
|
100
124
|
|
|
101
125
|
{
|
|
102
126
|
"id" => page["id"],
|
|
103
127
|
"title" => title,
|
|
104
|
-
"summary" => summary
|
|
128
|
+
"summary" => summary,
|
|
129
|
+
"content_checksum" => content_checksum
|
|
105
130
|
}
|
|
106
131
|
end
|
|
107
132
|
|
|
108
133
|
def generate_summary(content, title)
|
|
109
134
|
prompt = build_summary_prompt(content, title)
|
|
110
|
-
LLM
|
|
135
|
+
Aircana::LLM.client.prompt(prompt).strip
|
|
111
136
|
rescue StandardError => e
|
|
112
137
|
Aircana.human_logger.warn("Failed to generate summary: #{e.message}")
|
|
113
138
|
# Fallback to title or truncated content
|
|
@@ -7,11 +7,11 @@ module Aircana
|
|
|
7
7
|
module Contexts
|
|
8
8
|
class Manifest
|
|
9
9
|
class << self
|
|
10
|
-
def create_manifest(kb_name, sources)
|
|
10
|
+
def create_manifest(kb_name, sources, color: nil)
|
|
11
11
|
validate_sources(sources)
|
|
12
12
|
|
|
13
13
|
manifest_path = manifest_path_for(kb_name)
|
|
14
|
-
manifest_data = build_manifest_data(kb_name, sources)
|
|
14
|
+
manifest_data = build_manifest_data(kb_name, sources, color)
|
|
15
15
|
|
|
16
16
|
FileUtils.mkdir_p(File.dirname(manifest_path))
|
|
17
17
|
File.write(manifest_path, JSON.pretty_generate(manifest_data))
|
|
@@ -20,7 +20,7 @@ module Aircana
|
|
|
20
20
|
manifest_path
|
|
21
21
|
end
|
|
22
22
|
|
|
23
|
-
def update_manifest(kb_name, sources)
|
|
23
|
+
def update_manifest(kb_name, sources, color: nil)
|
|
24
24
|
validate_sources(sources)
|
|
25
25
|
|
|
26
26
|
manifest_path = manifest_path_for(kb_name)
|
|
@@ -29,8 +29,9 @@ module Aircana
|
|
|
29
29
|
existing_data = JSON.parse(File.read(manifest_path))
|
|
30
30
|
manifest_data = existing_data.merge({ "sources" => sources })
|
|
31
31
|
manifest_data.delete("kb_type")
|
|
32
|
+
manifest_data["color"] = color if color
|
|
32
33
|
else
|
|
33
|
-
manifest_data = build_manifest_data(kb_name, sources)
|
|
34
|
+
manifest_data = build_manifest_data(kb_name, sources, color)
|
|
34
35
|
end
|
|
35
36
|
|
|
36
37
|
FileUtils.mkdir_p(File.dirname(manifest_path))
|
|
@@ -62,6 +63,13 @@ module Aircana
|
|
|
62
63
|
manifest["sources"] || []
|
|
63
64
|
end
|
|
64
65
|
|
|
66
|
+
def color_from_manifest(kb_name)
|
|
67
|
+
manifest = read_manifest(kb_name)
|
|
68
|
+
return nil unless manifest
|
|
69
|
+
|
|
70
|
+
manifest["color"]
|
|
71
|
+
end
|
|
72
|
+
|
|
65
73
|
def manifest_exists?(kb_name)
|
|
66
74
|
File.exist?(manifest_path_for(kb_name))
|
|
67
75
|
end
|
|
@@ -77,12 +85,14 @@ module Aircana
|
|
|
77
85
|
File.join(Aircana.configuration.kb_knowledge_dir, kb_name)
|
|
78
86
|
end
|
|
79
87
|
|
|
80
|
-
def build_manifest_data(kb_name, sources)
|
|
81
|
-
{
|
|
88
|
+
def build_manifest_data(kb_name, sources, color = nil)
|
|
89
|
+
data = {
|
|
82
90
|
"version" => "1.0",
|
|
83
91
|
"name" => kb_name,
|
|
84
92
|
"sources" => sources
|
|
85
93
|
}
|
|
94
|
+
data["color"] = color if color
|
|
95
|
+
data
|
|
86
96
|
end
|
|
87
97
|
|
|
88
98
|
def validate_manifest(manifest_data)
|
data/lib/aircana/contexts/web.rb
CHANGED
|
@@ -7,7 +7,6 @@ require_relative "local"
|
|
|
7
7
|
require_relative "manifest"
|
|
8
8
|
require_relative "../progress_tracker"
|
|
9
9
|
require_relative "../version"
|
|
10
|
-
require_relative "../llm/claude_client"
|
|
11
10
|
|
|
12
11
|
module Aircana
|
|
13
12
|
module Contexts
|
|
@@ -22,26 +21,27 @@ module Aircana
|
|
|
22
21
|
@local_storage = Local.new
|
|
23
22
|
end
|
|
24
23
|
|
|
25
|
-
def fetch_url_for(kb_name:, url:)
|
|
24
|
+
def fetch_url_for(kb_name:, url:, existing_metadata: nil)
|
|
26
25
|
validate_url!(url)
|
|
27
26
|
|
|
28
27
|
page_data = fetch_and_process_url(url)
|
|
29
28
|
store_page_as_markdown(page_data, kb_name)
|
|
30
29
|
|
|
31
|
-
build_url_metadata(page_data)
|
|
30
|
+
build_url_metadata(page_data, existing_metadata: existing_metadata)
|
|
32
31
|
rescue StandardError => e
|
|
33
32
|
handle_fetch_error(url, e)
|
|
34
33
|
nil
|
|
35
34
|
end
|
|
36
35
|
|
|
37
|
-
def fetch_urls_for(kb_name:, urls:) # rubocop:disable Metrics/MethodLength
|
|
36
|
+
def fetch_urls_for(kb_name:, urls:, existing_metadata: nil) # rubocop:disable Metrics/MethodLength
|
|
38
37
|
return { pages_count: 0, sources: [] } if urls.empty?
|
|
39
38
|
|
|
39
|
+
existing_metadata ||= load_existing_url_metadata(kb_name)
|
|
40
40
|
pages_metadata = []
|
|
41
41
|
successful_urls = []
|
|
42
42
|
|
|
43
43
|
ProgressTracker.with_batch_progress(urls, "Fetching URLs") do |url, _index|
|
|
44
|
-
metadata = fetch_url_for(kb_name: kb_name, url: url)
|
|
44
|
+
metadata = fetch_url_for(kb_name: kb_name, url: url, existing_metadata: existing_metadata)
|
|
45
45
|
if metadata
|
|
46
46
|
pages_metadata << metadata
|
|
47
47
|
successful_urls << url
|
|
@@ -66,7 +66,8 @@ module Aircana
|
|
|
66
66
|
all_urls = web_sources.flat_map { |source| source["urls"]&.map { |u| u["url"] } || [] }
|
|
67
67
|
return { pages_count: 0, sources: [] } if all_urls.empty?
|
|
68
68
|
|
|
69
|
-
|
|
69
|
+
existing_metadata = load_existing_url_metadata(kb_name)
|
|
70
|
+
fetch_urls_for(kb_name: kb_name, urls: all_urls, existing_metadata: existing_metadata)
|
|
70
71
|
end
|
|
71
72
|
|
|
72
73
|
private
|
|
@@ -162,8 +163,7 @@ module Aircana
|
|
|
162
163
|
|
|
163
164
|
def generate_title_with_claude(content, url)
|
|
164
165
|
prompt = build_title_generation_prompt(content, url)
|
|
165
|
-
|
|
166
|
-
claude_client.prompt(prompt).strip
|
|
166
|
+
Aircana::LLM.client.prompt(prompt).strip
|
|
167
167
|
end
|
|
168
168
|
|
|
169
169
|
def build_title_generation_prompt(content, url) # rubocop:disable Metrics/MethodLength
|
|
@@ -208,18 +208,41 @@ module Aircana
|
|
|
208
208
|
)
|
|
209
209
|
end
|
|
210
210
|
|
|
211
|
-
def
|
|
212
|
-
|
|
211
|
+
def load_existing_url_metadata(kb_name)
|
|
212
|
+
sources = Manifest.sources_from_manifest(kb_name)
|
|
213
|
+
web_sources = sources.select { |s| s["type"] == "web" }
|
|
214
|
+
return {} if web_sources.empty?
|
|
213
215
|
|
|
214
|
-
{
|
|
215
|
-
|
|
216
|
-
"
|
|
217
|
-
|
|
216
|
+
metadata = {}
|
|
217
|
+
web_sources.each do |source|
|
|
218
|
+
(source["urls"] || []).each do |url_entry|
|
|
219
|
+
metadata[url_entry["url"]] = url_entry
|
|
220
|
+
end
|
|
221
|
+
end
|
|
222
|
+
metadata
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
def build_url_metadata(page_data, existing_metadata: nil)
|
|
226
|
+
existing_metadata ||= {}
|
|
227
|
+
content_checksum = Aircana::Checksum.compute(page_data[:content])
|
|
228
|
+
existing = existing_metadata[page_data[:url]]
|
|
229
|
+
summary = resolve_summary(page_data, existing)
|
|
230
|
+
|
|
231
|
+
{ "url" => page_data[:url], "summary" => summary, "content_checksum" => content_checksum }
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
def resolve_summary(page_data, existing)
|
|
235
|
+
if existing && Aircana::Checksum.match?(existing["content_checksum"], page_data[:content])
|
|
236
|
+
Aircana.human_logger.info("Content unchanged for '#{page_data[:title]}', reusing summary")
|
|
237
|
+
existing["summary"]
|
|
238
|
+
else
|
|
239
|
+
generate_summary(page_data[:content], page_data[:title], page_data[:url])
|
|
240
|
+
end
|
|
218
241
|
end
|
|
219
242
|
|
|
220
243
|
def generate_summary(content, title, url)
|
|
221
244
|
prompt = build_summary_prompt(content, title, url)
|
|
222
|
-
LLM
|
|
245
|
+
Aircana::LLM.client.prompt(prompt).strip
|
|
223
246
|
rescue StandardError => e
|
|
224
247
|
Aircana.human_logger.warn("Failed to generate summary: #{e.message}")
|
|
225
248
|
# Fallback to title or truncated content
|
|
@@ -23,17 +23,17 @@ module Aircana
|
|
|
23
23
|
)
|
|
24
24
|
end
|
|
25
25
|
|
|
26
|
-
# Generate agent markdown from manifest data
|
|
27
26
|
def self.from_manifest(kb_name)
|
|
28
27
|
manifest = Contexts::Manifest.read_manifest(kb_name)
|
|
29
28
|
raise Error, "No manifest found for knowledge base '#{kb_name}'" unless manifest
|
|
30
29
|
|
|
31
|
-
# Use the same description generation as skills
|
|
32
30
|
agent_description = generate_agent_description_from_manifest(manifest, kb_name)
|
|
31
|
+
color = manifest["color"]
|
|
33
32
|
|
|
34
33
|
new(
|
|
35
34
|
kb_name: kb_name,
|
|
36
|
-
agent_description: agent_description
|
|
35
|
+
agent_description: agent_description,
|
|
36
|
+
color: color
|
|
37
37
|
)
|
|
38
38
|
end
|
|
39
39
|
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "tty-spinner"
|
|
4
|
+
|
|
5
|
+
module Aircana
|
|
6
|
+
module LLM
|
|
7
|
+
class Base
|
|
8
|
+
def initialize
|
|
9
|
+
@spinner = nil
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def prompt(text)
|
|
13
|
+
raise NotImplementedError, "Subclasses must implement #prompt"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
protected
|
|
17
|
+
|
|
18
|
+
def truncate_content(content, max_length = 2000)
|
|
19
|
+
return content if content.length <= max_length
|
|
20
|
+
|
|
21
|
+
"#{content[0..max_length]}..."
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def start_spinner(message)
|
|
25
|
+
@spinner = TTY::Spinner.new("[:spinner] #{message}", format: :dots)
|
|
26
|
+
@spinner.auto_spin
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def success_spinner(message)
|
|
30
|
+
return unless @spinner
|
|
31
|
+
|
|
32
|
+
@spinner.stop("✓")
|
|
33
|
+
puts message
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def error_spinner(message)
|
|
37
|
+
return unless @spinner
|
|
38
|
+
|
|
39
|
+
@spinner.stop("✗")
|
|
40
|
+
puts message
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "aws-sdk-bedrockruntime"
|
|
4
|
+
require_relative "base"
|
|
5
|
+
|
|
6
|
+
module Aircana
|
|
7
|
+
module LLM
|
|
8
|
+
class BedrockClient < Base
|
|
9
|
+
DEFAULT_REGION = "us-east-1"
|
|
10
|
+
DEFAULT_MODEL = "anthropic.claude-3-haiku-20240307-v1:0"
|
|
11
|
+
|
|
12
|
+
def prompt(text)
|
|
13
|
+
start_spinner("Generating response with Bedrock...")
|
|
14
|
+
|
|
15
|
+
begin
|
|
16
|
+
result = invoke_bedrock(text)
|
|
17
|
+
success_spinner("Generated response with Bedrock")
|
|
18
|
+
result.strip
|
|
19
|
+
rescue StandardError => e
|
|
20
|
+
error_spinner("Failed to generate response: #{e.message}")
|
|
21
|
+
raise Error, "Bedrock request failed: #{e.message}"
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
private
|
|
26
|
+
|
|
27
|
+
def invoke_bedrock(text)
|
|
28
|
+
client = build_client
|
|
29
|
+
response = client.invoke_model(
|
|
30
|
+
model_id: model_id,
|
|
31
|
+
content_type: "application/json",
|
|
32
|
+
accept: "application/json",
|
|
33
|
+
body: build_request_body(text)
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
parse_response(response)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def build_client
|
|
40
|
+
Aws::BedrockRuntime::Client.new(region: region)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def region
|
|
44
|
+
Aircana.configuration.bedrock_region || DEFAULT_REGION
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def model_id
|
|
48
|
+
Aircana.configuration.bedrock_model || DEFAULT_MODEL
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def build_request_body(text)
|
|
52
|
+
{
|
|
53
|
+
anthropic_version: "bedrock-2023-05-31",
|
|
54
|
+
max_tokens: 1024,
|
|
55
|
+
messages: [
|
|
56
|
+
{
|
|
57
|
+
role: "user",
|
|
58
|
+
content: text
|
|
59
|
+
}
|
|
60
|
+
]
|
|
61
|
+
}.to_json
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def parse_response(response)
|
|
65
|
+
body = JSON.parse(response.body.read)
|
|
66
|
+
content = body.dig("content", 0, "text")
|
|
67
|
+
raise Error, "No content in Bedrock response" unless content
|
|
68
|
+
|
|
69
|
+
content
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
@@ -1,15 +1,11 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require "English"
|
|
4
|
-
|
|
4
|
+
require_relative "base"
|
|
5
5
|
|
|
6
6
|
module Aircana
|
|
7
7
|
module LLM
|
|
8
|
-
class ClaudeClient
|
|
9
|
-
def initialize
|
|
10
|
-
@spinner = nil
|
|
11
|
-
end
|
|
12
|
-
|
|
8
|
+
class ClaudeClient < Base
|
|
13
9
|
def prompt(text)
|
|
14
10
|
start_spinner("Generating response with Claude...")
|
|
15
11
|
|
|
@@ -25,25 +21,6 @@ module Aircana
|
|
|
25
21
|
|
|
26
22
|
private
|
|
27
23
|
|
|
28
|
-
def start_spinner(message)
|
|
29
|
-
@spinner = TTY::Spinner.new("[:spinner] #{message}", format: :dots)
|
|
30
|
-
@spinner.auto_spin
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def success_spinner(message)
|
|
34
|
-
return unless @spinner
|
|
35
|
-
|
|
36
|
-
@spinner.stop("✓")
|
|
37
|
-
puts message
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def error_spinner(message)
|
|
41
|
-
return unless @spinner
|
|
42
|
-
|
|
43
|
-
@spinner.stop("✗")
|
|
44
|
-
puts message
|
|
45
|
-
end
|
|
46
|
-
|
|
47
24
|
def execute_claude_command(text)
|
|
48
25
|
command = build_claude_command(text)
|
|
49
26
|
execute_system_command(command)
|
data/lib/aircana/version.rb
CHANGED
data/lib/aircana.rb
CHANGED
|
@@ -10,11 +10,36 @@ require_relative "aircana/system_checker"
|
|
|
10
10
|
require_relative "aircana/progress_tracker"
|
|
11
11
|
require_relative "aircana/cli"
|
|
12
12
|
require_relative "aircana/generators"
|
|
13
|
+
require_relative "aircana/checksum"
|
|
13
14
|
require_relative "aircana/contexts/confluence"
|
|
14
15
|
require_relative "aircana/contexts/local"
|
|
16
|
+
require_relative "aircana/llm/base"
|
|
15
17
|
require_relative "aircana/llm/claude_client"
|
|
16
18
|
|
|
17
19
|
module Aircana
|
|
20
|
+
module LLM
|
|
21
|
+
class << self
|
|
22
|
+
def client
|
|
23
|
+
case provider
|
|
24
|
+
when "bedrock"
|
|
25
|
+
require_relative "aircana/llm/bedrock_client"
|
|
26
|
+
BedrockClient.new
|
|
27
|
+
when "claude", nil
|
|
28
|
+
ClaudeClient.new
|
|
29
|
+
else
|
|
30
|
+
Aircana.human_logger.warn("Unknown LLM provider '#{provider}', falling back to Claude")
|
|
31
|
+
ClaudeClient.new
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
private
|
|
36
|
+
|
|
37
|
+
def provider
|
|
38
|
+
Aircana.configuration.llm_provider
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
18
43
|
class Error < StandardError; end
|
|
19
44
|
|
|
20
45
|
class << self
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: aircana
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 5.
|
|
4
|
+
version: 5.1.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Weston Dransfield
|
|
@@ -9,6 +9,20 @@ bindir: exe
|
|
|
9
9
|
cert_chain: []
|
|
10
10
|
date: 2026-01-28 00:00:00.000000000 Z
|
|
11
11
|
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: aws-sdk-bedrockruntime
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - "~>"
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: '1.0'
|
|
19
|
+
type: :runtime
|
|
20
|
+
prerelease: false
|
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
22
|
+
requirements:
|
|
23
|
+
- - "~>"
|
|
24
|
+
- !ruby/object:Gem::Version
|
|
25
|
+
version: '1.0'
|
|
12
26
|
- !ruby/object:Gem::Dependency
|
|
13
27
|
name: httparty
|
|
14
28
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -118,6 +132,7 @@ files:
|
|
|
118
132
|
- compose.yml
|
|
119
133
|
- exe/aircana
|
|
120
134
|
- lib/aircana.rb
|
|
135
|
+
- lib/aircana/checksum.rb
|
|
121
136
|
- lib/aircana/cli.rb
|
|
122
137
|
- lib/aircana/cli/app.rb
|
|
123
138
|
- lib/aircana/cli/commands/doctor.rb
|
|
@@ -152,6 +167,8 @@ files:
|
|
|
152
167
|
- lib/aircana/hooks_manifest.rb
|
|
153
168
|
- lib/aircana/human_logger.rb
|
|
154
169
|
- lib/aircana/initializers.rb
|
|
170
|
+
- lib/aircana/llm/base.rb
|
|
171
|
+
- lib/aircana/llm/bedrock_client.rb
|
|
155
172
|
- lib/aircana/llm/claude_client.rb
|
|
156
173
|
- lib/aircana/plugin_manifest.rb
|
|
157
174
|
- lib/aircana/progress_tracker.rb
|