aircana 3.2.1 → 4.0.0.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rspec_status +175 -160
- data/CHANGELOG.md +24 -0
- data/CLAUDE.md +50 -39
- data/README.md +70 -76
- data/lib/aircana/cli/app.rb +16 -21
- data/lib/aircana/cli/commands/generate.rb +0 -12
- data/lib/aircana/cli/commands/kb.rb +579 -0
- data/lib/aircana/cli/help_formatter.rb +5 -4
- data/lib/aircana/configuration.rb +13 -28
- data/lib/aircana/contexts/confluence.rb +55 -24
- data/lib/aircana/contexts/confluence_content.rb +4 -4
- data/lib/aircana/contexts/local.rb +8 -9
- data/lib/aircana/contexts/manifest.rb +46 -34
- data/lib/aircana/contexts/web.rb +47 -17
- data/lib/aircana/generators/skills_generator.rb +126 -0
- data/lib/aircana/templates/skills/base_skill.erb +12 -0
- data/lib/aircana/version.rb +1 -1
- metadata +4 -18
- data/lib/aircana/cli/commands/agents.rb +0 -733
- data/lib/aircana/generators/agents_generator.rb +0 -79
- data/lib/aircana/templates/agents/base_agent.erb +0 -31
- data/lib/aircana/templates/agents/defaults/apply_feedback.erb +0 -91
- data/lib/aircana/templates/agents/defaults/executor.erb +0 -84
- data/lib/aircana/templates/agents/defaults/jira.erb +0 -45
- data/lib/aircana/templates/agents/defaults/planner.erb +0 -63
- data/lib/aircana/templates/agents/defaults/reviewer.erb +0 -94
- data/lib/aircana/templates/agents/defaults/sub-agent-coordinator.erb +0 -90
- data/lib/aircana/templates/hooks/refresh_agents.erb +0 -66
- data/lib/aircana/templates/hooks/sync_local_knowledge.erb +0 -86
- data/spec_target_1760656566_428/agents/test-agent/manifest.json +0 -16
- data/spec_target_1760656588_38/agents/test-agent/manifest.json +0 -16
- data/spec_target_1760656647_612/agents/test-agent/manifest.json +0 -16
- data/spec_target_1760656660_113/agents/test-agent/manifest.json +0 -16
- data/spec_target_1760656689_268/agents/test-agent/manifest.json +0 -16
- data/spec_target_1760656710_387/agents/test-agent/manifest.json +0 -16
@@ -0,0 +1,126 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../generators"
|
4
|
+
require_relative "../contexts/manifest"
|
5
|
+
|
6
|
+
module Aircana
|
7
|
+
module Generators
|
8
|
+
class SkillsGenerator < BaseGenerator
|
9
|
+
attr_reader :kb_name, :short_description, :skill_description, :knowledge_files
|
10
|
+
|
11
|
+
# rubocop:disable Metrics/ParameterLists
|
12
|
+
def initialize(kb_name:, short_description: nil, skill_description: nil, knowledge_files: [], file_in: nil,
|
13
|
+
file_out: nil)
|
14
|
+
@kb_name = kb_name
|
15
|
+
@short_description = short_description
|
16
|
+
@skill_description = skill_description || generate_skill_description
|
17
|
+
@knowledge_files = knowledge_files
|
18
|
+
|
19
|
+
super(
|
20
|
+
file_in: file_in || default_template_path,
|
21
|
+
file_out: file_out || default_output_path
|
22
|
+
)
|
23
|
+
end
|
24
|
+
# rubocop:enable Metrics/ParameterLists
|
25
|
+
|
26
|
+
# Generate SKILL.md based on manifest data
|
27
|
+
def self.from_manifest(kb_name)
|
28
|
+
manifest = Contexts::Manifest.read_manifest(kb_name)
|
29
|
+
raise Error, "No manifest found for knowledge base '#{kb_name}'" unless manifest
|
30
|
+
|
31
|
+
knowledge_files = extract_knowledge_files_from_manifest(manifest)
|
32
|
+
skill_description = generate_skill_description_from_manifest(manifest, kb_name)
|
33
|
+
|
34
|
+
new(
|
35
|
+
kb_name: kb_name,
|
36
|
+
skill_description: skill_description,
|
37
|
+
knowledge_files: knowledge_files
|
38
|
+
)
|
39
|
+
end
|
40
|
+
|
41
|
+
# Class methods for manifest processing
|
42
|
+
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
|
43
|
+
# rubocop:disable Metrics/PerceivedComplexity
|
44
|
+
def self.extract_knowledge_files_from_manifest(manifest)
|
45
|
+
files = []
|
46
|
+
|
47
|
+
manifest["sources"]&.each do |source|
|
48
|
+
case source["type"]
|
49
|
+
when "confluence"
|
50
|
+
source["pages"]&.each do |page|
|
51
|
+
files << {
|
52
|
+
summary: page["summary"] || "Documentation",
|
53
|
+
filename: "#{sanitize_filename_from_id(page["id"])}.md"
|
54
|
+
}
|
55
|
+
end
|
56
|
+
when "web"
|
57
|
+
source["urls"]&.each do |url_entry|
|
58
|
+
files << {
|
59
|
+
summary: url_entry["summary"] || "Web resource",
|
60
|
+
filename: "#{sanitize_filename_from_url(url_entry["url"])}.md"
|
61
|
+
}
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
files
|
67
|
+
end
|
68
|
+
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
|
69
|
+
# rubocop:enable Metrics/PerceivedComplexity
|
70
|
+
|
71
|
+
def self.generate_skill_description_from_manifest(manifest, kb_name)
|
72
|
+
# Generate a description optimized for Claude's skill discovery
|
73
|
+
source_count = manifest["sources"]&.size || 0
|
74
|
+
"Discover critical context for #{kb_name.split("-").join(" ")} from #{source_count} knowledge sources"
|
75
|
+
end
|
76
|
+
|
77
|
+
def self.sanitize_filename_from_id(page_id)
|
78
|
+
"page_#{page_id}"
|
79
|
+
end
|
80
|
+
|
81
|
+
def self.sanitize_filename_from_url(url)
|
82
|
+
# Extract meaningful name from URL
|
83
|
+
uri = URI.parse(url)
|
84
|
+
path_segments = uri.path.split("/").reject(&:empty?)
|
85
|
+
|
86
|
+
if path_segments.any?
|
87
|
+
path_segments.last.gsub(/[^a-z0-9\-_]/i, "-").gsub(/-+/, "-").downcase
|
88
|
+
else
|
89
|
+
uri.host.gsub(/[^a-z0-9\-_]/i, "-").gsub(/-+/, "-").downcase
|
90
|
+
end
|
91
|
+
rescue URI::InvalidURIError
|
92
|
+
"web_resource"
|
93
|
+
end
|
94
|
+
|
95
|
+
protected
|
96
|
+
|
97
|
+
def locals
|
98
|
+
super.merge({
|
99
|
+
kb_name:,
|
100
|
+
skill_description:,
|
101
|
+
knowledge_files:
|
102
|
+
})
|
103
|
+
end
|
104
|
+
|
105
|
+
private
|
106
|
+
|
107
|
+
def default_template_path
|
108
|
+
File.join(File.dirname(__FILE__), "..", "templates", "skills", "base_skill.erb")
|
109
|
+
end
|
110
|
+
|
111
|
+
def default_output_path
|
112
|
+
File.join(Aircana.configuration.skills_dir, kb_name, "SKILL.md")
|
113
|
+
end
|
114
|
+
|
115
|
+
def generate_skill_description
|
116
|
+
return @skill_description if @skill_description
|
117
|
+
|
118
|
+
if @short_description
|
119
|
+
"Discover critical context for #{short_description}"
|
120
|
+
else
|
121
|
+
"Discover critical context for #{kb_name.split("-").join(" ")}"
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
---
|
2
|
+
name: Learn <%= kb_name.split("-").map(&:capitalize).join(" ") %>
|
3
|
+
description: <%= skill_description %>
|
4
|
+
---
|
5
|
+
|
6
|
+
# Learn <%= kb_name.split("-").map(&:capitalize).join(" ") %>
|
7
|
+
|
8
|
+
## Instructions
|
9
|
+
Choose a sub-topic most relevant to your current task:
|
10
|
+
<% knowledge_files.each do |file| %>
|
11
|
+
* <%= file[:summary] %>: [<%= file[:filename] %>](<%= file[:filename] %>)
|
12
|
+
<% end %>
|
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:
|
4
|
+
version: 4.0.0.rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Weston Dransfield
|
@@ -127,7 +127,6 @@ files:
|
|
127
127
|
- lib/aircana.rb
|
128
128
|
- lib/aircana/cli.rb
|
129
129
|
- lib/aircana/cli/app.rb
|
130
|
-
- lib/aircana/cli/commands/agents.rb
|
131
130
|
- lib/aircana/cli/commands/doctor.rb
|
132
131
|
- lib/aircana/cli/commands/doctor_checks.rb
|
133
132
|
- lib/aircana/cli/commands/doctor_helpers.rb
|
@@ -135,6 +134,7 @@ files:
|
|
135
134
|
- lib/aircana/cli/commands/generate.rb
|
136
135
|
- lib/aircana/cli/commands/hooks.rb
|
137
136
|
- lib/aircana/cli/commands/init.rb
|
137
|
+
- lib/aircana/cli/commands/kb.rb
|
138
138
|
- lib/aircana/cli/commands/plugin.rb
|
139
139
|
- lib/aircana/cli/help_formatter.rb
|
140
140
|
- lib/aircana/cli/shell_command.rb
|
@@ -150,7 +150,6 @@ files:
|
|
150
150
|
- lib/aircana/contexts/web.rb
|
151
151
|
- lib/aircana/fzf_helper.rb
|
152
152
|
- lib/aircana/generators.rb
|
153
|
-
- lib/aircana/generators/agents_generator.rb
|
154
153
|
- lib/aircana/generators/apply_feedback_command_generator.rb
|
155
154
|
- lib/aircana/generators/ask_expert_command_generator.rb
|
156
155
|
- lib/aircana/generators/base_generator.rb
|
@@ -160,6 +159,7 @@ files:
|
|
160
159
|
- lib/aircana/generators/plan_command_generator.rb
|
161
160
|
- lib/aircana/generators/record_command_generator.rb
|
162
161
|
- lib/aircana/generators/review_command_generator.rb
|
162
|
+
- lib/aircana/generators/skills_generator.rb
|
163
163
|
- lib/aircana/hooks_manifest.rb
|
164
164
|
- lib/aircana/human_logger.rb
|
165
165
|
- lib/aircana/initializers.rb
|
@@ -167,13 +167,6 @@ files:
|
|
167
167
|
- lib/aircana/plugin_manifest.rb
|
168
168
|
- lib/aircana/progress_tracker.rb
|
169
169
|
- lib/aircana/system_checker.rb
|
170
|
-
- lib/aircana/templates/agents/base_agent.erb
|
171
|
-
- lib/aircana/templates/agents/defaults/apply_feedback.erb
|
172
|
-
- lib/aircana/templates/agents/defaults/executor.erb
|
173
|
-
- lib/aircana/templates/agents/defaults/jira.erb
|
174
|
-
- lib/aircana/templates/agents/defaults/planner.erb
|
175
|
-
- lib/aircana/templates/agents/defaults/reviewer.erb
|
176
|
-
- lib/aircana/templates/agents/defaults/sub-agent-coordinator.erb
|
177
170
|
- lib/aircana/templates/commands/apply_feedback.erb
|
178
171
|
- lib/aircana/templates/commands/ask_expert.erb
|
179
172
|
- lib/aircana/templates/commands/execute.erb
|
@@ -184,20 +177,13 @@ files:
|
|
184
177
|
- lib/aircana/templates/hooks/notification_sqs.erb
|
185
178
|
- lib/aircana/templates/hooks/post_tool_use.erb
|
186
179
|
- lib/aircana/templates/hooks/pre_tool_use.erb
|
187
|
-
- lib/aircana/templates/hooks/refresh_agents.erb
|
188
180
|
- lib/aircana/templates/hooks/rspec_test.erb
|
189
181
|
- lib/aircana/templates/hooks/rubocop_pre_commit.erb
|
190
182
|
- lib/aircana/templates/hooks/session_start.erb
|
191
|
-
- lib/aircana/templates/hooks/sync_local_knowledge.erb
|
192
183
|
- lib/aircana/templates/hooks/user_prompt_submit.erb
|
184
|
+
- lib/aircana/templates/skills/base_skill.erb
|
193
185
|
- lib/aircana/version.rb
|
194
186
|
- sig/aircana.rbs
|
195
|
-
- spec_target_1760656566_428/agents/test-agent/manifest.json
|
196
|
-
- spec_target_1760656588_38/agents/test-agent/manifest.json
|
197
|
-
- spec_target_1760656647_612/agents/test-agent/manifest.json
|
198
|
-
- spec_target_1760656660_113/agents/test-agent/manifest.json
|
199
|
-
- spec_target_1760656689_268/agents/test-agent/manifest.json
|
200
|
-
- spec_target_1760656710_387/agents/test-agent/manifest.json
|
201
187
|
homepage: https://github.com/westonkd/aircana
|
202
188
|
licenses:
|
203
189
|
- MIT
|