ace-design 0.2.0

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.
Files changed (111) hide show
  1. checksums.yaml +7 -0
  2. data/.ace-defaults/design/config.yml +9 -0
  3. data/.ace-defaults/design/contexts/app/component.md +3 -0
  4. data/.ace-defaults/design/contexts/app/view.md +3 -0
  5. data/.ace-defaults/design/contexts/app.md +3 -0
  6. data/.ace-defaults/design/contexts/project.md +7 -0
  7. data/.ace-defaults/design/contexts/site/component.md +3 -0
  8. data/.ace-defaults/design/contexts/site/view.md +3 -0
  9. data/.ace-defaults/design/contexts/site.md +3 -0
  10. data/.ace-defaults/design/presets/ace-vs-taste.yml +37 -0
  11. data/.ace-defaults/design/presets/fast.yml +18 -0
  12. data/.ace-defaults/design/presets/impeccable.yml +48 -0
  13. data/.ace-defaults/design/presets/superdesign.yml +48 -0
  14. data/.ace-defaults/design/presets/taste-v2.yml +46 -0
  15. data/.ace-defaults/design/presets/ui-ux-pro-max.yml +48 -0
  16. data/.ace-defaults/nav/protocols/guide-sources/ace-design.yml +8 -0
  17. data/.ace-defaults/nav/protocols/skill-sources/ace-design.yml +8 -0
  18. data/.ace-defaults/nav/protocols/tmpl-sources/ace-design.yml +8 -0
  19. data/.ace-defaults/nav/protocols/wfi-sources/ace-design.yml +8 -0
  20. data/CHANGELOG.md +37 -0
  21. data/LICENSE +21 -0
  22. data/README.md +119 -0
  23. data/Rakefile +12 -0
  24. data/browser/dependencies.mjs +20 -0
  25. data/browser/doctor.mjs +7 -0
  26. data/browser/inspect.mjs +61 -0
  27. data/browser/package-lock.json +71 -0
  28. data/browser/package.json +1 -0
  29. data/browser/preview.mjs +35 -0
  30. data/browser/source.mjs +14 -0
  31. data/docs/contexts.md +66 -0
  32. data/docs/inspiration.md +28 -0
  33. data/docs/intent-verification.md +73 -0
  34. data/docs/runner.md +108 -0
  35. data/docs/testing.md +18 -0
  36. data/docs/usage.md +38 -0
  37. data/exe/ace-design +19 -0
  38. data/handbook/benchmarks/app-booking/brief.md +8 -0
  39. data/handbook/benchmarks/app-booking/fixtures.json +46 -0
  40. data/handbook/benchmarks/app-inventory/brief.md +8 -0
  41. data/handbook/benchmarks/app-inventory/fixtures.json +38 -0
  42. data/handbook/benchmarks/app-support/brief.md +8 -0
  43. data/handbook/benchmarks/app-support/fixtures.json +41 -0
  44. data/handbook/benchmarks/site-community/brief.md +8 -0
  45. data/handbook/benchmarks/site-community/fixtures.json +41 -0
  46. data/handbook/benchmarks/site-course/brief.md +8 -0
  47. data/handbook/benchmarks/site-course/fixtures.json +41 -0
  48. data/handbook/benchmarks/site-studio/brief.md +8 -0
  49. data/handbook/benchmarks/site-studio/fixtures.json +38 -0
  50. data/handbook/catalog/app/error-recovery.md +11 -0
  51. data/handbook/catalog/app/status-feedback.md +11 -0
  52. data/handbook/catalog/app/task-first-density.md +11 -0
  53. data/handbook/catalog/shared/automated-a11y-boundary.md +11 -0
  54. data/handbook/catalog/shared/bounded-exploration.md +11 -0
  55. data/handbook/catalog/shared/context-before-style.md +11 -0
  56. data/handbook/catalog/shared/contextual-cards.md +11 -0
  57. data/handbook/catalog/shared/focus-visible.md +11 -0
  58. data/handbook/catalog/shared/responsive-reflow.md +11 -0
  59. data/handbook/catalog/site/critique-versus-defect.md +11 -0
  60. data/handbook/catalog/site/purposeful-links.md +11 -0
  61. data/handbook/catalog/site/subject-specific-hero.md +11 -0
  62. data/handbook/guides/design/process.g.md +20 -0
  63. data/handbook/skills/as-design-app/SKILL.md +21 -0
  64. data/handbook/skills/as-design-app-adjust/SKILL.md +23 -0
  65. data/handbook/skills/as-design-app-audit/SKILL.md +23 -0
  66. data/handbook/skills/as-design-app-implement/SKILL.md +22 -0
  67. data/handbook/skills/as-design-look-for-inspiration/SKILL.md +24 -0
  68. data/handbook/skills/as-design-site/SKILL.md +21 -0
  69. data/handbook/skills/as-design-site-adjust/SKILL.md +23 -0
  70. data/handbook/skills/as-design-site-audit/SKILL.md +23 -0
  71. data/handbook/skills/as-design-site-implement/SKILL.md +22 -0
  72. data/handbook/templates/design/benchmark-result.template.md +14 -0
  73. data/handbook/templates/design/brief.template.md +12 -0
  74. data/handbook/templates/design/feedback.template.md +8 -0
  75. data/handbook/templates/design/proposal.template.md +15 -0
  76. data/handbook/templates/design/source-ledger.template.md +5 -0
  77. data/handbook/workflow-instructions/design/adjust.wf.md +51 -0
  78. data/handbook/workflow-instructions/design/audit.wf.md +50 -0
  79. data/handbook/workflow-instructions/design/explore.wf.md +51 -0
  80. data/handbook/workflow-instructions/design/implement.wf.md +47 -0
  81. data/handbook/workflow-instructions/design/look-for-inspiration.wf.md +43 -0
  82. data/lib/ace/design/atoms/contracts.rb +36 -0
  83. data/lib/ace/design/cli/commands/adjust.rb +41 -0
  84. data/lib/ace/design/cli/commands/doctor.rb +18 -0
  85. data/lib/ace/design/cli/commands/explore.rb +42 -0
  86. data/lib/ace/design/cli/commands/inspect.rb +21 -0
  87. data/lib/ace/design/cli/commands/preset.rb +32 -0
  88. data/lib/ace/design/cli/commands/preview.rb +21 -0
  89. data/lib/ace/design/cli/commands/run_commands.rb +50 -0
  90. data/lib/ace/design/cli/commands/validate.rb +25 -0
  91. data/lib/ace/design/cli.rb +79 -0
  92. data/lib/ace/design/molecules/adjust_prompts.rb +40 -0
  93. data/lib/ace/design/molecules/agent_executor.rb +28 -0
  94. data/lib/ace/design/molecules/artifacts.rb +94 -0
  95. data/lib/ace/design/molecules/catalog.rb +36 -0
  96. data/lib/ace/design/molecules/context_document.rb +42 -0
  97. data/lib/ace/design/molecules/context_repository.rb +117 -0
  98. data/lib/ace/design/molecules/design_context.rb +96 -0
  99. data/lib/ace/design/molecules/design_prompts.rb +118 -0
  100. data/lib/ace/design/molecules/design_source.rb +89 -0
  101. data/lib/ace/design/molecules/preset.rb +120 -0
  102. data/lib/ace/design/molecules/runtime.rb +75 -0
  103. data/lib/ace/design/molecules/session.rb +123 -0
  104. data/lib/ace/design/molecules/skill_sources.rb +71 -0
  105. data/lib/ace/design/organisms/adjuster.rb +211 -0
  106. data/lib/ace/design/organisms/design_run.rb +394 -0
  107. data/lib/ace/design/organisms/generator.rb +127 -0
  108. data/lib/ace/design/organisms/inspector.rb +50 -0
  109. data/lib/ace/design/version.rb +6 -0
  110. data/lib/ace/design.rb +40 -0
  111. metadata +280 -0
@@ -0,0 +1,127 @@
1
+ # frozen_string_literal: true
2
+ require "fileutils"
3
+ require "digest"
4
+ require "ace/bundle"
5
+ require "time"
6
+ module Ace
7
+ module Design
8
+ module Organisms
9
+ class Generator
10
+ def initialize(config: Design.config, executor: Molecules::AgentExecutor.new)
11
+ @config, @executor = config, executor
12
+ end
13
+ def generate(surface: nil, prompt: nil, prompt_append: [], intent: "explore", from: nil, preset: "fast", input: [], fixtures: nil, model: nil,
14
+ variant_prompts: [], variant_prompt_files: [], language: nil, dry_run: false, kind: nil, profile: nil)
15
+ raise Error, "Unknown intent: #{intent}" unless %w[explore recreate reimagine].include?(intent)
16
+ raise Error, "explore does not accept --from" if intent == "explore" && from
17
+ raise Error, "#{intent} requires --from" if intent != "explore" && !from
18
+ source = Molecules::DesignSource.new(from, config: @config)
19
+ surface, kind = Molecules::DesignSource.scope(surface: surface, kind: kind, profile: profile, source: source.info)
20
+ origin = prompt.nil? ? "default" : "explicit"
21
+ if prompt.nil? && source.info&.fetch("type") == "session"
22
+ prompt = File.read(File.join(source.info.fetch("root"), "brief.md"))
23
+ origin = "session"
24
+ end
25
+ prompt ||= "#{intent.capitalize} the supplied interface, preserving its goals and functions." unless intent == "explore"
26
+ Atoms::Contracts.text(prompt, "prompt")
27
+ raise Error, "prompt_append must be a list" unless prompt_append.is_a?(Array)
28
+ prompt_append.each { |text| Atoms::Contracts.text(text, "prompt-append") }
29
+ brief_inputs = {"origin" => origin, "base" => prompt, "append" => prompt_append.dup}
30
+ prompt = ([prompt] + prompt_append).join("\n\n")
31
+ assumptions = Molecules::DesignContext.new.snapshot(surface: surface, kind: kind, context: profile, readonly: dry_run)
32
+ language ||= @config.fetch("language")
33
+ Atoms::Contracts.text(language, "language")
34
+ resolved = Molecules::Preset.load(name: preset, surface: surface, config: @config, model: model,
35
+ prompts: variant_prompts, prompt_files: variant_prompt_files, kind: kind, intent: intent)
36
+ # Validate all declarations before creating a session or starting preparation.
37
+ @executor.validate_model(resolved.fetch("preparation_model"))
38
+ resolved.fetch("variants").each do |slot|
39
+ @executor.validate_model(slot.fetch("model"), execution_preset: slot["execution_preset"])
40
+ end
41
+ begin
42
+ fixture_bytes = fixtures && File.binread(fixtures)
43
+ rescue SystemCallError => e
44
+ raise Error, "Cannot read --fixtures #{fixtures}: #{e.message}"
45
+ end
46
+ Atoms::Contracts.object(JSON.parse(fixture_bytes), "fixtures") if fixture_bytes
47
+ snapshot = load_context(resolved.fetch("input") + input)
48
+ requirements = Molecules::SkillSources.new(@config).requirements(resolved) + source.requirements
49
+ resolved["brief_inputs"] = brief_inputs
50
+ resolved["requirements"] = requirements
51
+ resolved["profile"] = assumptions.reject { |key, _| key == "document" }
52
+ resolved["source"] = source.info
53
+ resolved["surface"], resolved["kind"] = surface, kind
54
+ if dry_run
55
+ return {"status" => "planned", "resolved" => resolved, "requirements" => requirements, "brief" => prompt, "input_snapshot" => snapshot,
56
+ "fixtures_sha256" => fixture_bytes && Digest::SHA256.hexdigest(fixture_bytes),
57
+ "next" => "Run the same command without --dry-run"}
58
+ end
59
+ missing = requirements.select { |entry| entry["status"] == "missing" }
60
+ raise Error, "Missing preset requirements: #{missing.map { |r| r['name'] }.join(', ')}" unless missing.empty?
61
+ root = allocate_session
62
+ source.snapshot(root)
63
+ Molecules::SkillSources.new(@config).snapshot(root, resolved)
64
+ metadata = {"intent" => intent, "source" => source.info, "surface" => surface, "kind" => kind, "title" => prompt.lines.find { |line| !line.strip.empty? }.strip[0, 120], "language" => language,
65
+ "variants" => resolved.fetch("variants").map { |s| s.fetch("id") }}
66
+ Molecules::Artifacts.json(File.join(root, "session.json"), metadata)
67
+ Molecules::Artifacts.json(File.join(root, "resolved.json"), resolved)
68
+ File.write(File.join(root, "brief.md"), prompt)
69
+ File.write(File.join(root, "context.md"), snapshot)
70
+ File.write(File.join(root, "design.md"), assumptions.fetch("document"))
71
+ File.binwrite(File.join(root, "fixtures.json"), fixture_bytes) if fixture_bytes
72
+ state = {"project_root" => Dir.pwd, "status" => "prepared", "preparation" => {"status" => "pending"},
73
+ "supplied_fixtures" => !!fixture_bytes,
74
+ "inputs" => %w[brief.md context.md design.md session.json resolved.json].to_h { |f| [f, Digest::SHA256.file(File.join(root, f)).hexdigest] },
75
+ "workers" => metadata.fetch("variants").to_h { |id| [id, {"status" => "pending", "attempts" => []}] }}
76
+ state["inputs"]["fixtures.json"] = Digest::SHA256.hexdigest(fixture_bytes) if fixture_bytes
77
+ %w[source skills].each do |folder|
78
+ directory = File.join(root, folder)
79
+ next unless File.directory?(directory)
80
+ Molecules::Artifacts.files(directory).each do |file|
81
+ state["inputs"]["#{folder}/#{file}"] = Digest::SHA256.file(File.join(directory, file)).hexdigest
82
+ end
83
+ end
84
+ Molecules::Artifacts.json(File.join(root, "run.json"), state)
85
+ FileUtils.mkdir_p(File.join(root, "prompts"))
86
+ File.write(File.join(root, "prompts/system.md"), Molecules::DesignPrompts::SYSTEM)
87
+ File.write(File.join(root, "prompts/preparation.md"), Molecules::DesignPrompts.preparation(metadata, resolved, supplied: !!fixture_bytes))
88
+ resolved.fetch("variants").each do |slot|
89
+ File.write(File.join(root, "prompts/#{slot.fetch('id')}.md"), Molecules::DesignPrompts.variant(metadata, slot))
90
+ end
91
+ warn "Design session: #{root}"
92
+ run = DesignRun.new(root, executor: @executor)
93
+ run.resume
94
+ rescue JSON::ParserError => e
95
+ raise Error, "Invalid fixtures JSON: #{e.message}"
96
+ ensure
97
+ FileUtils.rm_rf(root) if root && !File.file?(File.join(root, "run.json"))
98
+ end
99
+ private
100
+ def allocate_session
101
+ base = File.expand_path(@config.fetch("run_root"))
102
+ FileUtils.mkdir_p(base)
103
+ 100.times do
104
+ root = File.join(base, Ace::B36ts.encode(Time.now, format: :ms))
105
+ begin
106
+ Dir.mkdir(root)
107
+ return root
108
+ rescue Errno::EEXIST
109
+ sleep 0.002
110
+ end
111
+ end
112
+ raise Error, "Could not allocate a unique Base36 session"
113
+ end
114
+ def load_context(inputs)
115
+ inputs.map do |input|
116
+ Atoms::Contracts.text(input, "context reference")
117
+ bundle = Ace::Bundle.load_auto(input, compressor: "off", allow_commands: false, allowed_root: Dir.pwd)
118
+ error = bundle.metadata[:error] || bundle.metadata["error"]
119
+ raise Error, "Context #{input}: #{error}" if error
120
+ raise Error, "Context #{input} is empty" if bundle.content.to_s.strip.empty?
121
+ "# Context: #{input}\n\n#{bundle.content}"
122
+ end.join("\n\n")
123
+ end
124
+ end
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+ require "fileutils"
3
+ require "securerandom"
4
+ module Ace
5
+ module Design
6
+ module Organisms
7
+ class Inspector
8
+ def initialize(config: Design.config, runtime: nil)
9
+ @config = config
10
+ @runtime = runtime || Molecules::Runtime.new(config)
11
+ end
12
+ def run(url:, surface:, out: nil)
13
+ Atoms::Contracts.url(url)
14
+ Atoms::Contracts.surface(surface)
15
+ seconds = Integer(@config.fetch("timeout"))
16
+ raise Error, "timeout must be between 1 and 300 seconds" unless (1..300).cover?(seconds)
17
+ output = File.expand_path(out || File.join(@config.fetch("run_root"), "#{Ace::B36ts.now}-#{SecureRandom.hex(4)}", "inspection"))
18
+ if File.symlink?(output) || (File.exist?(output) && (!File.directory?(output) || !Dir.empty?(output)))
19
+ raise Error, "Inspection output must be new or empty: #{output}"
20
+ end
21
+ FileUtils.mkdir_p(output)
22
+ owned_output = true
23
+ result = @runtime.capture(@runtime.node, @runtime.script("inspect.mjs"), url, surface, output,
24
+ @runtime.directory, seconds.to_s, timeout: seconds * 3 + 30)
25
+ report_path = File.join(output, "report.json")
26
+ raise Error, "Runner produced no report: #{result['stderr']}" unless File.file?(report_path)
27
+ report = JSON.parse(File.read(report_path))
28
+ unless report.is_a?(Hash) && %w[pass findings incomplete].include?(report["status"]) && report["viewports"].is_a?(Array)
29
+ raise Error, "Runner produced an invalid inspection report"
30
+ end
31
+ if report["status"] == "pass" && (report["viewports"].map { |v| v["width"] }.sort != [390, 768, 1440] ||
32
+ !report.fetch("errors", ["missing errors"]).empty? || !report.fetch("findings", ["missing findings"]).empty?)
33
+ raise Error, "Runner pass report lacks complete clean evidence"
34
+ end
35
+ if result["exit_code"] != 0 && report["status"] == "pass"
36
+ raise Error, "Runner failed despite a pass report: #{result['stderr']}"
37
+ end
38
+ report.merge("report_path" => report_path)
39
+ rescue JSON::ParserError => e
40
+ raise Error, "Invalid inspection JSON: #{e.message}"
41
+ rescue Error => e
42
+ if defined?(owned_output) && owned_output && File.directory?(output) && !File.exist?(File.join(output, "report.json"))
43
+ File.write(File.join(output, "error.json"), JSON.pretty_generate({"status" => "incomplete", "error" => e.message}))
44
+ end
45
+ raise
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+ module Ace
3
+ module Design
4
+ VERSION = "0.2.0"
5
+ end
6
+ end
data/lib/ace/design.rb ADDED
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+ require "json"
3
+ require "yaml"
4
+ require "date"
5
+ require "ace/support/config"
6
+ require "ace/support/cli"
7
+ require "ace/b36ts"
8
+ require_relative "design/version"
9
+ module Ace
10
+ module Design
11
+ class Error < StandardError; end
12
+ def self.gem_root
13
+ File.expand_path("../..", __dir__)
14
+ end
15
+ def self.config
16
+ defaults = YAML.safe_load_file(File.join(gem_root, ".ace-defaults/design/config.yml"))
17
+ overrides = Ace::Support::Config.create(gem_path: gem_root).resolve_namespace("design").to_h
18
+ Ace::Support::Config::Models::Config.wrap(defaults, overrides).fetch("design")
19
+ end
20
+ end
21
+ end
22
+ require_relative "design/atoms/contracts"
23
+ require_relative "design/molecules/preset"
24
+ require_relative "design/molecules/artifacts"
25
+ require_relative "design/molecules/agent_executor"
26
+ require_relative "design/molecules/context_document"
27
+ require_relative "design/molecules/context_repository"
28
+ require_relative "design/molecules/design_context"
29
+ require_relative "design/molecules/adjust_prompts"
30
+ require_relative "design/organisms/adjuster"
31
+ require_relative "design/molecules/design_source"
32
+ require_relative "design/molecules/skill_sources"
33
+ require_relative "design/molecules/design_prompts"
34
+ require_relative "design/molecules/session"
35
+ require_relative "design/organisms/design_run"
36
+ require_relative "design/organisms/generator"
37
+ require_relative "design/molecules/catalog"
38
+ require_relative "design/molecules/runtime"
39
+ require_relative "design/organisms/inspector"
40
+ require_relative "design/cli"
metadata ADDED
@@ -0,0 +1,280 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ace-design
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ platform: ruby
6
+ authors:
7
+ - Michal Czyz
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: ace-support-cli
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '0.6'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '0.6'
26
+ - !ruby/object:Gem::Dependency
27
+ name: ace-support-config
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '0.18'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '0.18'
40
+ - !ruby/object:Gem::Dependency
41
+ name: ace-llm
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '0.42'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '0.42'
54
+ - !ruby/object:Gem::Dependency
55
+ name: ace-llm-providers-cli
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: 0.36.2
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: 0.36.2
68
+ - !ruby/object:Gem::Dependency
69
+ name: ace-bundle
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '0.45'
75
+ type: :runtime
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '0.45'
82
+ - !ruby/object:Gem::Dependency
83
+ name: ace-b36ts
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '0.14'
89
+ type: :runtime
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '0.14'
96
+ - !ruby/object:Gem::Dependency
97
+ name: ace-support-core
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '0.32'
103
+ type: :runtime
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '0.32'
110
+ - !ruby/object:Gem::Dependency
111
+ name: minitest
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '5.19'
117
+ type: :development
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '5.19'
124
+ - !ruby/object:Gem::Dependency
125
+ name: rake
126
+ requirement: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '13.0'
131
+ type: :development
132
+ prerelease: false
133
+ version_requirements: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '13.0'
138
+ description: Shared site/app design workflows, local mockup previews, browser inspection
139
+ and curated inspiration.
140
+ email:
141
+ - mc@cs3b.com
142
+ executables:
143
+ - ace-design
144
+ extensions: []
145
+ extra_rdoc_files: []
146
+ files:
147
+ - ".ace-defaults/design/config.yml"
148
+ - ".ace-defaults/design/contexts/app.md"
149
+ - ".ace-defaults/design/contexts/app/component.md"
150
+ - ".ace-defaults/design/contexts/app/view.md"
151
+ - ".ace-defaults/design/contexts/project.md"
152
+ - ".ace-defaults/design/contexts/site.md"
153
+ - ".ace-defaults/design/contexts/site/component.md"
154
+ - ".ace-defaults/design/contexts/site/view.md"
155
+ - ".ace-defaults/design/presets/ace-vs-taste.yml"
156
+ - ".ace-defaults/design/presets/fast.yml"
157
+ - ".ace-defaults/design/presets/impeccable.yml"
158
+ - ".ace-defaults/design/presets/superdesign.yml"
159
+ - ".ace-defaults/design/presets/taste-v2.yml"
160
+ - ".ace-defaults/design/presets/ui-ux-pro-max.yml"
161
+ - ".ace-defaults/nav/protocols/guide-sources/ace-design.yml"
162
+ - ".ace-defaults/nav/protocols/skill-sources/ace-design.yml"
163
+ - ".ace-defaults/nav/protocols/tmpl-sources/ace-design.yml"
164
+ - ".ace-defaults/nav/protocols/wfi-sources/ace-design.yml"
165
+ - CHANGELOG.md
166
+ - LICENSE
167
+ - README.md
168
+ - Rakefile
169
+ - browser/dependencies.mjs
170
+ - browser/doctor.mjs
171
+ - browser/inspect.mjs
172
+ - browser/package-lock.json
173
+ - browser/package.json
174
+ - browser/preview.mjs
175
+ - browser/source.mjs
176
+ - docs/contexts.md
177
+ - docs/inspiration.md
178
+ - docs/intent-verification.md
179
+ - docs/runner.md
180
+ - docs/testing.md
181
+ - docs/usage.md
182
+ - exe/ace-design
183
+ - handbook/benchmarks/app-booking/brief.md
184
+ - handbook/benchmarks/app-booking/fixtures.json
185
+ - handbook/benchmarks/app-inventory/brief.md
186
+ - handbook/benchmarks/app-inventory/fixtures.json
187
+ - handbook/benchmarks/app-support/brief.md
188
+ - handbook/benchmarks/app-support/fixtures.json
189
+ - handbook/benchmarks/site-community/brief.md
190
+ - handbook/benchmarks/site-community/fixtures.json
191
+ - handbook/benchmarks/site-course/brief.md
192
+ - handbook/benchmarks/site-course/fixtures.json
193
+ - handbook/benchmarks/site-studio/brief.md
194
+ - handbook/benchmarks/site-studio/fixtures.json
195
+ - handbook/catalog/app/error-recovery.md
196
+ - handbook/catalog/app/status-feedback.md
197
+ - handbook/catalog/app/task-first-density.md
198
+ - handbook/catalog/shared/automated-a11y-boundary.md
199
+ - handbook/catalog/shared/bounded-exploration.md
200
+ - handbook/catalog/shared/context-before-style.md
201
+ - handbook/catalog/shared/contextual-cards.md
202
+ - handbook/catalog/shared/focus-visible.md
203
+ - handbook/catalog/shared/responsive-reflow.md
204
+ - handbook/catalog/site/critique-versus-defect.md
205
+ - handbook/catalog/site/purposeful-links.md
206
+ - handbook/catalog/site/subject-specific-hero.md
207
+ - handbook/guides/design/process.g.md
208
+ - handbook/skills/as-design-app-adjust/SKILL.md
209
+ - handbook/skills/as-design-app-audit/SKILL.md
210
+ - handbook/skills/as-design-app-implement/SKILL.md
211
+ - handbook/skills/as-design-app/SKILL.md
212
+ - handbook/skills/as-design-look-for-inspiration/SKILL.md
213
+ - handbook/skills/as-design-site-adjust/SKILL.md
214
+ - handbook/skills/as-design-site-audit/SKILL.md
215
+ - handbook/skills/as-design-site-implement/SKILL.md
216
+ - handbook/skills/as-design-site/SKILL.md
217
+ - handbook/templates/design/benchmark-result.template.md
218
+ - handbook/templates/design/brief.template.md
219
+ - handbook/templates/design/feedback.template.md
220
+ - handbook/templates/design/proposal.template.md
221
+ - handbook/templates/design/source-ledger.template.md
222
+ - handbook/workflow-instructions/design/adjust.wf.md
223
+ - handbook/workflow-instructions/design/audit.wf.md
224
+ - handbook/workflow-instructions/design/explore.wf.md
225
+ - handbook/workflow-instructions/design/implement.wf.md
226
+ - handbook/workflow-instructions/design/look-for-inspiration.wf.md
227
+ - lib/ace/design.rb
228
+ - lib/ace/design/atoms/contracts.rb
229
+ - lib/ace/design/cli.rb
230
+ - lib/ace/design/cli/commands/adjust.rb
231
+ - lib/ace/design/cli/commands/doctor.rb
232
+ - lib/ace/design/cli/commands/explore.rb
233
+ - lib/ace/design/cli/commands/inspect.rb
234
+ - lib/ace/design/cli/commands/preset.rb
235
+ - lib/ace/design/cli/commands/preview.rb
236
+ - lib/ace/design/cli/commands/run_commands.rb
237
+ - lib/ace/design/cli/commands/validate.rb
238
+ - lib/ace/design/molecules/adjust_prompts.rb
239
+ - lib/ace/design/molecules/agent_executor.rb
240
+ - lib/ace/design/molecules/artifacts.rb
241
+ - lib/ace/design/molecules/catalog.rb
242
+ - lib/ace/design/molecules/context_document.rb
243
+ - lib/ace/design/molecules/context_repository.rb
244
+ - lib/ace/design/molecules/design_context.rb
245
+ - lib/ace/design/molecules/design_prompts.rb
246
+ - lib/ace/design/molecules/design_source.rb
247
+ - lib/ace/design/molecules/preset.rb
248
+ - lib/ace/design/molecules/runtime.rb
249
+ - lib/ace/design/molecules/session.rb
250
+ - lib/ace/design/molecules/skill_sources.rb
251
+ - lib/ace/design/organisms/adjuster.rb
252
+ - lib/ace/design/organisms/design_run.rb
253
+ - lib/ace/design/organisms/generator.rb
254
+ - lib/ace/design/organisms/inspector.rb
255
+ - lib/ace/design/version.rb
256
+ homepage: https://github.com/cs3b/ace
257
+ licenses:
258
+ - MIT
259
+ metadata:
260
+ allowed_push_host: https://rubygems.org
261
+ source_code_uri: https://github.com/cs3b/ace/tree/main/ace-design
262
+ changelog_uri: https://github.com/cs3b/ace/blob/main/ace-design/CHANGELOG.md
263
+ rdoc_options: []
264
+ require_paths:
265
+ - lib
266
+ required_ruby_version: !ruby/object:Gem::Requirement
267
+ requirements:
268
+ - - ">="
269
+ - !ruby/object:Gem::Version
270
+ version: 3.2.0
271
+ required_rubygems_version: !ruby/object:Gem::Requirement
272
+ requirements:
273
+ - - ">="
274
+ - !ruby/object:Gem::Version
275
+ version: '0'
276
+ requirements: []
277
+ rubygems_version: 3.6.9
278
+ specification_version: 4
279
+ summary: Fast interactive web design directions, production handoff and browser evidence
280
+ test_files: []