Skip to content

Document what EditAI does, and give it a page that shows it - #21

Open
deonmenezes wants to merge 2 commits into
mainfrom
docs/readme-and-landing-page
Open

deonmenezes wants to merge 2 commits into
mainfrom
docs/readme-and-landing-page

Conversation

@deonmenezes

Copy link
Copy Markdown
Owner

What changed

README. It described the tools but not what you can actually say to the thing. It now covers:

  • What you can ask for as a table of nine real asks mapped to the tools that run
  • The 16 timeline tools with arguments and kinds, and the three timeline semantics worth knowing before reading project.ts (sourceOffset, ripple delete ordering, caption merging across cuts)
  • Reaching past the timeline: all three connector auth styles, and how attaching a new MCP server puts its tools on the agent's next turn
  • Where the code runs: both sandboxes, the four ffmpeg-sandbox tools, and why run_python is gated
  • Environment table, repo layout, and per-suite test counts (17 + 6 + 8 = 31)
  • Known limits, stated plainly: export_project writes a render description rather than encoding video, transcripts and tempo come from sample metadata rather than ASR, and motion graphics have no dedicated tool yet

Landing page (site/, live at https://editai-agent.vercel.app). One static index.html, no build step and no dependencies. The hero renders the agent server's own sample project and performs a real ripple delete on it: mapTime() applies the same rule project.ts does, so clips straddling a silence get shorter rather than merely shifting, and 24.0s becomes 21.1s. Colours come from apps/web/src/styles.css and the favicon rather than being invented.

GitHub About was updated out-of-band: description, homepage, and topics.

Two corrections

Both were wrong in the README before this PR:

  • The silence ranges in the walkthrough were sketched, not read off project.ts. The real ones are 3.2-4.1, 9.6-10.4, 16.8-18.0, which is the same 2.9s total.
  • .env.example lives at apps/agent/.env.example, not the repo root.

site/README.md records the constraint that keeps this honest: if the sample project changes, SILENCES and LANES in index.html have to change with it, because the page claims those are real numbers.

Testing

bun test in apps/agent (17 pass) and bun run test in apps/web (6 pass) are unchanged by this PR; no source files were touched. The page was checked at 1470px and at 390px, where scrollWidth === clientWidth (no horizontal overflow), and the reduced-motion path renders the finished edit without the typing or tween.

The README described the timeline tools but not the thing people ask
about first: what you can say to it, and what happens at each of the
three layers the agent drives (your UI, ours, the ffmpeg encode). It
now carries the full 16-tool reference with arguments, the connector
story including how to attach an MCP server mid-conversation, both
sandboxes and what each is for, the environment table, test counts,
and a "Known limits" section, because export writes a render
description rather than encoding video and the demo does not make that
obvious.

The landing page in site/ renders the agent server's own sample
project and performs a real ripple delete on it: mapTime() applies the
same rule project.ts does, so clips straddling a silence get shorter
rather than merely shifting, and 24.0s becomes 21.1s. Its palette is
lifted from the editor's stylesheet and favicon rather than invented,
so the page and the product read as one thing.

Two numbers in the README were wrong and are corrected here: the
silence ranges in the walkthrough were sketched rather than read off
project.ts (they are 3.2-4.1, 9.6-10.4, 16.8-18.0), and .env.example
lives in apps/agent, not the repo root.
@qodo-code-review

Copy link
Copy Markdown
Contributor

PR Summary by Qodo

Document EditAI and add an interactive landing page

📝 Documentation ✨ Enhancement ⚙️ Configuration changes 🕐 20-40 Minutes

Grey Divider

AI Description

• Documents requests, timeline semantics, connectors, sandboxes, setup, tests, and known
 limitations.
• Adds a responsive landing page demonstrating approval-gated ripple deletion with real sample data.
• Configures dependency-free Vercel deployment and records synchronization requirements for the
 demo.
Diagram

graph TD
  Reader["Project Visitor"] --> Docs["README"] --> Site["Static Landing Page"] --> Demo["Timeline Demo"] --> Approval{"Cut Approved?"} -->|Yes| Ripple["Ripple Mapping"] --> Result["21.1s Timeline"]
  Sample["Agent Sample Project"] --> Docs
  Sample --> Demo
Loading
High-Level Assessment

The dependency-free static page is appropriate for a focused product landing page and keeps deployment and maintenance simple. A framework or generated documentation site would add build complexity without clear benefit; the explicit synchronization note adequately manages the intentional duplication of sample timeline data.

Files changed (5) +1264 / -103

Enhancement (1) +918 / -0
index.htmlAdd responsive interactive EditAI landing page +918/-0

Add responsive interactive EditAI landing page

• Introduces a standalone product site with inline styling, responsive layouts, SEO metadata, tool and architecture explanations, and links to the repository. Its animated hero reproduces the sample project's approval-gated silence removal using browser-side ripple-delete timing, with replay, scroll effects, and a reduced-motion completion path.

site/index.html

Documentation (2) +332 / -103
README.mdExpand product, architecture, setup, and limitations documentation +295/-103

Expand product, architecture, setup, and limitations documentation

• Reframes EditAI around concrete user requests and documents all 16 timeline tools, approval semantics, MCP connectors, sandbox boundaries, environment variables, repository layout, and test coverage. It also corrects the sample silence ranges and environment-file path, links the live site, and states current export, metadata, and motion-graphics limitations.

README.md

README.mdDocument landing-page maintenance and deployment +37/-0

Document landing-page maintenance and deployment

• Explains local serving and production deployment for the dependency-free site. Records that the hero timeline constants must remain synchronized with the agent sample project and identifies the reused editor palette.

site/README.md

Other (2) +14 / -0
.gitignoreIgnore local Vercel project metadata +1/-0

Ignore local Vercel project metadata

• Excludes the local '.vercel' directory from version control.

site/.gitignore

vercel.jsonConfigure static Vercel hosting and security headers +13/-0

Configure static Vercel hosting and security headers

• Enables clean URLs and adds content-type sniffing and referrer-policy headers for all landing-page routes.

site/vercel.json

@qodo-code-review

Copy link
Copy Markdown
Contributor

Code Review by Qodo

🐞 Bugs (8) 📘 Rule violations (2) 📜 Skill insights (0)

Grey Divider


Action required

1. Logo import path absent 🐞 Bug ≡ Correctness
Description
The README says Bright Data can scrape a logo and bring it into the project, but
scrape_as_markdown returns text and the timeline exposes no tool or model operation to download,
register, or add image media. The advertised ask therefore cannot put the discovered asset on the
timeline.
Code

README.md[73]

+| *"Put their logo in the corner"* | Searches the live web through Bright Data, scrapes the asset, and brings it into the project. | `search_engine` → `scrape_as_markdown` |
Relevance

●●● Strong

Clear documentation overclaim: Bright Data returns text, while no timeline image or asset operation
exists.

PR-#15

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The connector documentation lists text/search tools and describes scrape_as_markdown as rendered
text, while the timeline's only creation tools create text/caption clips and the clip model has no
image or asset-path support.

docs/brightdata.md[18-19]
docs/brightdata.md[60-65]
apps/agent/src/tools.ts[176-209]
apps/agent/src/project.ts[4-19]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The documented logo workflow ends at textual web scraping because there is no media-import operation.

## Issue Context
Either describe Bright Data as research-only, or implement downloading, media registration, image clip support, and timeline insertion.

## Fix Focus Areas
- README.md[71-74]
- site/index.html[539-554]
- apps/agent/src/tools.ts[176-209]
- apps/agent/src/project.ts[4-19]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. Custom connectors are skipped 🐞 Bug ≡ Correctness
Description
The new docs say a self-hosted MCP server can be attached by adding its name to EDITAI_CONNECTORS,
but setup only accepts exact names returned by TrueForge's catalog and skips every unknown name. A
private motion-graphics server therefore does not attach through the shown command.
Code

README.md[R181-182]

+# your own server, attached the same way
+EDITAI_CONNECTORS=exa,bright-data,motion-graphics bun run setup
Relevance

●●● Strong

Setup explicitly skips connector names absent from the catalog, contradicting the documented
private-server workflow.

PR-#3

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
configureConnectors fetches the catalog, performs an exact name lookup, warns that unknown names
are not in the catalog, and continues without registering them.

apps/agent/scripts/setup.ts[118-127]
apps/agent/scripts/setup.ts[142-160]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`EDITAI_CONNECTORS` cannot attach arbitrary self-hosted servers as documented.

## Issue Context
Either state that names must exist in the TrueForge MCP catalog, or add a supported name-to-URL configuration path for custom servers.

## Fix Focus Areas
- README.md[164-187]
- site/index.html[579-593]
- apps/agent/scripts/setup.ts[118-160]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended

3. build() uses side-effectful forEach 📘 Rule violation ⚙ Maintainability
Description
The new build() implementation uses nested forEach callbacks to create DOM nodes, append them,
and mutate clipEls/gapEls; layout() and the reveal code repeat the same side-effect-driven
pattern. The checklist requires for...of or an equivalent loop for multi-statement side effects.
Code

site/index.html[R761-764]

+      spec.clips.forEach(function(c){
+        var el = document.createElement("div");
+        el.className = "clip clip--" + spec.kind;
+        el.textContent = c[2] || "";
Relevance

●●● Strong

The cited active checklist explicitly requires for...of for multi-statement side-effect callbacks.

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
PR Compliance ID 2993122 requires for...of for multi-statement callbacks whose purpose is side
effects. The cited new code appends a clip element and pushes metadata into an external array inside
spec.clips.forEach, with equivalent side-effectful loops elsewhere in the new script.

Rule 2993122: Prefer for...of loops over Array.forEach for iteration with side effects
site/index.html[758-790]
site/index.html[903-913]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Replace multi-statement, side-effect-driven `forEach` callbacks with `for...of` loops.

## Issue Context
The callbacks create and append DOM nodes, mutate arrays, update styles, and register observed elements. Keep the simple `timers.forEach(clearTimeout)` call if desired because the checklist explicitly permits one-line simple function calls.

## Fix Focus Areas
- site/index.html[758-790]
- site/index.html[903-913]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


4. Callbacks use anonymous function 📘 Rule violation ⚙ Maintainability
Description
The new script repeatedly passes anonymous function expressions to timers, event listeners,
observers, and array methods even though none requires dynamic this, arguments, super, or
new.target. These callbacks must use arrow-function syntax under the checklist.
Code

site/index.html[R852-854]

+      at(1250, function(){
+        approveBtn.classList.add("is-hit");
+        at(160, function(){ approveBtn.classList.remove("is-hit"); finish(); });
Relevance

●●● Strong

The cited active checklist explicitly requires arrows where callbacks do not need dynamic function
bindings.

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
PR Compliance ID 2993339 requires anonymous callback function expressions to be arrows when dynamic
function bindings are unnecessary. The cited timer callbacks only access lexical variables and call
methods, and the same prohibited callback form appears throughout the added script.

Rule 2993339: Prefer arrow functions over anonymous function expressions in JavaScript/TypeScript
site/index.html[852-855]
site/index.html[861-868]
site/index.html[892-913]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Convert safely replaceable anonymous callback function expressions to arrow functions.

## Issue Context
Keep named function declarations and named IIFEs unchanged; update only anonymous expressions passed as callbacks where lexical binding does not alter behavior.

## Fix Focus Areas
- site/index.html[758-790]
- site/index.html[852-868]
- site/index.html[861-868]
- site/index.html[892-913]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


5. Demo bypasses user approval 🐞 Bug ≡ Correctness
Description
After showing the approval state, ask() schedules finish() unconditionally, so the destructive
edit happens without a click; reduced-motion mode bypasses the approval state entirely. This
directly contradicts the page's claim that nothing is cut until the user approves.
Code

site/index.html[R852-855]

+      at(1250, function(){
+        approveBtn.classList.add("is-hit");
+        at(160, function(){ approveBtn.classList.remove("is-hit"); finish(); });
+      });
Relevance

●●● Strong

The demo schedules finish independently of approval and also auto-finishes reduced-motion mode,
violating its stated interaction.

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The page promises approval before cutting, but the timer and reduced-motion branch both invoke
finish() independently of the click handler; finish() applies the cut layout.

site/index.html[387-391]
site/index.html[415-419]
site/index.html[811-817]
site/index.html[827-831]
site/index.html[849-862]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The hero automatically finishes a destructive operation instead of waiting for user approval.

## Issue Context
Keep the deck in its asking state until the approval button is clicked, including in reduced-motion mode.

## Fix Focus Areas
- site/index.html[827-831]
- site/index.html[849-855]
- site/index.html[859-862]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


View medium (5)
6. Connector commands miss directory 🐞 Bug ≡ Correctness
Description
The connector examples invoke bun run setup without entering apps/agent, so running them from
the repository root fails because the root package has no setup script. Users following the new
section cannot configure the advertised connectors.
Code

README.md[R168-170]

+```bash
+# keyless, the default
+EDITAI_CONNECTORS=exa bun run setup
Relevance

●●● Strong

The documented command fails from the stated root directory because setup exists only in apps/agent.

PR-#3

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The root package defines no setup command, while apps/agent/package.json defines the only
setup script.

package.json[5-10]
apps/agent/package.json[6-10]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The connector examples run a package-local script from the repository root.

## Issue Context
Prefix each example with `cd apps/agent &&`, use Bun's workspace targeting, or add a root delegating script.

## Fix Focus Areas
- README.md[168-182]
- package.json[5-10]
- apps/agent/package.json[6-10]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


7. Landing setup sequence fails 🐞 Bug ≡ Correctness
Description
The landing page changes into apps/agent for step 2 but never restores the repository root: in one
shell the final root-only dev:web command fails, while in separate terminals the unqualified
step-3 setup command fails from the root. The displayed four-step sequence is not executable as
written.
Code

site/index.html[R463-467]

+<span class="c"># 2 · the timeline tools</span>
+cd apps/agent &amp;&amp; <b>bun run start</b>            <span class="c">→ localhost:8941</span>
+
+<span class="c"># 3 · wire them together (any one key is enough)</span>
+<span class="v">ANTHROPIC_API_KEY</span>=sk-... <b>bun run setup</b>
Relevance

●●● Strong

The displayed shell sequence leaves the working directory wrong for subsequent root and agent
commands.

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
setup exists only in the agent package and dev:web exists only in the root package, but the
shown sequence changes into the agent package and supplies no later directory transition.

site/index.html[460-470]
package.json[5-10]
apps/agent/package.json[6-10]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The landing-page setup steps rely on incompatible implicit working directories.

## Issue Context
Use subshells or explicit `cd` commands so both package-local `setup` and root-only `dev:web` run from their defining packages.

## Fix Focus Areas
- site/index.html[460-470]
- package.json[5-10]
- apps/agent/package.json[6-10]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


8. Export claim contradicts implementation 🐞 Bug ≡ Correctness
Description
The ask table says export_project renders a 1080p export, but the implementation writes only a
JSON render description, as the new Known Limits section itself later acknowledges. Readers are
given contradictory expectations about the result of the advertised command.
Code

README.md[74]

+| *"Export it at 1080p"* | Renders, after you approve. | `export_project` |
Relevance

●●● Strong

README directly contradicts the implementation and its own Known Limits section about export output.

PR-#3

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The README's added Known Limits section explicitly says export_project writes a JSON description
rather than encoding video, and exportProject serializes the export record to a JSON file.

README.md[403-408]
apps/agent/src/project.ts[407-423]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The capability table calls a JSON-only export a rendered video.

## Issue Context
Align the ask/tool descriptions with the Known Limits section until actual ffmpeg encoding is wired into `export_project`.

## Fix Focus Areas
- README.md[64-74]
- README.md[137-140]
- README.md[403-408]
- apps/agent/src/project.ts[407-423]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


9. Export annotation described incorrectly 🐞 Bug ⚙ Maintainability
Description
The README says all four gated tools carry destructiveHint, but only the three destructive tools
do; export_project uses the ordinary write annotation and is gated separately by name. This gives
an incorrect approval-policy model to anyone extending or debugging the tool configuration.
Code

README.md[R145-146]

+The four gated tools are published with MCP's `destructiveHint` annotation, and the agent declares
+`require_approval_for_tools: ["@destructive", "export_project"]`. That turns the annotation into a
Relevance

●●● Strong

The approval annotation claim is factually wrong; export is WRITE and separately named in approval
configuration.

PR-#3

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The code assigns DESTRUCTIVE only to delete, ripple delete, and remove silences; export receives
WRITE, while agent.json explicitly names export alongside the @destructive group.

apps/agent/src/tools.ts[48-50]
apps/agent/src/tools.ts[224-270]
apps/agent/agent.json[16-19]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The approval documentation conflates destructive annotations with explicit name-based gating.

## Issue Context
State that three tools carry `destructiveHint` and `export_project` is separately listed in `require_approval_for_tools`.

## Fix Focus Areas
- README.md[145-148]
- apps/agent/src/tools.ts[48-50]
- apps/agent/src/tools.ts[224-270]
- apps/agent/agent.json[16-19]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


10. Sample timeline omits music 🐞 Bug ≡ Correctness
Description
The hero claims to show the server's sample project and a ripple delete across every track, but its
lane data omits the seeded A2 music track entirely. The visualization therefore does not show the
operation across the complete real sample it claims to reproduce.
Code

site/index.html[R731-735]

+  var LANES = {
+    V1: {kind:"video", clips:[[0,5,"intro.mp4"],[5,11,"b-roll.mp4"],[11,24,"talking-head.mp4"]]},
+    A1: {kind:"audio", clips:[[0,3.2,""],[4.1,9.6,""],[10.4,16.8,""],[18,24,""]]},
+    T1: {kind:"text",  clips:[[0.5,4,"Hook line"],[20,24,"Subscribe"]]}
+  };
Relevance

●●● Strong

The claimed real sample visualization omits seeded A2 music, making the displayed all-track
operation incomplete.

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
seedProject() defines four tracks and places music.mp3 on A2 for the full 24 seconds, while the
page creates and populates only V1, A1, and T1. The server's ripple-delete implementation processes
all project clips.

apps/agent/src/project.ts[72-86]
apps/agent/src/project.ts[334-373]
site/index.html[401-405]
site/index.html[731-735]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The landing-page timeline omits one track from the sample project it claims to reproduce.

## Issue Context
Add A2 with its 24-second music clip, or explicitly say the hero shows selected tracks rather than every sample track.

## Fix Focus Areas
- site/index.html[401-405]
- site/index.html[415-419]
- site/index.html[731-735]
- apps/agent/src/project.ts[72-86]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Context sources
✅ Compliance rules (platform): 124 rules
Review mode: ⚖️ Balanced

Grey Divider

Tip of the day
💡 Did you know, you can enable the Remediation agent and Qodo fixes findings in a dedicated fix PR

More tips ↗ | Customize Qodo ↗ | Qodo docs ↗

Grey Divider

Qodo Logo

Comment thread site/index.html
Comment on lines +761 to +764
spec.clips.forEach(function(c){
var el = document.createElement("div");
el.className = "clip clip--" + spec.kind;
el.textContent = c[2] || "";

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remediation recommended

1. build() uses side-effectful foreach 📘 Rule violation ⚙ Maintainability

The new build() implementation uses nested forEach callbacks to create DOM nodes, append them,
and mutate clipEls/gapEls; layout() and the reveal code repeat the same side-effect-driven
pattern. The checklist requires for...of or an equivalent loop for multi-statement side effects.
Agent Prompt
## Issue description
Replace multi-statement, side-effect-driven `forEach` callbacks with `for...of` loops.

## Issue Context
The callbacks create and append DOM nodes, mutate arrays, update styles, and register observed elements. Keep the simple `timers.forEach(clearTimeout)` call if desired because the checklist explicitly permits one-line simple function calls.

## Fix Focus Areas
- site/index.html[758-790]
- site/index.html[903-913]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment thread site/index.html
Comment on lines +852 to +854
at(1250, function(){
approveBtn.classList.add("is-hit");
at(160, function(){ approveBtn.classList.remove("is-hit"); finish(); });

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remediation recommended

2. Callbacks use anonymous function 📘 Rule violation ⚙ Maintainability

The new script repeatedly passes anonymous function expressions to timers, event listeners,
observers, and array methods even though none requires dynamic this, arguments, super, or
new.target. These callbacks must use arrow-function syntax under the checklist.
Agent Prompt
## Issue description
Convert safely replaceable anonymous callback function expressions to arrow functions.

## Issue Context
Keep named function declarations and named IIFEs unchanged; update only anonymous expressions passed as callbacks where lexical binding does not alter behavior.

## Fix Focus Areas
- site/index.html[758-790]
- site/index.html[852-868]
- site/index.html[861-868]
- site/index.html[892-913]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment thread README.md
| *"Duck the music under the voiceover"* | Sets clip volume where the voice track is speaking and restores it where it is not. | `get_project` → `set_volume` |
| *"Grade it warmer and add grain"* | Writes the ffmpeg filter graph, runs it in the media sandbox, then probes the output to confirm it matches the intent. | `probe_media` → `run_ffmpeg` |
| *"Kill the room tone"* | Denoises the voice track in the sandbox, leaving the original file untouched beside it. | `run_ffmpeg` (`afftdn`) |
| *"Put their logo in the corner"* | Searches the live web through Bright Data, scrapes the asset, and brings it into the project. | `search_engine` → `scrape_as_markdown` |

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

3. Logo import path absent 🐞 Bug ≡ Correctness

The README says Bright Data can scrape a logo and bring it into the project, but
scrape_as_markdown returns text and the timeline exposes no tool or model operation to download,
register, or add image media. The advertised ask therefore cannot put the discovered asset on the
timeline.
Agent Prompt
## Issue description
The documented logo workflow ends at textual web scraping because there is no media-import operation.

## Issue Context
Either describe Bright Data as research-only, or implement downloading, media registration, image clip support, and timeline insertion.

## Fix Focus Areas
- README.md[71-74]
- site/index.html[539-554]
- apps/agent/src/tools.ts[176-209]
- apps/agent/src/project.ts[4-19]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment thread README.md
Comment on lines +181 to +182
# your own server, attached the same way
EDITAI_CONNECTORS=exa,bright-data,motion-graphics bun run setup

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

4. Custom connectors are skipped 🐞 Bug ≡ Correctness

The new docs say a self-hosted MCP server can be attached by adding its name to EDITAI_CONNECTORS,
but setup only accepts exact names returned by TrueForge's catalog and skips every unknown name. A
private motion-graphics server therefore does not attach through the shown command.
Agent Prompt
## Issue description
`EDITAI_CONNECTORS` cannot attach arbitrary self-hosted servers as documented.

## Issue Context
Either state that names must exist in the TrueForge MCP catalog, or add a supported name-to-URL configuration path for custom servers.

## Fix Focus Areas
- README.md[164-187]
- site/index.html[579-593]
- apps/agent/scripts/setup.ts[118-160]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment thread site/index.html
Comment on lines +852 to +855
at(1250, function(){
approveBtn.classList.add("is-hit");
at(160, function(){ approveBtn.classList.remove("is-hit"); finish(); });
});

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remediation recommended

5. Demo bypasses user approval 🐞 Bug ≡ Correctness

After showing the approval state, ask() schedules finish() unconditionally, so the destructive
edit happens without a click; reduced-motion mode bypasses the approval state entirely. This
directly contradicts the page's claim that nothing is cut until the user approves.
Agent Prompt
## Issue description
The hero automatically finishes a destructive operation instead of waiting for user approval.

## Issue Context
Keep the deck in its asking state until the approval button is clicked, including in reduced-motion mode.

## Fix Focus Areas
- site/index.html[827-831]
- site/index.html[849-855]
- site/index.html[859-862]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment thread README.md
Comment on lines +168 to +170
```bash
# keyless, the default
EDITAI_CONNECTORS=exa bun run setup

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remediation recommended

6. Connector commands miss directory 🐞 Bug ≡ Correctness

The connector examples invoke bun run setup without entering apps/agent, so running them from
the repository root fails because the root package has no setup script. Users following the new
section cannot configure the advertised connectors.
Agent Prompt
## Issue description
The connector examples run a package-local script from the repository root.

## Issue Context
Prefix each example with `cd apps/agent &&`, use Bun's workspace targeting, or add a root delegating script.

## Fix Focus Areas
- README.md[168-182]
- package.json[5-10]
- apps/agent/package.json[6-10]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment thread site/index.html
Comment on lines +463 to +467
<span class="c"># 2 · the timeline tools</span>
cd apps/agent &amp;&amp; <b>bun run start</b> <span class="c">→ localhost:8941</span>

<span class="c"># 3 · wire them together (any one key is enough)</span>
<span class="v">ANTHROPIC_API_KEY</span>=sk-... <b>bun run setup</b>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remediation recommended

7. Landing setup sequence fails 🐞 Bug ≡ Correctness

The landing page changes into apps/agent for step 2 but never restores the repository root: in one
shell the final root-only dev:web command fails, while in separate terminals the unqualified
step-3 setup command fails from the root. The displayed four-step sequence is not executable as
written.
Agent Prompt
## Issue description
The landing-page setup steps rely on incompatible implicit working directories.

## Issue Context
Use subshells or explicit `cd` commands so both package-local `setup` and root-only `dev:web` run from their defining packages.

## Fix Focus Areas
- site/index.html[460-470]
- package.json[5-10]
- apps/agent/package.json[6-10]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment thread README.md
| *"Grade it warmer and add grain"* | Writes the ffmpeg filter graph, runs it in the media sandbox, then probes the output to confirm it matches the intent. | `probe_media` → `run_ffmpeg` |
| *"Kill the room tone"* | Denoises the voice track in the sandbox, leaving the original file untouched beside it. | `run_ffmpeg` (`afftdn`) |
| *"Put their logo in the corner"* | Searches the live web through Bright Data, scrapes the asset, and brings it into the project. | `search_engine` → `scrape_as_markdown` |
| *"Export it at 1080p"* | Renders, after you approve. | `export_project` |

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remediation recommended

8. Export claim contradicts implementation 🐞 Bug ≡ Correctness

The ask table says export_project renders a 1080p export, but the implementation writes only a
JSON render description, as the new Known Limits section itself later acknowledges. Readers are
given contradictory expectations about the result of the advertised command.
Agent Prompt
## Issue description
The capability table calls a JSON-only export a rendered video.

## Issue Context
Align the ask/tool descriptions with the Known Limits section until actual ffmpeg encoding is wired into `export_project`.

## Fix Focus Areas
- README.md[64-74]
- README.md[137-140]
- README.md[403-408]
- apps/agent/src/project.ts[407-423]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment thread README.md
Comment on lines +145 to +146
The four gated tools are published with MCP's `destructiveHint` annotation, and the agent declares
`require_approval_for_tools: ["@destructive", "export_project"]`. That turns the annotation into a

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remediation recommended

9. Export annotation described incorrectly 🐞 Bug ⚙ Maintainability

The README says all four gated tools carry destructiveHint, but only the three destructive tools
do; export_project uses the ordinary write annotation and is gated separately by name. This gives
an incorrect approval-policy model to anyone extending or debugging the tool configuration.
Agent Prompt
## Issue description
The approval documentation conflates destructive annotations with explicit name-based gating.

## Issue Context
State that three tools carry `destructiveHint` and `export_project` is separately listed in `require_approval_for_tools`.

## Fix Focus Areas
- README.md[145-148]
- apps/agent/src/tools.ts[48-50]
- apps/agent/src/tools.ts[224-270]
- apps/agent/agent.json[16-19]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment thread site/index.html
Comment on lines +731 to +735
var LANES = {
V1: {kind:"video", clips:[[0,5,"intro.mp4"],[5,11,"b-roll.mp4"],[11,24,"talking-head.mp4"]]},
A1: {kind:"audio", clips:[[0,3.2,""],[4.1,9.6,""],[10.4,16.8,""],[18,24,""]]},
T1: {kind:"text", clips:[[0.5,4,"Hook line"],[20,24,"Subscribe"]]}
};

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remediation recommended

10. Sample timeline omits music 🐞 Bug ≡ Correctness

The hero claims to show the server's sample project and a ripple delete across every track, but its
lane data omits the seeded A2 music track entirely. The visualization therefore does not show the
operation across the complete real sample it claims to reproduce.
Agent Prompt
## Issue description
The landing-page timeline omits one track from the sample project it claims to reproduce.

## Issue Context
Add A2 with its 24-second music clip, or explicitly say the hero shows selected tracks rather than every sample track.

## Fix Focus Areas
- site/index.html[401-405]
- site/index.html[415-419]
- site/index.html[731-735]
- apps/agent/src/project.ts[72-86]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

The navbar CTA said "GitHub" in text, which is the one link on the page
people scan for by icon rather than by reading. The mark is defined once
as an SVG symbol and used in all three places the link appears: the
navbar, the outro button, and the footer, so they read as one system
instead of three unrelated links.

The violet button picks up an inset top highlight and a soft cast of its
own colour, which is what separates a button from a coloured rectangle
at this size.

Below 480px the label is clipped rather than hidden, so the button
becomes a square mark and still announces "GitHub" to a screen reader.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant