Class: Ace::Core::Molecules::PromptCacheManager

Inherits:
Object
  • Object
show all
Defined in:
lib/ace/core/molecules/prompt_cache_manager.rb

Overview

Standardized prompt cache management for ace-* gems Provides consistent session directory creation, prompt saving, and metadata management

This is a stateless utility class - all methods are class methods.

Defined Under Namespace

Classes: PromptCacheError

Class Method Summary collapse

Class Method Details

.create_session(gem_name, operation, project_root: nil, timestamp_formatter: nil) ⇒ String

Create a new session directory with standardized structure

Parameters:

  • gem_name (String)

    Name of the gem (e.g., ‘ace-review’, ‘ace-docs’)

  • operation (String)

    Operation name (e.g., ‘review’, ‘analyze-consistency’)

  • project_root (String, nil) (defaults to: nil)

    Optional project root (auto-detected if nil)

  • timestamp_formatter (Proc, nil) (defaults to: nil)

    Optional custom timestamp formatter

Returns:

  • (String)

    Path to created session directory

Raises:

  • (ArgumentError)


24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/ace/core/molecules/prompt_cache_manager.rb', line 24

def create_session(gem_name, operation, project_root: nil, timestamp_formatter: nil)
  raise ArgumentError, "gem_name cannot be nil or empty" if gem_name.nil? || gem_name.strip.empty?
  raise ArgumentError, "operation cannot be nil or empty" if operation.nil? || operation.strip.empty?

  begin
    root = project_root || Ace::Support::Fs::Molecules::ProjectRootFinder.find_or_current
    timestamp = timestamp_formatter ? timestamp_formatter.call(Time.now) : Time.now.strftime("%Y%m%d-%H%M%S")
    session_name = "#{operation}-#{timestamp}"
    session_dir = File.join(base_cache_path(root, gem_name), session_name)
    FileUtils.mkdir_p(session_dir)
    session_dir
  rescue Errno::ENOENT, Errno::EACCES => e
    raise PromptCacheError, "Failed to create session directory: #{e.message}"
  rescue => e
    raise PromptCacheError, "Unexpected error creating session: #{e.message}"
  end
end

.save_metadata(metadata, session_dir, validate: true) ⇒ String

Save metadata to session directory

Parameters:

  • metadata (Hash)

    Metadata hash

  • session_dir (String)

    Session directory path

  • validate (Boolean) (defaults to: true)

    Whether to validate metadata schema (default: true)

Returns:

  • (String)

    Path to saved file

Raises:

  • (ArgumentError)


63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/ace/core/molecules/prompt_cache_manager.rb', line 63

def (, session_dir, validate: true)
  raise ArgumentError, "metadata must be a Hash" unless .is_a?(Hash)
  raise ArgumentError, "session_dir cannot be nil or empty" if session_dir.nil? || session_dir.strip.empty?

  () if validate

  begin
     = File.join(session_dir, "metadata.yml")
    File.write(, YAML.dump())
    
  rescue Errno::ENOENT, Errno::EACCES => e
    raise PromptCacheError, "Failed to save metadata to #{}: #{e.message}"
  rescue => e
    raise PromptCacheError, "Unexpected error saving metadata: #{e.message}"
  end
end

.save_system_prompt(content, session_dir) ⇒ String

Save system prompt to session directory

Parameters:

  • content (String)

    Prompt content

  • session_dir (String)

    Session directory path

Returns:

  • (String)

    Path to saved file



46
47
48
# File 'lib/ace/core/molecules/prompt_cache_manager.rb', line 46

def save_system_prompt(content, session_dir)
  save_prompt(content, session_dir, "system.prompt.md")
end

.save_user_prompt(content, session_dir) ⇒ String

Save user prompt to session directory

Parameters:

  • content (String)

    Prompt content

  • session_dir (String)

    Session directory path

Returns:

  • (String)

    Path to saved file



54
55
56
# File 'lib/ace/core/molecules/prompt_cache_manager.rb', line 54

def save_user_prompt(content, session_dir)
  save_prompt(content, session_dir, "user.prompt.md")
end

.validate_metadata(metadata) ⇒ Object

Validate metadata schema

Parameters:

  • metadata (Hash)

    Metadata hash to validate

Raises:

  • (ArgumentError)

    If required fields are missing



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/ace/core/molecules/prompt_cache_manager.rb', line 83

def ()
  required_fields = %w[timestamp gem operation]
  missing = required_fields - .keys
  unless missing.empty?
    raise ArgumentError, "Missing required metadata fields: #{missing.join(", ")}"
  end

  # Validate field types
  unless ["timestamp"].is_a?(String) || ["timestamp"].is_a?(Time)
    raise ArgumentError, "Metadata 'timestamp' must be a String or Time"
  end

  unless ["gem"].is_a?(String) && !["gem"].strip.empty?
    raise ArgumentError, "Metadata 'gem' must be a non-empty String"
  end

  unless ["operation"].is_a?(String) && !["operation"].strip.empty?
    raise ArgumentError, "Metadata 'operation' must be a non-empty String"
  end
end