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.
- checksums.yaml +7 -0
- data/.ace-defaults/design/config.yml +9 -0
- data/.ace-defaults/design/contexts/app/component.md +3 -0
- data/.ace-defaults/design/contexts/app/view.md +3 -0
- data/.ace-defaults/design/contexts/app.md +3 -0
- data/.ace-defaults/design/contexts/project.md +7 -0
- data/.ace-defaults/design/contexts/site/component.md +3 -0
- data/.ace-defaults/design/contexts/site/view.md +3 -0
- data/.ace-defaults/design/contexts/site.md +3 -0
- data/.ace-defaults/design/presets/ace-vs-taste.yml +37 -0
- data/.ace-defaults/design/presets/fast.yml +18 -0
- data/.ace-defaults/design/presets/impeccable.yml +48 -0
- data/.ace-defaults/design/presets/superdesign.yml +48 -0
- data/.ace-defaults/design/presets/taste-v2.yml +46 -0
- data/.ace-defaults/design/presets/ui-ux-pro-max.yml +48 -0
- data/.ace-defaults/nav/protocols/guide-sources/ace-design.yml +8 -0
- data/.ace-defaults/nav/protocols/skill-sources/ace-design.yml +8 -0
- data/.ace-defaults/nav/protocols/tmpl-sources/ace-design.yml +8 -0
- data/.ace-defaults/nav/protocols/wfi-sources/ace-design.yml +8 -0
- data/CHANGELOG.md +37 -0
- data/LICENSE +21 -0
- data/README.md +119 -0
- data/Rakefile +12 -0
- data/browser/dependencies.mjs +20 -0
- data/browser/doctor.mjs +7 -0
- data/browser/inspect.mjs +61 -0
- data/browser/package-lock.json +71 -0
- data/browser/package.json +1 -0
- data/browser/preview.mjs +35 -0
- data/browser/source.mjs +14 -0
- data/docs/contexts.md +66 -0
- data/docs/inspiration.md +28 -0
- data/docs/intent-verification.md +73 -0
- data/docs/runner.md +108 -0
- data/docs/testing.md +18 -0
- data/docs/usage.md +38 -0
- data/exe/ace-design +19 -0
- data/handbook/benchmarks/app-booking/brief.md +8 -0
- data/handbook/benchmarks/app-booking/fixtures.json +46 -0
- data/handbook/benchmarks/app-inventory/brief.md +8 -0
- data/handbook/benchmarks/app-inventory/fixtures.json +38 -0
- data/handbook/benchmarks/app-support/brief.md +8 -0
- data/handbook/benchmarks/app-support/fixtures.json +41 -0
- data/handbook/benchmarks/site-community/brief.md +8 -0
- data/handbook/benchmarks/site-community/fixtures.json +41 -0
- data/handbook/benchmarks/site-course/brief.md +8 -0
- data/handbook/benchmarks/site-course/fixtures.json +41 -0
- data/handbook/benchmarks/site-studio/brief.md +8 -0
- data/handbook/benchmarks/site-studio/fixtures.json +38 -0
- data/handbook/catalog/app/error-recovery.md +11 -0
- data/handbook/catalog/app/status-feedback.md +11 -0
- data/handbook/catalog/app/task-first-density.md +11 -0
- data/handbook/catalog/shared/automated-a11y-boundary.md +11 -0
- data/handbook/catalog/shared/bounded-exploration.md +11 -0
- data/handbook/catalog/shared/context-before-style.md +11 -0
- data/handbook/catalog/shared/contextual-cards.md +11 -0
- data/handbook/catalog/shared/focus-visible.md +11 -0
- data/handbook/catalog/shared/responsive-reflow.md +11 -0
- data/handbook/catalog/site/critique-versus-defect.md +11 -0
- data/handbook/catalog/site/purposeful-links.md +11 -0
- data/handbook/catalog/site/subject-specific-hero.md +11 -0
- data/handbook/guides/design/process.g.md +20 -0
- data/handbook/skills/as-design-app/SKILL.md +21 -0
- data/handbook/skills/as-design-app-adjust/SKILL.md +23 -0
- data/handbook/skills/as-design-app-audit/SKILL.md +23 -0
- data/handbook/skills/as-design-app-implement/SKILL.md +22 -0
- data/handbook/skills/as-design-look-for-inspiration/SKILL.md +24 -0
- data/handbook/skills/as-design-site/SKILL.md +21 -0
- data/handbook/skills/as-design-site-adjust/SKILL.md +23 -0
- data/handbook/skills/as-design-site-audit/SKILL.md +23 -0
- data/handbook/skills/as-design-site-implement/SKILL.md +22 -0
- data/handbook/templates/design/benchmark-result.template.md +14 -0
- data/handbook/templates/design/brief.template.md +12 -0
- data/handbook/templates/design/feedback.template.md +8 -0
- data/handbook/templates/design/proposal.template.md +15 -0
- data/handbook/templates/design/source-ledger.template.md +5 -0
- data/handbook/workflow-instructions/design/adjust.wf.md +51 -0
- data/handbook/workflow-instructions/design/audit.wf.md +50 -0
- data/handbook/workflow-instructions/design/explore.wf.md +51 -0
- data/handbook/workflow-instructions/design/implement.wf.md +47 -0
- data/handbook/workflow-instructions/design/look-for-inspiration.wf.md +43 -0
- data/lib/ace/design/atoms/contracts.rb +36 -0
- data/lib/ace/design/cli/commands/adjust.rb +41 -0
- data/lib/ace/design/cli/commands/doctor.rb +18 -0
- data/lib/ace/design/cli/commands/explore.rb +42 -0
- data/lib/ace/design/cli/commands/inspect.rb +21 -0
- data/lib/ace/design/cli/commands/preset.rb +32 -0
- data/lib/ace/design/cli/commands/preview.rb +21 -0
- data/lib/ace/design/cli/commands/run_commands.rb +50 -0
- data/lib/ace/design/cli/commands/validate.rb +25 -0
- data/lib/ace/design/cli.rb +79 -0
- data/lib/ace/design/molecules/adjust_prompts.rb +40 -0
- data/lib/ace/design/molecules/agent_executor.rb +28 -0
- data/lib/ace/design/molecules/artifacts.rb +94 -0
- data/lib/ace/design/molecules/catalog.rb +36 -0
- data/lib/ace/design/molecules/context_document.rb +42 -0
- data/lib/ace/design/molecules/context_repository.rb +117 -0
- data/lib/ace/design/molecules/design_context.rb +96 -0
- data/lib/ace/design/molecules/design_prompts.rb +118 -0
- data/lib/ace/design/molecules/design_source.rb +89 -0
- data/lib/ace/design/molecules/preset.rb +120 -0
- data/lib/ace/design/molecules/runtime.rb +75 -0
- data/lib/ace/design/molecules/session.rb +123 -0
- data/lib/ace/design/molecules/skill_sources.rb +71 -0
- data/lib/ace/design/organisms/adjuster.rb +211 -0
- data/lib/ace/design/organisms/design_run.rb +394 -0
- data/lib/ace/design/organisms/generator.rb +127 -0
- data/lib/ace/design/organisms/inspector.rb +50 -0
- data/lib/ace/design/version.rb +6 -0
- data/lib/ace/design.rb +40 -0
- 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
|
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: []
|