diff --git a/.agents/skills/AGENTS.md b/.agents/skills/AGENTS.md index 72c0a6e..37e1a62 100644 --- a/.agents/skills/AGENTS.md +++ b/.agents/skills/AGENTS.md @@ -15,4 +15,5 @@ - Keep these cross-repository workflows vendored and independently usable; never resolve a skill through a sibling checkout or Git submodule. - Refresh the KB skills from one reviewed immutable `hraness/kb` release and the orchestration skill from the reviewed portable template, then validate the complete copied directories. - Keep product-specific operating skills in the root `skills/` directory when present. Portable repository workflows belong here. +- Mark every portable repository workflow with `metadata.internal: true` so public `skills add hraness/atet` discovery exposes only the product-owned `atet` skill. - Preserve upstream attribution and license notices for adapted public resources. diff --git a/.agents/skills/percolate-kb/SKILL.md b/.agents/skills/percolate-kb/SKILL.md index 77fd3d9..691102e 100644 --- a/.agents/skills/percolate-kb/SKILL.md +++ b/.agents/skills/percolate-kb/SKILL.md @@ -1,6 +1,8 @@ --- name: percolate-kb description: Review a hraness/kb Markdown vault for recurring ideas and missing structural connections, then promote evidence-backed concepts and typed relationships with the KB CLI. Use after materially adding or revising notes, when organizing an accumulated vault, or when an agent needs to turn repeated tags and prose references into an explicit queryable knowledge graph. +metadata: + internal: true --- # Percolate concepts and relationships diff --git a/.agents/skills/phase-orchestrator/SKILL.md b/.agents/skills/phase-orchestrator/SKILL.md index 542628d..7a613a6 100644 --- a/.agents/skills/phase-orchestrator/SKILL.md +++ b/.agents/skills/phase-orchestrator/SKILL.md @@ -1,6 +1,8 @@ --- name: phase-orchestrator description: Orchestrate phase-based implementation plans in Codex with dependency analysis, parallel sub-agent lanes, join gates, validation, review/fix loops, and final integration. Use when the user provides a plan, checklist, PRD, or phased task and explicitly asks Codex to execute it with phases, delegation, parallel agents, or orchestration in any repository. +metadata: + internal: true --- # Phase Orchestrator diff --git a/.agents/skills/plan-kb/SKILL.md b/.agents/skills/plan-kb/SKILL.md index d2123d8..2c6abc1 100644 --- a/.agents/skills/plan-kb/SKILL.md +++ b/.agents/skills/plan-kb/SKILL.md @@ -1,6 +1,8 @@ --- name: plan-kb description: Create or evolve a durable Markdown plan inside a hraness/kb vault. Use when a user asks for an implementation plan, proposal, RFC, migration plan, execution audit, phased checklist, or an update to an existing plan's decisions, progress, review findings, verification evidence, or final result. +metadata: + internal: true --- # Write a durable plan diff --git a/.agents/skills/query-kb/SKILL.md b/.agents/skills/query-kb/SKILL.md index fefd2f3..f69804c 100644 --- a/.agents/skills/query-kb/SKILL.md +++ b/.agents/skills/query-kb/SKILL.md @@ -1,6 +1,8 @@ --- name: query-kb description: Load scoped repository context, then search and navigate a hraness/kb Markdown vault with hybrid text retrieval, exact metadata, bounded links and typed relationships, backlinks, whole-vault graph reports, and optional Git provenance. Use when an agent needs the applicable repository instructions, rationale, prior knowledge, plans, captures, decisions, concepts, relationships, or evidence before answering, planning, or changing code. +metadata: + internal: true --- # Query the knowledge base diff --git a/.agents/skills/refresh-kb/SKILL.md b/.agents/skills/refresh-kb/SKILL.md index d38ed85..ec5692b 100644 --- a/.agents/skills/refresh-kb/SKILL.md +++ b/.agents/skills/refresh-kb/SKILL.md @@ -1,6 +1,8 @@ --- name: refresh-kb description: Refresh and validate a hraness/kb Markdown knowledge graph after notes, concepts, typed relationships, attachments, repository scopes, or context mappings change. Use when an agent needs to maintain a managed or authored catalog, inspect graph and lifecycle findings, validate local artifacts and scope hubs, or complete a vault health check. +metadata: + internal: true --- # Refresh a knowledge base diff --git a/.agents/skills/save-pdf-kb/SKILL.md b/.agents/skills/save-pdf-kb/SKILL.md index 25fa9b7..9d6d7f3 100644 --- a/.agents/skills/save-pdf-kb/SKILL.md +++ b/.agents/skills/save-pdf-kb/SKILL.md @@ -7,6 +7,8 @@ description: >- archive, extract, or turn a PDF into KB Markdown, especially scanned documents and PDFs containing screenshots, Slack messages, charts, photos, or a mix of native text and images. +metadata: + internal: true --- # Save a PDF to the knowledge base diff --git a/.agents/skills/save-url-kb/SKILL.md b/.agents/skills/save-url-kb/SKILL.md index b80c243..35e95d8 100644 --- a/.agents/skills/save-url-kb/SKILL.md +++ b/.agents/skills/save-url-kb/SKILL.md @@ -8,6 +8,8 @@ description: >- YouTube page, or another page already visible in their browser. Supports URL capture, the current signed-in tab, temporary browser-profile snapshots, saved HTML, media, evidence, honest completeness, and knowledge-base linking. +metadata: + internal: true --- # Capture web content diff --git a/README.md b/README.md index b400be2..152dacd 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ [](https://atet.sh) +[](https://skills.sh/hraness/atet) + **AI media generation and video editing for coding agents.** Atet lets Codex, Claude, and other coding agents generate images, video, and @@ -17,15 +19,30 @@ an Atet service. ## Install Atet -Atet requires [Bun 1.3.14 or newer](https://bun.sh). Run these commands once: +Install the single Atet Agent Skill with either runner: + +```sh +npx skills add hraness/atet +# or +bunx skills add hraness/atet +``` + +Start a new agent session after installing the skill. It teaches Codex, Claude +Code, Cursor, and other compatible agents how to turn a finished-media request +into checked Atet operations. + +Atet requires [Bun 1.3.14 or newer](https://bun.sh). Install the current CLI, +then inspect the local media host: ```sh bun add --global github:hraness/atet -atet skill install +atet doctor ``` -The first command installs the Atet CLI. The second installs a short guide that -teaches Codex when and how to use it. +The CLI carries the guide released with that exact CLI version. Prefer the +public `skills` command for the current repository guide. Use +`atet skill install` when you specifically need the CLI's version-matched +runner installer. Move into the project where you want Atet to work, then check the available recording, rendering, browser, and media tools: @@ -35,8 +52,9 @@ cd /path/to/your/project atet doctor ``` -Start a new agent session after installing the skill. The default installation -works with Codex across your user account. +The public `skills` command follows the scope selected in that installer. If +you instead use the CLI's version-matched guide, `atet skill install` defaults +to Codex across your user account. For Claude Code or another system that reads Agent Skills: diff --git a/apps/web/scripts/build.ts b/apps/web/scripts/build.ts index ad56b57..3a92e35 100644 --- a/apps/web/scripts/build.ts +++ b/apps/web/scripts/build.ts @@ -71,6 +71,37 @@ function renderAppearanceMenu(): string { ` } +type CopyCommandOptions = Readonly<{ + alternateCommand: string + command: string + id: string +}> + +function escapeHtml(value: string): string { + return value.replace(/[&<>"']/gu, character => ({ + "&": "&", + "<": "<", + ">": ">", + '"': """, + "'": "'", + })[character] ?? character) +} + +function renderCopyCommand(options: CopyCommandOptions): string { + const alternateCommand = escapeHtml(options.alternateCommand) + const command = escapeHtml(options.command) + const id = escapeHtml(options.id) + + return `
${command}
+
+ Using Bun? ${alternateCommand}
bunx skills add hraness/atet")
expect(html).toContain("inside the project you want to work")
expect(html).toContain("start a new agent session")
+ expect(heroHtml).not.toContain("atet skill install")
+ expect(html).toContain("When that command is not being used")
expect(html).toContain("atet skill install --target claude")
expect(html).toContain("atet skill install --target agents")
expect(html).toContain("--scope project")
expect(html).not.toContain("github:hraness/atet#")
})
+ test("renders a progressively enhanced reusable copy command in the hero", async () => {
+ const [html, build, client] = await Promise.all([
+ readBuilt("index.html"),
+ readFile(join(appDirectory, "scripts/build.ts"), "utf8"),
+ readSource("copy-command.ts"),
+ ])
+
+ expect(build).toContain("function renderCopyCommand(options: CopyCommandOptions)")
+ expect(html.match(/data-copy-command(?:>|\s)/gu)).toHaveLength(1)
+ expect(html).toContain('npx skills add hraness/atet')
+ expect(html).toContain("bunx skills add hraness/atet")
+ expect(html).toContain('aria-label="Copy install command"')
+ expect(html).toContain("data-copy-command-button hidden type=\"button\">Copy")
+ expect(html).toContain('aria-live="polite"')
+ expect(html).toContain('aria-describedby="skill-install-copy-status"')
+ expect(client).toContain("button.hidden = false")
+ expect(client).toContain("navigator.clipboard.writeText(value)")
+ expect(client).toContain('ownerDocument.execCommand("copy")')
+ expect(client).toContain('button.addEventListener("click"')
+ expect(client).not.toMatch(/fetch\(|XMLHttpRequest|WebSocket|EventSource|sendBeacon/)
+ })
+
test("uses one install, examples, workflow, and design information architecture", async () => {
const html = await readSource("index.html")
const modes = ["> Install<", "> Examples<", "> Workflow<", "> Design<"]
@@ -368,6 +395,7 @@ describe("static Atet site", () => {
const html = await readSource("index.html")
const css = await readSource("styles.css")
const theme = await readSource("theme.ts")
+ const copyCommand = await readSource("copy-command.ts")
const analytics = await readSource("analytics.ts")
const build = await readFile(join(appDirectory, "scripts/build.ts"), "utf8")
const manifest = JSON.parse(
@@ -391,6 +419,7 @@ describe("static Atet site", () => {
expect(new TextEncoder().encode(html).byteLength).toBeLessThan(20_000)
expect(new TextEncoder().encode(css).byteLength).toBeLessThan(28_000)
expect(new TextEncoder().encode(theme).byteLength).toBeLessThan(3_000)
+ expect(new TextEncoder().encode(copyCommand).byteLength).toBeLessThan(4_000)
expect(html).not.toMatch(/https:\/\/[^"']+\.(?:css|js)/)
expect(html).toContain('')
expect(html).toContain('')
@@ -401,7 +430,9 @@ describe("static Atet site", () => {
expect(html.match(/