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 +4 -4
- data/.rspec_status +163 -148
- data/.rubocop.yml +5 -0
- data/lib/aircana/cli/commands/agents.rb +32 -4
- data/lib/aircana/contexts/confluence.rb +76 -3
- data/lib/aircana/contexts/manifest.rb +148 -0
- data/lib/aircana/symlink_manager.rb +20 -0
- data/lib/aircana/version.rb +1 -1
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 64811eb3cd8c51f06884e2f4f13e9c8b95e55b1bae350e558cccde508b3076c9
|
4
|
+
data.tar.gz: 61f3b8425387ada7b5f015d706d65fae1294aeb19d7b25ec35e0a22b3af6b3dc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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.
|
4
|
-
./spec/aircana/cli/commands/add_directory_spec.rb[1:1:2:1] | passed | 0.
|
5
|
-
./spec/aircana/cli/commands/add_directory_spec.rb[1:1:3:1] | passed | 0.
|
6
|
-
./spec/aircana/cli/commands/add_directory_spec.rb[1:1:4:1] | passed | 0.
|
7
|
-
./spec/aircana/cli/commands/add_directory_spec.rb[1:1:4:2:1] | passed | 0.
|
8
|
-
./spec/aircana/cli/commands/add_directory_spec.rb[1:1:5:1] | passed | 0.
|
9
|
-
./spec/aircana/cli/commands/add_directory_spec.rb[1:2:1] | passed | 0.
|
10
|
-
./spec/aircana/cli/commands/add_directory_spec.rb[1:2:2] | passed | 0.
|
11
|
-
./spec/aircana/cli/commands/add_directory_spec.rb[1:3:1] | passed | 0.
|
12
|
-
./spec/aircana/cli/commands/add_directory_spec.rb[1:3:2] | passed | 0.
|
13
|
-
./spec/aircana/cli/commands/add_directory_spec.rb[1:3:3] | passed | 0.
|
14
|
-
./spec/aircana/cli/commands/add_directory_spec.rb[1:3:4] | passed | 0.
|
15
|
-
./spec/aircana/cli/commands/add_directory_spec.rb[1:3:5] | passed | 0.
|
16
|
-
./spec/aircana/cli/commands/add_directory_spec.rb[1:3:6] | passed | 0.
|
17
|
-
./spec/aircana/cli/commands/add_directory_spec.rb[1:3:7] | passed | 0.
|
18
|
-
./spec/aircana/cli/commands/add_directory_spec.rb[1:3:8] | passed | 0.
|
19
|
-
./spec/aircana/cli/commands/agents_spec.rb[1:1:1:1] | passed | 0.
|
20
|
-
./spec/aircana/cli/commands/agents_spec.rb[1:1:1:2] | passed | 0.
|
21
|
-
./spec/aircana/cli/commands/agents_spec.rb[1:1:1:3] | passed | 0.
|
22
|
-
./spec/aircana/cli/commands/agents_spec.rb[1:1:2:1] | passed | 0.
|
23
|
-
./spec/aircana/cli/commands/agents_spec.rb[1:1:3:1] | passed | 0.
|
24
|
-
./spec/aircana/cli/commands/agents_spec.rb[1:1:3:2] | passed | 0.
|
25
|
-
./spec/aircana/cli/commands/agents_spec.rb[1:2:1] | passed | 0.
|
26
|
-
./spec/aircana/cli/commands/hooks_spec.rb[1:1:1:1] | passed | 0.
|
27
|
-
./spec/aircana/cli/commands/hooks_spec.rb[1:1:2:1:1] | passed | 0.
|
28
|
-
./spec/aircana/cli/commands/hooks_spec.rb[1:1:2:2:1] | passed | 0.
|
29
|
-
./spec/aircana/cli/commands/hooks_spec.rb[1:2:1:1] | passed | 0.
|
30
|
-
./spec/aircana/cli/commands/hooks_spec.rb[1:2:2:1] | passed | 0.
|
31
|
-
./spec/aircana/cli/commands/hooks_spec.rb[1:3:1:1] | passed | 0.
|
32
|
-
./spec/aircana/cli/commands/hooks_spec.rb[1:3:2:1] | passed | 0.
|
33
|
-
./spec/aircana/cli/commands/hooks_spec.rb[1:4:1] | passed | 0.
|
34
|
-
./spec/aircana/cli/commands/hooks_spec.rb[1:4:2:1] | passed | 0.
|
35
|
-
./spec/aircana/cli/commands/hooks_spec.rb[1:5:1:1] | passed | 0.
|
36
|
-
./spec/aircana/cli/commands/hooks_spec.rb[1:5:2:1] | passed | 0.
|
37
|
-
./spec/aircana/cli/commands/hooks_spec.rb[1:5:3:1] | passed | 0.
|
38
|
-
./spec/aircana/cli/commands/hooks_spec.rb[1:5:4:1] | passed | 0.
|
39
|
-
./spec/aircana/cli/commands/hooks_spec.rb[1:6:1:1] | passed | 0.
|
40
|
-
./spec/aircana/cli/commands/hooks_spec.rb[1:6:2:1] | passed | 0.
|
41
|
-
./spec/aircana/cli/commands/hooks_spec.rb[1:7:1] | passed | 0.
|
42
|
-
./spec/aircana/cli/commands/install_spec.rb[1:1:1:1] | passed | 0.
|
43
|
-
./spec/aircana/cli/commands/install_spec.rb[1:1:2:1] | passed | 0.
|
44
|
-
./spec/aircana/cli/commands/install_spec.rb[1:2:1:1] | passed | 0.
|
45
|
-
./spec/aircana/cli/commands/install_spec.rb[1:2:2:1] | passed | 0.
|
46
|
-
./spec/aircana/cli/commands/install_spec.rb[1:2:3:1] | passed | 0.
|
47
|
-
./spec/aircana/cli/commands/install_spec.rb[1:2:4:1] | passed | 0.
|
48
|
-
./spec/aircana/cli/commands/install_spec.rb[1:3:1] | passed | 0.
|
49
|
-
./spec/aircana/cli/commands/install_spec.rb[1:3:2:1] | passed | 0.
|
50
|
-
./spec/aircana/cli/commands/install_spec.rb[1:3:3:1] | passed | 0.
|
51
|
-
./spec/aircana/cli/commands/install_spec.rb[1:3:4:1] | passed | 0.
|
52
|
-
./spec/aircana/cli/commands/install_spec.rb[1:4:1] | passed | 0.
|
53
|
-
./spec/aircana/cli/commands/install_spec.rb[1:4:2] | passed | 0.
|
54
|
-
./spec/aircana/cli/commands/install_spec.rb[1:4:3] | passed | 0.
|
55
|
-
./spec/aircana/cli/commands/install_spec.rb[1:4:4] | passed | 0.
|
56
|
-
./spec/aircana/cli/commands/install_spec.rb[1:4:5] | passed | 0.
|
57
|
-
./spec/aircana/cli/commands/install_spec.rb[1:5:1:1] | passed | 0.
|
58
|
-
./spec/aircana/cli/commands/install_spec.rb[1:5:2:1] | passed | 0.
|
59
|
-
./spec/aircana/cli/commands/install_spec.rb[1:5:3:1] | passed | 0.
|
60
|
-
./spec/aircana/cli/commands/install_spec.rb[1:6:1] | passed | 0.
|
61
|
-
./spec/aircana/cli/commands/plan_spec.rb[1:1:1:1] | passed | 0.
|
62
|
-
./spec/aircana/cli/commands/plan_spec.rb[1:1:2:1] | passed | 0.
|
63
|
-
./spec/aircana/cli/commands/plan_spec.rb[1:1:3:1] | passed | 0.
|
64
|
-
./spec/aircana/cli/commands/work_spec.rb[1:1:1:1] | passed | 0.
|
65
|
-
./spec/aircana/cli/commands/work_spec.rb[1:1:2:1] | passed | 0.
|
66
|
-
./spec/aircana/cli/commands/work_spec.rb[1:1:3:1] | passed | 0.
|
67
|
-
./spec/aircana/configuration_spec.rb[1:1:1] | passed | 0.
|
68
|
-
./spec/aircana/configuration_spec.rb[1:2:1] | passed | 0.
|
69
|
-
./spec/aircana/configuration_spec.rb[1:3:1] | passed | 0.
|
70
|
-
./spec/aircana/configuration_spec.rb[1:4:1] | passed | 0.
|
71
|
-
./spec/aircana/configuration_spec.rb[1:5:1] | passed | 0.
|
72
|
-
./spec/aircana/configuration_spec.rb[1:5:2] | passed | 0.
|
73
|
-
./spec/aircana/contexts/confluence_spec.rb[1:1:1:1] | passed | 0.
|
74
|
-
./spec/aircana/contexts/confluence_spec.rb[1:1:1:2] | passed | 0.
|
75
|
-
./spec/aircana/contexts/confluence_spec.rb[1:1:1:3] | passed | 0.
|
76
|
-
./spec/aircana/contexts/confluence_spec.rb[1:1:2:1] | passed | 0.
|
77
|
-
./spec/aircana/contexts/confluence_spec.rb[1:1:2:2] | passed | 0.
|
78
|
-
./spec/aircana/contexts/confluence_spec.rb[1:1:2:3] | passed | 0.
|
79
|
-
./spec/aircana/contexts/confluence_spec.rb[1:1:3:1] | passed | 0.
|
80
|
-
./spec/aircana/contexts/confluence_spec.rb[1:1:3:2] | passed | 0.
|
81
|
-
./spec/aircana/contexts/local_spec.rb[1:1:1] | passed | 0.
|
82
|
-
./spec/aircana/contexts/local_spec.rb[1:1:2] | passed | 0.
|
83
|
-
./spec/aircana/contexts/local_spec.rb[1:1:3] | passed | 0.
|
84
|
-
./spec/aircana/contexts/local_spec.rb[1:1:4] | passed | 0.
|
85
|
-
./spec/aircana/contexts/local_spec.rb[1:1:5] | passed | 0.
|
86
|
-
./spec/aircana/contexts/local_spec.rb[1:1:6] | passed | 0.
|
87
|
-
./spec/aircana/contexts/local_spec.rb[1:1:7] | passed | 0.
|
88
|
-
./spec/aircana/contexts/local_spec.rb[1:1:8] | passed | 0.
|
89
|
-
./spec/aircana/
|
90
|
-
./spec/aircana/
|
91
|
-
./spec/aircana/
|
92
|
-
./spec/aircana/
|
93
|
-
./spec/aircana/
|
94
|
-
./spec/aircana/
|
95
|
-
./spec/aircana/
|
96
|
-
./spec/aircana/
|
97
|
-
./spec/aircana/
|
98
|
-
./spec/aircana/
|
99
|
-
./spec/aircana/
|
100
|
-
./spec/aircana/
|
101
|
-
./spec/aircana/
|
102
|
-
./spec/aircana/
|
103
|
-
./spec/aircana/
|
104
|
-
./spec/aircana/
|
105
|
-
./spec/aircana/
|
106
|
-
./spec/aircana/
|
107
|
-
./spec/aircana/
|
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.
|
110
|
-
./spec/aircana/generators/hooks_generator_spec.rb[1:3:1] | passed | 0.
|
111
|
-
./spec/aircana/generators/hooks_generator_spec.rb[1:3:2] | passed | 0.
|
112
|
-
./spec/aircana/generators/hooks_generator_spec.rb[1:4:1] | passed | 0.
|
113
|
-
./spec/aircana/generators/hooks_generator_spec.rb[1:5:1:1] | passed | 0.
|
114
|
-
./spec/aircana/generators/hooks_generator_spec.rb[1:5:2:1] | passed | 0.
|
115
|
-
./spec/aircana/generators/hooks_generator_spec.rb[1:6:1] | passed | 0.
|
116
|
-
./spec/aircana/generators/hooks_generator_spec.rb[1:7:1] | passed | 0.
|
117
|
-
./spec/aircana/human_logger_spec.rb[1:1:1] | passed | 0.
|
118
|
-
./spec/aircana/human_logger_spec.rb[1:2:1] | passed | 0.
|
119
|
-
./spec/aircana/human_logger_spec.rb[1:3:1] | passed | 0.
|
120
|
-
./spec/aircana/human_logger_spec.rb[1:4:1] | passed | 0.
|
121
|
-
./spec/aircana/human_logger_spec.rb[1:5:1] | passed | 0.
|
122
|
-
./spec/aircana/human_logger_spec.rb[1:5:2] | passed | 0.
|
123
|
-
./spec/aircana/human_logger_spec.rb[1:5:3] | passed | 0.
|
124
|
-
./spec/aircana/human_logger_spec.rb[1:5:4] | passed | 0.
|
125
|
-
./spec/aircana/human_logger_spec.rb[1:5:5] | passed | 0.
|
126
|
-
./spec/aircana/human_logger_spec.rb[1:5:6] | passed | 0.
|
127
|
-
./spec/aircana/human_logger_spec.rb[1:5:7] | passed | 0.
|
128
|
-
./spec/aircana/human_logger_spec.rb[1:6:1] | passed | 0.
|
129
|
-
./spec/aircana/llm/claude_client_spec.rb[1:1:1:1] | passed | 0.
|
130
|
-
./spec/aircana/llm/claude_client_spec.rb[1:1:1:2] | passed | 0.
|
131
|
-
./spec/aircana/llm/claude_client_spec.rb[1:1:1:3] | passed | 0.
|
132
|
-
./spec/aircana/llm/claude_client_spec.rb[1:1:1:4] | passed | 0.
|
133
|
-
./spec/aircana/llm/claude_client_spec.rb[1:1:2:1] | passed | 0.
|
134
|
-
./spec/aircana/llm/claude_client_spec.rb[1:1:2:2] | passed | 0.
|
135
|
-
./spec/aircana/llm/claude_client_spec.rb[1:1:3:1] | passed | 0.
|
136
|
-
./spec/aircana/llm/claude_client_spec.rb[1:2:1] | passed | 0.
|
137
|
-
./spec/aircana/llm/claude_client_spec.rb[1:2:2] | passed | 0.
|
138
|
-
./spec/aircana/llm/claude_client_spec.rb[1:3:1:1] | passed | 0.
|
139
|
-
./spec/aircana/llm/claude_client_spec.rb[1:3:1:2] | passed | 0.
|
140
|
-
./spec/aircana/system_checker_spec.rb[1:1:1:1] | passed | 0.
|
141
|
-
./spec/aircana/system_checker_spec.rb[1:1:2:1] | passed | 0.
|
142
|
-
./spec/aircana/system_checker_spec.rb[1:1:3:1] | passed | 0.
|
143
|
-
./spec/aircana/system_checker_spec.rb[1:2:1] | passed | 0.
|
144
|
-
./spec/aircana/system_checker_spec.rb[1:2:2] | passed | 0.
|
145
|
-
./spec/aircana/system_checker_spec.rb[1:3:1] | passed | 0.
|
146
|
-
./spec/aircana/system_checker_spec.rb[1:3:2] | passed | 0.
|
147
|
-
./spec/aircana/system_checker_spec.rb[1:3:3] | passed | 0.
|
148
|
-
./spec/aircana/system_checker_spec.rb[1:3:4] | passed | 0.
|
149
|
-
./spec/aircana/system_checker_spec.rb[1:3:5] | passed | 0.
|
150
|
-
./spec/aircana_spec.rb[1:1] | passed | 0.
|
151
|
-
./spec/aircana_spec.rb[1:2] | passed | 0.
|
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
|
-
|
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
|
-
|
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
|
-
|
34
|
-
|
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
|
data/lib/aircana/version.rb
CHANGED
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.
|
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
|