Module: Kward::Prompts
- Defined in:
- lib/kward/prompts.rb,
lib/kward/prompts/templates.rb
Overview
Prompt template discovery from configured markdown files.
Defined Under Namespace
Classes: Templates
Class Method Summary collapse
- .base_prompt ⇒ Object
- .config_agents_prompt ⇒ Object
- .config_agents_prompt_label ⇒ Object
- .config_agents_prompt_source ⇒ Object
- .persona_prompt(workspace_root = Dir.pwd, model: nil, reasoning_effort: nil, now: Time.now) ⇒ Object
- .prompt_parts(workspace_root: Dir.pwd, include_workspace_personality: true, model: nil, reasoning_effort: nil, now: Time.now, memory_context: nil, plugin_context: nil) ⇒ Object
- .prompt_section(label, content, source: nil) ⇒ Object
- .prompt_sections(workspace_root: Dir.pwd, include_workspace_personality: true, model: nil, reasoning_effort: nil, now: Time.now, memory_context: nil, plugin_context: nil) ⇒ Object
- .skills_prompt(skills = ConfigFiles.skills) ⇒ Object
- .system_message(workspace_root: Dir.pwd, include_workspace_personality: true, model: nil, reasoning_effort: nil, now: Time.now, memory_context: nil, plugin_context: nil) ⇒ Object
- .workspace_agents_context(workspace_root = Dir.pwd) ⇒ Object
- .workspace_agents_context_label(workspace_root = Dir.pwd) ⇒ Object
- .workspace_agents_hint(workspace_root = Dir.pwd) ⇒ Object
- .workspace_agents_prompt(workspace_root = Dir.pwd) ⇒ Object
Class Method Details
.base_prompt ⇒ Object
34 35 36 37 38 39 40 41 42 |
# File 'lib/kward/prompts.rb', line 34 def base_prompt <<~PROMPT.strip You are Kward, a concise practical CLI coding agent. Use tools to understand and modify software projects. Inspect files before changing them, make the smallest correct change, preserve existing style, and summarize what changed. Be honest about limitations. For web research, use web_search to discover sources, fetch_content for important human-readable pages, and fetch_raw for machine-readable resources such as JSON, YAML, XML, RSS, OpenAPI specs, and plain text. Prefer official or primary sources and cite or mention the URLs you relied on. Manage code context deliberately. Prefer context_for_task, summarize_file_structure, and read_file mode="outline"/"preview" before broad reads. Escalate to read_file mode="range" for exact lines, and use mode="full" only when focused context is insufficient. Use context_budget_stats when asked about context savings. PROMPT end |
.config_agents_prompt ⇒ Object
44 45 46 |
# File 'lib/kward/prompts.rb', line 44 def config_agents_prompt ConfigFiles.agents_prompt end |
.config_agents_prompt_label ⇒ Object
48 49 50 51 52 53 |
# File 'lib/kward/prompts.rb', line 48 def config_agents_prompt_label return "Config principles" if File.exist?(ConfigFiles.config_principles_path) return "Config AGENTS.md alias" if File.exist?(ConfigFiles.config_agents_path) "Config principles" end |
.config_agents_prompt_source ⇒ Object
55 56 57 58 59 60 |
# File 'lib/kward/prompts.rb', line 55 def config_agents_prompt_source return ConfigFiles.config_principles_path if File.exist?(ConfigFiles.config_principles_path) return ConfigFiles.config_agents_path if File.exist?(ConfigFiles.config_agents_path) nil end |
.persona_prompt(workspace_root = Dir.pwd, model: nil, reasoning_effort: nil, now: Time.now) ⇒ Object
62 63 64 |
# File 'lib/kward/prompts.rb', line 62 def persona_prompt(workspace_root = Dir.pwd, model: nil, reasoning_effort: nil, now: Time.now) ConfigFiles.persona_prompt(workspace_root, model: model, reasoning_effort: reasoning_effort, now: now) end |
.prompt_parts(workspace_root: Dir.pwd, include_workspace_personality: true, model: nil, reasoning_effort: nil, now: Time.now, memory_context: nil, plugin_context: nil) ⇒ Object
16 17 18 |
# File 'lib/kward/prompts.rb', line 16 def prompt_parts(workspace_root: Dir.pwd, include_workspace_personality: true, model: nil, reasoning_effort: nil, now: Time.now, memory_context: nil, plugin_context: nil) prompt_sections(workspace_root: workspace_root, include_workspace_personality: include_workspace_personality, model: model, reasoning_effort: reasoning_effort, now: now, memory_context: memory_context, plugin_context: plugin_context).map { |section| section[:content] } end |
.prompt_section(label, content, source: nil) ⇒ Object
95 96 97 98 99 |
# File 'lib/kward/prompts.rb', line 95 def prompt_section(label, content, source: nil) return nil if content.to_s.empty? { label: label, content: content, source: source } end |
.prompt_sections(workspace_root: Dir.pwd, include_workspace_personality: true, model: nil, reasoning_effort: nil, now: Time.now, memory_context: nil, plugin_context: nil) ⇒ Object
20 21 22 23 24 25 26 27 28 29 30 31 32 |
# File 'lib/kward/prompts.rb', line 20 def prompt_sections(workspace_root: Dir.pwd, include_workspace_personality: true, model: nil, reasoning_effort: nil, now: Time.now, memory_context: nil, plugin_context: nil) sections = [prompt_section("Built-in system prompt", base_prompt)] sections << prompt_section(config_agents_prompt_label, config_agents_prompt, source: config_agents_prompt_source) sections << prompt_section("Memory context", memory_context) unless memory_context.to_s.empty? if include_workspace_personality sections << prompt_section("Persona", persona_prompt(workspace_root, model: model, reasoning_effort: reasoning_effort, now: now)) sections << prompt_section("Plugin context", plugin_context) unless plugin_context.to_s.empty? end skills = ConfigFiles.skills(workspace_root: workspace_root) sections << prompt_section("Configured skills", skills_prompt(skills), source: skills.empty? ? nil : File.join(ConfigFiles.config_dir, "skills")) sections << prompt_section(workspace_agents_context_label(workspace_root), workspace_agents_context(workspace_root), source: ConfigFiles.workspace_agents_file?(workspace_root) ? ConfigFiles.workspace_agents_path(workspace_root) : nil) sections.compact end |
.skills_prompt(skills = ConfigFiles.skills) ⇒ Object
101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
# File 'lib/kward/prompts.rb', line 101 def skills_prompt(skills = ConfigFiles.skills) return nil if skills.empty? lines = [ "Agent Skills are available.", "When a task matches a skill's description, use read_skill to load its instructions before proceeding.", "Use read_skill with a relative path to read referenced files inside a skill directory.", "Available skills:" ] skills.each do |skill| lines << "- #{skill.name}: #{skill.description}" end lines.join("\n") end |
.system_message(workspace_root: Dir.pwd, include_workspace_personality: true, model: nil, reasoning_effort: nil, now: Time.now, memory_context: nil, plugin_context: nil) ⇒ Object
9 10 11 12 13 14 |
# File 'lib/kward/prompts.rb', line 9 def (workspace_root: Dir.pwd, include_workspace_personality: true, model: nil, reasoning_effort: nil, now: Time.now, memory_context: nil, plugin_context: nil) { role: "system", content: prompt_parts(workspace_root: workspace_root, include_workspace_personality: include_workspace_personality, model: model, reasoning_effort: reasoning_effort, now: now, memory_context: memory_context, plugin_context: plugin_context).compact.join("\n\n") } end |
.workspace_agents_context(workspace_root = Dir.pwd) ⇒ Object
66 67 68 69 70 71 72 |
# File 'lib/kward/prompts.rb', line 66 def workspace_agents_context(workspace_root = Dir.pwd) if ConfigFiles.enforce_workspace_agents_file? ConfigFiles.workspace_agents_prompt(workspace_root) else workspace_agents_hint(workspace_root) end end |
.workspace_agents_context_label(workspace_root = Dir.pwd) ⇒ Object
88 89 90 91 92 93 |
# File 'lib/kward/prompts.rb', line 88 def workspace_agents_context_label(workspace_root = Dir.pwd) return "Workspace AGENTS.md" unless ConfigFiles.workspace_agents_file?(workspace_root) return "Workspace AGENTS.md" if ConfigFiles.enforce_workspace_agents_file? "Workspace AGENTS.md hint" end |
.workspace_agents_hint(workspace_root = Dir.pwd) ⇒ Object
78 79 80 81 82 83 84 85 86 |
# File 'lib/kward/prompts.rb', line 78 def workspace_agents_hint(workspace_root = Dir.pwd) return nil unless ConfigFiles.workspace_agents_file?(workspace_root) path = ConfigFiles.workspace_agents_path(workspace_root) <<~PROMPT.strip Workspace guidance is available in AGENTS.md at the workspace root: #{path} For tasks involving this repository, read it before analyzing or modifying project files, and follow it when it does not conflict with higher-priority instructions or the user's request. PROMPT end |
.workspace_agents_prompt(workspace_root = Dir.pwd) ⇒ Object
74 75 76 |
# File 'lib/kward/prompts.rb', line 74 def workspace_agents_prompt(workspace_root = Dir.pwd) ConfigFiles.workspace_agents_prompt(workspace_root) end |