aia 0.8.3 → 0.8.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 15a24480e7b5958570ae21ef3e3f958cdb991a1f03cb88ebe3e8ca52a6029f9a
4
- data.tar.gz: dcef2697a2d2fdec85e371421a5c16a48c70d3688ea7bb6646f001df5e795d68
3
+ metadata.gz: 307fe4fba0b6c2134cba097ffd9b01750eea1f3e06d6c6de5131099435caaa16
4
+ data.tar.gz: ac46548236f1c9162d62af9a999776d9a01ffa5cc8ff283ed9bfd774414ddc85
5
5
  SHA512:
6
- metadata.gz: 97f8c423247051e31eef8b6a66fdde22fe72438097da41bb30ec53ef56508266e07f5502fa85cf8cfb63ebad22e995d7c7b4cbe55745f20e87b2b535cbd0b55c
7
- data.tar.gz: c48ebed9374edc9a8dcf86b2dd592031c1bef02b60f5d61e113a9c90bf31865030231ebc267a6308ca46d71f3e864d02e44bfc93f221112102309ddf2186d563
6
+ metadata.gz: '09ec4085dabf70365ccc74a95126891a6075eefc57ad1a652432278b38355f55d2c503ebc6e10b52d9f77e3d7788fef0a9b1d9d6e6aa3b7d72b2cda82d337c08'
7
+ data.tar.gz: 84eed4f09f8d9d506887ea91cd9b810cc47e77a724c3031e43b464779e5cfcaf5f0a92cc30304bf0d6ffea0eb31e35a23dc2baabff1671cff1bca8852b7e7801
data/.version CHANGED
@@ -1 +1 @@
1
- 0.8.3
1
+ 0.8.5
data/CHANGELOG.md CHANGED
@@ -2,6 +2,11 @@
2
2
  ## [Unreleased]
3
3
 
4
4
  ## Released
5
+ ### [0.8.5] 2025-04-49
6
+ - documentation updates
7
+ - integrated the https://pure.md web service for inserting web pages into the context window
8
+ - //include http?://example.com/stuff
9
+ - //webpage http?://example.com/stuff
5
10
 
6
11
  ### [0.8.2] 2025-04-18
7
12
  - fixed problems with pre-loaded context and chat repl
data/README.md CHANGED
@@ -17,18 +17,13 @@
17
17
  AIA leverages the [prompt_manager gem](https://github.com/madbomber/prompt_manager) to manage prompts. It utilizes the [CLI tool fzf](https://github.com/junegunn/fzf) for prompt selection.
18
18
 
19
19
  **Most Recent Change**: Refer to the [Changelog](CHANGELOG.md)
20
+ - //include directive now supports web URLs
21
+ - //webpage insert web URL content as markdown into context
20
22
 
21
- **Notable Recent Changes:**
22
- - **Directive Processing in Chat and Prompts:** You can now use directives in chat sessions and prompt files with the syntax: `//command args`. Supported directives include:
23
- - `shell`/`sh`: Execute shell commands
24
- - `ruby`/`rb`: Execute Ruby code
25
- - `config`/`cfg`: Display or update configuration
26
- - `include`/`inc`: Include file content
27
- - `next`: Specify the next prompt ID in a sequence
28
- - `pipeline`: Specify a pipeline of prompt IDs to process
29
- - `clear`: Clear the context (handy in a chat session)
30
- - `help`: Show available directives
23
+ **Wiki**: [Checkout the AIA Wiki](https://github.com/MadBomber/aia/wiki)
31
24
 
25
+ **Notable Recent Changes:**
26
+ - **Directive Processing in Chat and Prompts:** You can now use directives in chat sessions and prompt files. Use the directive **//help** to get a list of available directives.
32
27
 
33
28
  <!-- Tocer[start]: Auto-generated, don't remove. -->
34
29
 
@@ -90,7 +85,7 @@ Install the command-line utilities by executing:
90
85
 
91
86
  brew install fzf
92
87
 
93
- You will also need to establish a directory in your file system where your prompt text files, last used parameters and usage log files are kept.
88
+ You will also need to establish a directory in your filesystem where your prompt text files, last used parameters and usage log files are kept.
94
89
 
95
90
  Setup a system environment variable (envar) named "AIA_PROMPTS_DIR" that points to your prompts directory. The default is in your HOME directory named ".prompts". The envar "AIA_ROLES_PREFIX" points to your role prefix where you have prompts that define the different roles you want the LLM to assume when it is doing its work. The default roles prefix is "roles".
96
91
 
@@ -104,7 +99,7 @@ aia --completion bash
104
99
 
105
100
  ## What is a Prompt ID?
106
101
 
107
- A prompt ID is the basename of a text file (extension *.txt) located in a prompts directory. The prompts directory is specified by the environment variable "AIA_PROMPTS_DIR". If this variable is not set, the default is in your HOME directory named ".prompts". It can also be set on the command line with the `--prompts-dir` option.
102
+ A prompt ID is the basename of a text file (extension *.txt) located in a prompts directory. The prompts directory is specified by the environment variable "AIA_PROMPTS_DIR". If this variable is not set, the default is in your HOME directory named ".prompts". It can also be set on the command line with the `--prompts-dir` option.
108
103
 
109
104
  This file contains the context and instructions for the LLM to follow. The prompt ID is what you use as an option on the command line to specify which prompt text file to use. Prompt files can have comments, parameters, directives and ERB blocks along with the instruction text to feed to the LLM. It can also have shell commands and use system environment variables. Consider the following example:
110
105
 
@@ -142,16 +137,32 @@ Tell me how to do something for a $(uname -s) platform that would rename all
142
137
  of the files in the directory $MY_DIRECTORY to have a prefix of for its filename
143
138
  that is [PREFIX] and a ${SUFFIX}
144
139
 
145
- # directives, ERB blocks and other junk can be used
146
- # anywhere in the file mixing dynamic context/instructions with
147
- # the static stuff.
140
+ <!--
141
+ directives, ERB blocks and other junk can be used
142
+ anywhere in the file mixing dynamic context/instructions with
143
+ the static stuff.
144
+ -->
145
+
146
+ ```markdown
147
+ # Header 1 -- not a comment
148
+ ## Header 2 -- not a comment
149
+ ### Header 3, etc -- not a comment
150
+
151
+ ```ruby
152
+ # this is a comment; but it stays in the prompt
153
+ puts "hello world" <!-- this is also a comment; but it gets removed -->
154
+ ```
155
+ Kewl!
156
+ ```
148
157
 
149
158
  __END__
150
159
 
151
- Block comments that are not part of the context or instructions to
152
- the LLM. Stuff that is just here ofr documentation.
160
+ Everything after the "__END__" line is not part of the context or instructions to
161
+ the LLM.
153
162
  ```
154
163
 
164
+ Comments in a prompt text file are just there to document the prompt. They are removed before the completed prompt is processed by the LLM. This reduces token counts; but, more importantly it helps you remember why you structured your prompt they way you did - if you remembered to document your prompt.
165
+
155
166
  That is just about everything including the kitchen sink that a pre-compositional parameterized prompt file can have. It can be an executable with a she-bang line and a special system prompt name `run` as shown in the example. It has line comments that use the `#` symbol. It had end of file block comments that appear after the "__END__" line. It has directive command that begin with the double slash `//` - an homage to IBM JCL. It has shell variables in both forms. It has shell commands. It has parameters that default to a regex that uses square brackets and all uppercase characeters to define the parameter name whose value is to be given in a Q&A session before the prompt is sent to the LLM for processing.
156
167
 
157
168
  AIA has the ability to define a workflow of prompt IDs with either the //next or //pipeline directives.
data/lib/aia/config.rb CHANGED
@@ -10,15 +10,17 @@ require 'toml-rb'
10
10
  require 'erb'
11
11
  require 'optparse'
12
12
 
13
-
14
13
  module AIA
15
14
  class Config
16
- DEFAULT_CONFIG = {
15
+ DEFAULT_CONFIG = OpenStruct.new({
17
16
  aia_dir: File.join(ENV['HOME'], '.aia'),
18
17
  config_file: File.join(ENV['HOME'], '.aia', 'config.yml'),
19
18
  out_file: 'temp.md',
20
19
  log_file: File.join(ENV['HOME'], '.prompts', '_prompts.log'),
21
20
  prompts_dir: File.join(ENV['HOME'], '.prompts'),
21
+ #
22
+ prompt_extname: PromptManager::Storage::FileSystemAdapter::PROMPT_EXTENSION,
23
+ #
22
24
  roles_prefix: 'roles',
23
25
  roles_dir: File.join(ENV['HOME'], '.prompts', 'roles'),
24
26
  role: '',
@@ -67,11 +69,10 @@ module AIA
67
69
 
68
70
  # Ruby libraries to require for Ruby binding
69
71
  require_libs: [],
70
- }.freeze
71
-
72
+ }).freeze
72
73
 
73
74
  def self.setup
74
- default_config = OpenStruct.new(DEFAULT_CONFIG)
75
+ default_config = DEFAULT_CONFIG.dup
75
76
  cli_config = cli_options
76
77
  envar_config = envar_options(default_config, cli_config)
77
78
 
@@ -92,6 +93,35 @@ module AIA
92
93
 
93
94
 
94
95
  def self.tailor_the_config(config)
96
+ remaining_args = config.remaining_args.dup
97
+ config.remaining_args = nil
98
+
99
+ # Is first remaining argument a prompt ID?
100
+ unless remaining_args.empty?
101
+ maybe_id = remaining_args.first
102
+ maybe_id_plus = File.join(config.prompts_dir, maybe_id + config.prompt_extname)
103
+
104
+ if AIA.bad_file?(maybe_id) && AIA.good_file?(maybe_id_plus)
105
+ config.prompt_id =remaining_args.shift
106
+ end
107
+ end
108
+
109
+ unless remaining_args.empty?
110
+ bad_files = remaining_args.reject { |filename| AIA.good_file?(filename) }
111
+ if bad_files.any?
112
+ STDERR.puts "Error: The following files do not exist: #{bad_files.join(', ')}"
113
+ exit 1
114
+ end
115
+
116
+ config.context_files = remaining_args
117
+ end
118
+
119
+ if config.prompt_id.nil? && !config.chat && !config.fuzzy
120
+ STDERR.puts "Error: A prompt ID is required unless using --chat, --fuzzy, or providing context files. Use -h or --help for help."
121
+ exit 1
122
+ end
123
+
124
+
95
125
  unless config.role.empty?
96
126
  unless config.roles_prefix.empty?
97
127
  unless config.role.start_with?(config.roles_prefix)
@@ -151,7 +181,7 @@ module AIA
151
181
  STDERR.puts "Error: A prompt ID is required unless using --chat, --fuzzy, or providing context files. Use -h or --help for help."
152
182
  exit 1
153
183
  end
154
-
184
+
155
185
  # If we're in chat mode with context files but no prompt_id, that's valid
156
186
  if config.chat && config.prompt_id.empty? && config.context_files && !config.context_files.empty?
157
187
  # This is a valid use case - no action needed
@@ -391,32 +421,13 @@ module AIA
391
421
 
392
422
  # Parse the command line arguments
393
423
  begin
394
- remaining_args = opt_parser.parse(args)
424
+ config.remaining_args = opt_parser.parse(args)
395
425
  rescue OptionParser::InvalidOption => e
396
426
  puts e.message
397
427
  puts opt_parser
398
428
  exit 1
399
429
  end
400
430
 
401
- # Handle remaining args
402
- unless remaining_args.empty?
403
- # If in chat mode and all args are existing files, treat them all as context files
404
- if config.chat && remaining_args.all? { |arg| File.exist?(arg) }
405
- config.context_files = remaining_args
406
- # If first arg is empty string and we're in chat mode, treat all args as context files
407
- elsif config.chat && remaining_args.first == ""
408
- remaining_args.shift # Remove the empty string
409
- config.context_files = remaining_args unless remaining_args.empty?
410
- else
411
- # First remaining arg is the prompt ID
412
- config.prompt_id = remaining_args.shift
413
-
414
- # Remaining args are context files
415
- config.context_files = remaining_args unless remaining_args.empty?
416
- end
417
- end
418
-
419
-
420
431
  config
421
432
  end
422
433
 
@@ -1,7 +1,10 @@
1
1
  # lib/aia/directive_processor.rb
2
2
 
3
+ require 'faraday'
4
+
3
5
  module AIA
4
6
  class DirectiveProcessor
7
+ PUREMD_API_KEY = ENV.fetch('PUREMD_API_KEY', nil)
5
8
  EXCLUDED_METHODS = %w[ run initialize private? ]
6
9
  @descriptions = {}
7
10
  @aliases = {}
@@ -100,10 +103,32 @@ module AIA
100
103
  !respond_to?(method_name) && respond_to?(method_name, true)
101
104
  end
102
105
 
106
+
103
107
  ################
104
108
  ## Directives ##
105
109
  ################
106
110
 
111
+
112
+ desc "webpage inserted as markdown to context using pure.md"
113
+ def webpage(args, context_manager=nil)
114
+ if PUREMD_API_KEY.nil?
115
+ "ERROR: PUREMD_API_KEY is required in order to include a webpage"
116
+ else
117
+ url = `echo #{args.shift}`.strip
118
+ puremd_url = "https://pure.md/#{url}"
119
+
120
+ response = Faraday.get(puremd_url) do |req|
121
+ req.headers['x-puremd-api-token'] = PUREMD_API_KEY
122
+ end
123
+
124
+ if 200 == response.status
125
+ response.body
126
+ else
127
+ "Error: wtatus was #{r.status}\n#{ap response}"
128
+ end
129
+ end
130
+ end
131
+
107
132
  desc "Specify the next prompt ID to process after this one"
108
133
  def next(args = [])
109
134
  if args.empty?
@@ -129,6 +154,10 @@ module AIA
129
154
  # echo takes care of envars and tilde expansion
130
155
  file_path = `echo #{args.shift}`.strip
131
156
 
157
+ if file_path.start_with?(/http?:\/\//)
158
+ return webpage(args)
159
+ end
160
+
132
161
  if @included_files.include?(file_path)
133
162
  ""
134
163
  else
data/lib/aia.rb CHANGED
@@ -45,6 +45,16 @@ module AIA
45
45
  @config.client = client
46
46
  end
47
47
 
48
+ def self.good_file?(filename)
49
+ File.exist?(filename) &&
50
+ File.readable?(filename) &&
51
+ !File.directory?(filename)
52
+ end
53
+
54
+ def self.bad_file?(filename)
55
+ !good_file?(filename)
56
+ end
57
+
48
58
  def self.build_flags
49
59
  @config.each_pair do |key, value|
50
60
  if [TrueClass, FalseClass].include?(value.class)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aia
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.3
4
+ version: 0.8.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dewayne VanHoozer
@@ -37,6 +37,20 @@ dependencies:
37
37
  - - ">="
38
38
  - !ruby/object:Gem::Version
39
39
  version: '0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: faraday
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
40
54
  - !ruby/object:Gem::Dependency
41
55
  name: os
42
56
  requirement: !ruby/object:Gem::Requirement
@@ -57,14 +71,14 @@ dependencies:
57
71
  requirements:
58
72
  - - ">="
59
73
  - !ruby/object:Gem::Version
60
- version: 0.4.1
74
+ version: 0.5.2
61
75
  type: :runtime
62
76
  prerelease: false
63
77
  version_requirements: !ruby/object:Gem::Requirement
64
78
  requirements:
65
79
  - - ">="
66
80
  - !ruby/object:Gem::Version
67
- version: 0.4.1
81
+ version: 0.5.2
68
82
  - !ruby/object:Gem::Dependency
69
83
  name: reline
70
84
  requirement: !ruby/object:Gem::Requirement
@@ -247,17 +261,13 @@ dependencies:
247
261
  - - ">="
248
262
  - !ruby/object:Gem::Version
249
263
  version: '0'
250
- description: A command-line AI Assistante (aia) that provides pre-compositional template
251
- prompt management to various backend gen-AI processes such as llm, mods and sgpt
252
- support processing of prompts both via remote API calls as well as keeping everything
253
- local through the use of locally managed models and the LocalAI API. Complete shell
254
- integration allows a prompt to access system environment variables and execut shell
255
- commands as part of the prompt content. In addition full embedded Ruby support
256
- is provided given even more dynamic prompt conditional content. It is a generalized
257
- power house that rivals specialized gen-AI tools. aia currently supports "mods"
258
- and "sgpt" CLI tools. aia uses "ripgrep" and "fzf" CLI utilities to search for
259
- and select prompt files to send to the backend gen-AI tool along with supported
260
- context files.
264
+ description: |
265
+ Unleash the full power of AI from your terminal! AIA is a cutting-edge CLI
266
+ assistant for generative AI workflows, offering dynamic prompt management,
267
+ seamless shell and Ruby integration, interactive chat, and advanced automation.
268
+ Effortlessly craft, manage, and execute prompts with embedded directives,
269
+ history, and flexible configuration. Experience next-level productivity for
270
+ developers, power users, and AI enthusiasts—all from your command line.
261
271
  email:
262
272
  - dvanhoozer@gmail.com
263
273
  executables:
@@ -321,5 +331,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
321
331
  requirements: []
322
332
  rubygems_version: 3.6.8
323
333
  specification_version: 4
324
- summary: AI Assistant (aia) a command-line (CLI) utility
334
+ summary: 'AI Assistant: dynamic prompts, shell & Ruby integration, and seamless chat
335
+ workflows.'
325
336
  test_files: []