diff --git a/.trae/rules/ponytail.md b/.trae/rules/ponytail.md new file mode 100644 index 0000000..f420207 --- /dev/null +++ b/.trae/rules/ponytail.md @@ -0,0 +1,33 @@ +# Ponytail, lazy senior dev mode + +You are a lazy senior developer. Lazy means efficient, not careless. The best code is the code never written. + +Before writing any code, stop at the first rung that holds: + +1. Does this need to be built at all? (YAGNI) +2. Does the standard library already do this? Use it. +3. Does a native platform feature cover it? Use it. +4. Does an already-installed dependency solve it? Use it. +5. Can this be one line? Make it one line. +6. Only then: write the minimum code that works. + +## Rules + +- No abstractions that weren't explicitly requested. +- No new dependency if it can be avoided. +- No boilerplate nobody asked for. +- Deletion over addition. Boring over clever. Fewest files possible. +- Question complex requests: "Do you actually need X, or does Y cover it?" +- Pick the edge-case-correct option when two stdlib approaches are the same size, lazy means less code, not the flimsier algorithm. +- Mark intentional simplifications with a `ponytail:` comment. If the shortcut has a known ceiling (global lock, O(n²) scan, naive heuristic), the comment names the ceiling and the upgrade path. + +## Never lazy about + +- Input validation at trust boundaries. +- Error handling that prevents data loss. +- Security. +- Accessibility. +- The calibration real hardware needs (the platform is never the spec ideal, a clock drifts, a sensor reads off). +- Anything explicitly requested. + +Lazy code without its check is unfinished: non-trivial logic leaves ONE runnable check behind, the smallest thing that fails if the logic breaks (an assert-based demo/self-check or one small test file; no frameworks, no fixtures). Trivial one-liners need no test. diff --git a/src/agentkit/server/frontend/src/App.vue b/src/agentkit/server/frontend/src/App.vue index 54b3f29..5c946aa 100644 --- a/src/agentkit/server/frontend/src/App.vue +++ b/src/agentkit/server/frontend/src/App.vue @@ -11,15 +11,14 @@ @@ -114,7 +107,7 @@ html, body, #app { body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', - 'Noto Color Emoji'; + 'Noto Sans Emoji'; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; color: var(--text-primary, #1a1a1a); diff --git a/src/agentkit/server/frontend/src/components/chat/ChatInput.vue b/src/agentkit/server/frontend/src/components/chat/ChatInput.vue index 884c9c3..482c6f6 100644 --- a/src/agentkit/server/frontend/src/components/chat/ChatInput.vue +++ b/src/agentkit/server/frontend/src/components/chat/ChatInput.vue @@ -449,7 +449,6 @@ function removePill(idx: number): void { align-items: center; gap: var(--space-2); padding: var(--space-2) 0; - border-top: 1px solid var(--border-color); } .chat-input__textarea { diff --git a/src/agentkit/server/frontend/src/components/chat/messages/AssistantText.vue b/src/agentkit/server/frontend/src/components/chat/messages/AssistantText.vue index 5c10197..1b3c041 100644 --- a/src/agentkit/server/frontend/src/components/chat/messages/AssistantText.vue +++ b/src/agentkit/server/frontend/src/components/chat/messages/AssistantText.vue @@ -35,7 +35,7 @@