aircana 1.0.0 → 1.1.0.rc1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fc4450f7e5dfe9baa5e3d6d0251529f07538dcd06d5c4c10bf6286d746634e90
4
- data.tar.gz: 70a9992e7f81b85fd9d44ef30901f972afe6af4d695f6d37c2bc9636fa4c8d18
3
+ metadata.gz: 64811eb3cd8c51f06884e2f4f13e9c8b95e55b1bae350e558cccde508b3076c9
4
+ data.tar.gz: 61f3b8425387ada7b5f015d706d65fae1294aeb19d7b25ec35e0a22b3af6b3dc
5
5
  SHA512:
6
- metadata.gz: 94b1fc580d26df3f10ced6afd0deb5d92b520a35f2c904d9604900bbc384c401c5f2ac27944a2622ec0c650d112a9f448a7664210620587cac2a75aa9e2eb1b0
7
- data.tar.gz: 1d9a04978cc482c5cf65d8712893bd1546a3f49aa645e6de85147b1807cb2dbd0b8c0b6b53ef4d3f7b515fca062fb6959119212487def575d8c39f48f82f46eb
6
+ metadata.gz: c7a10c4f9ec04d77d1dbc96be3aec865acde288865c837839d92d005226489e1e77031d5da2623f4d019c69a28e1855f824415fb3a2362178829e723f8acad87
7
+ data.tar.gz: 234c4c2743a72b3fe899c234b94bed5e4ac964939dc77f2ba114401421ed660d8b58c18d2e4595523dd76c266dce1470563f7fa2ab53ccbe52a2192b4d28b493
data/.rspec_status CHANGED
@@ -1,151 +1,166 @@
1
1
  example_id | status | run_time |
2
2
  ------------------------------------------------------------ | ------ | --------------- |
3
- ./spec/aircana/cli/commands/add_directory_spec.rb[1:1:1:1] | passed | 0.0069 seconds |
4
- ./spec/aircana/cli/commands/add_directory_spec.rb[1:1:2:1] | passed | 0.00106 seconds |
5
- ./spec/aircana/cli/commands/add_directory_spec.rb[1:1:3:1] | passed | 0.0009 seconds |
6
- ./spec/aircana/cli/commands/add_directory_spec.rb[1:1:4:1] | passed | 0.00258 seconds |
7
- ./spec/aircana/cli/commands/add_directory_spec.rb[1:1:4:2:1] | passed | 0.00519 seconds |
8
- ./spec/aircana/cli/commands/add_directory_spec.rb[1:1:5:1] | passed | 0.00149 seconds |
9
- ./spec/aircana/cli/commands/add_directory_spec.rb[1:2:1] | passed | 0.00109 seconds |
10
- ./spec/aircana/cli/commands/add_directory_spec.rb[1:2:2] | passed | 0.0014 seconds |
11
- ./spec/aircana/cli/commands/add_directory_spec.rb[1:3:1] | passed | 0.00147 seconds |
12
- ./spec/aircana/cli/commands/add_directory_spec.rb[1:3:2] | passed | 0.00088 seconds |
13
- ./spec/aircana/cli/commands/add_directory_spec.rb[1:3:3] | passed | 0.00099 seconds |
14
- ./spec/aircana/cli/commands/add_directory_spec.rb[1:3:4] | passed | 0.00079 seconds |
15
- ./spec/aircana/cli/commands/add_directory_spec.rb[1:3:5] | passed | 0.00087 seconds |
16
- ./spec/aircana/cli/commands/add_directory_spec.rb[1:3:6] | passed | 0.00076 seconds |
17
- ./spec/aircana/cli/commands/add_directory_spec.rb[1:3:7] | passed | 0.00082 seconds |
18
- ./spec/aircana/cli/commands/add_directory_spec.rb[1:3:8] | passed | 0.00079 seconds |
19
- ./spec/aircana/cli/commands/agents_spec.rb[1:1:1:1] | passed | 0.0007 seconds |
20
- ./spec/aircana/cli/commands/agents_spec.rb[1:1:1:2] | passed | 0.00057 seconds |
21
- ./spec/aircana/cli/commands/agents_spec.rb[1:1:1:3] | passed | 0.00052 seconds |
22
- ./spec/aircana/cli/commands/agents_spec.rb[1:1:2:1] | passed | 0.00122 seconds |
23
- ./spec/aircana/cli/commands/agents_spec.rb[1:1:3:1] | passed | 0.00057 seconds |
24
- ./spec/aircana/cli/commands/agents_spec.rb[1:1:3:2] | passed | 0.00044 seconds |
25
- ./spec/aircana/cli/commands/agents_spec.rb[1:2:1] | passed | 0.00031 seconds |
26
- ./spec/aircana/cli/commands/hooks_spec.rb[1:1:1:1] | passed | 0.00085 seconds |
27
- ./spec/aircana/cli/commands/hooks_spec.rb[1:1:2:1:1] | passed | 0.00098 seconds |
28
- ./spec/aircana/cli/commands/hooks_spec.rb[1:1:2:2:1] | passed | 0.00103 seconds |
29
- ./spec/aircana/cli/commands/hooks_spec.rb[1:2:1:1] | passed | 0.0008 seconds |
30
- ./spec/aircana/cli/commands/hooks_spec.rb[1:2:2:1] | passed | 0.00093 seconds |
31
- ./spec/aircana/cli/commands/hooks_spec.rb[1:3:1:1] | passed | 0.00066 seconds |
32
- ./spec/aircana/cli/commands/hooks_spec.rb[1:3:2:1] | passed | 0.00129 seconds |
33
- ./spec/aircana/cli/commands/hooks_spec.rb[1:4:1] | passed | 0.00145 seconds |
34
- ./spec/aircana/cli/commands/hooks_spec.rb[1:4:2:1] | passed | 0.00151 seconds |
35
- ./spec/aircana/cli/commands/hooks_spec.rb[1:5:1:1] | passed | 0.00076 seconds |
36
- ./spec/aircana/cli/commands/hooks_spec.rb[1:5:2:1] | passed | 0.01352 seconds |
37
- ./spec/aircana/cli/commands/hooks_spec.rb[1:5:3:1] | passed | 0.00099 seconds |
38
- ./spec/aircana/cli/commands/hooks_spec.rb[1:5:4:1] | passed | 0.00078 seconds |
39
- ./spec/aircana/cli/commands/hooks_spec.rb[1:6:1:1] | passed | 0.0016 seconds |
40
- ./spec/aircana/cli/commands/hooks_spec.rb[1:6:2:1] | passed | 0.00075 seconds |
41
- ./spec/aircana/cli/commands/hooks_spec.rb[1:7:1] | passed | 0.00061 seconds |
42
- ./spec/aircana/cli/commands/install_spec.rb[1:1:1:1] | passed | 0.0016 seconds |
43
- ./spec/aircana/cli/commands/install_spec.rb[1:1:2:1] | passed | 0.00177 seconds |
44
- ./spec/aircana/cli/commands/install_spec.rb[1:2:1:1] | passed | 0.0031 seconds |
45
- ./spec/aircana/cli/commands/install_spec.rb[1:2:2:1] | passed | 0.00123 seconds |
46
- ./spec/aircana/cli/commands/install_spec.rb[1:2:3:1] | passed | 0.00145 seconds |
47
- ./spec/aircana/cli/commands/install_spec.rb[1:2:4:1] | passed | 0.00123 seconds |
48
- ./spec/aircana/cli/commands/install_spec.rb[1:3:1] | passed | 0.00109 seconds |
49
- ./spec/aircana/cli/commands/install_spec.rb[1:3:2:1] | passed | 0.00119 seconds |
50
- ./spec/aircana/cli/commands/install_spec.rb[1:3:3:1] | passed | 0.001 seconds |
51
- ./spec/aircana/cli/commands/install_spec.rb[1:3:4:1] | passed | 0.00104 seconds |
52
- ./spec/aircana/cli/commands/install_spec.rb[1:4:1] | passed | 0.00062 seconds |
53
- ./spec/aircana/cli/commands/install_spec.rb[1:4:2] | passed | 0.00077 seconds |
54
- ./spec/aircana/cli/commands/install_spec.rb[1:4:3] | passed | 0.00064 seconds |
55
- ./spec/aircana/cli/commands/install_spec.rb[1:4:4] | passed | 0.0006 seconds |
56
- ./spec/aircana/cli/commands/install_spec.rb[1:4:5] | passed | 0.00058 seconds |
57
- ./spec/aircana/cli/commands/install_spec.rb[1:5:1:1] | passed | 0.00077 seconds |
58
- ./spec/aircana/cli/commands/install_spec.rb[1:5:2:1] | passed | 0.00092 seconds |
59
- ./spec/aircana/cli/commands/install_spec.rb[1:5:3:1] | passed | 0.00082 seconds |
60
- ./spec/aircana/cli/commands/install_spec.rb[1:6:1] | passed | 0.00092 seconds |
61
- ./spec/aircana/cli/commands/plan_spec.rb[1:1:1:1] | passed | 0.00323 seconds |
62
- ./spec/aircana/cli/commands/plan_spec.rb[1:1:2:1] | passed | 0.00218 seconds |
63
- ./spec/aircana/cli/commands/plan_spec.rb[1:1:3:1] | passed | 0.00089 seconds |
64
- ./spec/aircana/cli/commands/work_spec.rb[1:1:1:1] | passed | 0.00133 seconds |
65
- ./spec/aircana/cli/commands/work_spec.rb[1:1:2:1] | passed | 0.00175 seconds |
66
- ./spec/aircana/cli/commands/work_spec.rb[1:1:3:1] | passed | 0.00085 seconds |
67
- ./spec/aircana/configuration_spec.rb[1:1:1] | passed | 0.0002 seconds |
68
- ./spec/aircana/configuration_spec.rb[1:2:1] | passed | 0.00009 seconds |
69
- ./spec/aircana/configuration_spec.rb[1:3:1] | passed | 0.00008 seconds |
70
- ./spec/aircana/configuration_spec.rb[1:4:1] | passed | 0.00008 seconds |
71
- ./spec/aircana/configuration_spec.rb[1:5:1] | passed | 0.00008 seconds |
72
- ./spec/aircana/configuration_spec.rb[1:5:2] | passed | 0.00007 seconds |
73
- ./spec/aircana/contexts/confluence_spec.rb[1:1:1:1] | passed | 0.00345 seconds |
74
- ./spec/aircana/contexts/confluence_spec.rb[1:1:1:2] | passed | 0.0014 seconds |
75
- ./spec/aircana/contexts/confluence_spec.rb[1:1:1:3] | passed | 0.00228 seconds |
76
- ./spec/aircana/contexts/confluence_spec.rb[1:1:2:1] | passed | 0.0004 seconds |
77
- ./spec/aircana/contexts/confluence_spec.rb[1:1:2:2] | passed | 0.00027 seconds |
78
- ./spec/aircana/contexts/confluence_spec.rb[1:1:2:3] | passed | 0.00025 seconds |
79
- ./spec/aircana/contexts/confluence_spec.rb[1:1:3:1] | passed | 0.00068 seconds |
80
- ./spec/aircana/contexts/confluence_spec.rb[1:1:3:2] | passed | 0.00068 seconds |
81
- ./spec/aircana/contexts/local_spec.rb[1:1:1] | passed | 0.00051 seconds |
82
- ./spec/aircana/contexts/local_spec.rb[1:1:2] | passed | 0.00026 seconds |
83
- ./spec/aircana/contexts/local_spec.rb[1:1:3] | passed | 0.00024 seconds |
84
- ./spec/aircana/contexts/local_spec.rb[1:1:4] | passed | 0.00023 seconds |
85
- ./spec/aircana/contexts/local_spec.rb[1:1:5] | passed | 0.00026 seconds |
86
- ./spec/aircana/contexts/local_spec.rb[1:1:6] | passed | 0.00027 seconds |
87
- ./spec/aircana/contexts/local_spec.rb[1:1:7] | passed | 0.00034 seconds |
88
- ./spec/aircana/contexts/local_spec.rb[1:1:8] | passed | 0.00026 seconds |
89
- ./spec/aircana/fzf_helper_spec.rb[1:1:1:1] | passed | 0.00037 seconds |
90
- ./spec/aircana/fzf_helper_spec.rb[1:1:1:2] | passed | 0.00032 seconds |
91
- ./spec/aircana/fzf_helper_spec.rb[1:1:1:3] | passed | 0.00042 seconds |
92
- ./spec/aircana/fzf_helper_spec.rb[1:1:2:1] | passed | 0.0136 seconds |
93
- ./spec/aircana/fzf_helper_spec.rb[1:1:3:1] | passed | 0.00123 seconds |
94
- ./spec/aircana/fzf_helper_spec.rb[1:2:1:1] | passed | 0.00023 seconds |
95
- ./spec/aircana/fzf_helper_spec.rb[1:2:1:2] | passed | 0.00019 seconds |
96
- ./spec/aircana/fzf_helper_spec.rb[1:2:1:3] | passed | 0.00106 seconds |
97
- ./spec/aircana/fzf_helper_spec.rb[1:2:2:1] | passed | 0.00019 seconds |
98
- ./spec/aircana/fzf_helper_spec.rb[1:2:2:2] | passed | 0.00013 seconds |
99
- ./spec/aircana/generators/agents_generator_spec.rb[1:1:1] | passed | 0.00006 seconds |
100
- ./spec/aircana/generators/agents_generator_spec.rb[1:2:1] | passed | 0.00058 seconds |
101
- ./spec/aircana/generators/agents_generator_spec.rb[1:2:2] | passed | 0.00026 seconds |
102
- ./spec/aircana/generators/agents_generator_spec.rb[1:3:1:1] | passed | 0.00009 seconds |
103
- ./spec/aircana/generators/agents_generator_spec.rb[1:3:1:2] | passed | 0.00006 seconds |
104
- ./spec/aircana/generators/agents_generator_spec.rb[1:3:2:1] | passed | 0.00006 seconds |
105
- ./spec/aircana/generators/agents_generator_spec.rb[1:3:2:2] | passed | 0.00007 seconds |
106
- ./spec/aircana/generators/agents_generator_spec.rb[1:4:1:1] | passed | 0.00007 seconds |
107
- ./spec/aircana/generators/agents_generator_spec.rb[1:4:2:1] | passed | 0.00006 seconds |
3
+ ./spec/aircana/cli/commands/add_directory_spec.rb[1:1:1:1] | passed | 0.00772 seconds |
4
+ ./spec/aircana/cli/commands/add_directory_spec.rb[1:1:2:1] | passed | 0.00102 seconds |
5
+ ./spec/aircana/cli/commands/add_directory_spec.rb[1:1:3:1] | passed | 0.00078 seconds |
6
+ ./spec/aircana/cli/commands/add_directory_spec.rb[1:1:4:1] | passed | 0.00248 seconds |
7
+ ./spec/aircana/cli/commands/add_directory_spec.rb[1:1:4:2:1] | passed | 0.01424 seconds |
8
+ ./spec/aircana/cli/commands/add_directory_spec.rb[1:1:5:1] | passed | 0.00263 seconds |
9
+ ./spec/aircana/cli/commands/add_directory_spec.rb[1:2:1] | passed | 0.00191 seconds |
10
+ ./spec/aircana/cli/commands/add_directory_spec.rb[1:2:2] | passed | 0.00177 seconds |
11
+ ./spec/aircana/cli/commands/add_directory_spec.rb[1:3:1] | passed | 0.00062 seconds |
12
+ ./spec/aircana/cli/commands/add_directory_spec.rb[1:3:2] | passed | 0.00063 seconds |
13
+ ./spec/aircana/cli/commands/add_directory_spec.rb[1:3:3] | passed | 0.00069 seconds |
14
+ ./spec/aircana/cli/commands/add_directory_spec.rb[1:3:4] | passed | 0.00063 seconds |
15
+ ./spec/aircana/cli/commands/add_directory_spec.rb[1:3:5] | passed | 0.00061 seconds |
16
+ ./spec/aircana/cli/commands/add_directory_spec.rb[1:3:6] | passed | 0.00063 seconds |
17
+ ./spec/aircana/cli/commands/add_directory_spec.rb[1:3:7] | passed | 0.0006 seconds |
18
+ ./spec/aircana/cli/commands/add_directory_spec.rb[1:3:8] | passed | 0.00063 seconds |
19
+ ./spec/aircana/cli/commands/agents_spec.rb[1:1:1:1] | passed | 0.00042 seconds |
20
+ ./spec/aircana/cli/commands/agents_spec.rb[1:1:1:2] | passed | 0.00032 seconds |
21
+ ./spec/aircana/cli/commands/agents_spec.rb[1:1:1:3] | passed | 0.00044 seconds |
22
+ ./spec/aircana/cli/commands/agents_spec.rb[1:1:2:1] | passed | 0.00124 seconds |
23
+ ./spec/aircana/cli/commands/agents_spec.rb[1:1:3:1] | passed | 0.00035 seconds |
24
+ ./spec/aircana/cli/commands/agents_spec.rb[1:1:3:2] | passed | 0.00031 seconds |
25
+ ./spec/aircana/cli/commands/agents_spec.rb[1:2:1] | passed | 0.00021 seconds |
26
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:1:1:1] | passed | 0.00089 seconds |
27
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:1:2:1:1] | passed | 0.00087 seconds |
28
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:1:2:2:1] | passed | 0.00125 seconds |
29
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:2:1:1] | passed | 0.00092 seconds |
30
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:2:2:1] | passed | 0.00098 seconds |
31
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:3:1:1] | passed | 0.00079 seconds |
32
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:3:2:1] | passed | 0.00145 seconds |
33
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:4:1] | passed | 0.00411 seconds |
34
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:4:2:1] | passed | 0.00155 seconds |
35
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:5:1:1] | passed | 0.00071 seconds |
36
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:5:2:1] | passed | 0.00093 seconds |
37
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:5:3:1] | passed | 0.00124 seconds |
38
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:5:4:1] | passed | 0.00087 seconds |
39
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:6:1:1] | passed | 0.00066 seconds |
40
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:6:2:1] | passed | 0.00116 seconds |
41
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:7:1] | passed | 0.0006 seconds |
42
+ ./spec/aircana/cli/commands/install_spec.rb[1:1:1:1] | passed | 0.0011 seconds |
43
+ ./spec/aircana/cli/commands/install_spec.rb[1:1:2:1] | passed | 0.00182 seconds |
44
+ ./spec/aircana/cli/commands/install_spec.rb[1:2:1:1] | passed | 0.00368 seconds |
45
+ ./spec/aircana/cli/commands/install_spec.rb[1:2:2:1] | passed | 0.00227 seconds |
46
+ ./spec/aircana/cli/commands/install_spec.rb[1:2:3:1] | passed | 0.00197 seconds |
47
+ ./spec/aircana/cli/commands/install_spec.rb[1:2:4:1] | passed | 0.00264 seconds |
48
+ ./spec/aircana/cli/commands/install_spec.rb[1:3:1] | passed | 0.00229 seconds |
49
+ ./spec/aircana/cli/commands/install_spec.rb[1:3:2:1] | passed | 0.00228 seconds |
50
+ ./spec/aircana/cli/commands/install_spec.rb[1:3:3:1] | passed | 0.00224 seconds |
51
+ ./spec/aircana/cli/commands/install_spec.rb[1:3:4:1] | passed | 0.00231 seconds |
52
+ ./spec/aircana/cli/commands/install_spec.rb[1:4:1] | passed | 0.00079 seconds |
53
+ ./spec/aircana/cli/commands/install_spec.rb[1:4:2] | passed | 0.00076 seconds |
54
+ ./spec/aircana/cli/commands/install_spec.rb[1:4:3] | passed | 0.0009 seconds |
55
+ ./spec/aircana/cli/commands/install_spec.rb[1:4:4] | passed | 0.00085 seconds |
56
+ ./spec/aircana/cli/commands/install_spec.rb[1:4:5] | passed | 0.00082 seconds |
57
+ ./spec/aircana/cli/commands/install_spec.rb[1:5:1:1] | passed | 0.00114 seconds |
58
+ ./spec/aircana/cli/commands/install_spec.rb[1:5:2:1] | passed | 0.00089 seconds |
59
+ ./spec/aircana/cli/commands/install_spec.rb[1:5:3:1] | passed | 0.00136 seconds |
60
+ ./spec/aircana/cli/commands/install_spec.rb[1:6:1] | passed | 0.00117 seconds |
61
+ ./spec/aircana/cli/commands/plan_spec.rb[1:1:1:1] | passed | 0.00687 seconds |
62
+ ./spec/aircana/cli/commands/plan_spec.rb[1:1:2:1] | passed | 0.00506 seconds |
63
+ ./spec/aircana/cli/commands/plan_spec.rb[1:1:3:1] | passed | 0.00052 seconds |
64
+ ./spec/aircana/cli/commands/work_spec.rb[1:1:1:1] | passed | 0.00558 seconds |
65
+ ./spec/aircana/cli/commands/work_spec.rb[1:1:2:1] | passed | 0.00574 seconds |
66
+ ./spec/aircana/cli/commands/work_spec.rb[1:1:3:1] | passed | 0.00056 seconds |
67
+ ./spec/aircana/configuration_spec.rb[1:1:1] | passed | 0.00021 seconds |
68
+ ./spec/aircana/configuration_spec.rb[1:2:1] | passed | 0.00007 seconds |
69
+ ./spec/aircana/configuration_spec.rb[1:3:1] | passed | 0.0001 seconds |
70
+ ./spec/aircana/configuration_spec.rb[1:4:1] | passed | 0.00019 seconds |
71
+ ./spec/aircana/configuration_spec.rb[1:5:1] | passed | 0.00012 seconds |
72
+ ./spec/aircana/configuration_spec.rb[1:5:2] | passed | 0.00008 seconds |
73
+ ./spec/aircana/contexts/confluence_spec.rb[1:1:1:1] | passed | 0.00648 seconds |
74
+ ./spec/aircana/contexts/confluence_spec.rb[1:1:1:2] | passed | 0.00066 seconds |
75
+ ./spec/aircana/contexts/confluence_spec.rb[1:1:1:3] | passed | 0.00155 seconds |
76
+ ./spec/aircana/contexts/confluence_spec.rb[1:1:2:1] | passed | 0.00019 seconds |
77
+ ./spec/aircana/contexts/confluence_spec.rb[1:1:2:2] | passed | 0.00013 seconds |
78
+ ./spec/aircana/contexts/confluence_spec.rb[1:1:2:3] | passed | 0.00012 seconds |
79
+ ./spec/aircana/contexts/confluence_spec.rb[1:1:3:1] | passed | 0.00047 seconds |
80
+ ./spec/aircana/contexts/confluence_spec.rb[1:1:3:2] | passed | 0.00047 seconds |
81
+ ./spec/aircana/contexts/local_spec.rb[1:1:1] | passed | 0.0013 seconds |
82
+ ./spec/aircana/contexts/local_spec.rb[1:1:2] | passed | 0.00106 seconds |
83
+ ./spec/aircana/contexts/local_spec.rb[1:1:3] | passed | 0.00102 seconds |
84
+ ./spec/aircana/contexts/local_spec.rb[1:1:4] | passed | 0.00096 seconds |
85
+ ./spec/aircana/contexts/local_spec.rb[1:1:5] | passed | 0.00101 seconds |
86
+ ./spec/aircana/contexts/local_spec.rb[1:1:6] | passed | 0.00136 seconds |
87
+ ./spec/aircana/contexts/local_spec.rb[1:1:7] | passed | 0.00158 seconds |
88
+ ./spec/aircana/contexts/local_spec.rb[1:1:8] | passed | 0.00126 seconds |
89
+ ./spec/aircana/contexts/manifest_spec.rb[1:1:1] | passed | 0.00096 seconds |
90
+ ./spec/aircana/contexts/manifest_spec.rb[1:1:2] | passed | 0.00084 seconds |
91
+ ./spec/aircana/contexts/manifest_spec.rb[1:2:1] | passed | 1.02 seconds |
92
+ ./spec/aircana/contexts/manifest_spec.rb[1:2:2] | passed | 0.00189 seconds |
93
+ ./spec/aircana/contexts/manifest_spec.rb[1:3:1] | passed | 0.00188 seconds |
94
+ ./spec/aircana/contexts/manifest_spec.rb[1:3:2] | passed | 0.00039 seconds |
95
+ ./spec/aircana/contexts/manifest_spec.rb[1:3:3] | passed | 0.0015 seconds |
96
+ ./spec/aircana/contexts/manifest_spec.rb[1:3:4] | passed | 0.00208 seconds |
97
+ ./spec/aircana/contexts/manifest_spec.rb[1:4:1] | passed | 0.00217 seconds |
98
+ ./spec/aircana/contexts/manifest_spec.rb[1:4:2] | passed | 0.00051 seconds |
99
+ ./spec/aircana/contexts/manifest_spec.rb[1:5:1] | passed | 0.00185 seconds |
100
+ ./spec/aircana/contexts/manifest_spec.rb[1:5:2] | passed | 0.00046 seconds |
101
+ ./spec/aircana/contexts/manifest_spec.rb[1:6:1] | passed | 0.00046 seconds |
102
+ ./spec/aircana/contexts/manifest_spec.rb[1:6:2] | passed | 0.00054 seconds |
103
+ ./spec/aircana/contexts/manifest_spec.rb[1:6:3] | passed | 0.00051 seconds |
104
+ ./spec/aircana/fzf_helper_spec.rb[1:1:1:1] | passed | 0.0006 seconds |
105
+ ./spec/aircana/fzf_helper_spec.rb[1:1:1:2] | passed | 0.00043 seconds |
106
+ ./spec/aircana/fzf_helper_spec.rb[1:1:1:3] | passed | 0.00068 seconds |
107
+ ./spec/aircana/fzf_helper_spec.rb[1:1:2:1] | passed | 0.00075 seconds |
108
+ ./spec/aircana/fzf_helper_spec.rb[1:1:3:1] | passed | 0.00084 seconds |
109
+ ./spec/aircana/fzf_helper_spec.rb[1:2:1:1] | passed | 0.00032 seconds |
110
+ ./spec/aircana/fzf_helper_spec.rb[1:2:1:2] | passed | 0.0003 seconds |
111
+ ./spec/aircana/fzf_helper_spec.rb[1:2:1:3] | passed | 0.00029 seconds |
112
+ ./spec/aircana/fzf_helper_spec.rb[1:2:2:1] | passed | 0.0003 seconds |
113
+ ./spec/aircana/fzf_helper_spec.rb[1:2:2:2] | passed | 0.00022 seconds |
114
+ ./spec/aircana/generators/agents_generator_spec.rb[1:1:1] | passed | 0.00009 seconds |
115
+ ./spec/aircana/generators/agents_generator_spec.rb[1:2:1] | passed | 0.00096 seconds |
116
+ ./spec/aircana/generators/agents_generator_spec.rb[1:2:2] | passed | 0.00032 seconds |
117
+ ./spec/aircana/generators/agents_generator_spec.rb[1:3:1:1] | passed | 0.00011 seconds |
118
+ ./spec/aircana/generators/agents_generator_spec.rb[1:3:1:2] | passed | 0.00008 seconds |
119
+ ./spec/aircana/generators/agents_generator_spec.rb[1:3:2:1] | passed | 0.00008 seconds |
120
+ ./spec/aircana/generators/agents_generator_spec.rb[1:3:2:2] | passed | 0.00008 seconds |
121
+ ./spec/aircana/generators/agents_generator_spec.rb[1:4:1:1] | passed | 0.00009 seconds |
122
+ ./spec/aircana/generators/agents_generator_spec.rb[1:4:2:1] | passed | 0.00008 seconds |
108
123
  ./spec/aircana/generators/hooks_generator_spec.rb[1:1:1] | passed | 0.00006 seconds |
109
- ./spec/aircana/generators/hooks_generator_spec.rb[1:2:1] | passed | 0.00004 seconds |
110
- ./spec/aircana/generators/hooks_generator_spec.rb[1:3:1] | passed | 0.00068 seconds |
111
- ./spec/aircana/generators/hooks_generator_spec.rb[1:3:2] | passed | 0.00033 seconds |
112
- ./spec/aircana/generators/hooks_generator_spec.rb[1:4:1] | passed | 0.00015 seconds |
113
- ./spec/aircana/generators/hooks_generator_spec.rb[1:5:1:1] | passed | 0.00016 seconds |
114
- ./spec/aircana/generators/hooks_generator_spec.rb[1:5:2:1] | passed | 0.00006 seconds |
115
- ./spec/aircana/generators/hooks_generator_spec.rb[1:6:1] | passed | 0.0012 seconds |
116
- ./spec/aircana/generators/hooks_generator_spec.rb[1:7:1] | passed | 0.00025 seconds |
117
- ./spec/aircana/human_logger_spec.rb[1:1:1] | passed | 0.00012 seconds |
118
- ./spec/aircana/human_logger_spec.rb[1:2:1] | passed | 0.00007 seconds |
119
- ./spec/aircana/human_logger_spec.rb[1:3:1] | passed | 0.00006 seconds |
120
- ./spec/aircana/human_logger_spec.rb[1:4:1] | passed | 0.00007 seconds |
121
- ./spec/aircana/human_logger_spec.rb[1:5:1] | passed | 0.00005 seconds |
122
- ./spec/aircana/human_logger_spec.rb[1:5:2] | passed | 0.00005 seconds |
123
- ./spec/aircana/human_logger_spec.rb[1:5:3] | passed | 0.00005 seconds |
124
- ./spec/aircana/human_logger_spec.rb[1:5:4] | passed | 0.00005 seconds |
125
- ./spec/aircana/human_logger_spec.rb[1:5:5] | passed | 0.00027 seconds |
126
- ./spec/aircana/human_logger_spec.rb[1:5:6] | passed | 0.00005 seconds |
127
- ./spec/aircana/human_logger_spec.rb[1:5:7] | passed | 0.00005 seconds |
128
- ./spec/aircana/human_logger_spec.rb[1:6:1] | passed | 0.00005 seconds |
129
- ./spec/aircana/llm/claude_client_spec.rb[1:1:1:1] | passed | 0.00066 seconds |
130
- ./spec/aircana/llm/claude_client_spec.rb[1:1:1:2] | passed | 0.00058 seconds |
131
- ./spec/aircana/llm/claude_client_spec.rb[1:1:1:3] | passed | 0.0007 seconds |
132
- ./spec/aircana/llm/claude_client_spec.rb[1:1:1:4] | passed | 0.00052 seconds |
133
- ./spec/aircana/llm/claude_client_spec.rb[1:1:2:1] | passed | 0.0006 seconds |
134
- ./spec/aircana/llm/claude_client_spec.rb[1:1:2:2] | passed | 0.00073 seconds |
135
- ./spec/aircana/llm/claude_client_spec.rb[1:1:3:1] | passed | 0.00061 seconds |
136
- ./spec/aircana/llm/claude_client_spec.rb[1:2:1] | passed | 0.00055 seconds |
137
- ./spec/aircana/llm/claude_client_spec.rb[1:2:2] | passed | 0.00051 seconds |
138
- ./spec/aircana/llm/claude_client_spec.rb[1:3:1:1] | passed | 0.00055 seconds |
139
- ./spec/aircana/llm/claude_client_spec.rb[1:3:1:2] | passed | 0.00034 seconds |
140
- ./spec/aircana/system_checker_spec.rb[1:1:1:1] | passed | 0.00053 seconds |
141
- ./spec/aircana/system_checker_spec.rb[1:1:2:1] | passed | 0.00088 seconds |
142
- ./spec/aircana/system_checker_spec.rb[1:1:3:1] | passed | 0.00095 seconds |
143
- ./spec/aircana/system_checker_spec.rb[1:2:1] | passed | 0.00037 seconds |
144
- ./spec/aircana/system_checker_spec.rb[1:2:2] | passed | 0.00035 seconds |
145
- ./spec/aircana/system_checker_spec.rb[1:3:1] | passed | 0.00033 seconds |
146
- ./spec/aircana/system_checker_spec.rb[1:3:2] | passed | 0.00036 seconds |
147
- ./spec/aircana/system_checker_spec.rb[1:3:3] | passed | 0.00038 seconds |
148
- ./spec/aircana/system_checker_spec.rb[1:3:4] | passed | 0.00047 seconds |
149
- ./spec/aircana/system_checker_spec.rb[1:3:5] | passed | 0.00027 seconds |
150
- ./spec/aircana_spec.rb[1:1] | passed | 0.00005 seconds |
151
- ./spec/aircana_spec.rb[1:2] | passed | 0.00088 seconds |
124
+ ./spec/aircana/generators/hooks_generator_spec.rb[1:2:1] | passed | 0.00006 seconds |
125
+ ./spec/aircana/generators/hooks_generator_spec.rb[1:3:1] | passed | 0.00077 seconds |
126
+ ./spec/aircana/generators/hooks_generator_spec.rb[1:3:2] | passed | 0.0005 seconds |
127
+ ./spec/aircana/generators/hooks_generator_spec.rb[1:4:1] | passed | 0.00018 seconds |
128
+ ./spec/aircana/generators/hooks_generator_spec.rb[1:5:1:1] | passed | 0.0002 seconds |
129
+ ./spec/aircana/generators/hooks_generator_spec.rb[1:5:2:1] | passed | 0.00008 seconds |
130
+ ./spec/aircana/generators/hooks_generator_spec.rb[1:6:1] | passed | 0.00134 seconds |
131
+ ./spec/aircana/generators/hooks_generator_spec.rb[1:7:1] | passed | 0.00048 seconds |
132
+ ./spec/aircana/human_logger_spec.rb[1:1:1] | passed | 0.00014 seconds |
133
+ ./spec/aircana/human_logger_spec.rb[1:2:1] | passed | 0.00009 seconds |
134
+ ./spec/aircana/human_logger_spec.rb[1:3:1] | passed | 0.00009 seconds |
135
+ ./spec/aircana/human_logger_spec.rb[1:4:1] | passed | 0.00009 seconds |
136
+ ./spec/aircana/human_logger_spec.rb[1:5:1] | passed | 0.00007 seconds |
137
+ ./spec/aircana/human_logger_spec.rb[1:5:2] | passed | 0.00008 seconds |
138
+ ./spec/aircana/human_logger_spec.rb[1:5:3] | passed | 0.00007 seconds |
139
+ ./spec/aircana/human_logger_spec.rb[1:5:4] | passed | 0.00007 seconds |
140
+ ./spec/aircana/human_logger_spec.rb[1:5:5] | passed | 0.00007 seconds |
141
+ ./spec/aircana/human_logger_spec.rb[1:5:6] | passed | 0.00007 seconds |
142
+ ./spec/aircana/human_logger_spec.rb[1:5:7] | passed | 0.00008 seconds |
143
+ ./spec/aircana/human_logger_spec.rb[1:6:1] | passed | 0.00006 seconds |
144
+ ./spec/aircana/llm/claude_client_spec.rb[1:1:1:1] | passed | 0.00086 seconds |
145
+ ./spec/aircana/llm/claude_client_spec.rb[1:1:1:2] | passed | 0.00072 seconds |
146
+ ./spec/aircana/llm/claude_client_spec.rb[1:1:1:3] | passed | 0.0006 seconds |
147
+ ./spec/aircana/llm/claude_client_spec.rb[1:1:1:4] | passed | 0.0006 seconds |
148
+ ./spec/aircana/llm/claude_client_spec.rb[1:1:2:1] | passed | 0.00068 seconds |
149
+ ./spec/aircana/llm/claude_client_spec.rb[1:1:2:2] | passed | 0.00061 seconds |
150
+ ./spec/aircana/llm/claude_client_spec.rb[1:1:3:1] | passed | 0.00066 seconds |
151
+ ./spec/aircana/llm/claude_client_spec.rb[1:2:1] | passed | 0.00074 seconds |
152
+ ./spec/aircana/llm/claude_client_spec.rb[1:2:2] | passed | 0.00058 seconds |
153
+ ./spec/aircana/llm/claude_client_spec.rb[1:3:1:1] | passed | 0.00043 seconds |
154
+ ./spec/aircana/llm/claude_client_spec.rb[1:3:1:2] | passed | 0.00076 seconds |
155
+ ./spec/aircana/system_checker_spec.rb[1:1:1:1] | passed | 0.00064 seconds |
156
+ ./spec/aircana/system_checker_spec.rb[1:1:2:1] | passed | 0.00077 seconds |
157
+ ./spec/aircana/system_checker_spec.rb[1:1:3:1] | passed | 0.00098 seconds |
158
+ ./spec/aircana/system_checker_spec.rb[1:2:1] | passed | 0.00038 seconds |
159
+ ./spec/aircana/system_checker_spec.rb[1:2:2] | passed | 0.0004 seconds |
160
+ ./spec/aircana/system_checker_spec.rb[1:3:1] | passed | 0.00035 seconds |
161
+ ./spec/aircana/system_checker_spec.rb[1:3:2] | passed | 0.00039 seconds |
162
+ ./spec/aircana/system_checker_spec.rb[1:3:3] | passed | 0.00044 seconds |
163
+ ./spec/aircana/system_checker_spec.rb[1:3:4] | passed | 0.00049 seconds |
164
+ ./spec/aircana/system_checker_spec.rb[1:3:5] | passed | 0.00028 seconds |
165
+ ./spec/aircana_spec.rb[1:1] | passed | 0.0001 seconds |
166
+ ./spec/aircana_spec.rb[1:2] | passed | 0.0012 seconds |
data/.rubocop.yml CHANGED
@@ -29,6 +29,9 @@ Metrics/ClassLength:
29
29
  - 'lib/aircana/cli/commands/add_directory.rb'
30
30
  - 'lib/aircana/cli/commands/hooks.rb'
31
31
  - 'lib/aircana/cli/commands/install.rb'
32
+ - 'lib/aircana/contexts/confluence.rb'
33
+ - 'lib/aircana/contexts/manifest.rb'
34
+ - 'lib/aircana/symlink_manager.rb'
32
35
 
33
36
  Metrics/ModuleLength:
34
37
  Exclude:
@@ -43,6 +46,8 @@ Metrics/MethodLength:
43
46
  - 'lib/aircana/cli/commands/project.rb'
44
47
  - 'lib/aircana/generators/project_config_generator.rb'
45
48
  - 'lib/aircana/symlink_manager.rb'
49
+ - 'lib/aircana/contexts/confluence.rb'
50
+ - 'lib/aircana/contexts/manifest.rb'
46
51
 
47
52
  Metrics/AbcSize:
48
53
  Exclude:
@@ -3,6 +3,7 @@
3
3
  require "json"
4
4
  require "tty-prompt"
5
5
  require_relative "../../generators/agents_generator"
6
+ require_relative "../../contexts/manifest"
6
7
 
7
8
  module Aircana
8
9
  module CLI
@@ -13,7 +14,7 @@ module Aircana
13
14
  class << self # rubocop:disable Metrics/ClassLength
14
15
  def refresh(agent)
15
16
  normalized_agent = normalize_string(agent)
16
- perform_refresh(normalized_agent)
17
+ perform_manifest_aware_refresh(normalized_agent)
17
18
  rescue Aircana::Error => e
18
19
  handle_refresh_error(normalized_agent, e)
19
20
  end
@@ -62,9 +63,10 @@ module Aircana
62
63
 
63
64
  def perform_refresh(normalized_agent)
64
65
  confluence = Aircana::Contexts::Confluence.new
65
- pages_count = confluence.fetch_pages_for(agent: normalized_agent)
66
+ result = confluence.fetch_pages_for(agent: normalized_agent)
66
67
 
67
- log_refresh_result(normalized_agent, pages_count)
68
+ log_refresh_result(normalized_agent, result[:pages_count])
69
+ result
68
70
  end
69
71
 
70
72
  def log_refresh_result(normalized_agent, pages_count)
@@ -75,6 +77,31 @@ module Aircana
75
77
  end
76
78
  end
77
79
 
80
+ def perform_manifest_aware_refresh(normalized_agent)
81
+ confluence = Aircana::Contexts::Confluence.new
82
+
83
+ # Try manifest-based refresh first
84
+ if Aircana::Contexts::Manifest.manifest_exists?(normalized_agent)
85
+ Aircana.human_logger.info "Refreshing from knowledge manifest..."
86
+ result = confluence.refresh_from_manifest(agent: normalized_agent)
87
+ else
88
+ Aircana.human_logger.info "No manifest found, falling back to label-based search..."
89
+ result = confluence.fetch_pages_for(agent: normalized_agent)
90
+ end
91
+
92
+ log_refresh_result(normalized_agent, result[:pages_count])
93
+ result
94
+ end
95
+
96
+ def show_gitignore_recommendation
97
+ Aircana.human_logger.info ""
98
+ Aircana.human_logger.info "💡 Recommendation: Add knowledge directories to .gitignore:"
99
+ Aircana.human_logger.info " echo \".aircana/agents/*/knowledge/\" >> .gitignore"
100
+ Aircana.human_logger.info ""
101
+ Aircana.human_logger.info " This keeps knowledge sources in version control while excluding"
102
+ Aircana.human_logger.info " the actual knowledge content from your repository."
103
+ end
104
+
78
105
  def log_no_pages_found(normalized_agent)
79
106
  Aircana.human_logger.info "No pages found for agent '#{normalized_agent}'. " \
80
107
  "Make sure pages are labeled with '#{normalized_agent}' in Confluence."
@@ -114,7 +141,8 @@ module Aircana
114
141
 
115
142
  if prompt.yes?("Would you like to fetch knowledge for this agent from Confluence now?")
116
143
  Aircana.human_logger.info "Fetching knowledge from Confluence..."
117
- perform_refresh(normalized_agent_name)
144
+ result = perform_refresh(normalized_agent_name)
145
+ show_gitignore_recommendation if result[:pages_count]&.positive?
118
146
  else
119
147
  Aircana.human_logger.info(
120
148
  "Skipping knowledge fetch. You can run 'aircana agents refresh #{normalized_agent_name}' later."
@@ -3,6 +3,7 @@
3
3
  require "httparty"
4
4
  require "reverse_markdown"
5
5
  require_relative "local"
6
+ require_relative "manifest"
6
7
  require_relative "confluence_logging"
7
8
  require_relative "confluence_http"
8
9
  require_relative "confluence_content"
@@ -28,10 +29,36 @@ module Aircana
28
29
  setup_httparty
29
30
 
30
31
  pages = search_and_log_pages(agent)
31
- return 0 if pages.empty?
32
+ return { pages_count: 0, sources: [] } if pages.empty?
32
33
 
33
- process_pages(pages, agent)
34
- pages.size
34
+ sources = process_pages_with_manifest(pages, agent)
35
+ create_or_update_manifest(agent, sources)
36
+
37
+ { pages_count: pages.size, sources: sources }
38
+ end
39
+
40
+ def refresh_from_manifest(agent:)
41
+ sources = Manifest.sources_from_manifest(agent)
42
+ return { pages_count: 0, sources: [] } if sources.empty?
43
+
44
+ validate_configuration!
45
+ setup_httparty
46
+
47
+ confluence_sources = sources.select { |s| s["type"] == "confluence" }
48
+ return { pages_count: 0, sources: [] } if confluence_sources.empty?
49
+
50
+ all_pages = []
51
+ confluence_sources.each do |source|
52
+ pages = fetch_pages_from_source(source)
53
+ all_pages.concat(pages)
54
+ end
55
+
56
+ return { pages_count: 0, sources: [] } if all_pages.empty?
57
+
58
+ updated_sources = process_pages_with_manifest(all_pages, agent)
59
+ Manifest.update_manifest(agent, updated_sources)
60
+
61
+ { pages_count: all_pages.size, sources: updated_sources }
35
62
  end
36
63
 
37
64
  def search_and_log_pages(agent)
@@ -48,8 +75,54 @@ module Aircana
48
75
  end
49
76
  end
50
77
 
78
+ def process_pages_with_manifest(pages, agent)
79
+ page_metadata = []
80
+
81
+ ProgressTracker.with_batch_progress(pages, "Processing pages") do |page, _index|
82
+ store_page_as_markdown(page, agent)
83
+ page_metadata << extract_page_metadata(page)
84
+ end
85
+
86
+ build_source_metadata(agent, page_metadata)
87
+ end
88
+
51
89
  private
52
90
 
91
+ def fetch_pages_from_source(source)
92
+ case source["type"]
93
+ when "confluence"
94
+ fetch_pages_by_label(source["label"])
95
+ else
96
+ []
97
+ end
98
+ end
99
+
100
+ def extract_page_metadata(page)
101
+ {
102
+ "id" => page["id"],
103
+ "title" => page["title"],
104
+ "last_updated" => page.dig("version", "when") || Time.now.utc.strftime("%Y-%m-%dT%H:%M:%SZ")
105
+ }
106
+ end
107
+
108
+ def build_source_metadata(agent, page_metadata)
109
+ [
110
+ {
111
+ "type" => "confluence",
112
+ "label" => agent,
113
+ "pages" => page_metadata
114
+ }
115
+ ]
116
+ end
117
+
118
+ def create_or_update_manifest(agent, sources)
119
+ if Manifest.manifest_exists?(agent)
120
+ Manifest.update_manifest(agent, sources)
121
+ else
122
+ Manifest.create_manifest(agent, sources)
123
+ end
124
+ end
125
+
53
126
  def validate_configuration!
54
127
  config = Aircana.configuration
55
128
 
@@ -0,0 +1,148 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+ require "fileutils"
5
+
6
+ module Aircana
7
+ module Contexts
8
+ class Manifest
9
+ class << self
10
+ def create_manifest(agent, sources)
11
+ validate_sources(sources)
12
+
13
+ manifest_path = manifest_path_for(agent)
14
+ manifest_data = build_manifest_data(agent, sources)
15
+
16
+ FileUtils.mkdir_p(File.dirname(manifest_path))
17
+ File.write(manifest_path, JSON.pretty_generate(manifest_data))
18
+
19
+ Aircana.human_logger.info "Created knowledge manifest for agent '#{agent}'"
20
+ manifest_path
21
+ end
22
+
23
+ def update_manifest(agent, sources)
24
+ validate_sources(sources)
25
+
26
+ manifest_path = manifest_path_for(agent)
27
+
28
+ if File.exist?(manifest_path)
29
+ existing_data = JSON.parse(File.read(manifest_path))
30
+ manifest_data = existing_data.merge({
31
+ "last_updated" => Time.now.utc.strftime("%Y-%m-%dT%H:%M:%SZ"),
32
+ "sources" => sources
33
+ })
34
+ else
35
+ manifest_data = build_manifest_data(agent, sources)
36
+ end
37
+
38
+ FileUtils.mkdir_p(File.dirname(manifest_path))
39
+ File.write(manifest_path, JSON.pretty_generate(manifest_data))
40
+ manifest_path
41
+ end
42
+
43
+ def read_manifest(agent)
44
+ manifest_path = manifest_path_for(agent)
45
+ return nil unless File.exist?(manifest_path)
46
+
47
+ begin
48
+ manifest_data = JSON.parse(File.read(manifest_path))
49
+ validate_manifest(manifest_data)
50
+ manifest_data
51
+ rescue JSON::ParserError => e
52
+ Aircana.human_logger.warn "Invalid manifest for agent '#{agent}': #{e.message}"
53
+ nil
54
+ rescue ManifestError => e
55
+ Aircana.human_logger.warn "Manifest validation failed for agent '#{agent}': #{e.message}"
56
+ nil
57
+ end
58
+ end
59
+
60
+ def sources_from_manifest(agent)
61
+ manifest = read_manifest(agent)
62
+ return [] unless manifest
63
+
64
+ manifest["sources"] || []
65
+ end
66
+
67
+ def manifest_exists?(agent)
68
+ File.exist?(manifest_path_for(agent))
69
+ end
70
+
71
+ private
72
+
73
+ def manifest_path_for(agent)
74
+ resolved_agent_path = resolve_agent_path(agent)
75
+ File.join(resolved_agent_path, "manifest.json")
76
+ end
77
+
78
+ def resolve_agent_path(agent)
79
+ base_path = File.join(Aircana.configuration.agent_knowledge_dir, agent)
80
+
81
+ # If this is a symlink (multi-root scenario), resolve to original
82
+ if File.symlink?(base_path)
83
+ File.readlink(base_path)
84
+ else
85
+ base_path
86
+ end
87
+ end
88
+
89
+ def build_manifest_data(agent, sources)
90
+ timestamp = Time.now.utc.strftime("%Y-%m-%dT%H:%M:%SZ")
91
+
92
+ {
93
+ "version" => "1.0",
94
+ "agent" => agent,
95
+ "created" => timestamp,
96
+ "last_updated" => timestamp,
97
+ "sources" => sources
98
+ }
99
+ end
100
+
101
+ def validate_manifest(manifest_data)
102
+ required_fields = %w[version agent sources]
103
+
104
+ required_fields.each do |field|
105
+ raise ManifestError, "Missing required field: #{field}" unless manifest_data.key?(field)
106
+ end
107
+
108
+ unless manifest_data["version"] == "1.0"
109
+ raise ManifestError, "Unsupported manifest version: #{manifest_data["version"]}"
110
+ end
111
+
112
+ validate_sources(manifest_data["sources"])
113
+ end
114
+
115
+ def validate_sources(sources)
116
+ raise ManifestError, "Sources must be an array" unless sources.is_a?(Array)
117
+
118
+ sources.each do |source|
119
+ validate_source(source)
120
+ end
121
+ end
122
+
123
+ def validate_source(source)
124
+ raise ManifestError, "Each source must be a hash" unless source.is_a?(Hash)
125
+
126
+ raise ManifestError, "Source missing required field: type" unless source.key?("type")
127
+
128
+ case source["type"]
129
+ when "confluence"
130
+ validate_confluence_source(source)
131
+ else
132
+ raise ManifestError, "Unknown source type: #{source["type"]}"
133
+ end
134
+ end
135
+
136
+ def validate_confluence_source(source)
137
+ raise ManifestError, "Confluence source missing required field: label" unless source.key?("label")
138
+
139
+ return unless source.key?("pages") && !source["pages"].is_a?(Array)
140
+
141
+ raise ManifestError, "Confluence pages must be an array"
142
+ end
143
+ end
144
+ end
145
+
146
+ class ManifestError < StandardError; end
147
+ end
148
+ end
@@ -133,6 +133,26 @@ module Aircana
133
133
  to = Pathname.new(File.expand_path(to_path))
134
134
  to.relative_path_from(from).to_s
135
135
  end
136
+
137
+ # Helper methods for resolving symlinked agent paths
138
+ def resolve_agent_path(agent_name)
139
+ agent_path = File.join(Aircana.configuration.agent_knowledge_dir, agent_name)
140
+
141
+ if File.symlink?(agent_path)
142
+ File.readlink(agent_path)
143
+ else
144
+ agent_path
145
+ end
146
+ end
147
+
148
+ def agent_is_symlinked?(agent_name)
149
+ agent_path = File.join(Aircana.configuration.agent_knowledge_dir, agent_name)
150
+ File.symlink?(agent_path)
151
+ end
152
+
153
+ def resolve_symlinked_path(path)
154
+ File.symlink?(path) ? File.readlink(path) : path
155
+ end
136
156
  end
137
157
  end
138
158
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Aircana
4
- VERSION = "1.0.0"
4
+ VERSION = "1.1.0.rc1"
5
5
  end
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: 1.0.0
4
+ version: 1.1.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Weston Dransfield
@@ -143,6 +143,7 @@ files:
143
143
  - lib/aircana/contexts/confluence_logging.rb
144
144
  - lib/aircana/contexts/confluence_setup.rb
145
145
  - lib/aircana/contexts/local.rb
146
+ - lib/aircana/contexts/manifest.rb
146
147
  - lib/aircana/contexts/relevant_files.rb
147
148
  - lib/aircana/fzf_helper.rb
148
149
  - lib/aircana/generators.rb