aircana 3.1.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rspec_status +145 -145
- data/CHANGELOG.md +35 -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: 6c0014d44f55af9f319f672b8af4905b3a1b4821e1e1be16731605b58f61b533
|
4
|
+
data.tar.gz: a62bd7a4aa91061ed04661588b46ce011817f4cdc7357f1e7781147a3f697395
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0a5227735515c84823b372054176148c1a445b3e7867d02d10d18ba7de873bf2862d67f38ee7dab2ae3f423ec0da396c480793cf730841bd296f435c80352556
|
7
|
+
data.tar.gz: a4147026cb0fb6c699b8ae8164689edc32a990c296bb595edd08ba2317b7648d8cb4b1a038fdd9f848482ed9bb23bda2fbd3bb27c0d9dbff6aa3d52179a461b9
|
data/.rspec_status
CHANGED
@@ -1,115 +1,115 @@
|
|
1
1
|
example_id | status | run_time |
|
2
2
|
----------------------------------------------------------------- | ------ | --------------- |
|
3
|
-
./spec/aircana/cli/commands/agents_spec.rb[1:1:1:1] | passed | 0.
|
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.
|
3
|
+
./spec/aircana/cli/commands/agents_spec.rb[1:1:1:1] | passed | 0.00544 seconds |
|
4
|
+
./spec/aircana/cli/commands/agents_spec.rb[1:1:1:2] | passed | 0.00036 seconds |
|
5
|
+
./spec/aircana/cli/commands/agents_spec.rb[1:1:1:3] | passed | 0.00182 seconds |
|
6
|
+
./spec/aircana/cli/commands/agents_spec.rb[1:1:2:1] | passed | 0.00105 seconds |
|
7
|
+
./spec/aircana/cli/commands/agents_spec.rb[1:1:3:1] | passed | 0.00031 seconds |
|
8
|
+
./spec/aircana/cli/commands/agents_spec.rb[1:1:3:2] | passed | 0.00029 seconds |
|
9
|
+
./spec/aircana/cli/commands/agents_spec.rb[1:2:1:1] | passed | 0.00055 seconds |
|
10
|
+
./spec/aircana/cli/commands/agents_spec.rb[1:2:1:2] | passed | 0.00045 seconds |
|
11
|
+
./spec/aircana/cli/commands/agents_spec.rb[1:2:1:3:1] | passed | 0.00044 seconds |
|
12
|
+
./spec/aircana/cli/commands/agents_spec.rb[1:2:2:1] | passed | 0.00029 seconds |
|
13
|
+
./spec/aircana/cli/commands/agents_spec.rb[1:2:3:1] | passed | 0.00034 seconds |
|
14
|
+
./spec/aircana/cli/commands/agents_spec.rb[1:2:4:1] | passed | 0.00035 seconds |
|
15
|
+
./spec/aircana/cli/commands/agents_spec.rb[1:3:1] | passed | 0.00075 seconds |
|
16
|
+
./spec/aircana/cli/commands/agents_spec.rb[1:3:2] | passed | 0.00043 seconds |
|
17
|
+
./spec/aircana/cli/commands/agents_spec.rb[1:3:3] | passed | 0.00044 seconds |
|
18
|
+
./spec/aircana/cli/commands/agents_spec.rb[1:4:1] | passed | 0.00019 seconds |
|
19
19
|
./spec/aircana/cli/commands/agents_spec.rb[1:5:1:1] | passed | 0.0003 seconds |
|
20
|
-
./spec/aircana/cli/commands/agents_spec.rb[1:5:2:1] | passed | 0.
|
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.
|
20
|
+
./spec/aircana/cli/commands/agents_spec.rb[1:5:2:1] | passed | 0.00032 seconds |
|
21
|
+
./spec/aircana/cli/commands/agents_spec.rb[1:5:3:1] | passed | 0.00069 seconds |
|
22
|
+
./spec/aircana/cli/commands/agents_spec.rb[1:5:3:2] | passed | 0.00068 seconds |
|
23
|
+
./spec/aircana/cli/commands/agents_spec.rb[1:5:3:3] | passed | 0.00072 seconds |
|
24
|
+
./spec/aircana/cli/commands/hooks_spec.rb[1:1:1:1] | passed | 0.00224 seconds |
|
25
|
+
./spec/aircana/cli/commands/hooks_spec.rb[1:1:2:1:1] | passed | 0.0007 seconds |
|
26
|
+
./spec/aircana/cli/commands/hooks_spec.rb[1:1:2:2:1] | passed | 0.00113 seconds |
|
27
|
+
./spec/aircana/cli/commands/hooks_spec.rb[1:2:1:1] | passed | 0.00056 seconds |
|
28
|
+
./spec/aircana/cli/commands/hooks_spec.rb[1:2:2:1] | passed | 0.00081 seconds |
|
29
|
+
./spec/aircana/cli/commands/hooks_spec.rb[1:3:1:1] | passed | 0.0008 seconds |
|
30
|
+
./spec/aircana/cli/commands/hooks_spec.rb[1:3:2:1] | passed | 0.00114 seconds |
|
31
|
+
./spec/aircana/cli/commands/hooks_spec.rb[1:4:1] | passed | 0.00138 seconds |
|
32
32
|
./spec/aircana/cli/commands/hooks_spec.rb[1:4:2:1] | passed | 0.00121 seconds |
|
33
33
|
./spec/aircana/cli/commands/hooks_spec.rb[1:5:1:1] | passed | 0.00064 seconds |
|
34
|
-
./spec/aircana/cli/commands/hooks_spec.rb[1:5:2:1] | passed | 0.
|
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.
|
34
|
+
./spec/aircana/cli/commands/hooks_spec.rb[1:5:2:1] | passed | 0.00079 seconds |
|
35
|
+
./spec/aircana/cli/commands/hooks_spec.rb[1:5:3:1] | passed | 0.00076 seconds |
|
36
|
+
./spec/aircana/cli/commands/hooks_spec.rb[1:5:4:1] | passed | 0.0007 seconds |
|
37
|
+
./spec/aircana/cli/commands/hooks_spec.rb[1:6:1:1] | passed | 0.00052 seconds |
|
38
|
+
./spec/aircana/cli/commands/hooks_spec.rb[1:6:2:1] | passed | 0.00175 seconds |
|
39
|
+
./spec/aircana/cli/commands/hooks_spec.rb[1:7:1] | passed | 0.00055 seconds |
|
40
|
+
./spec/aircana/cli/commands/init_spec.rb[1:1:1] | passed | 0.00278 seconds |
|
41
|
+
./spec/aircana/cli/commands/init_spec.rb[1:1:2] | passed | 0.00515 seconds |
|
42
|
+
./spec/aircana/cli/commands/init_spec.rb[1:2:1:1] | passed | 0.005 seconds |
|
43
|
+
./spec/aircana/cli/commands/init_spec.rb[1:3:1] | passed | 0.0033 seconds |
|
44
|
+
./spec/aircana/cli/commands/init_spec.rb[1:3:2:1] | passed | 0.0028 seconds |
|
45
|
+
./spec/aircana/cli/commands/init_spec.rb[1:3:3:1] | passed | 0.00355 seconds |
|
46
|
+
./spec/aircana/cli/commands/init_spec.rb[1:3:4:1] | passed | 0.00376 seconds |
|
47
|
+
./spec/aircana/cli/commands/init_spec.rb[1:4:1] | passed | 0.00148 seconds |
|
48
|
+
./spec/aircana/cli/commands/init_spec.rb[1:4:2] | passed | 0.00135 seconds |
|
49
|
+
./spec/aircana/cli/commands/init_spec.rb[1:4:3] | passed | 0.00159 seconds |
|
50
|
+
./spec/aircana/cli/commands/init_spec.rb[1:4:4] | passed | 0.00295 seconds |
|
51
|
+
./spec/aircana/cli/commands/init_spec.rb[1:4:5] | passed | 0.00135 seconds |
|
52
|
+
./spec/aircana/cli/commands/init_spec.rb[1:5:1] | passed | 0.00363 seconds |
|
53
|
+
./spec/aircana/cli/commands/init_spec.rb[1:5:2] | passed | 0.00446 seconds |
|
54
|
+
./spec/aircana/cli/commands/init_spec.rb[1:5:3] | passed | 0.00464 seconds |
|
55
55
|
./spec/aircana/cli/commands/init_spec.rb[1:5:4] | passed | 0.00436 seconds |
|
56
|
-
./spec/aircana/configuration_spec.rb[1:1:1] | passed | 0.
|
56
|
+
./spec/aircana/configuration_spec.rb[1:1:1] | passed | 0.00019 seconds |
|
57
57
|
./spec/aircana/configuration_spec.rb[1:2:1] | passed | 0.00008 seconds |
|
58
58
|
./spec/aircana/configuration_spec.rb[1:3:1] | passed | 0.00007 seconds |
|
59
59
|
./spec/aircana/configuration_spec.rb[1:4:1] | passed | 0.00007 seconds |
|
60
60
|
./spec/aircana/configuration_spec.rb[1:5:1] | passed | 0.00007 seconds |
|
61
61
|
./spec/aircana/configuration_spec.rb[1:5:2] | passed | 0.00007 seconds |
|
62
|
-
./spec/aircana/configuration_spec.rb[1:6:1:1] | passed | 0.
|
63
|
-
./spec/aircana/configuration_spec.rb[1:6:2:1] | passed | 0.
|
64
|
-
./spec/aircana/configuration_spec.rb[1:6:3:1] | passed | 0.
|
62
|
+
./spec/aircana/configuration_spec.rb[1:6:1:1] | passed | 0.00023 seconds |
|
63
|
+
./spec/aircana/configuration_spec.rb[1:6:2:1] | passed | 0.0002 seconds |
|
64
|
+
./spec/aircana/configuration_spec.rb[1:6:3:1] | passed | 0.0002 seconds |
|
65
65
|
./spec/aircana/configuration_spec.rb[1:6:4:1] | passed | 0.00009 seconds |
|
66
|
-
./spec/aircana/contexts/confluence_spec.rb[1:1:1:1] | passed | 0.
|
66
|
+
./spec/aircana/contexts/confluence_spec.rb[1:1:1:1] | passed | 0.00206 seconds |
|
67
67
|
./spec/aircana/contexts/confluence_spec.rb[1:1:1:2] | passed | 0.00053 seconds |
|
68
|
-
./spec/aircana/contexts/confluence_spec.rb[1:1:1:3] | passed | 0.
|
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.
|
71
|
-
./spec/aircana/contexts/confluence_spec.rb[1:1:2:3] | passed | 0.
|
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.
|
86
|
-
./spec/aircana/contexts/manifest_spec.rb[1:3:1] | passed | 0.
|
68
|
+
./spec/aircana/contexts/confluence_spec.rb[1:1:1:3] | passed | 0.0013 seconds |
|
69
|
+
./spec/aircana/contexts/confluence_spec.rb[1:1:2:1] | passed | 0.00161 seconds |
|
70
|
+
./spec/aircana/contexts/confluence_spec.rb[1:1:2:2] | passed | 0.00018 seconds |
|
71
|
+
./spec/aircana/contexts/confluence_spec.rb[1:1:2:3] | passed | 0.00013 seconds |
|
72
|
+
./spec/aircana/contexts/confluence_spec.rb[1:1:3:1] | passed | 0.00031 seconds |
|
73
|
+
./spec/aircana/contexts/confluence_spec.rb[1:1:3:2] | passed | 0.00034 seconds |
|
74
|
+
./spec/aircana/contexts/local_spec.rb[1:1:1] | passed | 0.0013 seconds |
|
75
|
+
./spec/aircana/contexts/local_spec.rb[1:1:2] | passed | 0.00106 seconds |
|
76
|
+
./spec/aircana/contexts/local_spec.rb[1:1:3] | passed | 0.00137 seconds |
|
77
|
+
./spec/aircana/contexts/local_spec.rb[1:1:4] | passed | 0.00117 seconds |
|
78
|
+
./spec/aircana/contexts/local_spec.rb[1:1:5] | passed | 0.00121 seconds |
|
79
|
+
./spec/aircana/contexts/local_spec.rb[1:1:6] | passed | 0.00152 seconds |
|
80
|
+
./spec/aircana/contexts/local_spec.rb[1:1:7] | passed | 0.00208 seconds |
|
81
|
+
./spec/aircana/contexts/local_spec.rb[1:1:8] | passed | 0.00136 seconds |
|
82
|
+
./spec/aircana/contexts/manifest_spec.rb[1:1:1] | passed | 0.0013 seconds |
|
83
|
+
./spec/aircana/contexts/manifest_spec.rb[1:1:2] | passed | 0.00108 seconds |
|
84
|
+
./spec/aircana/contexts/manifest_spec.rb[1:2:1] | passed | 0.00118 seconds |
|
85
|
+
./spec/aircana/contexts/manifest_spec.rb[1:2:2] | passed | 0.00093 seconds |
|
86
|
+
./spec/aircana/contexts/manifest_spec.rb[1:3:1] | passed | 0.00107 seconds |
|
87
87
|
./spec/aircana/contexts/manifest_spec.rb[1:3:2] | passed | 0.00024 seconds |
|
88
|
-
./spec/aircana/contexts/manifest_spec.rb[1:3:3] | passed | 0.
|
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.
|
95
|
-
./spec/aircana/contexts/manifest_spec.rb[1:6:2] | passed | 0.
|
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.
|
100
|
-
./spec/aircana/contexts/manifest_spec.rb[1:6:7] | passed | 0.
|
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.
|
106
|
-
./spec/aircana/contexts/web_spec.rb[1:3:1:1] | passed | 0.
|
107
|
-
./spec/aircana/contexts/web_spec.rb[1:3:1:2] | passed | 0.
|
108
|
-
./spec/aircana/contexts/web_spec.rb[1:3:1:3] | passed | 0.
|
109
|
-
./spec/aircana/contexts/web_spec.rb[1:3:2:1] | passed | 0.
|
110
|
-
./spec/aircana/contexts/web_spec.rb[1:3:2:2] | passed | 0.
|
111
|
-
./spec/aircana/contexts/web_spec.rb[1:3:3:1] | passed | 0.
|
112
|
-
./spec/aircana/contexts/web_spec.rb[1:3:3:2] | passed | 0.
|
88
|
+
./spec/aircana/contexts/manifest_spec.rb[1:3:3] | passed | 0.00111 seconds |
|
89
|
+
./spec/aircana/contexts/manifest_spec.rb[1:3:4] | passed | 0.00116 seconds |
|
90
|
+
./spec/aircana/contexts/manifest_spec.rb[1:4:1] | passed | 0.00107 seconds |
|
91
|
+
./spec/aircana/contexts/manifest_spec.rb[1:4:2] | passed | 0.00021 seconds |
|
92
|
+
./spec/aircana/contexts/manifest_spec.rb[1:5:1] | passed | 0.00097 seconds |
|
93
|
+
./spec/aircana/contexts/manifest_spec.rb[1:5:2] | passed | 0.0002 seconds |
|
94
|
+
./spec/aircana/contexts/manifest_spec.rb[1:6:1] | passed | 0.00023 seconds |
|
95
|
+
./spec/aircana/contexts/manifest_spec.rb[1:6:2] | passed | 0.0002 seconds |
|
96
|
+
./spec/aircana/contexts/manifest_spec.rb[1:6:3] | passed | 0.00022 seconds |
|
97
|
+
./spec/aircana/contexts/manifest_spec.rb[1:6:4] | passed | 0.0002 seconds |
|
98
|
+
./spec/aircana/contexts/manifest_spec.rb[1:6:5] | passed | 0.00019 seconds |
|
99
|
+
./spec/aircana/contexts/manifest_spec.rb[1:6:6] | passed | 0.00035 seconds |
|
100
|
+
./spec/aircana/contexts/manifest_spec.rb[1:6:7] | passed | 0.00025 seconds |
|
101
|
+
./spec/aircana/contexts/manifest_spec.rb[1:6:8] | passed | 0.00104 seconds |
|
102
|
+
./spec/aircana/contexts/manifest_spec.rb[1:6:9] | passed | 0.00108 seconds |
|
103
|
+
./spec/aircana/contexts/manifest_spec.rb[1:6:10] | passed | 0.00441 seconds |
|
104
|
+
./spec/aircana/contexts/web_spec.rb[1:1:1] | passed | 0.00022 seconds |
|
105
|
+
./spec/aircana/contexts/web_spec.rb[1:2:1] | passed | 0.0002 seconds |
|
106
|
+
./spec/aircana/contexts/web_spec.rb[1:3:1:1] | passed | 0.00019 seconds |
|
107
|
+
./spec/aircana/contexts/web_spec.rb[1:3:1:2] | passed | 0.00018 seconds |
|
108
|
+
./spec/aircana/contexts/web_spec.rb[1:3:1:3] | passed | 0.00015 seconds |
|
109
|
+
./spec/aircana/contexts/web_spec.rb[1:3:2:1] | passed | 0.00016 seconds |
|
110
|
+
./spec/aircana/contexts/web_spec.rb[1:3:2:2] | passed | 0.00011 seconds |
|
111
|
+
./spec/aircana/contexts/web_spec.rb[1:3:3:1] | passed | 0.00017 seconds |
|
112
|
+
./spec/aircana/contexts/web_spec.rb[1:3:3:2] | passed | 0.00028 seconds |
|
113
113
|
./spec/aircana/contexts/web_spec.rb[1:3:3:3] | passed | 0.00022 seconds |
|
114
114
|
./spec/aircana/contexts/web_spec.rb[1:3:3:4] | passed | 0.00016 seconds |
|
115
115
|
./spec/aircana/contexts/web_spec.rb[1:3:3:5] | passed | 0.0002 seconds |
|
@@ -118,44 +118,44 @@ example_id | status | run
|
|
118
118
|
./spec/aircana/contexts/web_spec.rb[1:3:4:3] | passed | 0.00011 seconds |
|
119
119
|
./spec/aircana/contexts/web_spec.rb[1:3:5:1] | passed | 0.00037 seconds |
|
120
120
|
./spec/aircana/contexts/web_spec.rb[1:3:5:2] | passed | 0.0001 seconds |
|
121
|
-
./spec/aircana/contexts/web_spec.rb[1:3:5:3] | passed | 0.
|
122
|
-
./spec/aircana/contexts/web_spec.rb[1:3:6:1] | passed | 0.
|
123
|
-
./spec/aircana/contexts/web_spec.rb[1:3:6:2] | passed | 0.
|
121
|
+
./spec/aircana/contexts/web_spec.rb[1:3:5:3] | passed | 0.00026 seconds |
|
122
|
+
./spec/aircana/contexts/web_spec.rb[1:3:6:1] | passed | 0.00022 seconds |
|
123
|
+
./spec/aircana/contexts/web_spec.rb[1:3:6:2] | passed | 0.00021 seconds |
|
124
124
|
./spec/aircana/contexts/web_spec.rb[1:3:6:3] | passed | 0.00021 seconds |
|
125
125
|
./spec/aircana/contexts/web_spec.rb[1:3:7:1] | passed | 0.0001 seconds |
|
126
126
|
./spec/aircana/contexts/web_spec.rb[1:3:7:2] | passed | 0.0001 seconds |
|
127
127
|
./spec/aircana/fzf_helper_spec.rb[1:1:1:1] | passed | 0.00014 seconds |
|
128
128
|
./spec/aircana/fzf_helper_spec.rb[1:1:1:2] | passed | 0.00014 seconds |
|
129
|
-
./spec/aircana/fzf_helper_spec.rb[1:1:1:3] | passed | 0.
|
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.
|
135
|
-
./spec/aircana/fzf_helper_spec.rb[1:2:2:1] | passed | 0.
|
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.
|
129
|
+
./spec/aircana/fzf_helper_spec.rb[1:1:1:3] | passed | 0.00016 seconds |
|
130
|
+
./spec/aircana/fzf_helper_spec.rb[1:1:2:1] | passed | 0.00018 seconds |
|
131
|
+
./spec/aircana/fzf_helper_spec.rb[1:1:3:1] | passed | 0.00018 seconds |
|
132
|
+
./spec/aircana/fzf_helper_spec.rb[1:2:1:1] | passed | 0.0001 seconds |
|
133
|
+
./spec/aircana/fzf_helper_spec.rb[1:2:1:2] | passed | 0.0001 seconds |
|
134
|
+
./spec/aircana/fzf_helper_spec.rb[1:2:1:3] | passed | 0.0001 seconds |
|
135
|
+
./spec/aircana/fzf_helper_spec.rb[1:2:2:1] | passed | 0.00009 seconds |
|
136
|
+
./spec/aircana/fzf_helper_spec.rb[1:2:2:2] | passed | 0.00007 seconds |
|
137
|
+
./spec/aircana/generators/agents_generator_spec.rb[1:1:1] | passed | 0.00003 seconds |
|
138
|
+
./spec/aircana/generators/agents_generator_spec.rb[1:2:1] | passed | 0.00014 seconds |
|
139
|
+
./spec/aircana/generators/agents_generator_spec.rb[1:3:1:1] | passed | 0.00004 seconds |
|
140
140
|
./spec/aircana/generators/agents_generator_spec.rb[1:3:1:2] | passed | 0.00004 seconds |
|
141
141
|
./spec/aircana/generators/agents_generator_spec.rb[1:4:1:1] | passed | 0.00004 seconds |
|
142
142
|
./spec/aircana/generators/hooks_generator_spec.rb[1:1:1] | passed | 0.00003 seconds |
|
143
143
|
./spec/aircana/generators/hooks_generator_spec.rb[1:2:1] | passed | 0.00003 seconds |
|
144
|
-
./spec/aircana/generators/hooks_generator_spec.rb[1:3:1] | passed | 0.
|
145
|
-
./spec/aircana/generators/hooks_generator_spec.rb[1:3:2] | passed | 0.
|
146
|
-
./spec/aircana/generators/hooks_generator_spec.rb[1:4:1] | passed | 0.
|
147
|
-
./spec/aircana/generators/hooks_generator_spec.rb[1:5:1:1] | passed | 0.
|
144
|
+
./spec/aircana/generators/hooks_generator_spec.rb[1:3:1] | passed | 0.00033 seconds |
|
145
|
+
./spec/aircana/generators/hooks_generator_spec.rb[1:3:2] | passed | 0.00018 seconds |
|
146
|
+
./spec/aircana/generators/hooks_generator_spec.rb[1:4:1] | passed | 0.00009 seconds |
|
147
|
+
./spec/aircana/generators/hooks_generator_spec.rb[1:5:1:1] | passed | 0.00009 seconds |
|
148
148
|
./spec/aircana/generators/hooks_generator_spec.rb[1:5:2:1] | passed | 0.00003 seconds |
|
149
149
|
./spec/aircana/generators/hooks_generator_spec.rb[1:6:1] | passed | 0.00051 seconds |
|
150
|
-
./spec/aircana/generators/hooks_generator_spec.rb[1:7:1] | passed | 0.
|
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.
|
150
|
+
./spec/aircana/generators/hooks_generator_spec.rb[1:7:1] | passed | 0.00012 seconds |
|
151
|
+
./spec/aircana/generators/plan_command_generator_spec.rb[1:1:1] | passed | 0.00032 seconds |
|
152
|
+
./spec/aircana/generators/plan_command_generator_spec.rb[1:1:2] | passed | 0.00025 seconds |
|
153
|
+
./spec/aircana/generators/plan_command_generator_spec.rb[1:1:3] | passed | 0.00025 seconds |
|
154
|
+
./spec/aircana/generators/plan_command_generator_spec.rb[1:2:1] | passed | 0.00008 seconds |
|
155
155
|
./spec/aircana/generators/plan_command_generator_spec.rb[1:2:2] | passed | 0.00007 seconds |
|
156
|
-
./spec/aircana/generators/record_command_generator_spec.rb[1:1:1] | passed | 0.
|
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.
|
156
|
+
./spec/aircana/generators/record_command_generator_spec.rb[1:1:1] | passed | 0.00167 seconds |
|
157
|
+
./spec/aircana/generators/record_command_generator_spec.rb[1:2:1] | passed | 0.00079 seconds |
|
158
|
+
./spec/aircana/generators/record_command_generator_spec.rb[1:2:2] | passed | 0.00016 seconds |
|
159
159
|
./spec/aircana/human_logger_spec.rb[1:1:1] | passed | 0.00007 seconds |
|
160
160
|
./spec/aircana/human_logger_spec.rb[1:2:1] | passed | 0.00004 seconds |
|
161
161
|
./spec/aircana/human_logger_spec.rb[1:3:1] | passed | 0.00004 seconds |
|
@@ -166,28 +166,28 @@ example_id | status | run
|
|
166
166
|
./spec/aircana/human_logger_spec.rb[1:5:4] | passed | 0.00003 seconds |
|
167
167
|
./spec/aircana/human_logger_spec.rb[1:5:5] | passed | 0.00003 seconds |
|
168
168
|
./spec/aircana/human_logger_spec.rb[1:5:6] | passed | 0.00003 seconds |
|
169
|
-
./spec/aircana/human_logger_spec.rb[1:5:7] | passed | 0.
|
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.
|
169
|
+
./spec/aircana/human_logger_spec.rb[1:5:7] | passed | 0.00039 seconds |
|
170
|
+
./spec/aircana/human_logger_spec.rb[1:6:1] | passed | 0.00003 seconds |
|
171
|
+
./spec/aircana/llm/claude_client_spec.rb[1:1:1:1] | passed | 0.00046 seconds |
|
172
|
+
./spec/aircana/llm/claude_client_spec.rb[1:1:1:2] | passed | 0.00035 seconds |
|
173
|
+
./spec/aircana/llm/claude_client_spec.rb[1:1:1:3] | passed | 0.00039 seconds |
|
174
|
+
./spec/aircana/llm/claude_client_spec.rb[1:1:1:4] | passed | 0.00031 seconds |
|
175
175
|
./spec/aircana/llm/claude_client_spec.rb[1:1:2:1] | passed | 0.00034 seconds |
|
176
|
-
./spec/aircana/llm/claude_client_spec.rb[1:1:2:2] | passed | 0.
|
176
|
+
./spec/aircana/llm/claude_client_spec.rb[1:1:2:2] | passed | 0.0004 seconds |
|
177
177
|
./spec/aircana/llm/claude_client_spec.rb[1:1:3:1] | passed | 0.00033 seconds |
|
178
178
|
./spec/aircana/llm/claude_client_spec.rb[1:2:1] | passed | 0.0003 seconds |
|
179
|
-
./spec/aircana/llm/claude_client_spec.rb[1:2:2] | passed | 0.
|
180
|
-
./spec/aircana/llm/claude_client_spec.rb[1:3:1:1] | passed | 0.
|
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.
|
187
|
-
./spec/aircana/system_checker_spec.rb[1:3:1] | passed | 0.
|
188
|
-
./spec/aircana/system_checker_spec.rb[1:3:2] | passed | 0.
|
189
|
-
./spec/aircana/system_checker_spec.rb[1:3:3] | passed | 0.
|
190
|
-
./spec/aircana/system_checker_spec.rb[1:3:4] | passed | 0.
|
191
|
-
./spec/aircana/system_checker_spec.rb[1:3:5] | passed | 0.
|
179
|
+
./spec/aircana/llm/claude_client_spec.rb[1:2:2] | passed | 0.00039 seconds |
|
180
|
+
./spec/aircana/llm/claude_client_spec.rb[1:3:1:1] | passed | 0.00022 seconds |
|
181
|
+
./spec/aircana/llm/claude_client_spec.rb[1:3:1:2] | passed | 0.00021 seconds |
|
182
|
+
./spec/aircana/system_checker_spec.rb[1:1:1:1] | passed | 0.0003 seconds |
|
183
|
+
./spec/aircana/system_checker_spec.rb[1:1:2:1] | passed | 0.00049 seconds |
|
184
|
+
./spec/aircana/system_checker_spec.rb[1:1:3:1] | passed | 0.00075 seconds |
|
185
|
+
./spec/aircana/system_checker_spec.rb[1:2:1] | passed | 0.00024 seconds |
|
186
|
+
./spec/aircana/system_checker_spec.rb[1:2:2] | passed | 0.00021 seconds |
|
187
|
+
./spec/aircana/system_checker_spec.rb[1:3:1] | passed | 0.00021 seconds |
|
188
|
+
./spec/aircana/system_checker_spec.rb[1:3:2] | passed | 0.00021 seconds |
|
189
|
+
./spec/aircana/system_checker_spec.rb[1:3:3] | passed | 0.00024 seconds |
|
190
|
+
./spec/aircana/system_checker_spec.rb[1:3:4] | passed | 0.00028 seconds |
|
191
|
+
./spec/aircana/system_checker_spec.rb[1:3:5] | passed | 0.00017 seconds |
|
192
192
|
./spec/aircana_spec.rb[1:1] | passed | 0.00003 seconds |
|
193
|
-
./spec/aircana_spec.rb[1:2] | passed | 0.
|
193
|
+
./spec/aircana_spec.rb[1:2] | passed | 0.0008 seconds |
|
data/CHANGELOG.md
CHANGED
@@ -7,25 +7,56 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
7
7
|
|
8
8
|
## [Unreleased]
|
9
9
|
|
10
|
-
## [3.
|
10
|
+
## [3.2.0] - 2025-01-16
|
11
|
+
|
12
|
+
### Added
|
13
|
+
- SessionStart hook automatically syncs local knowledge bases to `~/.claude/agents/` on session start
|
14
|
+
- Compatible with macOS and Linux
|
15
|
+
- Only syncs agents with `kb_type: "local"` in manifest
|
16
|
+
- Uses rsync when available, falls back to cp
|
17
|
+
- Logs sync operations to `~/.aircana/hooks.log`
|
18
|
+
- Smart .gitignore management
|
19
|
+
- Remote agents: Adds `.claude/agents/*/knowledge/` to .gitignore
|
20
|
+
- Local agents: Adds `!agents/*/knowledge/` negation to ensure version control
|
21
|
+
|
22
|
+
### Changed
|
23
|
+
- Local knowledge bases now stored in version-controlled `agents/<name>/knowledge/` directory
|
24
|
+
- Local knowledge auto-synced to `~/.claude/agents/<plugin>-<agent>/knowledge/` via SessionStart hook
|
25
|
+
- Both local and remote agents use consistent runtime path: `~/.claude/agents/<plugin>-<agent>/knowledge/`
|
26
|
+
- Updated CLI prompts to accurately describe sync behavior for local agents
|
27
|
+
- Migration warnings updated to reflect new local knowledge sync architecture
|
28
|
+
|
29
|
+
### Fixed
|
30
|
+
- Local and remote agents now use consistent runtime path in agent file definitions
|
31
|
+
|
32
|
+
## [3.1.0] - 2025-01-16
|
11
33
|
|
12
34
|
### Added
|
13
35
|
- Optional local knowledge base storage for agents
|
14
36
|
- New `kb_type` field in agent manifests ("remote" or "local")
|
15
|
-
- Local knowledge bases
|
16
|
-
-
|
37
|
+
- Local knowledge bases version-controlled in `agents/<name>/knowledge/` directory
|
38
|
+
- Auto-synced to `~/.claude/agents/<plugin>-<agent>/knowledge/` via SessionStart hook
|
39
|
+
- Remote knowledge bases fetched from Confluence/web to `~/.claude/agents/` (not version controlled)
|
17
40
|
- Agent creation wizard prompts for knowledge base type with explanation
|
18
41
|
- Refresh commands automatically skip local knowledge base agents
|
19
42
|
- Existing agents without `kb_type` field default to "remote" for backward compatibility
|
43
|
+
- SessionStart hook automatically syncs local knowledge bases to `~/.claude/agents/` on session start
|
44
|
+
- Compatible with macOS and Linux
|
45
|
+
- Only syncs agents with `kb_type: "local"` in manifest
|
46
|
+
- Uses rsync when available, falls back to cp
|
47
|
+
- Logs sync operations to `~/.aircana/hooks.log`
|
20
48
|
- Migration command: `aircana agents migrate-to-local`
|
21
49
|
- Migrates remote knowledge bases to local (version-controlled) storage
|
22
50
|
- Automatically refreshes knowledge from sources before migration
|
23
51
|
- Copies knowledge files from global to local directory
|
24
52
|
- Updates manifests and regenerates agent files with correct paths
|
25
53
|
- Provides detailed migration summary
|
54
|
+
- Smart .gitignore management
|
55
|
+
- Remote agents: Adds `.claude/agents/*/knowledge/` to .gitignore
|
56
|
+
- Local agents: Adds `!agents/*/knowledge/` negation to ensure version control
|
26
57
|
|
27
58
|
### Fixed
|
28
|
-
- Local
|
59
|
+
- Local and remote agents now use consistent runtime path: `~/.claude/agents/<plugin>-<agent>/knowledge/`
|
29
60
|
- Rubocop linting violations
|
30
61
|
- Fixed line length issues with string concatenation
|
31
62
|
- Added appropriate Metrics exclusions for complex CLI command methods
|
@@ -39,13 +39,13 @@ module Aircana
|
|
39
39
|
# Prompt for knowledge base type
|
40
40
|
kb_type = prompt.select("Knowledge base type:", [
|
41
41
|
{
|
42
|
-
name: "Remote -
|
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" => "./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.
|
4
|
+
version: 3.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Weston Dransfield
|
8
8
|
bindir: exe
|
9
9
|
cert_chain: []
|
10
|
-
date: 2025-10-
|
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
|