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.
Files changed (32) hide show
  1. checksums.yaml +4 -4
  2. data/.claude-plugin/plugin.json +3 -1
  3. data/.rspec_status +161 -160
  4. data/CLAUDE.md +2 -1
  5. data/README.md +61 -27
  6. data/lib/aircana/cli/commands/init.rb +26 -9
  7. data/lib/aircana/cli/commands/plugin.rb +32 -3
  8. data/lib/aircana/configuration.rb +2 -1
  9. data/lib/aircana/generators/apply_feedback_command_generator.rb +1 -1
  10. data/lib/aircana/generators/ask_expert_command_generator.rb +1 -1
  11. data/lib/aircana/generators/execute_command_generator.rb +1 -1
  12. data/lib/aircana/generators/hooks_generator.rb +2 -2
  13. data/lib/aircana/generators/plan_command_generator.rb +1 -1
  14. data/lib/aircana/generators/record_command_generator.rb +1 -1
  15. data/lib/aircana/generators/review_command_generator.rb +1 -1
  16. data/lib/aircana/plugin_manifest.rb +34 -4
  17. data/lib/aircana/templates/agents/defaults/apply_feedback.erb +1 -1
  18. data/lib/aircana/templates/agents/defaults/executor.erb +1 -1
  19. data/lib/aircana/templates/agents/defaults/planner.erb +1 -1
  20. data/lib/aircana/templates/agents/defaults/reviewer.erb +2 -2
  21. data/lib/aircana/templates/commands/apply_feedback.erb +2 -2
  22. data/lib/aircana/templates/commands/plan.erb +1 -1
  23. data/lib/aircana/templates/commands/review.erb +1 -1
  24. data/lib/aircana/version.rb +1 -1
  25. metadata +7 -8
  26. data/commands/sample-command.md +0 -1
  27. /data/commands/{air-apply-feedback.md → apply-feedback.md} +0 -0
  28. /data/commands/{air-ask-expert.md → ask-expert.md} +0 -0
  29. /data/commands/{air-execute.md → execute.md} +0 -0
  30. /data/commands/{air-plan.md → plan.md} +0 -0
  31. /data/commands/{air-record.md → record.md} +0 -0
  32. /data/commands/{air-review.md → review.md} +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b1856482e2cdb70b17ed29f8ebb42c1ec8091b5f57bc5809cdd5cf6b6faaa93d
4
- data.tar.gz: b496244c5598c5266a2a7a815daea6132a4a37faf269ff2736afacf547d3f821
3
+ metadata.gz: 2c3bc781de2f628c118ca9644bd48986b72ce070aa76602d6a3141e9d867dc4c
4
+ data.tar.gz: b16ce2a538c5cf4ad66f7bc900287aa448fb67735b7cbf17e96420a1e61f6c37
5
5
  SHA512:
6
- metadata.gz: ce54c8ade79ac94582530ff6f7ebfb26a2ff6a0deee9067f69fa483fcf13e882a0b0c014ff6607d011f44b878d29c236b7e41be7ca36d0dacbe0539c9252b4a0
7
- data.tar.gz: 5e70187e226e397bd4e3b0bea3331bd39500d0941fa9e5fc590aa835bc9457371c2230aa4197045b9acd7a3ecc930949de98c835bfff2a1c7c57a1b868ab52ee
6
+ metadata.gz: 131b30cae8937bb4f983674bebf948ac185fc8f66da3f065f5e215d8fe8ce3ee89c3d59617c0704fcca5703680dae854c2434d21c95399750b410a4848f258c6
7
+ data.tar.gz: 5080f433908496ccba7009eaa946050ceb18409fd4460942c7c5b97bef2598cbdb4c8bc117e0957b3e3a3c6137fb1722ff3325a1a9dfdc6069047ee335ef218d
@@ -2,6 +2,8 @@
2
2
  "name": "test-plugin",
3
3
  "version": "0.1.0",
4
4
  "description": "Test plugin",
5
- "author": "Test Author",
5
+ "author": {
6
+ "name": "Test Author"
7
+ },
6
8
  "license": "MIT"
7
9
  }
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.00431 seconds |
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.00049 seconds |
6
- ./spec/aircana/cli/commands/agents_spec.rb[1:1:2:1] | passed | 0.00099 seconds |
7
- ./spec/aircana/cli/commands/agents_spec.rb[1:1:3:1] | passed | 0.00048 seconds |
8
- ./spec/aircana/cli/commands/agents_spec.rb[1:1:3:2] | passed | 0.00044 seconds |
9
- ./spec/aircana/cli/commands/agents_spec.rb[1:2:1:1] | passed | 0.00062 seconds |
10
- ./spec/aircana/cli/commands/agents_spec.rb[1:2:1:2] | passed | 0.00059 seconds |
11
- ./spec/aircana/cli/commands/agents_spec.rb[1:2:1:3:1] | passed | 0.0007 seconds |
12
- ./spec/aircana/cli/commands/agents_spec.rb[1:2:2:1] | passed | 0.00046 seconds |
13
- ./spec/aircana/cli/commands/agents_spec.rb[1:2:3:1] | passed | 0.00047 seconds |
14
- ./spec/aircana/cli/commands/agents_spec.rb[1:2:4:1] | passed | 0.00051 seconds |
15
- ./spec/aircana/cli/commands/agents_spec.rb[1:3:1] | passed | 0.00085 seconds |
16
- ./spec/aircana/cli/commands/agents_spec.rb[1:3:2] | passed | 0.00062 seconds |
17
- ./spec/aircana/cli/commands/agents_spec.rb[1:3:3] | passed | 0.00066 seconds |
18
- ./spec/aircana/cli/commands/agents_spec.rb[1:4:1] | passed | 0.00028 seconds |
19
- ./spec/aircana/cli/commands/agents_spec.rb[1:5:1:1] | passed | 0.0005 seconds |
20
- ./spec/aircana/cli/commands/agents_spec.rb[1:5:2:1] | passed | 0.00843 seconds |
21
- ./spec/aircana/cli/commands/agents_spec.rb[1:5:3:1] | passed | 0.00134 seconds |
22
- ./spec/aircana/cli/commands/agents_spec.rb[1:5:3:2] | passed | 0.00119 seconds |
23
- ./spec/aircana/cli/commands/agents_spec.rb[1:5:3:3] | passed | 0.00118 seconds |
24
- ./spec/aircana/cli/commands/hooks_spec.rb[1:1:1:1] | passed | 0.00081 seconds |
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.00071 seconds |
27
- ./spec/aircana/cli/commands/hooks_spec.rb[1:2:1:1] | passed | 0.00051 seconds |
28
- ./spec/aircana/cli/commands/hooks_spec.rb[1:2:2:1] | passed | 0.00066 seconds |
29
- ./spec/aircana/cli/commands/hooks_spec.rb[1:3:1:1] | passed | 0.00043 seconds |
30
- ./spec/aircana/cli/commands/hooks_spec.rb[1:3:2:1] | passed | 0.00095 seconds |
31
- ./spec/aircana/cli/commands/hooks_spec.rb[1:4:1] | passed | 0.00146 seconds |
32
- ./spec/aircana/cli/commands/hooks_spec.rb[1:4:2:1] | passed | 0.00111 seconds |
33
- ./spec/aircana/cli/commands/hooks_spec.rb[1:5:1:1] | passed | 0.00046 seconds |
34
- ./spec/aircana/cli/commands/hooks_spec.rb[1:5:2:1] | passed | 0.00051 seconds |
35
- ./spec/aircana/cli/commands/hooks_spec.rb[1:5:3:1] | passed | 0.00055 seconds |
36
- ./spec/aircana/cli/commands/hooks_spec.rb[1:5:4:1] | passed | 0.00049 seconds |
37
- ./spec/aircana/cli/commands/hooks_spec.rb[1:6:1:1] | passed | 0.00043 seconds |
38
- ./spec/aircana/cli/commands/hooks_spec.rb[1:6:2:1] | passed | 0.00121 seconds |
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.00182 seconds |
41
- ./spec/aircana/cli/commands/init_spec.rb[1:1:2] | passed | 0.00814 seconds |
42
- ./spec/aircana/cli/commands/init_spec.rb[1:2:1:1] | passed | 0.00347 seconds |
43
- ./spec/aircana/cli/commands/init_spec.rb[1:3:1] | passed | 0.00127 seconds |
44
- ./spec/aircana/cli/commands/init_spec.rb[1:3:2:1] | passed | 0.0012 seconds |
45
- ./spec/aircana/cli/commands/init_spec.rb[1:3:3:1] | passed | 0.00111 seconds |
46
- ./spec/aircana/cli/commands/init_spec.rb[1:3:4:1] | passed | 0.00124 seconds |
47
- ./spec/aircana/cli/commands/init_spec.rb[1:4:1] | passed | 0.00076 seconds |
48
- ./spec/aircana/cli/commands/init_spec.rb[1:4:2] | passed | 0.00089 seconds |
49
- ./spec/aircana/cli/commands/init_spec.rb[1:4:3] | passed | 0.00077 seconds |
50
- ./spec/aircana/cli/commands/init_spec.rb[1:4:4] | passed | 0.00074 seconds |
51
- ./spec/aircana/cli/commands/init_spec.rb[1:4:5] | passed | 0.00085 seconds |
52
- ./spec/aircana/cli/commands/init_spec.rb[1:5:1] | passed | 0.00166 seconds |
53
- ./spec/aircana/cli/commands/init_spec.rb[1:5:2] | passed | 0.00186 seconds |
54
- ./spec/aircana/cli/commands/init_spec.rb[1:5:3] | passed | 0.00197 seconds |
55
- ./spec/aircana/cli/commands/init_spec.rb[1:5:4] | passed | 0.00759 seconds |
56
- ./spec/aircana/configuration_spec.rb[1:1:1] | passed | 0.0001 seconds |
57
- ./spec/aircana/configuration_spec.rb[1:2:1] | passed | 0.00005 seconds |
58
- ./spec/aircana/configuration_spec.rb[1:3:1] | passed | 0.00004 seconds |
59
- ./spec/aircana/configuration_spec.rb[1:4:1] | passed | 0.00004 seconds |
60
- ./spec/aircana/configuration_spec.rb[1:4:2] | passed | 0.00004 seconds |
61
- ./spec/aircana/contexts/confluence_spec.rb[1:1:1:1] | passed | 0.00212 seconds |
62
- ./spec/aircana/contexts/confluence_spec.rb[1:1:1:2] | passed | 0.00051 seconds |
63
- ./spec/aircana/contexts/confluence_spec.rb[1:1:1:3] | passed | 0.00124 seconds |
64
- ./spec/aircana/contexts/confluence_spec.rb[1:1:2:1] | passed | 0.00025 seconds |
65
- ./spec/aircana/contexts/confluence_spec.rb[1:1:2:2] | passed | 0.00032 seconds |
66
- ./spec/aircana/contexts/confluence_spec.rb[1:1:2:3] | passed | 0.00016 seconds |
67
- ./spec/aircana/contexts/confluence_spec.rb[1:1:3:1] | passed | 0.00043 seconds |
68
- ./spec/aircana/contexts/confluence_spec.rb[1:1:3:2] | passed | 0.00044 seconds |
69
- ./spec/aircana/contexts/local_spec.rb[1:1:1] | passed | 0.00035 seconds |
70
- ./spec/aircana/contexts/local_spec.rb[1:1:2] | passed | 0.00019 seconds |
71
- ./spec/aircana/contexts/local_spec.rb[1:1:3] | passed | 0.00016 seconds |
72
- ./spec/aircana/contexts/local_spec.rb[1:1:4] | passed | 0.00015 seconds |
73
- ./spec/aircana/contexts/local_spec.rb[1:1:5] | passed | 0.00016 seconds |
74
- ./spec/aircana/contexts/local_spec.rb[1:1:6] | passed | 0.00037 seconds |
75
- ./spec/aircana/contexts/local_spec.rb[1:1:7] | passed | 0.00022 seconds |
76
- ./spec/aircana/contexts/local_spec.rb[1:1:8] | passed | 0.00017 seconds |
77
- ./spec/aircana/contexts/manifest_spec.rb[1:1:1] | passed | 0.00019 seconds |
78
- ./spec/aircana/contexts/manifest_spec.rb[1:1:2] | passed | 0.00016 seconds |
79
- ./spec/aircana/contexts/manifest_spec.rb[1:2:1] | passed | 0.00017 seconds |
80
- ./spec/aircana/contexts/manifest_spec.rb[1:2:2] | passed | 0.00014 seconds |
81
- ./spec/aircana/contexts/manifest_spec.rb[1:3:1] | passed | 0.00015 seconds |
82
- ./spec/aircana/contexts/manifest_spec.rb[1:3:2] | passed | 0.00011 seconds |
83
- ./spec/aircana/contexts/manifest_spec.rb[1:3:3] | passed | 0.00016 seconds |
84
- ./spec/aircana/contexts/manifest_spec.rb[1:3:4] | passed | 0.00016 seconds |
85
- ./spec/aircana/contexts/manifest_spec.rb[1:4:1] | passed | 0.00015 seconds |
86
- ./spec/aircana/contexts/manifest_spec.rb[1:4:2] | passed | 0.00019 seconds |
87
- ./spec/aircana/contexts/manifest_spec.rb[1:5:1] | passed | 0.00014 seconds |
88
- ./spec/aircana/contexts/manifest_spec.rb[1:5:2] | passed | 0.00007 seconds |
89
- ./spec/aircana/contexts/manifest_spec.rb[1:6:1] | passed | 0.00008 seconds |
90
- ./spec/aircana/contexts/manifest_spec.rb[1:6:2] | passed | 0.00008 seconds |
91
- ./spec/aircana/contexts/manifest_spec.rb[1:6:3] | passed | 0.00007 seconds |
92
- ./spec/aircana/contexts/manifest_spec.rb[1:6:4] | passed | 0.00007 seconds |
93
- ./spec/aircana/contexts/manifest_spec.rb[1:6:5] | passed | 0.00007 seconds |
94
- ./spec/aircana/contexts/manifest_spec.rb[1:6:6] | passed | 0.00007 seconds |
95
- ./spec/aircana/contexts/manifest_spec.rb[1:6:7] | passed | 0.00007 seconds |
96
- ./spec/aircana/contexts/manifest_spec.rb[1:6:8] | passed | 0.00026 seconds |
97
- ./spec/aircana/contexts/manifest_spec.rb[1:6:9] | passed | 0.00016 seconds |
98
- ./spec/aircana/contexts/manifest_spec.rb[1:6:10] | passed | 0.00064 seconds |
99
- ./spec/aircana/contexts/web_spec.rb[1:1:1] | passed | 0.0008 seconds |
100
- ./spec/aircana/contexts/web_spec.rb[1:2:1] | passed | 0.00067 seconds |
101
- ./spec/aircana/contexts/web_spec.rb[1:3:1:1] | passed | 0.00061 seconds |
102
- ./spec/aircana/contexts/web_spec.rb[1:3:1:2] | passed | 0.00107 seconds |
103
- ./spec/aircana/contexts/web_spec.rb[1:3:1:3] | passed | 0.00039 seconds |
104
- ./spec/aircana/contexts/web_spec.rb[1:3:2:1] | passed | 0.00053 seconds |
105
- ./spec/aircana/contexts/web_spec.rb[1:3:2:2] | passed | 0.00047 seconds |
106
- ./spec/aircana/contexts/web_spec.rb[1:3:3:1] | passed | 0.0004 seconds |
107
- ./spec/aircana/contexts/web_spec.rb[1:3:3:2] | passed | 0.00135 seconds |
108
- ./spec/aircana/contexts/web_spec.rb[1:3:3:3] | passed | 0.00183 seconds |
109
- ./spec/aircana/contexts/web_spec.rb[1:3:3:4] | passed | 0.00122 seconds |
110
- ./spec/aircana/contexts/web_spec.rb[1:3:3:5] | passed | 0.00116 seconds |
111
- ./spec/aircana/contexts/web_spec.rb[1:3:4:1] | passed | 0.00057 seconds |
112
- ./spec/aircana/contexts/web_spec.rb[1:3:4:2] | passed | 0.00089 seconds |
113
- ./spec/aircana/contexts/web_spec.rb[1:3:4:3] | passed | 0.00061 seconds |
114
- ./spec/aircana/contexts/web_spec.rb[1:3:5:1] | passed | 0.00196 seconds |
115
- ./spec/aircana/contexts/web_spec.rb[1:3:5:2] | passed | 0.00063 seconds |
116
- ./spec/aircana/contexts/web_spec.rb[1:3:5:3] | passed | 0.00202 seconds |
117
- ./spec/aircana/contexts/web_spec.rb[1:3:6:1] | passed | 0.0007 seconds |
118
- ./spec/aircana/contexts/web_spec.rb[1:3:6:2] | passed | 0.00121 seconds |
119
- ./spec/aircana/contexts/web_spec.rb[1:3:6:3] | passed | 0.00029 seconds |
120
- ./spec/aircana/contexts/web_spec.rb[1:3:7:1] | passed | 0.00016 seconds |
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.00023 seconds |
123
- ./spec/aircana/fzf_helper_spec.rb[1:1:1:2] | passed | 0.00064 seconds |
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.00027 seconds |
126
- ./spec/aircana/fzf_helper_spec.rb[1:1:3:1] | passed | 0.00032 seconds |
127
- ./spec/aircana/fzf_helper_spec.rb[1:2:1:1] | passed | 0.00015 seconds |
128
- ./spec/aircana/fzf_helper_spec.rb[1:2:1:2] | passed | 0.00013 seconds |
129
- ./spec/aircana/fzf_helper_spec.rb[1:2:1:3] | passed | 0.00013 seconds |
130
- ./spec/aircana/fzf_helper_spec.rb[1:2:2:1] | passed | 0.00012 seconds |
131
- ./spec/aircana/fzf_helper_spec.rb[1:2:2:2] | passed | 0.0001 seconds |
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.0002 seconds |
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.00006 seconds |
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.00053 seconds |
140
- ./spec/aircana/generators/hooks_generator_spec.rb[1:3:2] | passed | 0.00025 seconds |
141
- ./spec/aircana/generators/hooks_generator_spec.rb[1:4:1] | passed | 0.00011 seconds |
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.00071 seconds |
145
- ./spec/aircana/generators/hooks_generator_spec.rb[1:7:1] | passed | 0.00021 seconds |
146
- ./spec/aircana/generators/plan_command_generator_spec.rb[1:1:1] | passed | 0.00044 seconds |
147
- ./spec/aircana/generators/plan_command_generator_spec.rb[1:1:2] | passed | 0.00046 seconds |
148
- ./spec/aircana/generators/plan_command_generator_spec.rb[1:1:3] | passed | 0.00032 seconds |
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.00009 seconds |
151
- ./spec/aircana/generators/record_command_generator_spec.rb[1:1:1] | passed | 0.00025 seconds |
152
- ./spec/aircana/generators/record_command_generator_spec.rb[1:2:1] | passed | 0.00046 seconds |
153
- ./spec/aircana/generators/record_command_generator_spec.rb[1:2:2] | passed | 0.00012 seconds |
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.00014 seconds |
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.00053 seconds |
167
- ./spec/aircana/llm/claude_client_spec.rb[1:1:1:2] | passed | 0.00044 seconds |
168
- ./spec/aircana/llm/claude_client_spec.rb[1:1:1:3] | passed | 0.0004 seconds |
169
- ./spec/aircana/llm/claude_client_spec.rb[1:1:1:4] | passed | 0.00041 seconds |
170
- ./spec/aircana/llm/claude_client_spec.rb[1:1:2:1] | passed | 0.0005 seconds |
171
- ./spec/aircana/llm/claude_client_spec.rb[1:1:2:2] | passed | 0.00042 seconds |
172
- ./spec/aircana/llm/claude_client_spec.rb[1:1:3:1] | passed | 0.00047 seconds |
173
- ./spec/aircana/llm/claude_client_spec.rb[1:2:1] | passed | 0.00044 seconds |
174
- ./spec/aircana/llm/claude_client_spec.rb[1:2:2] | passed | 0.00042 seconds |
175
- ./spec/aircana/llm/claude_client_spec.rb[1:3:1:1] | passed | 0.00029 seconds |
176
- ./spec/aircana/llm/claude_client_spec.rb[1:3:1:2] | passed | 0.00254 seconds |
177
- ./spec/aircana/system_checker_spec.rb[1:1:1:1] | passed | 0.0004 seconds |
178
- ./spec/aircana/system_checker_spec.rb[1:1:2:1] | passed | 0.0009 seconds |
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.00027 seconds |
181
- ./spec/aircana/system_checker_spec.rb[1:2:2] | passed | 0.00032 seconds |
182
- ./spec/aircana/system_checker_spec.rb[1:3:1] | passed | 0.00024 seconds |
183
- ./spec/aircana/system_checker_spec.rb[1:3:2] | passed | 0.00041 seconds |
184
- ./spec/aircana/system_checker_spec.rb[1:3:3] | passed | 0.00031 seconds |
185
- ./spec/aircana/system_checker_spec.rb[1:3:4] | passed | 0.00034 seconds |
186
- ./spec/aircana/system_checker_spec.rb[1:3:5] | passed | 0.0002 seconds |
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.00067 seconds |
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/` - Hook scripts and hooks.json manifest
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/` - Event 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 `/air-ask-expert` command to consult multiple specialized agents
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: /air-plan
114
- Plan --> Record: /air-record
115
- Record --> Execute: /air-execute
116
- Execute --> Review: /air-review
117
- Review --> ApplyFeedback: /air-apply-feedback
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. **`/air-plan`** - Create strategic implementation plan
125
- 2. **`/air-record`** - Save plan to Jira ticket
126
- 3. **`/air-execute`** - Implement plan and create commit
127
- 4. **`/air-review`** - Adversarial code review with expert feedback
128
- 5. **`/air-apply-feedback`** - Apply review changes and amend commit
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. `/air-plan` - Strategic Planning
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. `/air-record` - Save to Jira
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. `/air-execute` - Implementation
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 `/air-review`.
164
+ After commit creation, suggests running `/review`.
164
165
 
165
- #### 4. `/air-review` - Adversarial Review
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 /air-apply-feedback".
175
+ Explicitly states "Reviewing: <commit message>" and ends with "Run /apply-feedback".
175
176
 
176
- #### 5. `/air-apply-feedback` - Apply Changes
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
- /air-plan
194
+ /plan
194
195
  > Specify relevant files: src/api/, spec/api/
195
196
 
196
197
  # 2. Save plan to ticket
197
- /air-record PROJ-123
198
+ /record PROJ-123
198
199
 
199
200
  # 3. Execute implementation
200
- /air-execute PROJ-123
201
+ /execute PROJ-123
201
202
 
202
203
  # 4. Review the commit
203
- /air-review
204
+ /review
204
205
 
205
206
  # 5. Apply feedback
206
- /air-apply-feedback
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
- └── hooks/
271
- ├── hooks.json
272
- └── pre_tool_use.sh
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
- hooks_dir = Aircana.configuration.hooks_dir
158
- return unless Dir.exist?(hooks_dir)
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("#{hooks_dir}/*.sh")
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.hooks_dir}/*.sh").each do |hook_file|
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}/hooks/#{hook_name}.sh"
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 hooks")
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
- Aircana.human_logger.info(" Author: #{data["author"]}") if data["author"]
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
 
@@ -19,7 +19,7 @@ module Aircana
19
19
  end
20
20
 
21
21
  def default_output_path
22
- File.join(Aircana.configuration.output_dir, "commands", "air-apply-feedback.md")
22
+ File.join(Aircana.configuration.output_dir, "commands", "apply-feedback.md")
23
23
  end
24
24
  end
25
25
  end
@@ -19,7 +19,7 @@ module Aircana
19
19
  end
20
20
 
21
21
  def default_output_path
22
- File.join(Aircana.configuration.output_dir, "commands", "air-ask-expert.md")
22
+ File.join(Aircana.configuration.output_dir, "commands", "ask-expert.md")
23
23
  end
24
24
  end
25
25
  end
@@ -19,7 +19,7 @@ module Aircana
19
19
  end
20
20
 
21
21
  def default_output_path
22
- File.join(Aircana.configuration.output_dir, "commands", "air-execute.md")
22
+ File.join(Aircana.configuration.output_dir, "commands", "execute.md")
23
23
  end
24
24
  end
25
25
  end
@@ -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.hooks_dir, "#{hook_name}.sh")
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.hooks_dir, "#{hook_name}.sh")
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(**)
@@ -19,7 +19,7 @@ module Aircana
19
19
  end
20
20
 
21
21
  def default_output_path
22
- File.join(Aircana.configuration.output_dir, "commands", "air-plan.md")
22
+ File.join(Aircana.configuration.output_dir, "commands", "plan.md")
23
23
  end
24
24
  end
25
25
  end
@@ -19,7 +19,7 @@ module Aircana
19
19
  end
20
20
 
21
21
  def default_output_path
22
- File.join(Aircana.configuration.output_dir, "commands", "air-record.md")
22
+ File.join(Aircana.configuration.output_dir, "commands", "record.md")
23
23
  end
24
24
  end
25
25
  end
@@ -19,7 +19,7 @@ module Aircana
19
19
  end
20
20
 
21
21
  def default_output_path
22
- File.join(Aircana.configuration.output_dir, "commands", "air-review.md")
22
+ File.join(Aircana.configuration.output_dir, "commands", "review.md")
23
23
  end
24
24
  end
25
25
  end
@@ -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].freeze
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
- data[field] = value if value
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 /air-review command
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 '/air-review' command to review changes
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 '/air-record' command to save plan to Jira
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 '/air-apply-feedback' command
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 /air-apply-feedback to apply recommended changes\"
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 /air-review command.
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 /air-review."
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 '/air-record' command to save the plan to Jira ticket
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 '/air-apply-feedback' to apply recommended changes
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
  ) %>
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Aircana
4
- VERSION = "3.0.0.rc3"
4
+ VERSION = "3.0.0.rc4"
5
5
  end
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.rc3
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/air-apply-feedback.md
125
- - commands/air-ask-expert.md
126
- - commands/air-execute.md
127
- - commands/air-plan.md
128
- - commands/air-record.md
129
- - commands/air-review.md
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
@@ -1 +0,0 @@
1
- # Sample Command
File without changes
File without changes
File without changes
File without changes
File without changes