aircana 3.1.0 → 3.2.0

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: cb4ccc62f335ae4dd250fe34537af2ddda08e11f6d3440c56c467bd5867319a4
4
- data.tar.gz: dd4ba6f45cc0dc3e14d8d1c7022ab90db3c81d69b37dd9cc99def0ce53bf03b6
3
+ metadata.gz: 6c0014d44f55af9f319f672b8af4905b3a1b4821e1e1be16731605b58f61b533
4
+ data.tar.gz: a62bd7a4aa91061ed04661588b46ce011817f4cdc7357f1e7781147a3f697395
5
5
  SHA512:
6
- metadata.gz: 0e8e0e8cf171fb8e997ffd4d55c683ff44b92ac1cf52f6c25e5b922676eba8c93d59c6b075bc51cfc6c32374f2c63b8938c35f674d3c777f474253e9ddc30c24
7
- data.tar.gz: 2bc75c23f76a676830997a60830e249230ddab81a83616808b3efce5281253ee11357bbae83aa8d7089b35d989145f1af1b5464918aae4fabca30e2e178f3219
6
+ metadata.gz: 0a5227735515c84823b372054176148c1a445b3e7867d02d10d18ba7de873bf2862d67f38ee7dab2ae3f423ec0da396c480793cf730841bd296f435c80352556
7
+ data.tar.gz: a4147026cb0fb6c699b8ae8164689edc32a990c296bb595edd08ba2317b7648d8cb4b1a038fdd9f848482ed9bb23bda2fbd3bb27c0d9dbff6aa3d52179a461b9
data/.rspec_status CHANGED
@@ -1,115 +1,115 @@
1
1
  example_id | status | run_time |
2
2
  ----------------------------------------------------------------- | ------ | --------------- |
3
- ./spec/aircana/cli/commands/agents_spec.rb[1:1:1:1] | passed | 0.01103 seconds |
4
- ./spec/aircana/cli/commands/agents_spec.rb[1:1:1:2] | passed | 0.0004 seconds |
5
- ./spec/aircana/cli/commands/agents_spec.rb[1:1:1:3] | passed | 0.00041 seconds |
6
- ./spec/aircana/cli/commands/agents_spec.rb[1:1:2:1] | passed | 0.0008 seconds |
7
- ./spec/aircana/cli/commands/agents_spec.rb[1:1:3:1] | passed | 0.00032 seconds |
8
- ./spec/aircana/cli/commands/agents_spec.rb[1:1:3:2] | passed | 0.00028 seconds |
9
- ./spec/aircana/cli/commands/agents_spec.rb[1:2:1:1] | passed | 0.00048 seconds |
10
- ./spec/aircana/cli/commands/agents_spec.rb[1:2:1:2] | passed | 0.00042 seconds |
11
- ./spec/aircana/cli/commands/agents_spec.rb[1:2:1:3:1] | passed | 0.00045 seconds |
12
- ./spec/aircana/cli/commands/agents_spec.rb[1:2:2:1] | passed | 0.00031 seconds |
13
- ./spec/aircana/cli/commands/agents_spec.rb[1:2:3:1] | passed | 0.00035 seconds |
14
- ./spec/aircana/cli/commands/agents_spec.rb[1:2:4:1] | passed | 0.0004 seconds |
15
- ./spec/aircana/cli/commands/agents_spec.rb[1:3:1] | passed | 0.0007 seconds |
16
- ./spec/aircana/cli/commands/agents_spec.rb[1:3:2] | passed | 0.00044 seconds |
17
- ./spec/aircana/cli/commands/agents_spec.rb[1:3:3] | passed | 0.00042 seconds |
18
- ./spec/aircana/cli/commands/agents_spec.rb[1:4:1] | passed | 0.00023 seconds |
3
+ ./spec/aircana/cli/commands/agents_spec.rb[1:1:1:1] | passed | 0.00544 seconds |
4
+ ./spec/aircana/cli/commands/agents_spec.rb[1:1:1:2] | passed | 0.00036 seconds |
5
+ ./spec/aircana/cli/commands/agents_spec.rb[1:1:1:3] | passed | 0.00182 seconds |
6
+ ./spec/aircana/cli/commands/agents_spec.rb[1:1:2:1] | passed | 0.00105 seconds |
7
+ ./spec/aircana/cli/commands/agents_spec.rb[1:1:3:1] | passed | 0.00031 seconds |
8
+ ./spec/aircana/cli/commands/agents_spec.rb[1:1:3:2] | passed | 0.00029 seconds |
9
+ ./spec/aircana/cli/commands/agents_spec.rb[1:2:1:1] | passed | 0.00055 seconds |
10
+ ./spec/aircana/cli/commands/agents_spec.rb[1:2:1:2] | passed | 0.00045 seconds |
11
+ ./spec/aircana/cli/commands/agents_spec.rb[1:2:1:3:1] | passed | 0.00044 seconds |
12
+ ./spec/aircana/cli/commands/agents_spec.rb[1:2:2:1] | passed | 0.00029 seconds |
13
+ ./spec/aircana/cli/commands/agents_spec.rb[1:2:3:1] | passed | 0.00034 seconds |
14
+ ./spec/aircana/cli/commands/agents_spec.rb[1:2:4:1] | passed | 0.00035 seconds |
15
+ ./spec/aircana/cli/commands/agents_spec.rb[1:3:1] | passed | 0.00075 seconds |
16
+ ./spec/aircana/cli/commands/agents_spec.rb[1:3:2] | passed | 0.00043 seconds |
17
+ ./spec/aircana/cli/commands/agents_spec.rb[1:3:3] | passed | 0.00044 seconds |
18
+ ./spec/aircana/cli/commands/agents_spec.rb[1:4:1] | passed | 0.00019 seconds |
19
19
  ./spec/aircana/cli/commands/agents_spec.rb[1:5:1:1] | passed | 0.0003 seconds |
20
- ./spec/aircana/cli/commands/agents_spec.rb[1:5:2:1] | passed | 0.00033 seconds |
21
- ./spec/aircana/cli/commands/agents_spec.rb[1:5:3:1] | passed | 0.00063 seconds |
22
- ./spec/aircana/cli/commands/agents_spec.rb[1:5:3:2] | passed | 0.0007 seconds |
23
- ./spec/aircana/cli/commands/agents_spec.rb[1:5:3:3] | passed | 0.00075 seconds |
24
- ./spec/aircana/cli/commands/hooks_spec.rb[1:1:1:1] | passed | 0.00085 seconds |
25
- ./spec/aircana/cli/commands/hooks_spec.rb[1:1:2:1:1] | passed | 0.00075 seconds |
26
- ./spec/aircana/cli/commands/hooks_spec.rb[1:1:2:2:1] | passed | 0.00125 seconds |
27
- ./spec/aircana/cli/commands/hooks_spec.rb[1:2:1:1] | passed | 0.00072 seconds |
28
- ./spec/aircana/cli/commands/hooks_spec.rb[1:2:2:1] | passed | 0.00073 seconds |
29
- ./spec/aircana/cli/commands/hooks_spec.rb[1:3:1:1] | passed | 0.00057 seconds |
30
- ./spec/aircana/cli/commands/hooks_spec.rb[1:3:2:1] | passed | 0.00112 seconds |
31
- ./spec/aircana/cli/commands/hooks_spec.rb[1:4:1] | passed | 0.00141 seconds |
20
+ ./spec/aircana/cli/commands/agents_spec.rb[1:5:2:1] | passed | 0.00032 seconds |
21
+ ./spec/aircana/cli/commands/agents_spec.rb[1:5:3:1] | passed | 0.00069 seconds |
22
+ ./spec/aircana/cli/commands/agents_spec.rb[1:5:3:2] | passed | 0.00068 seconds |
23
+ ./spec/aircana/cli/commands/agents_spec.rb[1:5:3:3] | passed | 0.00072 seconds |
24
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:1:1:1] | passed | 0.00224 seconds |
25
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:1:2:1:1] | passed | 0.0007 seconds |
26
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:1:2:2:1] | passed | 0.00113 seconds |
27
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:2:1:1] | passed | 0.00056 seconds |
28
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:2:2:1] | passed | 0.00081 seconds |
29
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:3:1:1] | passed | 0.0008 seconds |
30
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:3:2:1] | passed | 0.00114 seconds |
31
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:4:1] | passed | 0.00138 seconds |
32
32
  ./spec/aircana/cli/commands/hooks_spec.rb[1:4:2:1] | passed | 0.00121 seconds |
33
33
  ./spec/aircana/cli/commands/hooks_spec.rb[1:5:1:1] | passed | 0.00064 seconds |
34
- ./spec/aircana/cli/commands/hooks_spec.rb[1:5:2:1] | passed | 0.001 seconds |
35
- ./spec/aircana/cli/commands/hooks_spec.rb[1:5:3:1] | passed | 0.00096 seconds |
36
- ./spec/aircana/cli/commands/hooks_spec.rb[1:5:4:1] | passed | 0.00092 seconds |
37
- ./spec/aircana/cli/commands/hooks_spec.rb[1:6:1:1] | passed | 0.00058 seconds |
38
- ./spec/aircana/cli/commands/hooks_spec.rb[1:6:2:1] | passed | 0.00391 seconds |
39
- ./spec/aircana/cli/commands/hooks_spec.rb[1:7:1] | passed | 0.00056 seconds |
40
- ./spec/aircana/cli/commands/init_spec.rb[1:1:1] | passed | 0.0032 seconds |
41
- ./spec/aircana/cli/commands/init_spec.rb[1:1:2] | passed | 0.00267 seconds |
42
- ./spec/aircana/cli/commands/init_spec.rb[1:2:1:1] | passed | 0.00501 seconds |
43
- ./spec/aircana/cli/commands/init_spec.rb[1:3:1] | passed | 0.00311 seconds |
44
- ./spec/aircana/cli/commands/init_spec.rb[1:3:2:1] | passed | 0.00284 seconds |
45
- ./spec/aircana/cli/commands/init_spec.rb[1:3:3:1] | passed | 0.00325 seconds |
46
- ./spec/aircana/cli/commands/init_spec.rb[1:3:4:1] | passed | 0.00305 seconds |
47
- ./spec/aircana/cli/commands/init_spec.rb[1:4:1] | passed | 0.00132 seconds |
48
- ./spec/aircana/cli/commands/init_spec.rb[1:4:2] | passed | 0.00162 seconds |
49
- ./spec/aircana/cli/commands/init_spec.rb[1:4:3] | passed | 0.00139 seconds |
50
- ./spec/aircana/cli/commands/init_spec.rb[1:4:4] | passed | 0.00133 seconds |
51
- ./spec/aircana/cli/commands/init_spec.rb[1:4:5] | passed | 0.00125 seconds |
52
- ./spec/aircana/cli/commands/init_spec.rb[1:5:1] | passed | 0.00295 seconds |
53
- ./spec/aircana/cli/commands/init_spec.rb[1:5:2] | passed | 0.00397 seconds |
54
- ./spec/aircana/cli/commands/init_spec.rb[1:5:3] | passed | 0.00636 seconds |
34
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:5:2:1] | passed | 0.00079 seconds |
35
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:5:3:1] | passed | 0.00076 seconds |
36
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:5:4:1] | passed | 0.0007 seconds |
37
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:6:1:1] | passed | 0.00052 seconds |
38
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:6:2:1] | passed | 0.00175 seconds |
39
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:7:1] | passed | 0.00055 seconds |
40
+ ./spec/aircana/cli/commands/init_spec.rb[1:1:1] | passed | 0.00278 seconds |
41
+ ./spec/aircana/cli/commands/init_spec.rb[1:1:2] | passed | 0.00515 seconds |
42
+ ./spec/aircana/cli/commands/init_spec.rb[1:2:1:1] | passed | 0.005 seconds |
43
+ ./spec/aircana/cli/commands/init_spec.rb[1:3:1] | passed | 0.0033 seconds |
44
+ ./spec/aircana/cli/commands/init_spec.rb[1:3:2:1] | passed | 0.0028 seconds |
45
+ ./spec/aircana/cli/commands/init_spec.rb[1:3:3:1] | passed | 0.00355 seconds |
46
+ ./spec/aircana/cli/commands/init_spec.rb[1:3:4:1] | passed | 0.00376 seconds |
47
+ ./spec/aircana/cli/commands/init_spec.rb[1:4:1] | passed | 0.00148 seconds |
48
+ ./spec/aircana/cli/commands/init_spec.rb[1:4:2] | passed | 0.00135 seconds |
49
+ ./spec/aircana/cli/commands/init_spec.rb[1:4:3] | passed | 0.00159 seconds |
50
+ ./spec/aircana/cli/commands/init_spec.rb[1:4:4] | passed | 0.00295 seconds |
51
+ ./spec/aircana/cli/commands/init_spec.rb[1:4:5] | passed | 0.00135 seconds |
52
+ ./spec/aircana/cli/commands/init_spec.rb[1:5:1] | passed | 0.00363 seconds |
53
+ ./spec/aircana/cli/commands/init_spec.rb[1:5:2] | passed | 0.00446 seconds |
54
+ ./spec/aircana/cli/commands/init_spec.rb[1:5:3] | passed | 0.00464 seconds |
55
55
  ./spec/aircana/cli/commands/init_spec.rb[1:5:4] | passed | 0.00436 seconds |
56
- ./spec/aircana/configuration_spec.rb[1:1:1] | passed | 0.00017 seconds |
56
+ ./spec/aircana/configuration_spec.rb[1:1:1] | passed | 0.00019 seconds |
57
57
  ./spec/aircana/configuration_spec.rb[1:2:1] | passed | 0.00008 seconds |
58
58
  ./spec/aircana/configuration_spec.rb[1:3:1] | passed | 0.00007 seconds |
59
59
  ./spec/aircana/configuration_spec.rb[1:4:1] | passed | 0.00007 seconds |
60
60
  ./spec/aircana/configuration_spec.rb[1:5:1] | passed | 0.00007 seconds |
61
61
  ./spec/aircana/configuration_spec.rb[1:5:2] | passed | 0.00007 seconds |
62
- ./spec/aircana/configuration_spec.rb[1:6:1:1] | passed | 0.00022 seconds |
63
- ./spec/aircana/configuration_spec.rb[1:6:2:1] | passed | 0.00019 seconds |
64
- ./spec/aircana/configuration_spec.rb[1:6:3:1] | passed | 0.00028 seconds |
62
+ ./spec/aircana/configuration_spec.rb[1:6:1:1] | passed | 0.00023 seconds |
63
+ ./spec/aircana/configuration_spec.rb[1:6:2:1] | passed | 0.0002 seconds |
64
+ ./spec/aircana/configuration_spec.rb[1:6:3:1] | passed | 0.0002 seconds |
65
65
  ./spec/aircana/configuration_spec.rb[1:6:4:1] | passed | 0.00009 seconds |
66
- ./spec/aircana/contexts/confluence_spec.rb[1:1:1:1] | passed | 0.0017 seconds |
66
+ ./spec/aircana/contexts/confluence_spec.rb[1:1:1:1] | passed | 0.00206 seconds |
67
67
  ./spec/aircana/contexts/confluence_spec.rb[1:1:1:2] | passed | 0.00053 seconds |
68
- ./spec/aircana/contexts/confluence_spec.rb[1:1:1:3] | passed | 0.0012 seconds |
69
- ./spec/aircana/contexts/confluence_spec.rb[1:1:2:1] | passed | 0.00017 seconds |
70
- ./spec/aircana/contexts/confluence_spec.rb[1:1:2:2] | passed | 0.00022 seconds |
71
- ./spec/aircana/contexts/confluence_spec.rb[1:1:2:3] | passed | 0.00012 seconds |
72
- ./spec/aircana/contexts/confluence_spec.rb[1:1:3:1] | passed | 0.00036 seconds |
73
- ./spec/aircana/contexts/confluence_spec.rb[1:1:3:2] | passed | 0.00043 seconds |
74
- ./spec/aircana/contexts/local_spec.rb[1:1:1] | passed | 0.00134 seconds |
75
- ./spec/aircana/contexts/local_spec.rb[1:1:2] | passed | 0.00114 seconds |
76
- ./spec/aircana/contexts/local_spec.rb[1:1:3] | passed | 0.00127 seconds |
77
- ./spec/aircana/contexts/local_spec.rb[1:1:4] | passed | 0.00131 seconds |
78
- ./spec/aircana/contexts/local_spec.rb[1:1:5] | passed | 0.00112 seconds |
79
- ./spec/aircana/contexts/local_spec.rb[1:1:6] | passed | 0.00128 seconds |
80
- ./spec/aircana/contexts/local_spec.rb[1:1:7] | passed | 0.00176 seconds |
81
- ./spec/aircana/contexts/local_spec.rb[1:1:8] | passed | 0.00152 seconds |
82
- ./spec/aircana/contexts/manifest_spec.rb[1:1:1] | passed | 0.00122 seconds |
83
- ./spec/aircana/contexts/manifest_spec.rb[1:1:2] | passed | 0.00111 seconds |
84
- ./spec/aircana/contexts/manifest_spec.rb[1:2:1] | passed | 0.00113 seconds |
85
- ./spec/aircana/contexts/manifest_spec.rb[1:2:2] | passed | 0.00088 seconds |
86
- ./spec/aircana/contexts/manifest_spec.rb[1:3:1] | passed | 0.00105 seconds |
68
+ ./spec/aircana/contexts/confluence_spec.rb[1:1:1:3] | passed | 0.0013 seconds |
69
+ ./spec/aircana/contexts/confluence_spec.rb[1:1:2:1] | passed | 0.00161 seconds |
70
+ ./spec/aircana/contexts/confluence_spec.rb[1:1:2:2] | passed | 0.00018 seconds |
71
+ ./spec/aircana/contexts/confluence_spec.rb[1:1:2:3] | passed | 0.00013 seconds |
72
+ ./spec/aircana/contexts/confluence_spec.rb[1:1:3:1] | passed | 0.00031 seconds |
73
+ ./spec/aircana/contexts/confluence_spec.rb[1:1:3:2] | passed | 0.00034 seconds |
74
+ ./spec/aircana/contexts/local_spec.rb[1:1:1] | passed | 0.0013 seconds |
75
+ ./spec/aircana/contexts/local_spec.rb[1:1:2] | passed | 0.00106 seconds |
76
+ ./spec/aircana/contexts/local_spec.rb[1:1:3] | passed | 0.00137 seconds |
77
+ ./spec/aircana/contexts/local_spec.rb[1:1:4] | passed | 0.00117 seconds |
78
+ ./spec/aircana/contexts/local_spec.rb[1:1:5] | passed | 0.00121 seconds |
79
+ ./spec/aircana/contexts/local_spec.rb[1:1:6] | passed | 0.00152 seconds |
80
+ ./spec/aircana/contexts/local_spec.rb[1:1:7] | passed | 0.00208 seconds |
81
+ ./spec/aircana/contexts/local_spec.rb[1:1:8] | passed | 0.00136 seconds |
82
+ ./spec/aircana/contexts/manifest_spec.rb[1:1:1] | passed | 0.0013 seconds |
83
+ ./spec/aircana/contexts/manifest_spec.rb[1:1:2] | passed | 0.00108 seconds |
84
+ ./spec/aircana/contexts/manifest_spec.rb[1:2:1] | passed | 0.00118 seconds |
85
+ ./spec/aircana/contexts/manifest_spec.rb[1:2:2] | passed | 0.00093 seconds |
86
+ ./spec/aircana/contexts/manifest_spec.rb[1:3:1] | passed | 0.00107 seconds |
87
87
  ./spec/aircana/contexts/manifest_spec.rb[1:3:2] | passed | 0.00024 seconds |
88
- ./spec/aircana/contexts/manifest_spec.rb[1:3:3] | passed | 0.00114 seconds |
89
- ./spec/aircana/contexts/manifest_spec.rb[1:3:4] | passed | 0.00103 seconds |
90
- ./spec/aircana/contexts/manifest_spec.rb[1:4:1] | passed | 0.00105 seconds |
91
- ./spec/aircana/contexts/manifest_spec.rb[1:4:2] | passed | 0.00033 seconds |
92
- ./spec/aircana/contexts/manifest_spec.rb[1:5:1] | passed | 0.0009 seconds |
93
- ./spec/aircana/contexts/manifest_spec.rb[1:5:2] | passed | 0.00022 seconds |
94
- ./spec/aircana/contexts/manifest_spec.rb[1:6:1] | passed | 0.00022 seconds |
95
- ./spec/aircana/contexts/manifest_spec.rb[1:6:2] | passed | 0.00022 seconds |
96
- ./spec/aircana/contexts/manifest_spec.rb[1:6:3] | passed | 0.00019 seconds |
97
- ./spec/aircana/contexts/manifest_spec.rb[1:6:4] | passed | 0.00023 seconds |
98
- ./spec/aircana/contexts/manifest_spec.rb[1:6:5] | passed | 0.0002 seconds |
99
- ./spec/aircana/contexts/manifest_spec.rb[1:6:6] | passed | 0.00021 seconds |
100
- ./spec/aircana/contexts/manifest_spec.rb[1:6:7] | passed | 0.0002 seconds |
101
- ./spec/aircana/contexts/manifest_spec.rb[1:6:8] | passed | 0.00091 seconds |
102
- ./spec/aircana/contexts/manifest_spec.rb[1:6:9] | passed | 0.00088 seconds |
103
- ./spec/aircana/contexts/manifest_spec.rb[1:6:10] | passed | 0.00088 seconds |
104
- ./spec/aircana/contexts/web_spec.rb[1:1:1] | passed | 0.0002 seconds |
105
- ./spec/aircana/contexts/web_spec.rb[1:2:1] | passed | 0.00019 seconds |
106
- ./spec/aircana/contexts/web_spec.rb[1:3:1:1] | passed | 0.00012 seconds |
107
- ./spec/aircana/contexts/web_spec.rb[1:3:1:2] | passed | 0.00011 seconds |
108
- ./spec/aircana/contexts/web_spec.rb[1:3:1:3] | passed | 0.0001 seconds |
109
- ./spec/aircana/contexts/web_spec.rb[1:3:2:1] | passed | 0.00014 seconds |
110
- ./spec/aircana/contexts/web_spec.rb[1:3:2:2] | passed | 0.0001 seconds |
111
- ./spec/aircana/contexts/web_spec.rb[1:3:3:1] | passed | 0.00018 seconds |
112
- ./spec/aircana/contexts/web_spec.rb[1:3:3:2] | passed | 0.00027 seconds |
88
+ ./spec/aircana/contexts/manifest_spec.rb[1:3:3] | passed | 0.00111 seconds |
89
+ ./spec/aircana/contexts/manifest_spec.rb[1:3:4] | passed | 0.00116 seconds |
90
+ ./spec/aircana/contexts/manifest_spec.rb[1:4:1] | passed | 0.00107 seconds |
91
+ ./spec/aircana/contexts/manifest_spec.rb[1:4:2] | passed | 0.00021 seconds |
92
+ ./spec/aircana/contexts/manifest_spec.rb[1:5:1] | passed | 0.00097 seconds |
93
+ ./spec/aircana/contexts/manifest_spec.rb[1:5:2] | passed | 0.0002 seconds |
94
+ ./spec/aircana/contexts/manifest_spec.rb[1:6:1] | passed | 0.00023 seconds |
95
+ ./spec/aircana/contexts/manifest_spec.rb[1:6:2] | passed | 0.0002 seconds |
96
+ ./spec/aircana/contexts/manifest_spec.rb[1:6:3] | passed | 0.00022 seconds |
97
+ ./spec/aircana/contexts/manifest_spec.rb[1:6:4] | passed | 0.0002 seconds |
98
+ ./spec/aircana/contexts/manifest_spec.rb[1:6:5] | passed | 0.00019 seconds |
99
+ ./spec/aircana/contexts/manifest_spec.rb[1:6:6] | passed | 0.00035 seconds |
100
+ ./spec/aircana/contexts/manifest_spec.rb[1:6:7] | passed | 0.00025 seconds |
101
+ ./spec/aircana/contexts/manifest_spec.rb[1:6:8] | passed | 0.00104 seconds |
102
+ ./spec/aircana/contexts/manifest_spec.rb[1:6:9] | passed | 0.00108 seconds |
103
+ ./spec/aircana/contexts/manifest_spec.rb[1:6:10] | passed | 0.00441 seconds |
104
+ ./spec/aircana/contexts/web_spec.rb[1:1:1] | passed | 0.00022 seconds |
105
+ ./spec/aircana/contexts/web_spec.rb[1:2:1] | passed | 0.0002 seconds |
106
+ ./spec/aircana/contexts/web_spec.rb[1:3:1:1] | passed | 0.00019 seconds |
107
+ ./spec/aircana/contexts/web_spec.rb[1:3:1:2] | passed | 0.00018 seconds |
108
+ ./spec/aircana/contexts/web_spec.rb[1:3:1:3] | passed | 0.00015 seconds |
109
+ ./spec/aircana/contexts/web_spec.rb[1:3:2:1] | passed | 0.00016 seconds |
110
+ ./spec/aircana/contexts/web_spec.rb[1:3:2:2] | passed | 0.00011 seconds |
111
+ ./spec/aircana/contexts/web_spec.rb[1:3:3:1] | passed | 0.00017 seconds |
112
+ ./spec/aircana/contexts/web_spec.rb[1:3:3:2] | passed | 0.00028 seconds |
113
113
  ./spec/aircana/contexts/web_spec.rb[1:3:3:3] | passed | 0.00022 seconds |
114
114
  ./spec/aircana/contexts/web_spec.rb[1:3:3:4] | passed | 0.00016 seconds |
115
115
  ./spec/aircana/contexts/web_spec.rb[1:3:3:5] | passed | 0.0002 seconds |
@@ -118,44 +118,44 @@ example_id | status | run
118
118
  ./spec/aircana/contexts/web_spec.rb[1:3:4:3] | passed | 0.00011 seconds |
119
119
  ./spec/aircana/contexts/web_spec.rb[1:3:5:1] | passed | 0.00037 seconds |
120
120
  ./spec/aircana/contexts/web_spec.rb[1:3:5:2] | passed | 0.0001 seconds |
121
- ./spec/aircana/contexts/web_spec.rb[1:3:5:3] | passed | 0.00028 seconds |
122
- ./spec/aircana/contexts/web_spec.rb[1:3:6:1] | passed | 0.00023 seconds |
123
- ./spec/aircana/contexts/web_spec.rb[1:3:6:2] | passed | 0.00023 seconds |
121
+ ./spec/aircana/contexts/web_spec.rb[1:3:5:3] | passed | 0.00026 seconds |
122
+ ./spec/aircana/contexts/web_spec.rb[1:3:6:1] | passed | 0.00022 seconds |
123
+ ./spec/aircana/contexts/web_spec.rb[1:3:6:2] | passed | 0.00021 seconds |
124
124
  ./spec/aircana/contexts/web_spec.rb[1:3:6:3] | passed | 0.00021 seconds |
125
125
  ./spec/aircana/contexts/web_spec.rb[1:3:7:1] | passed | 0.0001 seconds |
126
126
  ./spec/aircana/contexts/web_spec.rb[1:3:7:2] | passed | 0.0001 seconds |
127
127
  ./spec/aircana/fzf_helper_spec.rb[1:1:1:1] | passed | 0.00014 seconds |
128
128
  ./spec/aircana/fzf_helper_spec.rb[1:1:1:2] | passed | 0.00014 seconds |
129
- ./spec/aircana/fzf_helper_spec.rb[1:1:1:3] | passed | 0.00017 seconds |
130
- ./spec/aircana/fzf_helper_spec.rb[1:1:2:1] | passed | 0.00019 seconds |
131
- ./spec/aircana/fzf_helper_spec.rb[1:1:3:1] | passed | 0.0004 seconds |
132
- ./spec/aircana/fzf_helper_spec.rb[1:2:1:1] | passed | 0.00015 seconds |
133
- ./spec/aircana/fzf_helper_spec.rb[1:2:1:2] | passed | 0.00012 seconds |
134
- ./spec/aircana/fzf_helper_spec.rb[1:2:1:3] | passed | 0.00011 seconds |
135
- ./spec/aircana/fzf_helper_spec.rb[1:2:2:1] | passed | 0.0001 seconds |
136
- ./spec/aircana/fzf_helper_spec.rb[1:2:2:2] | passed | 0.00011 seconds |
137
- ./spec/aircana/generators/agents_generator_spec.rb[1:1:1] | passed | 0.00004 seconds |
138
- ./spec/aircana/generators/agents_generator_spec.rb[1:2:1] | passed | 0.00016 seconds |
139
- ./spec/aircana/generators/agents_generator_spec.rb[1:3:1:1] | passed | 0.00005 seconds |
129
+ ./spec/aircana/fzf_helper_spec.rb[1:1:1:3] | passed | 0.00016 seconds |
130
+ ./spec/aircana/fzf_helper_spec.rb[1:1:2:1] | passed | 0.00018 seconds |
131
+ ./spec/aircana/fzf_helper_spec.rb[1:1:3:1] | passed | 0.00018 seconds |
132
+ ./spec/aircana/fzf_helper_spec.rb[1:2:1:1] | passed | 0.0001 seconds |
133
+ ./spec/aircana/fzf_helper_spec.rb[1:2:1:2] | passed | 0.0001 seconds |
134
+ ./spec/aircana/fzf_helper_spec.rb[1:2:1:3] | passed | 0.0001 seconds |
135
+ ./spec/aircana/fzf_helper_spec.rb[1:2:2:1] | passed | 0.00009 seconds |
136
+ ./spec/aircana/fzf_helper_spec.rb[1:2:2:2] | passed | 0.00007 seconds |
137
+ ./spec/aircana/generators/agents_generator_spec.rb[1:1:1] | passed | 0.00003 seconds |
138
+ ./spec/aircana/generators/agents_generator_spec.rb[1:2:1] | passed | 0.00014 seconds |
139
+ ./spec/aircana/generators/agents_generator_spec.rb[1:3:1:1] | passed | 0.00004 seconds |
140
140
  ./spec/aircana/generators/agents_generator_spec.rb[1:3:1:2] | passed | 0.00004 seconds |
141
141
  ./spec/aircana/generators/agents_generator_spec.rb[1:4:1:1] | passed | 0.00004 seconds |
142
142
  ./spec/aircana/generators/hooks_generator_spec.rb[1:1:1] | passed | 0.00003 seconds |
143
143
  ./spec/aircana/generators/hooks_generator_spec.rb[1:2:1] | passed | 0.00003 seconds |
144
- ./spec/aircana/generators/hooks_generator_spec.rb[1:3:1] | passed | 0.00041 seconds |
145
- ./spec/aircana/generators/hooks_generator_spec.rb[1:3:2] | passed | 0.00019 seconds |
146
- ./spec/aircana/generators/hooks_generator_spec.rb[1:4:1] | passed | 0.0001 seconds |
147
- ./spec/aircana/generators/hooks_generator_spec.rb[1:5:1:1] | passed | 0.00011 seconds |
144
+ ./spec/aircana/generators/hooks_generator_spec.rb[1:3:1] | passed | 0.00033 seconds |
145
+ ./spec/aircana/generators/hooks_generator_spec.rb[1:3:2] | passed | 0.00018 seconds |
146
+ ./spec/aircana/generators/hooks_generator_spec.rb[1:4:1] | passed | 0.00009 seconds |
147
+ ./spec/aircana/generators/hooks_generator_spec.rb[1:5:1:1] | passed | 0.00009 seconds |
148
148
  ./spec/aircana/generators/hooks_generator_spec.rb[1:5:2:1] | passed | 0.00003 seconds |
149
149
  ./spec/aircana/generators/hooks_generator_spec.rb[1:6:1] | passed | 0.00051 seconds |
150
- ./spec/aircana/generators/hooks_generator_spec.rb[1:7:1] | passed | 0.00015 seconds |
151
- ./spec/aircana/generators/plan_command_generator_spec.rb[1:1:1] | passed | 0.00038 seconds |
152
- ./spec/aircana/generators/plan_command_generator_spec.rb[1:1:2] | passed | 0.00028 seconds |
153
- ./spec/aircana/generators/plan_command_generator_spec.rb[1:1:3] | passed | 0.0003 seconds |
154
- ./spec/aircana/generators/plan_command_generator_spec.rb[1:2:1] | passed | 0.00012 seconds |
150
+ ./spec/aircana/generators/hooks_generator_spec.rb[1:7:1] | passed | 0.00012 seconds |
151
+ ./spec/aircana/generators/plan_command_generator_spec.rb[1:1:1] | passed | 0.00032 seconds |
152
+ ./spec/aircana/generators/plan_command_generator_spec.rb[1:1:2] | passed | 0.00025 seconds |
153
+ ./spec/aircana/generators/plan_command_generator_spec.rb[1:1:3] | passed | 0.00025 seconds |
154
+ ./spec/aircana/generators/plan_command_generator_spec.rb[1:2:1] | passed | 0.00008 seconds |
155
155
  ./spec/aircana/generators/plan_command_generator_spec.rb[1:2:2] | passed | 0.00007 seconds |
156
- ./spec/aircana/generators/record_command_generator_spec.rb[1:1:1] | passed | 0.00022 seconds |
157
- ./spec/aircana/generators/record_command_generator_spec.rb[1:2:1] | passed | 0.00055 seconds |
158
- ./spec/aircana/generators/record_command_generator_spec.rb[1:2:2] | passed | 0.0001 seconds |
156
+ ./spec/aircana/generators/record_command_generator_spec.rb[1:1:1] | passed | 0.00167 seconds |
157
+ ./spec/aircana/generators/record_command_generator_spec.rb[1:2:1] | passed | 0.00079 seconds |
158
+ ./spec/aircana/generators/record_command_generator_spec.rb[1:2:2] | passed | 0.00016 seconds |
159
159
  ./spec/aircana/human_logger_spec.rb[1:1:1] | passed | 0.00007 seconds |
160
160
  ./spec/aircana/human_logger_spec.rb[1:2:1] | passed | 0.00004 seconds |
161
161
  ./spec/aircana/human_logger_spec.rb[1:3:1] | passed | 0.00004 seconds |
@@ -166,28 +166,28 @@ example_id | status | run
166
166
  ./spec/aircana/human_logger_spec.rb[1:5:4] | passed | 0.00003 seconds |
167
167
  ./spec/aircana/human_logger_spec.rb[1:5:5] | passed | 0.00003 seconds |
168
168
  ./spec/aircana/human_logger_spec.rb[1:5:6] | passed | 0.00003 seconds |
169
- ./spec/aircana/human_logger_spec.rb[1:5:7] | passed | 0.00003 seconds |
170
- ./spec/aircana/human_logger_spec.rb[1:6:1] | passed | 0.00005 seconds |
171
- ./spec/aircana/llm/claude_client_spec.rb[1:1:1:1] | passed | 0.00289 seconds |
172
- ./spec/aircana/llm/claude_client_spec.rb[1:1:1:2] | passed | 0.00038 seconds |
173
- ./spec/aircana/llm/claude_client_spec.rb[1:1:1:3] | passed | 0.00064 seconds |
174
- ./spec/aircana/llm/claude_client_spec.rb[1:1:1:4] | passed | 0.00032 seconds |
169
+ ./spec/aircana/human_logger_spec.rb[1:5:7] | passed | 0.00039 seconds |
170
+ ./spec/aircana/human_logger_spec.rb[1:6:1] | passed | 0.00003 seconds |
171
+ ./spec/aircana/llm/claude_client_spec.rb[1:1:1:1] | passed | 0.00046 seconds |
172
+ ./spec/aircana/llm/claude_client_spec.rb[1:1:1:2] | passed | 0.00035 seconds |
173
+ ./spec/aircana/llm/claude_client_spec.rb[1:1:1:3] | passed | 0.00039 seconds |
174
+ ./spec/aircana/llm/claude_client_spec.rb[1:1:1:4] | passed | 0.00031 seconds |
175
175
  ./spec/aircana/llm/claude_client_spec.rb[1:1:2:1] | passed | 0.00034 seconds |
176
- ./spec/aircana/llm/claude_client_spec.rb[1:1:2:2] | passed | 0.0005 seconds |
176
+ ./spec/aircana/llm/claude_client_spec.rb[1:1:2:2] | passed | 0.0004 seconds |
177
177
  ./spec/aircana/llm/claude_client_spec.rb[1:1:3:1] | passed | 0.00033 seconds |
178
178
  ./spec/aircana/llm/claude_client_spec.rb[1:2:1] | passed | 0.0003 seconds |
179
- ./spec/aircana/llm/claude_client_spec.rb[1:2:2] | passed | 0.00041 seconds |
180
- ./spec/aircana/llm/claude_client_spec.rb[1:3:1:1] | passed | 0.0002 seconds |
181
- ./spec/aircana/llm/claude_client_spec.rb[1:3:1:2] | passed | 0.00018 seconds |
182
- ./spec/aircana/system_checker_spec.rb[1:1:1:1] | passed | 0.00039 seconds |
183
- ./spec/aircana/system_checker_spec.rb[1:1:2:1] | passed | 0.00037 seconds |
184
- ./spec/aircana/system_checker_spec.rb[1:1:3:1] | passed | 0.00063 seconds |
185
- ./spec/aircana/system_checker_spec.rb[1:2:1] | passed | 0.0002 seconds |
186
- ./spec/aircana/system_checker_spec.rb[1:2:2] | passed | 0.00018 seconds |
187
- ./spec/aircana/system_checker_spec.rb[1:3:1] | passed | 0.00019 seconds |
188
- ./spec/aircana/system_checker_spec.rb[1:3:2] | passed | 0.00028 seconds |
189
- ./spec/aircana/system_checker_spec.rb[1:3:3] | passed | 0.00022 seconds |
190
- ./spec/aircana/system_checker_spec.rb[1:3:4] | passed | 0.00025 seconds |
191
- ./spec/aircana/system_checker_spec.rb[1:3:5] | passed | 0.00015 seconds |
179
+ ./spec/aircana/llm/claude_client_spec.rb[1:2:2] | passed | 0.00039 seconds |
180
+ ./spec/aircana/llm/claude_client_spec.rb[1:3:1:1] | passed | 0.00022 seconds |
181
+ ./spec/aircana/llm/claude_client_spec.rb[1:3:1:2] | passed | 0.00021 seconds |
182
+ ./spec/aircana/system_checker_spec.rb[1:1:1:1] | passed | 0.0003 seconds |
183
+ ./spec/aircana/system_checker_spec.rb[1:1:2:1] | passed | 0.00049 seconds |
184
+ ./spec/aircana/system_checker_spec.rb[1:1:3:1] | passed | 0.00075 seconds |
185
+ ./spec/aircana/system_checker_spec.rb[1:2:1] | passed | 0.00024 seconds |
186
+ ./spec/aircana/system_checker_spec.rb[1:2:2] | passed | 0.00021 seconds |
187
+ ./spec/aircana/system_checker_spec.rb[1:3:1] | passed | 0.00021 seconds |
188
+ ./spec/aircana/system_checker_spec.rb[1:3:2] | passed | 0.00021 seconds |
189
+ ./spec/aircana/system_checker_spec.rb[1:3:3] | passed | 0.00024 seconds |
190
+ ./spec/aircana/system_checker_spec.rb[1:3:4] | passed | 0.00028 seconds |
191
+ ./spec/aircana/system_checker_spec.rb[1:3:5] | passed | 0.00017 seconds |
192
192
  ./spec/aircana_spec.rb[1:1] | passed | 0.00003 seconds |
193
- ./spec/aircana_spec.rb[1:2] | passed | 0.00066 seconds |
193
+ ./spec/aircana_spec.rb[1:2] | passed | 0.0008 seconds |
data/CHANGELOG.md CHANGED
@@ -7,25 +7,56 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
- ## [3.1.0] - 2025-10-16
10
+ ## [3.2.0] - 2025-01-16
11
+
12
+ ### Added
13
+ - SessionStart hook automatically syncs local knowledge bases to `~/.claude/agents/` on session start
14
+ - Compatible with macOS and Linux
15
+ - Only syncs agents with `kb_type: "local"` in manifest
16
+ - Uses rsync when available, falls back to cp
17
+ - Logs sync operations to `~/.aircana/hooks.log`
18
+ - Smart .gitignore management
19
+ - Remote agents: Adds `.claude/agents/*/knowledge/` to .gitignore
20
+ - Local agents: Adds `!agents/*/knowledge/` negation to ensure version control
21
+
22
+ ### Changed
23
+ - Local knowledge bases now stored in version-controlled `agents/<name>/knowledge/` directory
24
+ - Local knowledge auto-synced to `~/.claude/agents/<plugin>-<agent>/knowledge/` via SessionStart hook
25
+ - Both local and remote agents use consistent runtime path: `~/.claude/agents/<plugin>-<agent>/knowledge/`
26
+ - Updated CLI prompts to accurately describe sync behavior for local agents
27
+ - Migration warnings updated to reflect new local knowledge sync architecture
28
+
29
+ ### Fixed
30
+ - Local and remote agents now use consistent runtime path in agent file definitions
31
+
32
+ ## [3.1.0] - 2025-01-16
11
33
 
12
34
  ### Added
13
35
  - Optional local knowledge base storage for agents
14
36
  - New `kb_type` field in agent manifests ("remote" or "local")
15
- - Local knowledge bases stored in `.claude/agents/<name>/knowledge/` (version controlled)
16
- - Remote knowledge bases stored in `~/.claude/agents/` (not version controlled)
37
+ - Local knowledge bases version-controlled in `agents/<name>/knowledge/` directory
38
+ - Auto-synced to `~/.claude/agents/<plugin>-<agent>/knowledge/` via SessionStart hook
39
+ - Remote knowledge bases fetched from Confluence/web to `~/.claude/agents/` (not version controlled)
17
40
  - Agent creation wizard prompts for knowledge base type with explanation
18
41
  - Refresh commands automatically skip local knowledge base agents
19
42
  - Existing agents without `kb_type` field default to "remote" for backward compatibility
43
+ - SessionStart hook automatically syncs local knowledge bases to `~/.claude/agents/` on session start
44
+ - Compatible with macOS and Linux
45
+ - Only syncs agents with `kb_type: "local"` in manifest
46
+ - Uses rsync when available, falls back to cp
47
+ - Logs sync operations to `~/.aircana/hooks.log`
20
48
  - Migration command: `aircana agents migrate-to-local`
21
49
  - Migrates remote knowledge bases to local (version-controlled) storage
22
50
  - Automatically refreshes knowledge from sources before migration
23
51
  - Copies knowledge files from global to local directory
24
52
  - Updates manifests and regenerates agent files with correct paths
25
53
  - Provides detailed migration summary
54
+ - Smart .gitignore management
55
+ - Remote agents: Adds `.claude/agents/*/knowledge/` to .gitignore
56
+ - Local agents: Adds `!agents/*/knowledge/` negation to ensure version control
26
57
 
27
58
  ### Fixed
28
- - Local knowledge base agent files now correctly reference `.claude/agents/<name>/knowledge/` instead of `agents/<name>/knowledge/`
59
+ - Local and remote agents now use consistent runtime path: `~/.claude/agents/<plugin>-<agent>/knowledge/`
29
60
  - Rubocop linting violations
30
61
  - Fixed line length issues with string concatenation
31
62
  - Added appropriate Metrics exclusions for complex CLI command methods
@@ -39,13 +39,13 @@ module Aircana
39
39
  # Prompt for knowledge base type
40
40
  kb_type = prompt.select("Knowledge base type:", [
41
41
  {
42
- name: "Remote - Stored in ~/.claude/agents/, not version controlled, " \
42
+ name: "Remote - Fetched from Confluence/web, stored in ~/.claude/agents/, " \
43
43
  "requires refresh",
44
44
  value: "remote"
45
45
  },
46
46
  {
47
- name: "Local - Stored in agents/<name>/knowledge/, version controlled, " \
48
- "no refresh needed",
47
+ name: "Local - Version controlled in plugin, auto-synced to ~/.claude/agents/ " \
48
+ "on session start",
49
49
  value: "local"
50
50
  }
51
51
  ])
@@ -64,6 +64,9 @@ module Aircana
64
64
 
65
65
  Aircana.human_logger.success "Agent created at #{file}"
66
66
 
67
+ # If local kb_type, ensure SessionStart hook is installed
68
+ ensure_local_knowledge_sync_hook if kb_type == "local"
69
+
67
70
  # Prompt for knowledge fetching
68
71
  prompt_for_knowledge_fetch(prompt, normalized_agent_name, kb_type)
69
72
 
@@ -189,8 +192,8 @@ module Aircana
189
192
  end
190
193
 
191
194
  Aircana.human_logger.warn "⚠️ This will migrate #{remote_agents.size} agent(s) to local knowledge bases."
192
- Aircana.human_logger.warn "Knowledge will be version-controlled and stored in " \
193
- ".claude/agents/<agent>/knowledge/"
195
+ Aircana.human_logger.warn "Knowledge will be version-controlled in agents/<agent>/knowledge/"
196
+ Aircana.human_logger.warn "and auto-synced to ~/.claude/agents/ on session start"
194
197
  Aircana.human_logger.info ""
195
198
 
196
199
  results = {
@@ -268,35 +271,61 @@ module Aircana
268
271
  end
269
272
 
270
273
  def ensure_gitignore_entry(kb_type = "remote")
271
- # Only add to gitignore for remote knowledge bases
272
- return if kb_type == "local"
273
-
274
274
  gitignore_path = gitignore_file_path
275
- pattern = gitignore_pattern
276
275
 
276
+ if kb_type == "local"
277
+ # For local agents, ensure version-controlled knowledge is not ignored
278
+ ensure_local_knowledge_not_ignored(gitignore_path)
279
+ else
280
+ # For remote agents, add ignore pattern for .claude/agents/*/knowledge/
281
+ ensure_remote_knowledge_ignored(gitignore_path)
282
+ end
283
+ rescue StandardError => e
284
+ Aircana.human_logger.warn "Could not update .gitignore: #{e.message}"
285
+ end
286
+
287
+ def ensure_remote_knowledge_ignored(gitignore_path)
288
+ pattern = remote_knowledge_pattern
277
289
  return if gitignore_has_pattern?(gitignore_path, pattern)
278
290
 
279
291
  append_to_gitignore(gitignore_path, pattern)
280
- Aircana.human_logger.success "Added knowledge directories to .gitignore"
281
- rescue StandardError => e
282
- Aircana.human_logger.warn "Could not update .gitignore: #{e.message}"
283
- Aircana.human_logger.info "Manually add: #{pattern}"
292
+ Aircana.human_logger.success "Added remote knowledge directories to .gitignore"
293
+ end
294
+
295
+ def ensure_local_knowledge_not_ignored(gitignore_path)
296
+ negation_pattern = local_knowledge_negation_pattern
297
+ return if gitignore_has_pattern?(gitignore_path, negation_pattern)
298
+
299
+ # Add comment and negation pattern
300
+ comment = "# Local agent knowledge IS version controlled (don't ignore)"
301
+ content_to_append = "\n#{comment}\n#{negation_pattern}\n"
302
+
303
+ existing_content = File.exist?(gitignore_path) ? File.read(gitignore_path) : ""
304
+ needs_newline = !existing_content.empty? && !existing_content.end_with?("\n")
305
+ content_to_append = "\n#{content_to_append}" if needs_newline
306
+
307
+ File.open(gitignore_path, "a") { |f| f.write(content_to_append) }
308
+ Aircana.human_logger.success "Added local knowledge negation to .gitignore"
284
309
  end
285
310
 
286
311
  def gitignore_file_path
287
312
  File.join(Aircana.configuration.project_dir, ".gitignore")
288
313
  end
289
314
 
290
- def gitignore_pattern
315
+ def remote_knowledge_pattern
291
316
  ".claude/agents/*/knowledge/"
292
317
  end
293
318
 
319
+ def local_knowledge_negation_pattern
320
+ "!agents/*/knowledge/"
321
+ end
322
+
294
323
  def gitignore_has_pattern?(gitignore_path, pattern)
295
324
  return false unless File.exist?(gitignore_path)
296
325
 
297
326
  content = File.read(gitignore_path)
298
327
  if content.lines.any? { |line| line.strip == pattern }
299
- Aircana.human_logger.info "Knowledge directories already in .gitignore"
328
+ Aircana.human_logger.info "Pattern '#{pattern}' already in .gitignore"
300
329
  true
301
330
  else
302
331
  false
@@ -560,6 +589,10 @@ module Aircana
560
589
  Aircana.human_logger.info " Regenerating agent file..."
561
590
  regenerate_agent_file(agent_name)
562
591
 
592
+ # Step 5: Ensure SessionStart hook is installed (only install once for all local agents)
593
+ Aircana.human_logger.info " Ensuring SessionStart hook is installed..."
594
+ ensure_local_knowledge_sync_hook
595
+
563
596
  Aircana.human_logger.success "✓ Successfully migrated '#{agent_name}'"
564
597
  { success: true }
565
598
  rescue StandardError => e
@@ -647,12 +680,53 @@ module Aircana
647
680
 
648
681
  if results[:successful].positive?
649
682
  Aircana.human_logger.info ""
650
- Aircana.human_logger.warn "⚠️ Knowledge is now version-controlled in .claude/agents/<agent>/knowledge/"
683
+ Aircana.human_logger.warn "⚠️ Knowledge is now version-controlled in agents/<agent>/knowledge/"
684
+ Aircana.human_logger.info "A SessionStart hook has been added to auto-sync knowledge to ~/.claude/agents/"
651
685
  Aircana.human_logger.info "Review and commit these changes to your repository."
652
686
  end
653
687
 
654
688
  Aircana.human_logger.info ""
655
689
  end
690
+
691
+ def ensure_local_knowledge_sync_hook
692
+ hooks_manifest = Aircana::HooksManifest.new(Aircana.configuration.plugin_root)
693
+
694
+ # Check if sync hook already exists
695
+ current_hooks = hooks_manifest.read || {}
696
+ session_start_hooks = current_hooks["SessionStart"] || []
697
+
698
+ # Check if our sync script already exists
699
+ sync_hook_exists = session_start_hooks.any? do |hook_group|
700
+ hook_group["hooks"]&.any? { |h| h["command"]&.include?("sync_local_knowledge.sh") }
701
+ end
702
+
703
+ return if sync_hook_exists
704
+
705
+ # Generate the sync script
706
+ generate_sync_script
707
+
708
+ # Add hook to manifest
709
+ hook_entry = {
710
+ "type" => "command",
711
+ "command" => "./scripts/sync_local_knowledge.sh"
712
+ }
713
+
714
+ hooks_manifest.add_hook(event: "SessionStart", hook_entry: hook_entry)
715
+ Aircana.human_logger.success "Added SessionStart hook to sync local knowledge bases"
716
+ end
717
+
718
+ def generate_sync_script
719
+ script_path = File.join(Aircana.configuration.scripts_dir, "sync_local_knowledge.sh")
720
+ return if File.exist?(script_path)
721
+
722
+ template_path = File.join(File.dirname(__FILE__), "..", "..", "templates", "hooks",
723
+ "sync_local_knowledge.erb")
724
+ template_content = File.read(template_path)
725
+
726
+ FileUtils.mkdir_p(Aircana.configuration.scripts_dir)
727
+ File.write(script_path, ERB.new(template_content).result)
728
+ File.chmod(0o755, script_path)
729
+ end
656
730
  end
657
731
  end
658
732
  end
@@ -48,29 +48,30 @@ module Aircana
48
48
  File.basename(@plugin_root).downcase.gsub(/[^a-z0-9]+/, "-")
49
49
  end
50
50
 
51
- # Returns the global knowledge directory path for an agent
51
+ # Returns the global knowledge directory path for an agent (runtime location)
52
52
  # Format: ~/.claude/agents/<plugin-name>-<agent-name>/knowledge/
53
+ # Both local and remote agents use this path at runtime
53
54
  def global_agent_knowledge_path(agent_name)
54
55
  File.join(@global_agents_dir, "#{plugin_name}-#{agent_name}", "knowledge")
55
56
  end
56
57
 
57
- # Returns the local knowledge directory path for an agent
58
+ # Returns the local knowledge directory path for an agent (version-controlled source)
58
59
  # Format: <plugin-root>/agents/<agent-name>/knowledge/
60
+ # Used only for local agents as the source that gets synced to global path
59
61
  def local_agent_knowledge_path(agent_name)
60
62
  File.join(@agents_dir, agent_name, "knowledge")
61
63
  end
62
64
 
63
65
  # Returns the appropriate knowledge directory path based on kb_type
64
- # kb_type can be "remote" or "local"
65
- def agent_knowledge_path(agent_name, kb_type)
66
- case kb_type
67
- when "local"
68
- local_agent_knowledge_path(agent_name)
69
- when "remote"
70
- global_agent_knowledge_path(agent_name)
71
- else
72
- raise ArgumentError, "Invalid kb_type: #{kb_type}. Must be 'remote' or 'local'"
73
- end
66
+ # For runtime access, both local and remote agents use global_agent_knowledge_path
67
+ # Local agents are synced there via SessionStart hook from their version-controlled source
68
+ # kb_type can be "remote" or "local" but is not used (kept for backward compatibility)
69
+ def agent_knowledge_path(agent_name, _kb_type = nil)
70
+ # Both types use the global path at runtime
71
+ # The difference is how the content gets there:
72
+ # - Remote: via 'aircana agents refresh' from Confluence/web
73
+ # - Local: via SessionStart hook from version-controlled agents/<name>/knowledge/
74
+ global_agent_knowledge_path(agent_name)
74
75
  end
75
76
 
76
77
  private
@@ -69,13 +69,10 @@ module Aircana
69
69
  end
70
70
 
71
71
  def knowledge_path
72
- if kb_type == "local"
73
- # Use local plugin directory for version-controlled knowledge
74
- ".claude/agents/#{agent_name}/knowledge/"
75
- else
76
- # Use global agents directory with plugin prefix
77
- "~/.claude/agents/#{plugin_prefix}-#{agent_name}/knowledge/"
78
- end
72
+ # Both local and remote agents use the same runtime path in ~/.claude/agents/
73
+ # Local agents: Synced from version control (agents/<name>/knowledge/) via SessionStart hook
74
+ # Remote agents: Fetched from Confluence/web via 'aircana agents refresh'
75
+ "~/.claude/agents/#{plugin_prefix}-#{agent_name}/knowledge/"
79
76
  end
80
77
  end
81
78
  end
@@ -0,0 +1,86 @@
1
+ #!/bin/bash
2
+ # Sync local agent knowledge bases to ~/.claude on session start
3
+ # Compatible with macOS and Linux
4
+
5
+ set -e
6
+
7
+ # Create log directory
8
+ mkdir -p ~/.aircana
9
+ LOG_FILE="$HOME/.aircana/hooks.log"
10
+
11
+ # Get plugin root from environment
12
+ PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT}"
13
+
14
+ if [ -z "$PLUGIN_ROOT" ]; then
15
+ echo "$(date): Warning - CLAUDE_PLUGIN_ROOT not set, skipping knowledge sync" >> "$LOG_FILE"
16
+ echo "{}"
17
+ exit 0
18
+ fi
19
+
20
+ # Source: version-controlled local knowledge in plugin
21
+ # Target: ~/.claude/agents/<plugin-name>-<agent-name>/knowledge/
22
+ LOCAL_AGENTS_DIR="${PLUGIN_ROOT}/agents"
23
+ CLAUDE_AGENTS_DIR="$HOME/.claude/agents"
24
+
25
+ # Only proceed if agents directory exists
26
+ if [ ! -d "$LOCAL_AGENTS_DIR" ]; then
27
+ echo "{}"
28
+ exit 0
29
+ fi
30
+
31
+ # Read plugin name from plugin.json
32
+ PLUGIN_NAME=$(grep -o '"name"[[:space:]]*:[[:space:]]*"[^"]*"' "${PLUGIN_ROOT}/.claude-plugin/plugin.json" | head -1 | sed 's/.*: *"\([^"]*\)".*/\1/')
33
+
34
+ if [ -z "$PLUGIN_NAME" ]; then
35
+ echo "$(date): Warning - Could not read plugin name" >> "$LOG_FILE"
36
+ echo "{}"
37
+ exit 0
38
+ fi
39
+
40
+ SYNCED_COUNT=0
41
+
42
+ # Iterate through each agent directory
43
+ for agent_dir in "$LOCAL_AGENTS_DIR"/*; do
44
+ if [ ! -d "$agent_dir" ]; then
45
+ continue
46
+ fi
47
+
48
+ agent_name=$(basename "$agent_dir")
49
+ manifest_file="${agent_dir}/manifest.json"
50
+
51
+ # Check if manifest exists and has kb_type: local
52
+ if [ -f "$manifest_file" ]; then
53
+ kb_type=$(grep -o '"kb_type"[[:space:]]*:[[:space:]]*"[^"]*"' "$manifest_file" | sed 's/.*: *"\([^"]*\)".*/\1/')
54
+
55
+ if [ "$kb_type" = "local" ]; then
56
+ # Source: version-controlled knowledge in plugin
57
+ source_knowledge="${agent_dir}/knowledge"
58
+
59
+ # Target: ~/.claude/agents/<plugin-name>-<agent-name>/knowledge/
60
+ target_knowledge="${CLAUDE_AGENTS_DIR}/${PLUGIN_NAME}-${agent_name}/knowledge"
61
+
62
+ if [ -d "$source_knowledge" ]; then
63
+ # Create target directory
64
+ mkdir -p "$target_knowledge"
65
+
66
+ # Sync knowledge files (rsync if available, fallback to cp)
67
+ if command -v rsync &> /dev/null; then
68
+ rsync -a --delete "$source_knowledge/" "$target_knowledge/"
69
+ else
70
+ # Fallback: remove old files and copy new ones
71
+ rm -rf "$target_knowledge"/*
72
+ cp -R "$source_knowledge"/* "$target_knowledge/" 2>/dev/null || true
73
+ fi
74
+
75
+ SYNCED_COUNT=$((SYNCED_COUNT + 1))
76
+ echo "$(date): Synced local knowledge for agent: ${agent_name}" >> "$LOG_FILE"
77
+ fi
78
+ fi
79
+ fi
80
+ done
81
+
82
+ if [ $SYNCED_COUNT -gt 0 ]; then
83
+ echo "$(date): Synced ${SYNCED_COUNT} local agent knowledge base(s)" >> "$LOG_FILE"
84
+ fi
85
+
86
+ echo "{}"
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Aircana
4
- VERSION = "3.1.0"
4
+ VERSION = "3.2.0"
5
5
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aircana
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.0
4
+ version: 3.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Weston Dransfield
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2025-10-16 00:00:00.000000000 Z
10
+ date: 2025-10-17 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: httparty
@@ -188,6 +188,7 @@ files:
188
188
  - lib/aircana/templates/hooks/rspec_test.erb
189
189
  - lib/aircana/templates/hooks/rubocop_pre_commit.erb
190
190
  - lib/aircana/templates/hooks/session_start.erb
191
+ - lib/aircana/templates/hooks/sync_local_knowledge.erb
191
192
  - lib/aircana/templates/hooks/user_prompt_submit.erb
192
193
  - lib/aircana/version.rb
193
194
  - sig/aircana.rbs