aircana 3.1.0 → 3.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cb4ccc62f335ae4dd250fe34537af2ddda08e11f6d3440c56c467bd5867319a4
4
- data.tar.gz: dd4ba6f45cc0dc3e14d8d1c7022ab90db3c81d69b37dd9cc99def0ce53bf03b6
3
+ metadata.gz: a118d5474b752e8beb6ef0c50bfba1d19cf1820d1d383079b29e06bba37eef62
4
+ data.tar.gz: 7ee1d0e0957398988b9480a99c9ee0a873c2c00306dffc15d533c60e757b5522
5
5
  SHA512:
6
- metadata.gz: 0e8e0e8cf171fb8e997ffd4d55c683ff44b92ac1cf52f6c25e5b922676eba8c93d59c6b075bc51cfc6c32374f2c63b8938c35f674d3c777f474253e9ddc30c24
7
- data.tar.gz: 2bc75c23f76a676830997a60830e249230ddab81a83616808b3efce5281253ee11357bbae83aa8d7089b35d989145f1af1b5464918aae4fabca30e2e178f3219
6
+ metadata.gz: def87361d0c177d3631ebad043d3715820d091df2b612cdcc6c1668aca7cab734afef20c47adcab5ab99eb03b7fb6dc0fca7b474fe8df4b3459ef132c7bbf4a5
7
+ data.tar.gz: 012b35af5bc02ba0eab3e135a31e5b38d75a35918538096dece8279efe39e2447bd8f5757762e1c437704d1c804054b471bd97db8c100ff12be95f40df22a1c9
data/.rspec_status CHANGED
@@ -1,193 +1,193 @@
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 |
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 |
32
- ./spec/aircana/cli/commands/hooks_spec.rb[1:4:2:1] | passed | 0.00121 seconds |
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 |
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 |
3
+ ./spec/aircana/cli/commands/agents_spec.rb[1:1:1:1] | passed | 0.00442 seconds |
4
+ ./spec/aircana/cli/commands/agents_spec.rb[1:1:1:2] | passed | 0.00037 seconds |
5
+ ./spec/aircana/cli/commands/agents_spec.rb[1:1:1:3] | passed | 0.00203 seconds |
6
+ ./spec/aircana/cli/commands/agents_spec.rb[1:1:2:1] | passed | 0.00093 seconds |
7
+ ./spec/aircana/cli/commands/agents_spec.rb[1:1:3:1] | passed | 0.00033 seconds |
8
+ ./spec/aircana/cli/commands/agents_spec.rb[1:1:3:2] | passed | 0.00032 seconds |
9
+ ./spec/aircana/cli/commands/agents_spec.rb[1:2:1:1] | passed | 0.00056 seconds |
10
+ ./spec/aircana/cli/commands/agents_spec.rb[1:2:1:2] | passed | 0.00044 seconds |
11
+ ./spec/aircana/cli/commands/agents_spec.rb[1:2:1:3:1] | passed | 0.00046 seconds |
12
+ ./spec/aircana/cli/commands/agents_spec.rb[1:2:2:1] | passed | 0.0003 seconds |
13
+ ./spec/aircana/cli/commands/agents_spec.rb[1:2:3:1] | passed | 0.00037 seconds |
14
+ ./spec/aircana/cli/commands/agents_spec.rb[1:2:4:1] | passed | 0.00036 seconds |
15
+ ./spec/aircana/cli/commands/agents_spec.rb[1:3:1] | passed | 0.00072 seconds |
16
+ ./spec/aircana/cli/commands/agents_spec.rb[1:3:2] | passed | 0.00045 seconds |
17
+ ./spec/aircana/cli/commands/agents_spec.rb[1:3:3] | passed | 0.00045 seconds |
18
+ ./spec/aircana/cli/commands/agents_spec.rb[1:4:1] | passed | 0.00022 seconds |
19
+ ./spec/aircana/cli/commands/agents_spec.rb[1:5:1:1] | passed | 0.00038 seconds |
20
+ ./spec/aircana/cli/commands/agents_spec.rb[1:5:2:1] | passed | 0.00036 seconds |
21
+ ./spec/aircana/cli/commands/agents_spec.rb[1:5:3:1] | passed | 0.00072 seconds |
22
+ ./spec/aircana/cli/commands/agents_spec.rb[1:5:3:2] | passed | 0.00073 seconds |
23
+ ./spec/aircana/cli/commands/agents_spec.rb[1:5:3:3] | passed | 0.00076 seconds |
24
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:1:1:1] | passed | 0.00238 seconds |
25
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:1:2:1:1] | passed | 0.00073 seconds |
26
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:1:2:2:1] | passed | 0.00119 seconds |
27
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:2:1:1] | passed | 0.0006 seconds |
28
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:2:2:1] | passed | 0.00076 seconds |
29
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:3:1:1] | passed | 0.00054 seconds |
30
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:3:2:1] | passed | 0.0011 seconds |
31
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:4:1] | passed | 0.00144 seconds |
32
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:4:2:1] | passed | 0.00113 seconds |
33
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:5:1:1] | passed | 0.00058 seconds |
34
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:5:2:1] | passed | 0.00081 seconds |
35
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:5:3:1] | passed | 0.0008 seconds |
36
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:5:4:1] | passed | 0.00073 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.00157 seconds |
39
+ ./spec/aircana/cli/commands/hooks_spec.rb[1:7:1] | passed | 0.00052 seconds |
40
+ ./spec/aircana/cli/commands/init_spec.rb[1:1:1] | passed | 0.00294 seconds |
41
+ ./spec/aircana/cli/commands/init_spec.rb[1:1:2] | passed | 0.00535 seconds |
42
+ ./spec/aircana/cli/commands/init_spec.rb[1:2:1:1] | passed | 0.00468 seconds |
43
+ ./spec/aircana/cli/commands/init_spec.rb[1:3:1] | passed | 0.00309 seconds |
44
+ ./spec/aircana/cli/commands/init_spec.rb[1:3:2:1] | passed | 0.00272 seconds |
45
+ ./spec/aircana/cli/commands/init_spec.rb[1:3:3:1] | passed | 0.00317 seconds |
46
+ ./spec/aircana/cli/commands/init_spec.rb[1:3:4:1] | passed | 0.00418 seconds |
47
+ ./spec/aircana/cli/commands/init_spec.rb[1:4:1] | passed | 0.0016 seconds |
48
+ ./spec/aircana/cli/commands/init_spec.rb[1:4:2] | passed | 0.0017 seconds |
49
+ ./spec/aircana/cli/commands/init_spec.rb[1:4:3] | passed | 0.00133 seconds |
50
+ ./spec/aircana/cli/commands/init_spec.rb[1:4:4] | passed | 0.00319 seconds |
51
+ ./spec/aircana/cli/commands/init_spec.rb[1:4:5] | passed | 0.00134 seconds |
52
+ ./spec/aircana/cli/commands/init_spec.rb[1:5:1] | passed | 0.0031 seconds |
53
+ ./spec/aircana/cli/commands/init_spec.rb[1:5:2] | passed | 0.00445 seconds |
54
+ ./spec/aircana/cli/commands/init_spec.rb[1:5:3] | passed | 0.00449 seconds |
55
+ ./spec/aircana/cli/commands/init_spec.rb[1:5:4] | passed | 0.00394 seconds |
56
+ ./spec/aircana/configuration_spec.rb[1:1:1] | passed | 0.00016 seconds |
57
57
  ./spec/aircana/configuration_spec.rb[1:2:1] | passed | 0.00008 seconds |
58
- ./spec/aircana/configuration_spec.rb[1:3:1] | passed | 0.00007 seconds |
58
+ ./spec/aircana/configuration_spec.rb[1:3:1] | passed | 0.00008 seconds |
59
59
  ./spec/aircana/configuration_spec.rb[1:4:1] | passed | 0.00007 seconds |
60
- ./spec/aircana/configuration_spec.rb[1:5:1] | passed | 0.00007 seconds |
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 |
60
+ ./spec/aircana/configuration_spec.rb[1:5:1] | passed | 0.00006 seconds |
61
+ ./spec/aircana/configuration_spec.rb[1:5:2] | passed | 0.00006 seconds |
62
+ ./spec/aircana/configuration_spec.rb[1:6:1:1] | passed | 0.00023 seconds |
63
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 |
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 |
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 |
64
+ ./spec/aircana/configuration_spec.rb[1:6:3:1] | passed | 0.00023 seconds |
65
+ ./spec/aircana/configuration_spec.rb[1:6:4:1] | passed | 0.0001 seconds |
66
+ ./spec/aircana/contexts/confluence_spec.rb[1:1:1:1] | passed | 0.00185 seconds |
67
+ ./spec/aircana/contexts/confluence_spec.rb[1:1:1:2] | passed | 0.00046 seconds |
68
+ ./spec/aircana/contexts/confluence_spec.rb[1:1:1:3] | passed | 0.00118 seconds |
69
+ ./spec/aircana/contexts/confluence_spec.rb[1:1:2:1] | passed | 0.0015 seconds |
70
+ ./spec/aircana/contexts/confluence_spec.rb[1:1:2:2] | passed | 0.00014 seconds |
71
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 |
72
+ ./spec/aircana/contexts/confluence_spec.rb[1:1:3:1] | passed | 0.00034 seconds |
73
+ ./spec/aircana/contexts/confluence_spec.rb[1:1:3:2] | passed | 0.00048 seconds |
74
+ ./spec/aircana/contexts/local_spec.rb[1:1:1] | passed | 0.00153 seconds |
75
+ ./spec/aircana/contexts/local_spec.rb[1:1:2] | passed | 0.00169 seconds |
76
+ ./spec/aircana/contexts/local_spec.rb[1:1:3] | passed | 0.0014 seconds |
77
+ ./spec/aircana/contexts/local_spec.rb[1:1:4] | passed | 0.00125 seconds |
78
+ ./spec/aircana/contexts/local_spec.rb[1:1:5] | passed | 0.00111 seconds |
79
+ ./spec/aircana/contexts/local_spec.rb[1:1:6] | passed | 0.00115 seconds |
80
+ ./spec/aircana/contexts/local_spec.rb[1:1:7] | passed | 0.00161 seconds |
81
+ ./spec/aircana/contexts/local_spec.rb[1:1:8] | passed | 0.00141 seconds |
82
+ ./spec/aircana/contexts/manifest_spec.rb[1:1:1] | passed | 0.00102 seconds |
83
+ ./spec/aircana/contexts/manifest_spec.rb[1:1:2] | passed | 0.00094 seconds |
84
+ ./spec/aircana/contexts/manifest_spec.rb[1:2:1] | passed | 0.0011 seconds |
85
+ ./spec/aircana/contexts/manifest_spec.rb[1:2:2] | passed | 0.00107 seconds |
86
86
  ./spec/aircana/contexts/manifest_spec.rb[1:3:1] | passed | 0.00105 seconds |
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 |
87
+ ./spec/aircana/contexts/manifest_spec.rb[1:3:2] | passed | 0.00023 seconds |
88
+ ./spec/aircana/contexts/manifest_spec.rb[1:3:3] | passed | 0.00095 seconds |
89
+ ./spec/aircana/contexts/manifest_spec.rb[1:3:4] | passed | 0.00106 seconds |
90
+ ./spec/aircana/contexts/manifest_spec.rb[1:4:1] | passed | 0.001 seconds |
91
+ ./spec/aircana/contexts/manifest_spec.rb[1:4:2] | passed | 0.0003 seconds |
92
+ ./spec/aircana/contexts/manifest_spec.rb[1:5:1] | passed | 0.0008 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.00027 seconds |
95
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 |
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.00022 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.0002 seconds |
100
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 |
101
+ ./spec/aircana/contexts/manifest_spec.rb[1:6:8] | passed | 0.00093 seconds |
102
+ ./spec/aircana/contexts/manifest_spec.rb[1:6:9] | passed | 0.00084 seconds |
103
+ ./spec/aircana/contexts/manifest_spec.rb[1:6:10] | passed | 0.00092 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
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 |
107
+ ./spec/aircana/contexts/web_spec.rb[1:3:1:2] | passed | 0.00021 seconds |
108
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 |
109
+ ./spec/aircana/contexts/web_spec.rb[1:3:2:1] | passed | 0.00016 seconds |
110
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 |
111
+ ./spec/aircana/contexts/web_spec.rb[1:3:3:1] | passed | 0.00017 seconds |
112
112
  ./spec/aircana/contexts/web_spec.rb[1:3:3:2] | passed | 0.00027 seconds |
113
- ./spec/aircana/contexts/web_spec.rb[1:3:3:3] | passed | 0.00022 seconds |
113
+ ./spec/aircana/contexts/web_spec.rb[1:3:3:3] | passed | 0.00023 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 |
116
116
  ./spec/aircana/contexts/web_spec.rb[1:3:4:1] | passed | 0.00012 seconds |
117
- ./spec/aircana/contexts/web_spec.rb[1:3:4:2] | passed | 0.00011 seconds |
117
+ ./spec/aircana/contexts/web_spec.rb[1:3:4:2] | passed | 0.00012 seconds |
118
118
  ./spec/aircana/contexts/web_spec.rb[1:3:4:3] | passed | 0.00011 seconds |
119
- ./spec/aircana/contexts/web_spec.rb[1:3:5:1] | passed | 0.00037 seconds |
120
- ./spec/aircana/contexts/web_spec.rb[1:3:5:2] | passed | 0.0001 seconds |
119
+ ./spec/aircana/contexts/web_spec.rb[1:3:5:1] | passed | 0.0004 seconds |
120
+ ./spec/aircana/contexts/web_spec.rb[1:3:5:2] | passed | 0.00011 seconds |
121
121
  ./spec/aircana/contexts/web_spec.rb[1:3:5:3] | passed | 0.00028 seconds |
122
122
  ./spec/aircana/contexts/web_spec.rb[1:3:6:1] | passed | 0.00023 seconds |
123
123
  ./spec/aircana/contexts/web_spec.rb[1:3:6:2] | passed | 0.00023 seconds |
124
- ./spec/aircana/contexts/web_spec.rb[1:3:6:3] | passed | 0.00021 seconds |
125
- ./spec/aircana/contexts/web_spec.rb[1:3:7:1] | passed | 0.0001 seconds |
124
+ ./spec/aircana/contexts/web_spec.rb[1:3:6:3] | passed | 0.00022 seconds |
125
+ ./spec/aircana/contexts/web_spec.rb[1:3:7:1] | passed | 0.00012 seconds |
126
126
  ./spec/aircana/contexts/web_spec.rb[1:3:7:2] | passed | 0.0001 seconds |
127
- ./spec/aircana/fzf_helper_spec.rb[1:1:1:1] | passed | 0.00014 seconds |
127
+ ./spec/aircana/fzf_helper_spec.rb[1:1:1:1] | passed | 0.00015 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 |
129
+ ./spec/aircana/fzf_helper_spec.rb[1:1:1:3] | passed | 0.00022 seconds |
130
+ ./spec/aircana/fzf_helper_spec.rb[1:1:2:1] | passed | 0.00021 seconds |
131
+ ./spec/aircana/fzf_helper_spec.rb[1:1:3:1] | passed | 0.00021 seconds |
132
+ ./spec/aircana/fzf_helper_spec.rb[1:2:1:1] | passed | 0.00011 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
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 |
136
+ ./spec/aircana/fzf_helper_spec.rb[1:2:2:2] | passed | 0.00008 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
- ./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 |
143
+ ./spec/aircana/generators/hooks_generator_spec.rb[1:2:1] | passed | 0.00002 seconds |
144
+ ./spec/aircana/generators/hooks_generator_spec.rb[1:3:1] | passed | 0.00035 seconds |
145
145
  ./spec/aircana/generators/hooks_generator_spec.rb[1:3:2] | passed | 0.00019 seconds |
146
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 |
148
- ./spec/aircana/generators/hooks_generator_spec.rb[1:5:2:1] | passed | 0.00003 seconds |
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 |
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 |
159
- ./spec/aircana/human_logger_spec.rb[1:1:1] | passed | 0.00007 seconds |
147
+ ./spec/aircana/generators/hooks_generator_spec.rb[1:5:1:1] | passed | 0.00009 seconds |
148
+ ./spec/aircana/generators/hooks_generator_spec.rb[1:5:2:1] | passed | 0.00004 seconds |
149
+ ./spec/aircana/generators/hooks_generator_spec.rb[1:6:1] | passed | 0.00057 seconds |
150
+ ./spec/aircana/generators/hooks_generator_spec.rb[1:7:1] | passed | 0.00013 seconds |
151
+ ./spec/aircana/generators/plan_command_generator_spec.rb[1:1:1] | passed | 0.00034 seconds |
152
+ ./spec/aircana/generators/plan_command_generator_spec.rb[1:1:2] | passed | 0.00027 seconds |
153
+ ./spec/aircana/generators/plan_command_generator_spec.rb[1:1:3] | passed | 0.00026 seconds |
154
+ ./spec/aircana/generators/plan_command_generator_spec.rb[1:2:1] | passed | 0.00009 seconds |
155
+ ./spec/aircana/generators/plan_command_generator_spec.rb[1:2:2] | passed | 0.00008 seconds |
156
+ ./spec/aircana/generators/record_command_generator_spec.rb[1:1:1] | passed | 0.00026 seconds |
157
+ ./spec/aircana/generators/record_command_generator_spec.rb[1:2:1] | passed | 0.00053 seconds |
158
+ ./spec/aircana/generators/record_command_generator_spec.rb[1:2:2] | passed | 0.00008 seconds |
159
+ ./spec/aircana/human_logger_spec.rb[1:1:1] | passed | 0.00006 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 |
162
162
  ./spec/aircana/human_logger_spec.rb[1:4:1] | passed | 0.00004 seconds |
163
- ./spec/aircana/human_logger_spec.rb[1:5:1] | passed | 0.00003 seconds |
164
- ./spec/aircana/human_logger_spec.rb[1:5:2] | passed | 0.00003 seconds |
163
+ ./spec/aircana/human_logger_spec.rb[1:5:1] | passed | 0.00033 seconds |
164
+ ./spec/aircana/human_logger_spec.rb[1:5:2] | passed | 0.00004 seconds |
165
165
  ./spec/aircana/human_logger_spec.rb[1:5:3] | passed | 0.00003 seconds |
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
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 |
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 |
177
- ./spec/aircana/llm/claude_client_spec.rb[1:1:3:1] | passed | 0.00033 seconds |
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 |
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.00039 seconds |
172
+ ./spec/aircana/llm/claude_client_spec.rb[1:1:1:2] | passed | 0.00041 seconds |
173
+ ./spec/aircana/llm/claude_client_spec.rb[1:1:1:3] | passed | 0.00029 seconds |
174
+ ./spec/aircana/llm/claude_client_spec.rb[1:1:1:4] | passed | 0.0003 seconds |
175
+ ./spec/aircana/llm/claude_client_spec.rb[1:1:2:1] | passed | 0.0004 seconds |
176
+ ./spec/aircana/llm/claude_client_spec.rb[1:1:2:2] | passed | 0.0003 seconds |
177
+ ./spec/aircana/llm/claude_client_spec.rb[1:1:3:1] | passed | 0.00032 seconds |
178
+ ./spec/aircana/llm/claude_client_spec.rb[1:2:1] | passed | 0.00029 seconds |
179
+ ./spec/aircana/llm/claude_client_spec.rb[1:2:2] | passed | 0.00029 seconds |
180
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 |
181
+ ./spec/aircana/llm/claude_client_spec.rb[1:3:1:2] | passed | 0.0002 seconds |
182
+ ./spec/aircana/system_checker_spec.rb[1:1:1:1] | passed | 0.00029 seconds |
183
+ ./spec/aircana/system_checker_spec.rb[1:1:2:1] | passed | 0.00039 seconds |
184
+ ./spec/aircana/system_checker_spec.rb[1:1:3:1] | passed | 0.00065 seconds |
185
+ ./spec/aircana/system_checker_spec.rb[1:2:1] | passed | 0.00021 seconds |
186
+ ./spec/aircana/system_checker_spec.rb[1:2:2] | passed | 0.00021 seconds |
187
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 |
188
+ ./spec/aircana/system_checker_spec.rb[1:3:2] | passed | 0.0002 seconds |
189
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 |
190
+ ./spec/aircana/system_checker_spec.rb[1:3:4] | passed | 0.00026 seconds |
191
+ ./spec/aircana/system_checker_spec.rb[1:3:5] | passed | 0.00016 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.0006 seconds |
data/CHANGELOG.md CHANGED
@@ -7,25 +7,63 @@ 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.1] - 2025-01-16
11
+
12
+ ### Fixed
13
+ - SessionStart hook command now uses `${CLAUDE_PLUGIN_ROOT}` environment variable for proper path resolution
14
+ - Changed from relative path `./scripts/sync_local_knowledge.sh` to `${CLAUDE_PLUGIN_ROOT}/scripts/sync_local_knowledge.sh`
15
+ - Fixes "No such file or directory" error when hook executes
16
+
17
+ ## [3.2.0] - 2025-01-16
18
+
19
+ ### Added
20
+ - SessionStart hook automatically syncs local knowledge bases to `~/.claude/agents/` on session start
21
+ - Compatible with macOS and Linux
22
+ - Only syncs agents with `kb_type: "local"` in manifest
23
+ - Uses rsync when available, falls back to cp
24
+ - Logs sync operations to `~/.aircana/hooks.log`
25
+ - Smart .gitignore management
26
+ - Remote agents: Adds `.claude/agents/*/knowledge/` to .gitignore
27
+ - Local agents: Adds `!agents/*/knowledge/` negation to ensure version control
28
+
29
+ ### Changed
30
+ - Local knowledge bases now stored in version-controlled `agents/<name>/knowledge/` directory
31
+ - Local knowledge auto-synced to `~/.claude/agents/<plugin>-<agent>/knowledge/` via SessionStart hook
32
+ - Both local and remote agents use consistent runtime path: `~/.claude/agents/<plugin>-<agent>/knowledge/`
33
+ - Updated CLI prompts to accurately describe sync behavior for local agents
34
+ - Migration warnings updated to reflect new local knowledge sync architecture
35
+
36
+ ### Fixed
37
+ - Local and remote agents now use consistent runtime path in agent file definitions
38
+
39
+ ## [3.1.0] - 2025-01-16
11
40
 
12
41
  ### Added
13
42
  - Optional local knowledge base storage for agents
14
43
  - 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)
44
+ - Local knowledge bases version-controlled in `agents/<name>/knowledge/` directory
45
+ - Auto-synced to `~/.claude/agents/<plugin>-<agent>/knowledge/` via SessionStart hook
46
+ - Remote knowledge bases fetched from Confluence/web to `~/.claude/agents/` (not version controlled)
17
47
  - Agent creation wizard prompts for knowledge base type with explanation
18
48
  - Refresh commands automatically skip local knowledge base agents
19
49
  - Existing agents without `kb_type` field default to "remote" for backward compatibility
50
+ - SessionStart hook automatically syncs local knowledge bases to `~/.claude/agents/` on session start
51
+ - Compatible with macOS and Linux
52
+ - Only syncs agents with `kb_type: "local"` in manifest
53
+ - Uses rsync when available, falls back to cp
54
+ - Logs sync operations to `~/.aircana/hooks.log`
20
55
  - Migration command: `aircana agents migrate-to-local`
21
56
  - Migrates remote knowledge bases to local (version-controlled) storage
22
57
  - Automatically refreshes knowledge from sources before migration
23
58
  - Copies knowledge files from global to local directory
24
59
  - Updates manifests and regenerates agent files with correct paths
25
60
  - Provides detailed migration summary
61
+ - Smart .gitignore management
62
+ - Remote agents: Adds `.claude/agents/*/knowledge/` to .gitignore
63
+ - Local agents: Adds `!agents/*/knowledge/` negation to ensure version control
26
64
 
27
65
  ### Fixed
28
- - Local knowledge base agent files now correctly reference `.claude/agents/<name>/knowledge/` instead of `agents/<name>/knowledge/`
66
+ - Local and remote agents now use consistent runtime path: `~/.claude/agents/<plugin>-<agent>/knowledge/`
29
67
  - Rubocop linting violations
30
68
  - Fixed line length issues with string concatenation
31
69
  - 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" => "${CLAUDE_PLUGIN_ROOT}/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.1"
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.1
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