aircana 3.0.0.rc3 → 3.0.0.rc4
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/.claude-plugin/plugin.json +3 -1
- data/.rspec_status +161 -160
- data/CLAUDE.md +2 -1
- data/README.md +61 -27
- data/lib/aircana/cli/commands/init.rb +26 -9
- data/lib/aircana/cli/commands/plugin.rb +32 -3
- data/lib/aircana/configuration.rb +2 -1
- data/lib/aircana/generators/apply_feedback_command_generator.rb +1 -1
- data/lib/aircana/generators/ask_expert_command_generator.rb +1 -1
- data/lib/aircana/generators/execute_command_generator.rb +1 -1
- data/lib/aircana/generators/hooks_generator.rb +2 -2
- data/lib/aircana/generators/plan_command_generator.rb +1 -1
- data/lib/aircana/generators/record_command_generator.rb +1 -1
- data/lib/aircana/generators/review_command_generator.rb +1 -1
- data/lib/aircana/plugin_manifest.rb +34 -4
- data/lib/aircana/templates/agents/defaults/apply_feedback.erb +1 -1
- data/lib/aircana/templates/agents/defaults/executor.erb +1 -1
- data/lib/aircana/templates/agents/defaults/planner.erb +1 -1
- data/lib/aircana/templates/agents/defaults/reviewer.erb +2 -2
- data/lib/aircana/templates/commands/apply_feedback.erb +2 -2
- data/lib/aircana/templates/commands/plan.erb +1 -1
- data/lib/aircana/templates/commands/review.erb +1 -1
- data/lib/aircana/version.rb +1 -1
- metadata +7 -8
- data/commands/sample-command.md +0 -1
- /data/commands/{air-apply-feedback.md → apply-feedback.md} +0 -0
- /data/commands/{air-ask-expert.md → ask-expert.md} +0 -0
- /data/commands/{air-execute.md → execute.md} +0 -0
- /data/commands/{air-plan.md → plan.md} +0 -0
- /data/commands/{air-record.md → record.md} +0 -0
- /data/commands/{air-review.md → review.md} +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2c3bc781de2f628c118ca9644bd48986b72ce070aa76602d6a3141e9d867dc4c
|
4
|
+
data.tar.gz: b16ce2a538c5cf4ad66f7bc900287aa448fb67735b7cbf17e96420a1e61f6c37
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 131b30cae8937bb4f983674bebf948ac185fc8f66da3f065f5e215d8fe8ce3ee89c3d59617c0704fcca5703680dae854c2434d21c95399750b410a4848f258c6
|
7
|
+
data.tar.gz: 5080f433908496ccba7009eaa946050ceb18409fd4460942c7c5b97bef2598cbdb4c8bc117e0957b3e3a3c6137fb1722ff3325a1a9dfdc6069047ee335ef218d
|
data/.claude-plugin/plugin.json
CHANGED
data/.rspec_status
CHANGED
@@ -1,160 +1,161 @@
|
|
1
1
|
example_id | status | run_time |
|
2
2
|
----------------------------------------------------------------- | ------ | --------------- |
|
3
|
-
./spec/aircana/cli/commands/agents_spec.rb[1:1:1:1] | passed | 0.
|
3
|
+
./spec/aircana/cli/commands/agents_spec.rb[1:1:1:1] | passed | 0.0042 seconds |
|
4
4
|
./spec/aircana/cli/commands/agents_spec.rb[1:1:1:2] | passed | 0.00055 seconds |
|
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.
|
5
|
+
./spec/aircana/cli/commands/agents_spec.rb[1:1:1:3] | passed | 0.00052 seconds |
|
6
|
+
./spec/aircana/cli/commands/agents_spec.rb[1:1:2:1] | passed | 0.00092 seconds |
|
7
|
+
./spec/aircana/cli/commands/agents_spec.rb[1:1:3:1] | passed | 0.0005 seconds |
|
8
|
+
./spec/aircana/cli/commands/agents_spec.rb[1:1:3:2] | passed | 0.0004 seconds |
|
9
|
+
./spec/aircana/cli/commands/agents_spec.rb[1:2:1:1] | passed | 0.00064 seconds |
|
10
|
+
./spec/aircana/cli/commands/agents_spec.rb[1:2:1:2] | passed | 0.00065 seconds |
|
11
|
+
./spec/aircana/cli/commands/agents_spec.rb[1:2:1:3:1] | passed | 0.00062 seconds |
|
12
|
+
./spec/aircana/cli/commands/agents_spec.rb[1:2:2:1] | passed | 0.00045 seconds |
|
13
|
+
./spec/aircana/cli/commands/agents_spec.rb[1:2:3:1] | passed | 0.00046 seconds |
|
14
|
+
./spec/aircana/cli/commands/agents_spec.rb[1:2:4:1] | passed | 0.00049 seconds |
|
15
|
+
./spec/aircana/cli/commands/agents_spec.rb[1:3:1] | passed | 0.00083 seconds |
|
16
|
+
./spec/aircana/cli/commands/agents_spec.rb[1:3:2] | passed | 0.00063 seconds |
|
17
|
+
./spec/aircana/cli/commands/agents_spec.rb[1:3:3] | passed | 0.00062 seconds |
|
18
|
+
./spec/aircana/cli/commands/agents_spec.rb[1:4:1] | passed | 0.00027 seconds |
|
19
|
+
./spec/aircana/cli/commands/agents_spec.rb[1:5:1:1] | passed | 0.00045 seconds |
|
20
|
+
./spec/aircana/cli/commands/agents_spec.rb[1:5:2:1] | passed | 0.00814 seconds |
|
21
|
+
./spec/aircana/cli/commands/agents_spec.rb[1:5:3:1] | passed | 0.00155 seconds |
|
22
|
+
./spec/aircana/cli/commands/agents_spec.rb[1:5:3:2] | passed | 0.00122 seconds |
|
23
|
+
./spec/aircana/cli/commands/agents_spec.rb[1:5:3:3] | passed | 0.00119 seconds |
|
24
|
+
./spec/aircana/cli/commands/hooks_spec.rb[1:1:1:1] | passed | 0.00075 seconds |
|
25
25
|
./spec/aircana/cli/commands/hooks_spec.rb[1:1:2:1:1] | passed | 0.00077 seconds |
|
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.
|
26
|
+
./spec/aircana/cli/commands/hooks_spec.rb[1:1:2:2:1] | passed | 0.00073 seconds |
|
27
|
+
./spec/aircana/cli/commands/hooks_spec.rb[1:2:1:1] | passed | 0.00065 seconds |
|
28
|
+
./spec/aircana/cli/commands/hooks_spec.rb[1:2:2:1] | passed | 0.00092 seconds |
|
29
|
+
./spec/aircana/cli/commands/hooks_spec.rb[1:3:1:1] | passed | 0.00056 seconds |
|
30
|
+
./spec/aircana/cli/commands/hooks_spec.rb[1:3:2:1] | passed | 0.00107 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.00115 seconds |
|
33
|
+
./spec/aircana/cli/commands/hooks_spec.rb[1:5:1:1] | passed | 0.00047 seconds |
|
34
|
+
./spec/aircana/cli/commands/hooks_spec.rb[1:5:2:1] | passed | 0.00052 seconds |
|
35
|
+
./spec/aircana/cli/commands/hooks_spec.rb[1:5:3:1] | passed | 0.00056 seconds |
|
36
|
+
./spec/aircana/cli/commands/hooks_spec.rb[1:5:4:1] | passed | 0.00052 seconds |
|
37
|
+
./spec/aircana/cli/commands/hooks_spec.rb[1:6:1:1] | passed | 0.00044 seconds |
|
38
|
+
./spec/aircana/cli/commands/hooks_spec.rb[1:6:2:1] | passed | 0.00128 seconds |
|
39
39
|
./spec/aircana/cli/commands/hooks_spec.rb[1:7:1] | passed | 0.00043 seconds |
|
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.
|
57
|
-
./spec/aircana/configuration_spec.rb[1:2:1] | passed | 0.
|
58
|
-
./spec/aircana/configuration_spec.rb[1:3:1] | passed | 0.
|
59
|
-
./spec/aircana/configuration_spec.rb[1:4:1] | passed | 0.
|
60
|
-
./spec/aircana/configuration_spec.rb[1:
|
61
|
-
./spec/aircana/
|
62
|
-
./spec/aircana/contexts/confluence_spec.rb[1:1:1:
|
63
|
-
./spec/aircana/contexts/confluence_spec.rb[1:1:1:
|
64
|
-
./spec/aircana/contexts/confluence_spec.rb[1:1:
|
65
|
-
./spec/aircana/contexts/confluence_spec.rb[1:1:2:
|
66
|
-
./spec/aircana/contexts/confluence_spec.rb[1:1:2:
|
67
|
-
./spec/aircana/contexts/confluence_spec.rb[1:1:3
|
68
|
-
./spec/aircana/contexts/confluence_spec.rb[1:1:3:
|
69
|
-
./spec/aircana/contexts/
|
70
|
-
./spec/aircana/contexts/local_spec.rb[1:1:
|
71
|
-
./spec/aircana/contexts/local_spec.rb[1:1:
|
72
|
-
./spec/aircana/contexts/local_spec.rb[1:1:
|
73
|
-
./spec/aircana/contexts/local_spec.rb[1:1:
|
74
|
-
./spec/aircana/contexts/local_spec.rb[1:1:
|
75
|
-
./spec/aircana/contexts/local_spec.rb[1:1:
|
76
|
-
./spec/aircana/contexts/local_spec.rb[1:1:
|
77
|
-
./spec/aircana/contexts/
|
78
|
-
./spec/aircana/contexts/manifest_spec.rb[1:1:
|
79
|
-
./spec/aircana/contexts/manifest_spec.rb[1:2
|
80
|
-
./spec/aircana/contexts/manifest_spec.rb[1:2:
|
81
|
-
./spec/aircana/contexts/manifest_spec.rb[1:
|
82
|
-
./spec/aircana/contexts/manifest_spec.rb[1:3:
|
83
|
-
./spec/aircana/contexts/manifest_spec.rb[1:3:
|
84
|
-
./spec/aircana/contexts/manifest_spec.rb[1:3:
|
85
|
-
./spec/aircana/contexts/manifest_spec.rb[1:4
|
86
|
-
./spec/aircana/contexts/manifest_spec.rb[1:4:
|
87
|
-
./spec/aircana/contexts/manifest_spec.rb[1:
|
88
|
-
./spec/aircana/contexts/manifest_spec.rb[1:5:
|
89
|
-
./spec/aircana/contexts/manifest_spec.rb[1:
|
90
|
-
./spec/aircana/contexts/manifest_spec.rb[1:6:
|
91
|
-
./spec/aircana/contexts/manifest_spec.rb[1:6:
|
92
|
-
./spec/aircana/contexts/manifest_spec.rb[1:6:
|
93
|
-
./spec/aircana/contexts/manifest_spec.rb[1:6:
|
94
|
-
./spec/aircana/contexts/manifest_spec.rb[1:6:
|
95
|
-
./spec/aircana/contexts/manifest_spec.rb[1:6:
|
96
|
-
./spec/aircana/contexts/manifest_spec.rb[1:6:
|
97
|
-
./spec/aircana/contexts/manifest_spec.rb[1:6:
|
98
|
-
./spec/aircana/contexts/manifest_spec.rb[1:6:
|
99
|
-
./spec/aircana/contexts/
|
100
|
-
./spec/aircana/contexts/web_spec.rb[1:
|
101
|
-
./spec/aircana/contexts/web_spec.rb[1:
|
102
|
-
./spec/aircana/contexts/web_spec.rb[1:3:1:
|
103
|
-
./spec/aircana/contexts/web_spec.rb[1:3:1:
|
104
|
-
./spec/aircana/contexts/web_spec.rb[1:3:
|
105
|
-
./spec/aircana/contexts/web_spec.rb[1:3:2:
|
106
|
-
./spec/aircana/contexts/web_spec.rb[1:3:
|
107
|
-
./spec/aircana/contexts/web_spec.rb[1:3:3:
|
108
|
-
./spec/aircana/contexts/web_spec.rb[1:3:3:
|
109
|
-
./spec/aircana/contexts/web_spec.rb[1:3:3:
|
110
|
-
./spec/aircana/contexts/web_spec.rb[1:3:3:
|
111
|
-
./spec/aircana/contexts/web_spec.rb[1:3:
|
112
|
-
./spec/aircana/contexts/web_spec.rb[1:3:4:
|
113
|
-
./spec/aircana/contexts/web_spec.rb[1:3:4:
|
114
|
-
./spec/aircana/contexts/web_spec.rb[1:3:
|
115
|
-
./spec/aircana/contexts/web_spec.rb[1:3:5:
|
116
|
-
./spec/aircana/contexts/web_spec.rb[1:3:5:
|
117
|
-
./spec/aircana/contexts/web_spec.rb[1:3:
|
118
|
-
./spec/aircana/contexts/web_spec.rb[1:3:6:
|
119
|
-
./spec/aircana/contexts/web_spec.rb[1:3:6:
|
120
|
-
./spec/aircana/contexts/web_spec.rb[1:3:
|
40
|
+
./spec/aircana/cli/commands/init_spec.rb[1:1:1] | passed | 0.00203 seconds |
|
41
|
+
./spec/aircana/cli/commands/init_spec.rb[1:1:2] | passed | 0.00939 seconds |
|
42
|
+
./spec/aircana/cli/commands/init_spec.rb[1:2:1:1] | passed | 0.00328 seconds |
|
43
|
+
./spec/aircana/cli/commands/init_spec.rb[1:3:1] | passed | 0.00147 seconds |
|
44
|
+
./spec/aircana/cli/commands/init_spec.rb[1:3:2:1] | passed | 0.0013 seconds |
|
45
|
+
./spec/aircana/cli/commands/init_spec.rb[1:3:3:1] | passed | 0.00121 seconds |
|
46
|
+
./spec/aircana/cli/commands/init_spec.rb[1:3:4:1] | passed | 0.00139 seconds |
|
47
|
+
./spec/aircana/cli/commands/init_spec.rb[1:4:1] | passed | 0.0009 seconds |
|
48
|
+
./spec/aircana/cli/commands/init_spec.rb[1:4:2] | passed | 0.00101 seconds |
|
49
|
+
./spec/aircana/cli/commands/init_spec.rb[1:4:3] | passed | 0.00092 seconds |
|
50
|
+
./spec/aircana/cli/commands/init_spec.rb[1:4:4] | passed | 0.00091 seconds |
|
51
|
+
./spec/aircana/cli/commands/init_spec.rb[1:4:5] | passed | 0.00087 seconds |
|
52
|
+
./spec/aircana/cli/commands/init_spec.rb[1:5:1] | passed | 0.00179 seconds |
|
53
|
+
./spec/aircana/cli/commands/init_spec.rb[1:5:2] | passed | 0.00727 seconds |
|
54
|
+
./spec/aircana/cli/commands/init_spec.rb[1:5:3] | passed | 0.00299 seconds |
|
55
|
+
./spec/aircana/cli/commands/init_spec.rb[1:5:4] | passed | 0.00212 seconds |
|
56
|
+
./spec/aircana/configuration_spec.rb[1:1:1] | passed | 0.00023 seconds |
|
57
|
+
./spec/aircana/configuration_spec.rb[1:2:1] | passed | 0.00017 seconds |
|
58
|
+
./spec/aircana/configuration_spec.rb[1:3:1] | passed | 0.00007 seconds |
|
59
|
+
./spec/aircana/configuration_spec.rb[1:4:1] | passed | 0.00005 seconds |
|
60
|
+
./spec/aircana/configuration_spec.rb[1:5:1] | passed | 0.00005 seconds |
|
61
|
+
./spec/aircana/configuration_spec.rb[1:5:2] | passed | 0.00005 seconds |
|
62
|
+
./spec/aircana/contexts/confluence_spec.rb[1:1:1:1] | passed | 0.0023 seconds |
|
63
|
+
./spec/aircana/contexts/confluence_spec.rb[1:1:1:2] | passed | 0.00057 seconds |
|
64
|
+
./spec/aircana/contexts/confluence_spec.rb[1:1:1:3] | passed | 0.00114 seconds |
|
65
|
+
./spec/aircana/contexts/confluence_spec.rb[1:1:2:1] | passed | 0.00036 seconds |
|
66
|
+
./spec/aircana/contexts/confluence_spec.rb[1:1:2:2] | passed | 0.00018 seconds |
|
67
|
+
./spec/aircana/contexts/confluence_spec.rb[1:1:2:3] | passed | 0.00017 seconds |
|
68
|
+
./spec/aircana/contexts/confluence_spec.rb[1:1:3:1] | passed | 0.00045 seconds |
|
69
|
+
./spec/aircana/contexts/confluence_spec.rb[1:1:3:2] | passed | 0.00328 seconds |
|
70
|
+
./spec/aircana/contexts/local_spec.rb[1:1:1] | passed | 0.00108 seconds |
|
71
|
+
./spec/aircana/contexts/local_spec.rb[1:1:2] | passed | 0.00021 seconds |
|
72
|
+
./spec/aircana/contexts/local_spec.rb[1:1:3] | passed | 0.00019 seconds |
|
73
|
+
./spec/aircana/contexts/local_spec.rb[1:1:4] | passed | 0.00067 seconds |
|
74
|
+
./spec/aircana/contexts/local_spec.rb[1:1:5] | passed | 0.00047 seconds |
|
75
|
+
./spec/aircana/contexts/local_spec.rb[1:1:6] | passed | 0.00075 seconds |
|
76
|
+
./spec/aircana/contexts/local_spec.rb[1:1:7] | passed | 0.00083 seconds |
|
77
|
+
./spec/aircana/contexts/local_spec.rb[1:1:8] | passed | 0.00117 seconds |
|
78
|
+
./spec/aircana/contexts/manifest_spec.rb[1:1:1] | passed | 0.00078 seconds |
|
79
|
+
./spec/aircana/contexts/manifest_spec.rb[1:1:2] | passed | 0.00088 seconds |
|
80
|
+
./spec/aircana/contexts/manifest_spec.rb[1:2:1] | passed | 0.00069 seconds |
|
81
|
+
./spec/aircana/contexts/manifest_spec.rb[1:2:2] | passed | 0.00059 seconds |
|
82
|
+
./spec/aircana/contexts/manifest_spec.rb[1:3:1] | passed | 0.00062 seconds |
|
83
|
+
./spec/aircana/contexts/manifest_spec.rb[1:3:2] | passed | 0.00044 seconds |
|
84
|
+
./spec/aircana/contexts/manifest_spec.rb[1:3:3] | passed | 0.00018 seconds |
|
85
|
+
./spec/aircana/contexts/manifest_spec.rb[1:3:4] | passed | 0.00101 seconds |
|
86
|
+
./spec/aircana/contexts/manifest_spec.rb[1:4:1] | passed | 0.00019 seconds |
|
87
|
+
./spec/aircana/contexts/manifest_spec.rb[1:4:2] | passed | 0.00009 seconds |
|
88
|
+
./spec/aircana/contexts/manifest_spec.rb[1:5:1] | passed | 0.00142 seconds |
|
89
|
+
./spec/aircana/contexts/manifest_spec.rb[1:5:2] | passed | 0.00009 seconds |
|
90
|
+
./spec/aircana/contexts/manifest_spec.rb[1:6:1] | passed | 0.00011 seconds |
|
91
|
+
./spec/aircana/contexts/manifest_spec.rb[1:6:2] | passed | 0.00139 seconds |
|
92
|
+
./spec/aircana/contexts/manifest_spec.rb[1:6:3] | passed | 0.00013 seconds |
|
93
|
+
./spec/aircana/contexts/manifest_spec.rb[1:6:4] | passed | 0.0001 seconds |
|
94
|
+
./spec/aircana/contexts/manifest_spec.rb[1:6:5] | passed | 0.0001 seconds |
|
95
|
+
./spec/aircana/contexts/manifest_spec.rb[1:6:6] | passed | 0.00009 seconds |
|
96
|
+
./spec/aircana/contexts/manifest_spec.rb[1:6:7] | passed | 0.0005 seconds |
|
97
|
+
./spec/aircana/contexts/manifest_spec.rb[1:6:8] | passed | 0.00043 seconds |
|
98
|
+
./spec/aircana/contexts/manifest_spec.rb[1:6:9] | passed | 0.00017 seconds |
|
99
|
+
./spec/aircana/contexts/manifest_spec.rb[1:6:10] | passed | 0.00126 seconds |
|
100
|
+
./spec/aircana/contexts/web_spec.rb[1:1:1] | passed | 0.00027 seconds |
|
101
|
+
./spec/aircana/contexts/web_spec.rb[1:2:1] | passed | 0.00027 seconds |
|
102
|
+
./spec/aircana/contexts/web_spec.rb[1:3:1:1] | passed | 0.00016 seconds |
|
103
|
+
./spec/aircana/contexts/web_spec.rb[1:3:1:2] | passed | 0.00015 seconds |
|
104
|
+
./spec/aircana/contexts/web_spec.rb[1:3:1:3] | passed | 0.00014 seconds |
|
105
|
+
./spec/aircana/contexts/web_spec.rb[1:3:2:1] | passed | 0.00059 seconds |
|
106
|
+
./spec/aircana/contexts/web_spec.rb[1:3:2:2] | passed | 0.00016 seconds |
|
107
|
+
./spec/aircana/contexts/web_spec.rb[1:3:3:1] | passed | 0.00023 seconds |
|
108
|
+
./spec/aircana/contexts/web_spec.rb[1:3:3:2] | passed | 0.00038 seconds |
|
109
|
+
./spec/aircana/contexts/web_spec.rb[1:3:3:3] | passed | 0.00058 seconds |
|
110
|
+
./spec/aircana/contexts/web_spec.rb[1:3:3:4] | passed | 0.00023 seconds |
|
111
|
+
./spec/aircana/contexts/web_spec.rb[1:3:3:5] | passed | 0.00031 seconds |
|
112
|
+
./spec/aircana/contexts/web_spec.rb[1:3:4:1] | passed | 0.00023 seconds |
|
113
|
+
./spec/aircana/contexts/web_spec.rb[1:3:4:2] | passed | 0.00022 seconds |
|
114
|
+
./spec/aircana/contexts/web_spec.rb[1:3:4:3] | passed | 0.00019 seconds |
|
115
|
+
./spec/aircana/contexts/web_spec.rb[1:3:5:1] | passed | 0.00086 seconds |
|
116
|
+
./spec/aircana/contexts/web_spec.rb[1:3:5:2] | passed | 0.00017 seconds |
|
117
|
+
./spec/aircana/contexts/web_spec.rb[1:3:5:3] | passed | 0.00037 seconds |
|
118
|
+
./spec/aircana/contexts/web_spec.rb[1:3:6:1] | passed | 0.0003 seconds |
|
119
|
+
./spec/aircana/contexts/web_spec.rb[1:3:6:2] | passed | 0.00029 seconds |
|
120
|
+
./spec/aircana/contexts/web_spec.rb[1:3:6:3] | passed | 0.00028 seconds |
|
121
|
+
./spec/aircana/contexts/web_spec.rb[1:3:7:1] | passed | 0.0003 seconds |
|
121
122
|
./spec/aircana/contexts/web_spec.rb[1:3:7:2] | passed | 0.00014 seconds |
|
122
|
-
./spec/aircana/fzf_helper_spec.rb[1:1:1:1] | passed | 0.
|
123
|
-
./spec/aircana/fzf_helper_spec.rb[1:1:1:2] | passed | 0.
|
123
|
+
./spec/aircana/fzf_helper_spec.rb[1:1:1:1] | passed | 0.00021 seconds |
|
124
|
+
./spec/aircana/fzf_helper_spec.rb[1:1:1:2] | passed | 0.0002 seconds |
|
124
125
|
./spec/aircana/fzf_helper_spec.rb[1:1:1:3] | passed | 0.00024 seconds |
|
125
|
-
./spec/aircana/fzf_helper_spec.rb[1:1:2:1] | passed | 0.
|
126
|
-
./spec/aircana/fzf_helper_spec.rb[1:1:3:1] | passed | 0.
|
127
|
-
./spec/aircana/fzf_helper_spec.rb[1:2:1:1] | passed | 0.
|
128
|
-
./spec/aircana/fzf_helper_spec.rb[1:2:1:2] | passed | 0.
|
129
|
-
./spec/aircana/fzf_helper_spec.rb[1:2:1:3] | passed | 0.
|
130
|
-
./spec/aircana/fzf_helper_spec.rb[1:2:2:1] | passed | 0.
|
131
|
-
./spec/aircana/fzf_helper_spec.rb[1:2:2:2] | passed | 0.
|
126
|
+
./spec/aircana/fzf_helper_spec.rb[1:1:2:1] | passed | 0.00045 seconds |
|
127
|
+
./spec/aircana/fzf_helper_spec.rb[1:1:3:1] | passed | 0.00029 seconds |
|
128
|
+
./spec/aircana/fzf_helper_spec.rb[1:2:1:1] | passed | 0.00017 seconds |
|
129
|
+
./spec/aircana/fzf_helper_spec.rb[1:2:1:2] | passed | 0.00014 seconds |
|
130
|
+
./spec/aircana/fzf_helper_spec.rb[1:2:1:3] | passed | 0.00014 seconds |
|
131
|
+
./spec/aircana/fzf_helper_spec.rb[1:2:2:1] | passed | 0.00013 seconds |
|
132
|
+
./spec/aircana/fzf_helper_spec.rb[1:2:2:2] | passed | 0.00058 seconds |
|
132
133
|
./spec/aircana/generators/agents_generator_spec.rb[1:1:1] | passed | 0.00004 seconds |
|
133
|
-
./spec/aircana/generators/agents_generator_spec.rb[1:2:1] | passed | 0.
|
134
|
+
./spec/aircana/generators/agents_generator_spec.rb[1:2:1] | passed | 0.00019 seconds |
|
134
135
|
./spec/aircana/generators/agents_generator_spec.rb[1:3:1:1] | passed | 0.00007 seconds |
|
135
136
|
./spec/aircana/generators/agents_generator_spec.rb[1:3:1:2] | passed | 0.00005 seconds |
|
136
|
-
./spec/aircana/generators/agents_generator_spec.rb[1:4:1:1] | passed | 0.
|
137
|
+
./spec/aircana/generators/agents_generator_spec.rb[1:4:1:1] | passed | 0.00005 seconds |
|
137
138
|
./spec/aircana/generators/hooks_generator_spec.rb[1:1:1] | passed | 0.00004 seconds |
|
138
139
|
./spec/aircana/generators/hooks_generator_spec.rb[1:2:1] | passed | 0.00003 seconds |
|
139
|
-
./spec/aircana/generators/hooks_generator_spec.rb[1:3:1] | passed | 0.
|
140
|
-
./spec/aircana/generators/hooks_generator_spec.rb[1:3:2] | passed | 0.
|
141
|
-
./spec/aircana/generators/hooks_generator_spec.rb[1:4:1] | passed | 0.
|
140
|
+
./spec/aircana/generators/hooks_generator_spec.rb[1:3:1] | passed | 0.00065 seconds |
|
141
|
+
./spec/aircana/generators/hooks_generator_spec.rb[1:3:2] | passed | 0.00027 seconds |
|
142
|
+
./spec/aircana/generators/hooks_generator_spec.rb[1:4:1] | passed | 0.00013 seconds |
|
142
143
|
./spec/aircana/generators/hooks_generator_spec.rb[1:5:1:1] | passed | 0.00013 seconds |
|
143
144
|
./spec/aircana/generators/hooks_generator_spec.rb[1:5:2:1] | passed | 0.00005 seconds |
|
144
|
-
./spec/aircana/generators/hooks_generator_spec.rb[1:6:1] | passed | 0.
|
145
|
-
./spec/aircana/generators/hooks_generator_spec.rb[1:7:1] | passed | 0.
|
146
|
-
./spec/aircana/generators/plan_command_generator_spec.rb[1:1:1] | passed | 0.
|
147
|
-
./spec/aircana/generators/plan_command_generator_spec.rb[1:1:2] | passed | 0.
|
148
|
-
./spec/aircana/generators/plan_command_generator_spec.rb[1:1:3] | passed | 0.
|
145
|
+
./spec/aircana/generators/hooks_generator_spec.rb[1:6:1] | passed | 0.00069 seconds |
|
146
|
+
./spec/aircana/generators/hooks_generator_spec.rb[1:7:1] | passed | 0.0002 seconds |
|
147
|
+
./spec/aircana/generators/plan_command_generator_spec.rb[1:1:1] | passed | 0.0004 seconds |
|
148
|
+
./spec/aircana/generators/plan_command_generator_spec.rb[1:1:2] | passed | 0.00033 seconds |
|
149
|
+
./spec/aircana/generators/plan_command_generator_spec.rb[1:1:3] | passed | 0.00033 seconds |
|
149
150
|
./spec/aircana/generators/plan_command_generator_spec.rb[1:2:1] | passed | 0.00013 seconds |
|
150
|
-
./spec/aircana/generators/plan_command_generator_spec.rb[1:2:2] | passed | 0.
|
151
|
-
./spec/aircana/generators/record_command_generator_spec.rb[1:1:1] | passed | 0.
|
152
|
-
./spec/aircana/generators/record_command_generator_spec.rb[1:2:1] | passed | 0.
|
153
|
-
./spec/aircana/generators/record_command_generator_spec.rb[1:2:2] | passed | 0.
|
151
|
+
./spec/aircana/generators/plan_command_generator_spec.rb[1:2:2] | passed | 0.0001 seconds |
|
152
|
+
./spec/aircana/generators/record_command_generator_spec.rb[1:1:1] | passed | 0.00027 seconds |
|
153
|
+
./spec/aircana/generators/record_command_generator_spec.rb[1:2:1] | passed | 0.00047 seconds |
|
154
|
+
./spec/aircana/generators/record_command_generator_spec.rb[1:2:2] | passed | 0.00013 seconds |
|
154
155
|
./spec/aircana/human_logger_spec.rb[1:1:1] | passed | 0.00009 seconds |
|
155
156
|
./spec/aircana/human_logger_spec.rb[1:2:1] | passed | 0.00005 seconds |
|
156
157
|
./spec/aircana/human_logger_spec.rb[1:3:1] | passed | 0.00005 seconds |
|
157
|
-
./spec/aircana/human_logger_spec.rb[1:4:1] | passed | 0.
|
158
|
+
./spec/aircana/human_logger_spec.rb[1:4:1] | passed | 0.00005 seconds |
|
158
159
|
./spec/aircana/human_logger_spec.rb[1:5:1] | passed | 0.00004 seconds |
|
159
160
|
./spec/aircana/human_logger_spec.rb[1:5:2] | passed | 0.00004 seconds |
|
160
161
|
./spec/aircana/human_logger_spec.rb[1:5:3] | passed | 0.00004 seconds |
|
@@ -163,26 +164,26 @@ example_id | status | run
|
|
163
164
|
./spec/aircana/human_logger_spec.rb[1:5:6] | passed | 0.00004 seconds |
|
164
165
|
./spec/aircana/human_logger_spec.rb[1:5:7] | passed | 0.00004 seconds |
|
165
166
|
./spec/aircana/human_logger_spec.rb[1:6:1] | passed | 0.00004 seconds |
|
166
|
-
./spec/aircana/llm/claude_client_spec.rb[1:1:1:1] | passed | 0.
|
167
|
-
./spec/aircana/llm/claude_client_spec.rb[1:1:1:2] | passed | 0.
|
168
|
-
./spec/aircana/llm/claude_client_spec.rb[1:1:1:3] | passed | 0.
|
169
|
-
./spec/aircana/llm/claude_client_spec.rb[1:1:1:4] | passed | 0.
|
170
|
-
./spec/aircana/llm/claude_client_spec.rb[1:1:2:1] | passed | 0.
|
171
|
-
./spec/aircana/llm/claude_client_spec.rb[1:1:2:2] | passed | 0.
|
172
|
-
./spec/aircana/llm/claude_client_spec.rb[1:1:3:1] | passed | 0.
|
173
|
-
./spec/aircana/llm/claude_client_spec.rb[1:2:1] | passed | 0.
|
174
|
-
./spec/aircana/llm/claude_client_spec.rb[1:2:2] | passed | 0.
|
175
|
-
./spec/aircana/llm/claude_client_spec.rb[1:3:1:1] | passed | 0.
|
176
|
-
./spec/aircana/llm/claude_client_spec.rb[1:3:1:2] | passed | 0.
|
177
|
-
./spec/aircana/system_checker_spec.rb[1:1:1:1] | passed | 0.
|
178
|
-
./spec/aircana/system_checker_spec.rb[1:1:2:1] | passed | 0.
|
167
|
+
./spec/aircana/llm/claude_client_spec.rb[1:1:1:1] | passed | 0.00056 seconds |
|
168
|
+
./spec/aircana/llm/claude_client_spec.rb[1:1:1:2] | passed | 0.00341 seconds |
|
169
|
+
./spec/aircana/llm/claude_client_spec.rb[1:1:1:3] | passed | 0.00044 seconds |
|
170
|
+
./spec/aircana/llm/claude_client_spec.rb[1:1:1:4] | passed | 0.00088 seconds |
|
171
|
+
./spec/aircana/llm/claude_client_spec.rb[1:1:2:1] | passed | 0.00059 seconds |
|
172
|
+
./spec/aircana/llm/claude_client_spec.rb[1:1:2:2] | passed | 0.00041 seconds |
|
173
|
+
./spec/aircana/llm/claude_client_spec.rb[1:1:3:1] | passed | 0.00073 seconds |
|
174
|
+
./spec/aircana/llm/claude_client_spec.rb[1:2:1] | passed | 0.00041 seconds |
|
175
|
+
./spec/aircana/llm/claude_client_spec.rb[1:2:2] | passed | 0.00061 seconds |
|
176
|
+
./spec/aircana/llm/claude_client_spec.rb[1:3:1:1] | passed | 0.00028 seconds |
|
177
|
+
./spec/aircana/llm/claude_client_spec.rb[1:3:1:2] | passed | 0.00026 seconds |
|
178
|
+
./spec/aircana/system_checker_spec.rb[1:1:1:1] | passed | 0.00039 seconds |
|
179
|
+
./spec/aircana/system_checker_spec.rb[1:1:2:1] | passed | 0.0007 seconds |
|
179
180
|
./spec/aircana/system_checker_spec.rb[1:1:3:1] | passed | 0.00102 seconds |
|
180
|
-
./spec/aircana/system_checker_spec.rb[1:2:1] | passed | 0.
|
181
|
-
./spec/aircana/system_checker_spec.rb[1:2:2] | passed | 0.
|
182
|
-
./spec/aircana/system_checker_spec.rb[1:3:1] | passed | 0.
|
183
|
-
./spec/aircana/system_checker_spec.rb[1:3:2] | passed | 0.
|
184
|
-
./spec/aircana/system_checker_spec.rb[1:3:3] | passed | 0.
|
185
|
-
./spec/aircana/system_checker_spec.rb[1:3:4] | passed | 0.
|
186
|
-
./spec/aircana/system_checker_spec.rb[1:3:5] | passed | 0.
|
181
|
+
./spec/aircana/system_checker_spec.rb[1:2:1] | passed | 0.00044 seconds |
|
182
|
+
./spec/aircana/system_checker_spec.rb[1:2:2] | passed | 0.00029 seconds |
|
183
|
+
./spec/aircana/system_checker_spec.rb[1:3:1] | passed | 0.00027 seconds |
|
184
|
+
./spec/aircana/system_checker_spec.rb[1:3:2] | passed | 0.00028 seconds |
|
185
|
+
./spec/aircana/system_checker_spec.rb[1:3:3] | passed | 0.00029 seconds |
|
186
|
+
./spec/aircana/system_checker_spec.rb[1:3:4] | passed | 0.0004 seconds |
|
187
|
+
./spec/aircana/system_checker_spec.rb[1:3:5] | passed | 0.00023 seconds |
|
187
188
|
./spec/aircana_spec.rb[1:1] | passed | 0.00004 seconds |
|
188
|
-
./spec/aircana_spec.rb[1:2] | passed | 0.
|
189
|
+
./spec/aircana_spec.rb[1:2] | passed | 0.00066 seconds |
|
data/CLAUDE.md
CHANGED
@@ -100,7 +100,8 @@ Aircana is a Ruby gem that creates and manages Claude Code plugins. The main com
|
|
100
100
|
- `.claude-plugin/plugin.json` - Plugin manifest with metadata and versioning
|
101
101
|
- `agents/` - Agent markdown files and their knowledge directories
|
102
102
|
- `commands/` - Slash command markdown files
|
103
|
-
- `hooks/` -
|
103
|
+
- `hooks/` - hooks.json manifest defining hook configurations
|
104
|
+
- `scripts/` - Hook scripts and utility scripts
|
104
105
|
- **Configuration**:
|
105
106
|
- `~/.aircana` - Global Aircana configuration
|
106
107
|
- `~/.aircana/aircana.out` - Generated templates output directory
|
data/README.md
CHANGED
@@ -57,7 +57,8 @@ This creates a plugin structure with:
|
|
57
57
|
- `.claude-plugin/plugin.json` - Plugin manifest
|
58
58
|
- `agents/` - Specialized agents
|
59
59
|
- `commands/` - Slash commands
|
60
|
-
- `hooks/` -
|
60
|
+
- `hooks/` - Hook configurations (hooks.json)
|
61
|
+
- `scripts/` - Hook scripts and utilities
|
61
62
|
|
62
63
|
### Next Steps
|
63
64
|
|
@@ -98,7 +99,7 @@ aircana plugin validate
|
|
98
99
|
|
99
100
|
- Configure the Confluence integration and create domain-specific agents
|
100
101
|
|
101
|
-
- Use the `/
|
102
|
+
- Use the `/ask-expert` command to consult multiple specialized agents
|
102
103
|
|
103
104
|
- Set up the development workflow with plan, execute, review, and apply-feedback commands
|
104
105
|
|
@@ -110,26 +111,26 @@ Aircana provides a complete development lifecycle through five integrated slash
|
|
110
111
|
|
111
112
|
```mermaid
|
112
113
|
stateDiagram-v2
|
113
|
-
[*] --> Plan: /
|
114
|
-
Plan --> Record: /
|
115
|
-
Record --> Execute: /
|
116
|
-
Execute --> Review: /
|
117
|
-
Review --> ApplyFeedback: /
|
114
|
+
[*] --> Plan: /plan
|
115
|
+
Plan --> Record: /record
|
116
|
+
Record --> Execute: /execute
|
117
|
+
Execute --> Review: /review
|
118
|
+
Review --> ApplyFeedback: /apply-feedback
|
118
119
|
ApplyFeedback --> Review: More issues found
|
119
120
|
ApplyFeedback --> [*]: Satisfied
|
120
121
|
```
|
121
122
|
|
122
123
|
### Quick Overview
|
123
124
|
|
124
|
-
1. **`/
|
125
|
-
2. **`/
|
126
|
-
3. **`/
|
127
|
-
4. **`/
|
128
|
-
5. **`/
|
125
|
+
1. **`/plan`** - Create strategic implementation plan
|
126
|
+
2. **`/record`** - Save plan to Jira ticket
|
127
|
+
3. **`/execute`** - Implement plan and create commit
|
128
|
+
4. **`/review`** - Adversarial code review with expert feedback
|
129
|
+
5. **`/apply-feedback`** - Apply review changes and amend commit
|
129
130
|
|
130
131
|
### Command Details
|
131
132
|
|
132
|
-
#### 1. `/
|
133
|
+
#### 1. `/plan` - Strategic Planning
|
133
134
|
|
134
135
|
Creates a high-level implementation plan by:
|
135
136
|
- Asking you to specify relevant files and directories
|
@@ -140,7 +141,7 @@ Creates a high-level implementation plan by:
|
|
140
141
|
|
141
142
|
The planner focuses on architecture decisions and approach, avoiding exhaustive code implementations.
|
142
143
|
|
143
|
-
#### 2. `/
|
144
|
+
#### 2. `/record` - Save to Jira
|
144
145
|
|
145
146
|
Records your approved plan to a Jira ticket by:
|
146
147
|
- Taking the ticket key/ID as input
|
@@ -149,7 +150,7 @@ Records your approved plan to a Jira ticket by:
|
|
149
150
|
|
150
151
|
This creates a traceable link between planning and execution.
|
151
152
|
|
152
|
-
#### 3. `/
|
153
|
+
#### 3. `/execute` - Implementation
|
153
154
|
|
154
155
|
Executes the strategic plan by:
|
155
156
|
- Reading the plan from the Jira ticket
|
@@ -160,9 +161,9 @@ Executes the strategic plan by:
|
|
160
161
|
- Running tests to verify implementation
|
161
162
|
- Creating git commit (delegates to git-ops sub-agent if available)
|
162
163
|
|
163
|
-
After commit creation, suggests running `/
|
164
|
+
After commit creation, suggests running `/review`.
|
164
165
|
|
165
|
-
#### 4. `/
|
166
|
+
#### 4. `/review` - Adversarial Review
|
166
167
|
|
167
168
|
Conducts comprehensive code review of HEAD commit by:
|
168
169
|
- Analyzing changed files to identify technical domains
|
@@ -171,9 +172,9 @@ Conducts comprehensive code review of HEAD commit by:
|
|
171
172
|
- Synthesizing feedback organized by severity (Critical/Important/Suggestions)
|
172
173
|
- Storing review output for next step
|
173
174
|
|
174
|
-
Explicitly states "Reviewing: <commit message>" and ends with "Run /
|
175
|
+
Explicitly states "Reviewing: <commit message>" and ends with "Run /apply-feedback".
|
175
176
|
|
176
|
-
#### 5. `/
|
177
|
+
#### 5. `/apply-feedback` - Apply Changes
|
177
178
|
|
178
179
|
Applies code review feedback by:
|
179
180
|
- Reading review output from conversation context
|
@@ -190,20 +191,20 @@ This preserves the original commit message while incorporating review improvemen
|
|
190
191
|
|
191
192
|
```bash
|
192
193
|
# 1. Start planning
|
193
|
-
/
|
194
|
+
/plan
|
194
195
|
> Specify relevant files: src/api/, spec/api/
|
195
196
|
|
196
197
|
# 2. Save plan to ticket
|
197
|
-
/
|
198
|
+
/record PROJ-123
|
198
199
|
|
199
200
|
# 3. Execute implementation
|
200
|
-
/
|
201
|
+
/execute PROJ-123
|
201
202
|
|
202
203
|
# 4. Review the commit
|
203
|
-
/
|
204
|
+
/review
|
204
205
|
|
205
206
|
# 5. Apply feedback
|
206
|
-
/
|
207
|
+
/apply-feedback
|
207
208
|
```
|
208
209
|
|
209
210
|
## Key Concepts
|
@@ -218,6 +219,37 @@ Aircana creates Claude Code plugins - portable, distributable packages that exte
|
|
218
219
|
|
219
220
|
Plugins can be shared with teams or published to plugin marketplaces for broader distribution.
|
220
221
|
|
222
|
+
#### Plugin Manifest Structure
|
223
|
+
|
224
|
+
The `.claude-plugin/plugin.json` file defines plugin metadata:
|
225
|
+
|
226
|
+
```json
|
227
|
+
{
|
228
|
+
"name": "my-plugin",
|
229
|
+
"version": "1.0.0",
|
230
|
+
"description": "Brief plugin description",
|
231
|
+
"author": {
|
232
|
+
"name": "Author Name",
|
233
|
+
"email": "[email protected]",
|
234
|
+
"url": "https://github.com/author"
|
235
|
+
},
|
236
|
+
"homepage": "https://docs.example.com/plugin",
|
237
|
+
"repository": "https://github.com/author/plugin",
|
238
|
+
"license": "MIT",
|
239
|
+
"keywords": ["keyword1", "keyword2"]
|
240
|
+
}
|
241
|
+
```
|
242
|
+
|
243
|
+
Optional path overrides (for non-standard layouts):
|
244
|
+
```json
|
245
|
+
{
|
246
|
+
"commands": "./custom/commands/",
|
247
|
+
"agents": "./custom/agents/",
|
248
|
+
"hooks": "./config/hooks.json",
|
249
|
+
"mcpServers": "./mcp-config.json"
|
250
|
+
}
|
251
|
+
```
|
252
|
+
|
221
253
|
### Specialized Agents
|
222
254
|
|
223
255
|
Agents are domain-specific experts to whom Claude Code can delegate tasks and questions. Each agent has:
|
@@ -267,9 +299,11 @@ my-plugin/
|
|
267
299
|
│ └── manifest.json
|
268
300
|
├── commands/
|
269
301
|
│ └── ask-expert.md
|
270
|
-
|
271
|
-
|
272
|
-
|
302
|
+
├── hooks/
|
303
|
+
│ └── hooks.json
|
304
|
+
└── scripts/
|
305
|
+
├── pre_tool_use.sh
|
306
|
+
└── session_start.sh
|
273
307
|
```
|
274
308
|
|
275
309
|
Agent files and their knowledge bases are co-located in the plugin's `agents/` directory.
|
@@ -59,6 +59,7 @@ module Aircana
|
|
59
59
|
Aircana.configuration.instance_variable_set(:@commands_dir, File.join(target_dir, "commands"))
|
60
60
|
Aircana.configuration.instance_variable_set(:@agents_dir, File.join(target_dir, "agents"))
|
61
61
|
Aircana.configuration.instance_variable_set(:@hooks_dir, File.join(target_dir, "hooks"))
|
62
|
+
Aircana.configuration.instance_variable_set(:@scripts_dir, File.join(target_dir, "scripts"))
|
62
63
|
Aircana.configuration.instance_variable_set(:@agent_knowledge_dir, File.join(target_dir, "agents"))
|
63
64
|
|
64
65
|
yield
|
@@ -72,6 +73,7 @@ module Aircana
|
|
72
73
|
File.join(original_plugin_root, "commands"))
|
73
74
|
Aircana.configuration.instance_variable_set(:@agents_dir, File.join(original_plugin_root, "agents"))
|
74
75
|
Aircana.configuration.instance_variable_set(:@hooks_dir, File.join(original_plugin_root, "hooks"))
|
76
|
+
Aircana.configuration.instance_variable_set(:@scripts_dir, File.join(original_plugin_root, "scripts"))
|
75
77
|
Aircana.configuration.instance_variable_set(:@agent_knowledge_dir,
|
76
78
|
File.join(original_plugin_root, "agents"))
|
77
79
|
end
|
@@ -82,18 +84,32 @@ module Aircana
|
|
82
84
|
|
83
85
|
default_name = plugin_name || PluginManifest.default_plugin_name(target_dir)
|
84
86
|
|
85
|
-
|
87
|
+
# Collect basic metadata
|
88
|
+
metadata = {
|
86
89
|
name: prompt.ask("Plugin name:", default: default_name),
|
87
90
|
version: prompt.ask("Initial version:", default: "0.1.0"),
|
88
91
|
description: prompt.ask("Plugin description:", default: "A Claude Code plugin created with Aircana"),
|
89
|
-
author: prompt.ask("Author name:"),
|
90
92
|
license: prompt.ask("License:", default: "MIT")
|
91
93
|
}
|
94
|
+
|
95
|
+
# Collect author information
|
96
|
+
author_name = prompt.ask("Author name:")
|
97
|
+
author = { "name" => author_name }
|
98
|
+
|
99
|
+
author["email"] = prompt.ask("Author email:") if prompt.yes?("Add author email?", default: false)
|
100
|
+
|
101
|
+
if prompt.yes?("Add author URL (e.g. GitHub profile)?", default: false)
|
102
|
+
author["url"] = prompt.ask("Author URL:")
|
103
|
+
end
|
104
|
+
|
105
|
+
metadata[:author] = author
|
106
|
+
|
107
|
+
metadata
|
92
108
|
end
|
93
109
|
|
94
110
|
def create_plugin_structure(target_dir)
|
95
111
|
# Create plugin directories
|
96
|
-
[".claude-plugin", "commands", "agents", "hooks"].each do |dir|
|
112
|
+
[".claude-plugin", "commands", "agents", "hooks", "scripts"].each do |dir|
|
97
113
|
dir_path = File.join(target_dir, dir)
|
98
114
|
Aircana.create_dir_if_needed(dir_path)
|
99
115
|
Aircana.human_logger.info("Created directory: #{dir}/")
|
@@ -154,11 +170,11 @@ module Aircana
|
|
154
170
|
end
|
155
171
|
|
156
172
|
def install_hooks
|
157
|
-
|
158
|
-
return unless Dir.exist?(
|
173
|
+
scripts_dir = Aircana.configuration.scripts_dir
|
174
|
+
return unless Dir.exist?(scripts_dir)
|
159
175
|
|
160
176
|
# Check if any hook scripts exist (they're already generated to the correct location)
|
161
|
-
hook_files = Dir.glob("#{
|
177
|
+
hook_files = Dir.glob("#{scripts_dir}/*.sh")
|
162
178
|
return unless hook_files.any?
|
163
179
|
|
164
180
|
# Create hooks manifest
|
@@ -191,7 +207,7 @@ module Aircana
|
|
191
207
|
"bundle_install" => { event: "PostToolUse", matcher: "Bash" }
|
192
208
|
}
|
193
209
|
|
194
|
-
Dir.glob("#{Aircana.configuration.
|
210
|
+
Dir.glob("#{Aircana.configuration.scripts_dir}/*.sh").each do |hook_file|
|
195
211
|
hook_name = File.basename(hook_file, ".sh")
|
196
212
|
|
197
213
|
# Determine mapping for this hook
|
@@ -207,7 +223,7 @@ module Aircana
|
|
207
223
|
event_key = mapping[:event]
|
208
224
|
|
209
225
|
# Create relative path using ${CLAUDE_PLUGIN_ROOT}
|
210
|
-
relative_path = "${CLAUDE_PLUGIN_ROOT}/
|
226
|
+
relative_path = "${CLAUDE_PLUGIN_ROOT}/scripts/#{hook_name}.sh"
|
211
227
|
|
212
228
|
hook_entry = {
|
213
229
|
"type" => "command",
|
@@ -249,7 +265,8 @@ module Aircana
|
|
249
265
|
Aircana.human_logger.info(" .claude-plugin/plugin.json - Plugin metadata")
|
250
266
|
Aircana.human_logger.info(" commands/ - Slash commands")
|
251
267
|
Aircana.human_logger.info(" agents/ - Specialized agents")
|
252
|
-
Aircana.human_logger.info(" hooks/ - Event
|
268
|
+
Aircana.human_logger.info(" hooks/ - Event hook configurations")
|
269
|
+
Aircana.human_logger.info(" scripts/ - Hook scripts and utilities")
|
253
270
|
Aircana.human_logger.info("\nNext steps:")
|
254
271
|
Aircana.human_logger.info(" - Create agents: aircana agents create")
|
255
272
|
Aircana.human_logger.info(" - Install plugin in Claude Code")
|
@@ -18,7 +18,18 @@ module Aircana
|
|
18
18
|
Aircana.human_logger.info(" Name: #{data["name"]}")
|
19
19
|
Aircana.human_logger.info(" Version: #{data["version"]}")
|
20
20
|
Aircana.human_logger.info(" Description: #{data["description"]}") if data["description"]
|
21
|
-
|
21
|
+
|
22
|
+
# Display author information
|
23
|
+
if data["author"]
|
24
|
+
if data["author"].is_a?(Hash)
|
25
|
+
Aircana.human_logger.info(" Author: #{data["author"]["name"]}")
|
26
|
+
Aircana.human_logger.info(" Email: #{data["author"]["email"]}") if data["author"]["email"]
|
27
|
+
Aircana.human_logger.info(" URL: #{data["author"]["url"]}") if data["author"]["url"]
|
28
|
+
else
|
29
|
+
Aircana.human_logger.info(" Author: #{data["author"]}")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
22
33
|
Aircana.human_logger.info(" License: #{data["license"]}") if data["license"]
|
23
34
|
Aircana.human_logger.info(" Homepage: #{data["homepage"]}") if data["homepage"]
|
24
35
|
Aircana.human_logger.info(" Repository: #{data["repository"]}") if data["repository"]
|
@@ -39,9 +50,9 @@ module Aircana
|
|
39
50
|
# Build update hash with only fields that user wants to change
|
40
51
|
updates = {}
|
41
52
|
|
53
|
+
# Handle regular fields
|
42
54
|
field_prompts = {
|
43
55
|
"description" => "Description",
|
44
|
-
"author" => "Author",
|
45
56
|
"homepage" => "Homepage URL",
|
46
57
|
"repository" => "Repository URL",
|
47
58
|
"license" => "License"
|
@@ -53,8 +64,26 @@ module Aircana
|
|
53
64
|
updates[field] = value if value != current
|
54
65
|
end
|
55
66
|
|
67
|
+
# Handle author separately (object)
|
68
|
+
if prompt.yes?("Update author information?", default: false)
|
69
|
+
current_author = current_data["author"] || {}
|
70
|
+
current_author = {} unless current_author.is_a?(Hash)
|
71
|
+
|
72
|
+
author = {}
|
73
|
+
author_name = prompt.ask("Author name:", default: current_author["name"])
|
74
|
+
author["name"] = author_name if author_name && !author_name.empty?
|
75
|
+
|
76
|
+
author_email = prompt.ask("Author email:", default: current_author["email"])
|
77
|
+
author["email"] = author_email if author_email && !author_email.empty?
|
78
|
+
|
79
|
+
author_url = prompt.ask("Author URL:", default: current_author["url"])
|
80
|
+
author["url"] = author_url if author_url && !author_url.empty?
|
81
|
+
|
82
|
+
updates["author"] = author unless author.empty?
|
83
|
+
end
|
84
|
+
|
56
85
|
# Handle keywords separately (array)
|
57
|
-
if prompt.yes?("Update keywords?")
|
86
|
+
if prompt.yes?("Update keywords?", default: false)
|
58
87
|
current_keywords = (current_data["keywords"] || []).join(", ")
|
59
88
|
keywords_input = prompt.ask("Keywords (comma-separated):", default: current_keywords)
|
60
89
|
updates["keywords"] = keywords_input.split(",").map(&:strip) if keywords_input
|
@@ -4,7 +4,7 @@ module Aircana
|
|
4
4
|
class Configuration
|
5
5
|
attr_accessor :global_dir, :project_dir, :stream, :output_dir,
|
6
6
|
:claude_code_config_path, :claude_code_project_config_path, :agent_knowledge_dir,
|
7
|
-
:hooks_dir, :confluence_base_url, :confluence_username, :confluence_api_token,
|
7
|
+
:hooks_dir, :scripts_dir, :confluence_base_url, :confluence_username, :confluence_api_token,
|
8
8
|
:plugin_root, :plugin_manifest_dir, :commands_dir, :agents_dir
|
9
9
|
|
10
10
|
def initialize
|
@@ -45,6 +45,7 @@ module Aircana
|
|
45
45
|
@commands_dir = File.join(@plugin_root, "commands")
|
46
46
|
@agents_dir = File.join(@plugin_root, "agents")
|
47
47
|
@hooks_dir = File.join(@plugin_root, "hooks")
|
48
|
+
@scripts_dir = File.join(@plugin_root, "scripts")
|
48
49
|
@agent_knowledge_dir = File.join(@plugin_root, "agents")
|
49
50
|
end
|
50
51
|
|
@@ -36,7 +36,7 @@ module Aircana
|
|
36
36
|
return unless all_available_hooks.include?(hook_name)
|
37
37
|
|
38
38
|
template_path = File.join(File.dirname(__FILE__), "..", "templates", "hooks", "#{hook_name}.erb")
|
39
|
-
output_path = File.join(Aircana.configuration.
|
39
|
+
output_path = File.join(Aircana.configuration.scripts_dir, "#{hook_name}.sh")
|
40
40
|
|
41
41
|
generator = new(file_in: template_path, file_out: output_path)
|
42
42
|
generator.generate
|
@@ -52,7 +52,7 @@ module Aircana
|
|
52
52
|
|
53
53
|
if hook_name
|
54
54
|
template_path = File.join(File.dirname(__FILE__), "..", "templates", "hooks", "#{hook_name}.erb")
|
55
|
-
output_path = File.join(Aircana.configuration.
|
55
|
+
output_path = File.join(Aircana.configuration.scripts_dir, "#{hook_name}.sh")
|
56
56
|
super(file_in: template_path, file_out: output_path)
|
57
57
|
else
|
58
58
|
super(**)
|
@@ -5,10 +5,12 @@ require "fileutils"
|
|
5
5
|
|
6
6
|
module Aircana
|
7
7
|
# Manages Claude Code plugin manifest (plugin.json) files
|
8
|
-
class PluginManifest
|
8
|
+
class PluginManifest # rubocop:disable Metrics/ClassLength
|
9
9
|
REQUIRED_FIELDS = %w[name version].freeze
|
10
|
-
OPTIONAL_FIELDS = %w[description author homepage repository license keywords
|
10
|
+
OPTIONAL_FIELDS = %w[description author homepage repository license keywords commands agents hooks
|
11
|
+
mcpServers].freeze
|
11
12
|
ALL_FIELDS = (REQUIRED_FIELDS + OPTIONAL_FIELDS).freeze
|
13
|
+
PATH_OVERRIDE_FIELDS = %w[commands agents hooks mcpServers].freeze
|
12
14
|
|
13
15
|
attr_reader :plugin_root
|
14
16
|
|
@@ -86,7 +88,7 @@ module Aircana
|
|
86
88
|
|
87
89
|
private
|
88
90
|
|
89
|
-
def build_manifest_data(attributes)
|
91
|
+
def build_manifest_data(attributes) # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
90
92
|
data = {
|
91
93
|
"name" => attributes[:name] || attributes["name"],
|
92
94
|
"version" => attributes[:version] || attributes["version"] || "0.1.0"
|
@@ -95,7 +97,14 @@ module Aircana
|
|
95
97
|
# Add optional fields if provided
|
96
98
|
OPTIONAL_FIELDS.each do |field|
|
97
99
|
value = attributes[field.to_sym] || attributes[field]
|
98
|
-
|
100
|
+
next unless value
|
101
|
+
|
102
|
+
# Special handling for author - convert to object if it's a string
|
103
|
+
data[field] = if field == "author"
|
104
|
+
build_author_object(value)
|
105
|
+
else
|
106
|
+
value
|
107
|
+
end
|
99
108
|
end
|
100
109
|
|
101
110
|
data
|
@@ -136,6 +145,27 @@ module Aircana
|
|
136
145
|
end
|
137
146
|
end
|
138
147
|
|
148
|
+
def build_author_object(value)
|
149
|
+
# If it's already a hash/object, use it
|
150
|
+
return value if value.is_a?(Hash)
|
151
|
+
|
152
|
+
# If it's a string, convert to object with name only
|
153
|
+
return { "name" => value } if value.is_a?(String)
|
154
|
+
|
155
|
+
# Otherwise return as-is
|
156
|
+
value
|
157
|
+
end
|
158
|
+
|
159
|
+
def validate_path_override(path)
|
160
|
+
return true unless path
|
161
|
+
|
162
|
+
# Path must be a string starting with ./
|
163
|
+
return false unless path.is_a?(String)
|
164
|
+
return false unless path.start_with?("./")
|
165
|
+
|
166
|
+
true
|
167
|
+
end
|
168
|
+
|
139
169
|
class << self
|
140
170
|
# Creates a default plugin name from a directory path
|
141
171
|
def default_plugin_name(directory)
|
@@ -30,7 +30,7 @@ Work through each task in the todo list sequentially:
|
|
30
30
|
TASK DETAILS:
|
31
31
|
|
32
32
|
1. PARSE FEEDBACK: Extract review feedback from conversation:
|
33
|
-
- Look for review output from previous /
|
33
|
+
- Look for review output from previous /review command
|
34
34
|
- Parse feedback organized by severity (Critical / Important / Suggestions)
|
35
35
|
- Extract actionable items with file, line, issue, and recommendation
|
36
36
|
- If no review feedback found in context, inform user and exit
|
@@ -72,7 +72,7 @@ TASK DETAILS:
|
|
72
72
|
- Provide context: Jira ticket key, summary of changes, files modified
|
73
73
|
- If no git-ops agent exists, create commit directly using Bash tool
|
74
74
|
- Commit message should reference Jira ticket and describe implementation
|
75
|
-
- After successful commit, suggest user runs '/
|
75
|
+
- After successful commit, suggest user runs '/review' command to review changes
|
76
76
|
|
77
77
|
IMPORTANT INSTRUCTIONS:
|
78
78
|
- ALWAYS start by creating the todo list file before doing any other work
|
@@ -14,7 +14,7 @@ MANDATORY WORKFLOW (Use TodoWrite to track):
|
|
14
14
|
3. Perform targeted research on user-specified files
|
15
15
|
4. Create implementation plan in current session
|
16
16
|
5. Iterate with user feedback
|
17
|
-
6. Suggest '/
|
17
|
+
6. Suggest '/record' command to save plan to Jira
|
18
18
|
|
19
19
|
TASK DETAILS:
|
20
20
|
|
@@ -20,7 +20,7 @@ First, create a todo list file with the following tasks enumerated in order:
|
|
20
20
|
6. Present changes to each expert agent in parallel for review
|
21
21
|
7. Synthesize feedback organized by severity
|
22
22
|
8. Present comprehensive review report
|
23
|
-
9. Suggest running '/
|
23
|
+
9. Suggest running '/apply-feedback' command
|
24
24
|
|
25
25
|
STEP 2: EXECUTE EACH TASK IN ORDER
|
26
26
|
Work through each task in the todo list sequentially:
|
@@ -79,7 +79,7 @@ TASK DETAILS:
|
|
79
79
|
- Store this output in conversation context for apply-feedback agent
|
80
80
|
|
81
81
|
9. NEXT STEPS: End with clear instruction:
|
82
|
-
- Output: \"Run /
|
82
|
+
- Output: \"Run /apply-feedback to apply recommended changes\"
|
83
83
|
- This guides user to next step in workflow
|
84
84
|
|
85
85
|
IMPORTANT INSTRUCTIONS:
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<%= helpers.model_instructions(
|
2
|
-
"Use the Task tool with subagent_type 'apply-feedback' to apply code review feedback from the previous /
|
2
|
+
"Use the Task tool with subagent_type 'apply-feedback' to apply code review feedback from the previous /review command.
|
3
3
|
|
4
4
|
Pass the review feedback from the conversation context to the apply-feedback agent.
|
5
5
|
|
@@ -13,5 +13,5 @@ The apply-feedback agent will:
|
|
13
13
|
7. Amend the HEAD commit with improvements using 'git commit --amend --no-edit'
|
14
14
|
8. Summarize changes made
|
15
15
|
|
16
|
-
IMPORTANT: This command reads the review output from the conversation context, so it must be run in the same conversation as /
|
16
|
+
IMPORTANT: This command reads the review output from the conversation context, so it must be run in the same conversation as /review."
|
17
17
|
) %>
|
@@ -12,7 +12,7 @@ First, create a todo list file with the following tasks enumerated in order:
|
|
12
12
|
4. Consult relevant sub-agents with research context (run in parallel when possible)
|
13
13
|
5. Create high-level strategic implementation plan
|
14
14
|
6. Iterate with user feedback
|
15
|
-
7. Suggest user runs '/
|
15
|
+
7. Suggest user runs '/record' command to save the plan to Jira ticket
|
16
16
|
|
17
17
|
STEP 2: EXECUTE EACH TASK IN ORDER
|
18
18
|
Work through each task in the todo list sequentially:
|
@@ -8,7 +8,7 @@ The reviewer agent will:
|
|
8
8
|
4. Present changes to experts in parallel for review
|
9
9
|
5. Synthesize feedback organized by severity
|
10
10
|
6. Store review output for the apply-feedback command
|
11
|
-
7. Suggest running '/
|
11
|
+
7. Suggest running '/apply-feedback' to apply recommended changes
|
12
12
|
|
13
13
|
IMPORTANT: The review agent will automatically review the HEAD commit. No arguments needed."
|
14
14
|
) %>
|
data/lib/aircana/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aircana
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.0.
|
4
|
+
version: 3.0.0.rc4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Weston Dransfield
|
@@ -121,13 +121,12 @@ files:
|
|
121
121
|
- agents/reviewer.md
|
122
122
|
- agents/sub-agent-coordinator.md
|
123
123
|
- agents/test-agent/manifest.json
|
124
|
-
- commands/
|
125
|
-
- commands/
|
126
|
-
- commands/
|
127
|
-
- commands/
|
128
|
-
- commands/
|
129
|
-
- commands/
|
130
|
-
- commands/sample-command.md
|
124
|
+
- commands/apply-feedback.md
|
125
|
+
- commands/ask-expert.md
|
126
|
+
- commands/execute.md
|
127
|
+
- commands/plan.md
|
128
|
+
- commands/record.md
|
129
|
+
- commands/review.md
|
131
130
|
- compose.yml
|
132
131
|
- exe/aircana
|
133
132
|
- hooks/hooks.json
|
data/commands/sample-command.md
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
# Sample Command
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|