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 +4 -4
- data/.rspec_status +153 -153
- data/CHANGELOG.md +42 -4
- data/lib/aircana/cli/commands/agents.rb +90 -16
- data/lib/aircana/configuration.rb +13 -12
- data/lib/aircana/generators/agents_generator.rb +4 -7
- data/lib/aircana/templates/hooks/sync_local_knowledge.erb +86 -0
- data/lib/aircana/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a118d5474b752e8beb6ef0c50bfba1d19cf1820d1d383079b29e06bba37eef62
|
4
|
+
data.tar.gz: 7ee1d0e0957398988b9480a99c9ee0a873c2c00306dffc15d533c60e757b5522
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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.
|
4
|
-
./spec/aircana/cli/commands/agents_spec.rb[1:1:1:2] | passed | 0.
|
5
|
-
./spec/aircana/cli/commands/agents_spec.rb[1:1:1:3] | passed | 0.
|
6
|
-
./spec/aircana/cli/commands/agents_spec.rb[1:1:2:1] | passed | 0.
|
7
|
-
./spec/aircana/cli/commands/agents_spec.rb[1:1:3:1] | passed | 0.
|
8
|
-
./spec/aircana/cli/commands/agents_spec.rb[1:1:3:2] | passed | 0.
|
9
|
-
./spec/aircana/cli/commands/agents_spec.rb[1:2:1:1] | passed | 0.
|
10
|
-
./spec/aircana/cli/commands/agents_spec.rb[1:2:1:2] | passed | 0.
|
11
|
-
./spec/aircana/cli/commands/agents_spec.rb[1:2:1:3:1] | passed | 0.
|
12
|
-
./spec/aircana/cli/commands/agents_spec.rb[1:2:2:1] | passed | 0.
|
13
|
-
./spec/aircana/cli/commands/agents_spec.rb[1:2:3:1] | passed | 0.
|
14
|
-
./spec/aircana/cli/commands/agents_spec.rb[1:2:4:1] | passed | 0.
|
15
|
-
./spec/aircana/cli/commands/agents_spec.rb[1:3:1] | passed | 0.
|
16
|
-
./spec/aircana/cli/commands/agents_spec.rb[1:3:2] | passed | 0.
|
17
|
-
./spec/aircana/cli/commands/agents_spec.rb[1:3:3] | passed | 0.
|
18
|
-
./spec/aircana/cli/commands/agents_spec.rb[1:4:1] | passed | 0.
|
19
|
-
./spec/aircana/cli/commands/agents_spec.rb[1:5:1:1] | passed | 0.
|
20
|
-
./spec/aircana/cli/commands/agents_spec.rb[1:5:2:1] | passed | 0.
|
21
|
-
./spec/aircana/cli/commands/agents_spec.rb[1:5:3:1] | passed | 0.
|
22
|
-
./spec/aircana/cli/commands/agents_spec.rb[1:5:3:2] | passed | 0.
|
23
|
-
./spec/aircana/cli/commands/agents_spec.rb[1:5:3:3] | passed | 0.
|
24
|
-
./spec/aircana/cli/commands/hooks_spec.rb[1:1:1:1] | passed | 0.
|
25
|
-
./spec/aircana/cli/commands/hooks_spec.rb[1:1:2:1:1] | passed | 0.
|
26
|
-
./spec/aircana/cli/commands/hooks_spec.rb[1:1:2:2:1] | passed | 0.
|
27
|
-
./spec/aircana/cli/commands/hooks_spec.rb[1:2:1:1] | passed | 0.
|
28
|
-
./spec/aircana/cli/commands/hooks_spec.rb[1:2:2:1] | passed | 0.
|
29
|
-
./spec/aircana/cli/commands/hooks_spec.rb[1:3:1:1] | passed | 0.
|
30
|
-
./spec/aircana/cli/commands/hooks_spec.rb[1:3:2:1] | passed | 0.
|
31
|
-
./spec/aircana/cli/commands/hooks_spec.rb[1:4:1] | passed | 0.
|
32
|
-
./spec/aircana/cli/commands/hooks_spec.rb[1:4:2:1] | passed | 0.
|
33
|
-
./spec/aircana/cli/commands/hooks_spec.rb[1:5:1:1] | passed | 0.
|
34
|
-
./spec/aircana/cli/commands/hooks_spec.rb[1:5:2:1] | passed | 0.
|
35
|
-
./spec/aircana/cli/commands/hooks_spec.rb[1:5:3:1] | passed | 0.
|
36
|
-
./spec/aircana/cli/commands/hooks_spec.rb[1:5:4:1] | passed | 0.
|
37
|
-
./spec/aircana/cli/commands/hooks_spec.rb[1:6:1:1] | passed | 0.
|
38
|
-
./spec/aircana/cli/commands/hooks_spec.rb[1:6:2:1] | passed | 0.
|
39
|
-
./spec/aircana/cli/commands/hooks_spec.rb[1:7:1] | passed | 0.
|
40
|
-
./spec/aircana/cli/commands/init_spec.rb[1:1:1] | passed | 0.
|
41
|
-
./spec/aircana/cli/commands/init_spec.rb[1:1:2] | passed | 0.
|
42
|
-
./spec/aircana/cli/commands/init_spec.rb[1:2:1:1] | passed | 0.
|
43
|
-
./spec/aircana/cli/commands/init_spec.rb[1:3:1] | passed | 0.
|
44
|
-
./spec/aircana/cli/commands/init_spec.rb[1:3:2:1] | passed | 0.
|
45
|
-
./spec/aircana/cli/commands/init_spec.rb[1:3:3:1] | passed | 0.
|
46
|
-
./spec/aircana/cli/commands/init_spec.rb[1:3:4:1] | passed | 0.
|
47
|
-
./spec/aircana/cli/commands/init_spec.rb[1:4:1] | passed | 0.
|
48
|
-
./spec/aircana/cli/commands/init_spec.rb[1:4:2] | passed | 0.
|
49
|
-
./spec/aircana/cli/commands/init_spec.rb[1:4:3] | passed | 0.
|
50
|
-
./spec/aircana/cli/commands/init_spec.rb[1:4:4] | passed | 0.
|
51
|
-
./spec/aircana/cli/commands/init_spec.rb[1:4:5] | passed | 0.
|
52
|
-
./spec/aircana/cli/commands/init_spec.rb[1:5:1] | passed | 0.
|
53
|
-
./spec/aircana/cli/commands/init_spec.rb[1:5:2] | passed | 0.
|
54
|
-
./spec/aircana/cli/commands/init_spec.rb[1:5:3] | passed | 0.
|
55
|
-
./spec/aircana/cli/commands/init_spec.rb[1:5:4] | passed | 0.
|
56
|
-
./spec/aircana/configuration_spec.rb[1:1:1] | passed | 0.
|
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.
|
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.
|
61
|
-
./spec/aircana/configuration_spec.rb[1:5:2] | passed | 0.
|
62
|
-
./spec/aircana/configuration_spec.rb[1:6:1:1] | passed | 0.
|
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.
|
65
|
-
./spec/aircana/configuration_spec.rb[1:6:4:1] | passed | 0.
|
66
|
-
./spec/aircana/contexts/confluence_spec.rb[1:1:1:1] | passed | 0.
|
67
|
-
./spec/aircana/contexts/confluence_spec.rb[1:1:1:2] | passed | 0.
|
68
|
-
./spec/aircana/contexts/confluence_spec.rb[1:1:1:3] | passed | 0.
|
69
|
-
./spec/aircana/contexts/confluence_spec.rb[1:1:2:1] | passed | 0.
|
70
|
-
./spec/aircana/contexts/confluence_spec.rb[1:1:2:2] | passed | 0.
|
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.
|
73
|
-
./spec/aircana/contexts/confluence_spec.rb[1:1:3:2] | passed | 0.
|
74
|
-
./spec/aircana/contexts/local_spec.rb[1:1:1] | passed | 0.
|
75
|
-
./spec/aircana/contexts/local_spec.rb[1:1:2] | passed | 0.
|
76
|
-
./spec/aircana/contexts/local_spec.rb[1:1:3] | passed | 0.
|
77
|
-
./spec/aircana/contexts/local_spec.rb[1:1:4] | passed | 0.
|
78
|
-
./spec/aircana/contexts/local_spec.rb[1:1:5] | passed | 0.
|
79
|
-
./spec/aircana/contexts/local_spec.rb[1:1:6] | passed | 0.
|
80
|
-
./spec/aircana/contexts/local_spec.rb[1:1:7] | passed | 0.
|
81
|
-
./spec/aircana/contexts/local_spec.rb[1:1:8] | passed | 0.
|
82
|
-
./spec/aircana/contexts/manifest_spec.rb[1:1:1] | passed | 0.
|
83
|
-
./spec/aircana/contexts/manifest_spec.rb[1:1:2] | passed | 0.
|
84
|
-
./spec/aircana/contexts/manifest_spec.rb[1:2:1] | passed | 0.
|
85
|
-
./spec/aircana/contexts/manifest_spec.rb[1:2:2] | passed | 0.
|
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.
|
88
|
-
./spec/aircana/contexts/manifest_spec.rb[1:3:3] | passed | 0.
|
89
|
-
./spec/aircana/contexts/manifest_spec.rb[1:3:4] | passed | 0.
|
90
|
-
./spec/aircana/contexts/manifest_spec.rb[1:4:1] | passed | 0.
|
91
|
-
./spec/aircana/contexts/manifest_spec.rb[1:4:2] | passed | 0.
|
92
|
-
./spec/aircana/contexts/manifest_spec.rb[1:5:1] | passed | 0.
|
93
|
-
./spec/aircana/contexts/manifest_spec.rb[1:5:2] | passed | 0.
|
94
|
-
./spec/aircana/contexts/manifest_spec.rb[1:6:1] | passed | 0.
|
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.
|
97
|
-
./spec/aircana/contexts/manifest_spec.rb[1:6:4] | passed | 0.
|
98
|
-
./spec/aircana/contexts/manifest_spec.rb[1:6:5] | passed | 0.
|
99
|
-
./spec/aircana/contexts/manifest_spec.rb[1:6:6] | passed | 0.
|
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.
|
102
|
-
./spec/aircana/contexts/manifest_spec.rb[1:6:9] | passed | 0.
|
103
|
-
./spec/aircana/contexts/manifest_spec.rb[1:6:10] | passed | 0.
|
104
|
-
./spec/aircana/contexts/web_spec.rb[1:1:1] | passed | 0.
|
105
|
-
./spec/aircana/contexts/web_spec.rb[1:2:1] | passed | 0.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
120
|
-
./spec/aircana/contexts/web_spec.rb[1:3:5:2] | passed | 0.
|
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.
|
125
|
-
./spec/aircana/contexts/web_spec.rb[1:3:7:1] | passed | 0.
|
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.
|
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.
|
130
|
-
./spec/aircana/fzf_helper_spec.rb[1:1:2:1] | passed | 0.
|
131
|
-
./spec/aircana/fzf_helper_spec.rb[1:1:3:1] | passed | 0.
|
132
|
-
./spec/aircana/fzf_helper_spec.rb[1:2:1:1] | passed | 0.
|
133
|
-
./spec/aircana/fzf_helper_spec.rb[1:2:1:2] | passed | 0.
|
134
|
-
./spec/aircana/fzf_helper_spec.rb[1:2:1:3] | passed | 0.
|
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.
|
137
|
-
./spec/aircana/generators/agents_generator_spec.rb[1:1:1] | passed | 0.
|
138
|
-
./spec/aircana/generators/agents_generator_spec.rb[1:2:1] | passed | 0.
|
139
|
-
./spec/aircana/generators/agents_generator_spec.rb[1:3:1:1] | passed | 0.
|
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.
|
144
|
-
./spec/aircana/generators/hooks_generator_spec.rb[1:3:1] | passed | 0.
|
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.
|
148
|
-
./spec/aircana/generators/hooks_generator_spec.rb[1:5:2:1] | passed | 0.
|
149
|
-
./spec/aircana/generators/hooks_generator_spec.rb[1:6:1] | passed | 0.
|
150
|
-
./spec/aircana/generators/hooks_generator_spec.rb[1:7:1] | passed | 0.
|
151
|
-
./spec/aircana/generators/plan_command_generator_spec.rb[1:1:1] | passed | 0.
|
152
|
-
./spec/aircana/generators/plan_command_generator_spec.rb[1:1:2] | passed | 0.
|
153
|
-
./spec/aircana/generators/plan_command_generator_spec.rb[1:1:3] | passed | 0.
|
154
|
-
./spec/aircana/generators/plan_command_generator_spec.rb[1:2:1] | passed | 0.
|
155
|
-
./spec/aircana/generators/plan_command_generator_spec.rb[1:2:2] | passed | 0.
|
156
|
-
./spec/aircana/generators/record_command_generator_spec.rb[1:1:1] | passed | 0.
|
157
|
-
./spec/aircana/generators/record_command_generator_spec.rb[1:2:1] | passed | 0.
|
158
|
-
./spec/aircana/generators/record_command_generator_spec.rb[1:2:2] | passed | 0.
|
159
|
-
./spec/aircana/human_logger_spec.rb[1:1:1] | passed | 0.
|
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.
|
164
|
-
./spec/aircana/human_logger_spec.rb[1:5:2] | passed | 0.
|
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.
|
171
|
-
./spec/aircana/llm/claude_client_spec.rb[1:1:1:1] | passed | 0.
|
172
|
-
./spec/aircana/llm/claude_client_spec.rb[1:1:1:2] | passed | 0.
|
173
|
-
./spec/aircana/llm/claude_client_spec.rb[1:1:1:3] | passed | 0.
|
174
|
-
./spec/aircana/llm/claude_client_spec.rb[1:1:1:4] | passed | 0.
|
175
|
-
./spec/aircana/llm/claude_client_spec.rb[1:1:2:1] | passed | 0.
|
176
|
-
./spec/aircana/llm/claude_client_spec.rb[1:1:2:2] | passed | 0.
|
177
|
-
./spec/aircana/llm/claude_client_spec.rb[1:1:3:1] | passed | 0.
|
178
|
-
./spec/aircana/llm/claude_client_spec.rb[1:2:1] | passed | 0.
|
179
|
-
./spec/aircana/llm/claude_client_spec.rb[1:2:2] | passed | 0.
|
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.
|
182
|
-
./spec/aircana/system_checker_spec.rb[1:1:1:1] | passed | 0.
|
183
|
-
./spec/aircana/system_checker_spec.rb[1:1:2:1] | passed | 0.
|
184
|
-
./spec/aircana/system_checker_spec.rb[1:1:3:1] | passed | 0.
|
185
|
-
./spec/aircana/system_checker_spec.rb[1:2:1] | passed | 0.
|
186
|
-
./spec/aircana/system_checker_spec.rb[1:2:2] | passed | 0.
|
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.
|
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.
|
191
|
-
./spec/aircana/system_checker_spec.rb[1:3:5] | passed | 0.
|
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.
|
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
|
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
|
16
|
-
-
|
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
|
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 -
|
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 -
|
48
|
-
"
|
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
|
193
|
-
|
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
|
-
|
282
|
-
|
283
|
-
|
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
|
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 "
|
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
|
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
|
-
#
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
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
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
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 "{}"
|
data/lib/aircana/version.rb
CHANGED
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
|
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-
|
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
|