Module: Ace::Task::Atoms::TaskFilePattern

Defined in:
lib/ace/task/atoms/task_file_pattern.rb

Overview

Glob patterns and matching logic for task spec files. Tasks use ‘.s.md` extension but exclude `.idea.s.md` (ideas). Subtask files are distinguished from primary files by their ID suffix.

Constant Summary collapse

SPEC_PATTERN =

Pattern matching all spec files

"*.s.md"
IDEA_PATTERN =

Pattern to exclude idea spec files

"*.idea.s.md"
SUBTASK_ID_REGEX =

Subtask ID pattern: parent ID + dot + single char (e.g., “8pp.t.q7w.a”)

/^([0-9a-z]{3}\.[a-z]\.[0-9a-z]{3})\.([a-z0-9])$/

Class Method Summary collapse

Class Method Details

.extract_id_from_filename(filename) ⇒ String?

Extract the task ID from a spec filename. “8pp.t.q7w-fix-login.s.md” → “8pp.t.q7w” “8pp.t.q7w.a-setup-db.s.md” → “8pp.t.q7w.a”

Parameters:

  • filename (String)

    Spec filename

Returns:

  • (String, nil)

    Extracted ID or nil



56
57
58
59
60
61
62
63
64
# File 'lib/ace/task/atoms/task_file_pattern.rb', line 56

def self.extract_id_from_filename(filename)
  # Remove .s.md extension
  base = filename.sub(/\.s\.md$/, "")
  return nil if base == filename # No .s.md extension

  # Match task ID at start: "8pp.t.q7w" or "8pp.t.q7w.a"
  match = base.match(/^([0-9a-z]{3}\.[a-z]\.[0-9a-z]{3}(?:\.[a-z0-9])?)/)
  match&.[](1)
end

.primary_file?(filename, folder_id) ⇒ Boolean

Check if a spec file is the primary file for its containing folder. The primary file’s ID prefix matches the folder’s ID prefix exactly. Subtask files have an additional ‘.char` suffix.

Parameters:

  • filename (String)

    Spec filename (e.g., “8pp.t.q7w-fix-login.s.md”)

  • folder_id (String)

    ID extracted from folder name (e.g., “8pp.t.q7w”)

Returns:

  • (Boolean)


26
27
28
29
30
31
32
33
34
35
# File 'lib/ace/task/atoms/task_file_pattern.rb', line 26

def self.primary_file?(filename, folder_id)
  return false if filename.end_with?(".idea.s.md")

  # Extract ID from filename: "8pp.t.q7w-fix-login.s.md" → "8pp.t.q7w"
  # or subtask: "8pp.t.q7w.a-setup-db.s.md" → "8pp.t.q7w.a"
  file_id = extract_id_from_filename(filename)
  return false unless file_id

  file_id == folder_id
end

.subtask_file?(filename) ⇒ Boolean

Check if a spec file is a subtask file.

Parameters:

  • filename (String)

    Spec filename

Returns:

  • (Boolean)


41
42
43
44
45
46
47
48
# File 'lib/ace/task/atoms/task_file_pattern.rb', line 41

def self.subtask_file?(filename)
  return false if filename.end_with?(".idea.s.md")

  file_id = extract_id_from_filename(filename)
  return false unless file_id

  file_id.match?(SUBTASK_ID_REGEX)
end