本文へ移動
cccskills
無料GitHub で公開

jj

Save the currently active browser page to the link collection at saved.owenyoung.com. Use when explicitly invoked as $jj, or when the user asks to bookmark or collect the current page there. Read the page without navigating, generate a concise Chinese title, SEO slug, and distinctive Chinese Markdown description, attach the complete article or main-page text as Chinese-only Markdown, match collections, create one authenticated link record, and return its clickable URL.

インストール方法を見る

含まれるファイル(4)

  • SKILL.md9.8 KB
  • agents/openai.yaml271 B
  • references/article-attachment.md4.9 KB
  • references/content-rules.md3.9 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

Save the Current Page

Create exactly one link record for the page that is active when the user invokes $jj.

Guardrails

  • Treat an explicit $jj invocation as authorization to create one record for the current page. Do not ask for an additional confirmation.
  • Read and follow the installed Browser skill before interacting with the browser. Connect to the existing/default browser and use its current active tab.
  • Do not navigate, reload, refresh, submit forms on, or otherwise change the current page. Do not open API endpoints in a tab.
  • Use JavaScript fetch() for every API request. Prefer Node-side fetch() in the same persistent JavaScript session used for browser control so cross-origin restrictions cannot affect the request.
  • Never expose, print, return, save, or interpolate the API token into tool-call source. Refer to it only through an in-memory variable.
  • Do not create a record if the current URL is not an absolute http:, https:, or mailto: URL. If its query or fragment appears to contain a credential, token, session ID, or password, stop and ask whether to save a sanitized URL.
  • Do not automatically retry a POST whose result is ambiguous; it may already have created the record.

Configuration

Use this non-secret base URL:

https://saved.owenyoung.com

Load the token without displaying it, in this order. On macOS, an unelevated or sandboxed Keychain lookup is not authoritative: it can incorrectly report that an existing item was not found.

  1. Read JJ_API_TOKEN from the JavaScript runtime's process environment.
  2. On macOS, if the environment variable is absent, use a fixed Node helper to call /usr/bin/security find-generic-password -s codex-jj-api-token -w. Run that helper with elevated permissions by setting sandbox_permissions: "require_escalated" and providing a concise Keychain-access justification. Capture stdout directly into an in-memory variable and make the helper return only a boolean, a fixed success label such as FOUND, or a sanitized error category.
  3. If an earlier unelevated JavaScript-runtime or sandboxed lookup returns an empty value, exit code 44, ITEM_NOT_FOUND, or any other failure, treat the result as inconclusive. You MUST perform the elevated lookup before reporting that the token is missing. Do not ask the user to configure a token based only on the unelevated result.
  4. Only when the elevated lookup explicitly reports that the Keychain item is absent may you stop before any API call and ask the user to configure JJ_API_TOKEN or add the token to macOS Keychain. Do not ask them to paste the token into chat.

Keep the loaded token in a JavaScript variable such as globalThis.jjApiToken. Build the Authorization header from that variable. Never inspect browser cookies, browser storage, passwords, or session stores to find the token.

When Keychain access requires elevation, keep the token inside the elevated fixed Node process and perform the related fetch() call from that process. Do not return the token to the parent tool session. For API calls that need separate processes, let each elevated helper read the token directly from Keychain.

Workflow

1. Read the current page

Use the selected browser's documented APIs to bind to the active existing tab. Record the full URL, document title, meta description, and the complete meaningful article or main-page content already present in the current DOM. Read content below the fold without navigating or refreshing. Ignore menus, cookie notices, repeated navigation, ads, comments, recommendations, and boilerplate.

Do not follow links or bypass a paywall, sign-in wall, or other access control. If the active tab cannot be read, the article is visibly truncated, or complete content cannot be recovered without navigation, report that and stop without creating a record. Do not silently attach a partial article as the full text.

2. Generate the fields

Read content-rules.md completely. Generate:

  • title: cleaned or translated according to the page type; at most 300 characters.
  • slug: short, lowercase, SEO-friendly ASCII words separated by hyphens.
  • bodyMarkdown: normally 1–3 Markdown list items containing only the page's most distinctive facts.

Base claims only on the current page. Do not invent capabilities, numbers, limitations, or comparisons.

3. Build the full-text attachment

Read article-attachment.md completely. Convert the complete article or cleaned main-page content to faithful Markdown, then apply its language rules:

  • Keep Chinese content as displayed.
  • Translate all substantive non-Chinese prose completely into Simplified Chinese.
  • When the rendered page contains paired source and Chinese translation blocks, keep only the Chinese block from each pair and omit the duplicated non-Chinese block.
  • If a substantive non-Chinese block has no Chinese counterpart, translate it before inclusion rather than retaining the source-language prose.
  • Preserve proper nouns, product names, code, commands, identifiers, filenames, URLs, numbers, units, citations, and mathematical expressions when translating them would reduce accuracy.

For long pages, extract and translate in ordered chunks at heading or block boundaries, then concatenate them. Verify that every substantive semantic unit appears exactly once in Chinese in the final Markdown. Treat a paired source block and its Chinese translation as one semantic unit, not two. Never replace a long section with a summary, placeholder, or ellipsis.

Create one text attachment:

{
  "type": "text",
  "contentFormat": "markdown",
  "content": "<complete Markdown article or main-page text>",
  "summary": "网页全文(中文翻译)"
}

Set summary to one of 网页全文(中文翻译), 网页全文(中文原文), or 网页主要内容, matching the actual content. Use 网页全文(中文翻译) when any substantive prose was translated or when the Chinese half of a rendered bilingual view was retained. The API allows up to 20 attachments, requires non-empty text content, and limits an attachment summary to 300 characters. It documents no content length cap. Keep this as one attachment; if the API rejects its size, report the validation error instead of truncating or splitting it silently.

4. Fetch and match collections

Call:

GET https://saved.owenyoung.com/api/collections
Authorization: Bearer <in-memory token>

Require a successful response before continuing. Read the response's collections array and semantically match the page using each collection's title, description, and slug. Select zero or more IDs, with a maximum of 20. Omit collectionIds when no collection is a good fit; never force a match.

Typical matches:

  • Blog posts, essays, commentary, or analysis: Articles
  • Interesting products or services: Products
  • Inspiring portfolios or side projects: Inspired Links
  • Inspiring personal blogs: Sources
  • RSS, Bluesky, Mastodon, indie web, or related topics: Open Web

A page can belong to multiple collections, such as Articles and Open Web.

5. Create the link record

Construct the request body with no token. Include only the generated link fields, the concise description, collection matches, and the intentional full-text attachment:

{
  "format": "link",
  "title": "生成的标题",
  "url": "当前页面的完整 URL",
  "slug": "generated-slug",
  "bodyMarkdown": "- 独特点一\n- 独特点二",
  "collectionIds": ["col_example"],
  "attachments": [
    {
      "type": "text",
      "contentFormat": "markdown",
      "content": "# 示例标题\n\n替换为完整的 Markdown 正文。",
      "summary": "网页全文(中文翻译)"
    }
  ]
}

Omit collectionIds if empty. Do not include both bodyMarkdown and body. Keep the concise description in bodyMarkdown; do not move it into the attachment. Rely on the service defaults of status: "published" and visibility: "public" unless the user explicitly requests different values.

When the elevated Node fallback is required, pass the non-secret JSON payload to the fixed Node process through stdin rather than shell interpolation or command-line arguments. Let that process read the token directly from Keychain and call fetch(). Do not write the token to stdin or to the payload. Use a non-TTY process so the full-text attachment is not echoed. For long payloads, write only the non-secret JSON payload to a workspace temporary file with apply_patch, then redirect that file to the helper's stdin; never put the token in the file.

Send exactly one request:

POST https://saved.owenyoung.com/api/posts
Authorization: Bearer <in-memory token>
Content-Type: application/json

Treat only 201 Created as success. Parse the returned post object and use its returned slug, not merely the requested slug.

If the server explicitly rejects the slug as already used before creating anything, generate one short disambiguated slug and retry once. Do not retry timeouts, connection drops, or other ambiguous POST failures.

6. Return the result

On success, return only the useful confirmation in this form:

✅ 已收藏:[生成的标题](https://saved.owenyoung.com/returned-slug)

On failure, report the HTTP status and a concise sanitized error. Never include request headers, credentials, or an unsanitized response that might echo them.

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

同じリポジトリのスキル

概要と使いどころ

Summarize the current Git working tree and create a straightforward non-interactive commit. Use when Codex is asked to quickly commit the current work, commit everything currently changed, prepare a concise commit message from the diff, or avoid extra confirmation and commit splitting unless there is a real safety issue.

日本語の概要は準備中です。原文の説明を表示しています。

theowenyoung/home1152026年9月27日 更新

imagegen

無料

Generate or edit raster images when the task benefits from AI-created bitmap visuals such as photos, illustrations, textures, sprites, mockups, or transparent-background cutouts. Use when Codex should create a brand-new image, transform an existing image, or derive visual variants from references, and the output should be a bitmap asset rather than repo-native code or vector. Do not use when the task is better handled by editing existing SVG/vector/code-native assets, extending an established icon or logo system, or building the visual directly in HTML/CSS/canvas.

日本語の概要は準備中です。原文の説明を表示しています。

theowenyoung/home1152026年9月27日 更新

oo

無料

总结当前打开的网页、用户提供的链接,或某个产品、工具、库、文章、教程与研究页面,生成适合个人网页收藏的原始标题清理版和大纲式中文描述。用户输入 `$oo`、要求“收藏这个网页”“总结这个工具/链接”“生成网页收藏标题和描述”,或希望留下半年后仍能看懂的网页批注时使用。

日本語の概要は準備中です。原文の説明を表示しています。

theowenyoung/home1152026年9月27日 更新

Use for Codex models/pricing, scheduled tasks, skills, settings, setup, troubleshooting, customization, automations, and self-knowledge—including 'you,' 'your,' 'this app,' or 'this coding agent' when they refer to Codex—and for OpenAI APIs/products and ChatGPT Work. Also use for model choice/migration, prompting, SDKs, Responses, Realtime, agents, evals, and Chat/Work/Codex comparisons. Do not use for generic app/software tasks that merely mention Codex.

日本語の概要は準備中です。原文の説明を表示しています。

theowenyoung/home1152026年9月27日 更新

Create and scaffold plugin directories for Codex with a required `.codex-plugin/plugin.json`, optional plugin folders/files, valid manifest defaults, and personal-marketplace entries by default. Use when Codex needs to create a new personal plugin, add optional plugin structure, generate or update marketplace entries for plugin ordering and availability metadata, or update an existing local plugin during development with the CLI-driven cachebuster and reinstall flow.

日本語の概要は準備中です。原文の説明を表示しています。

theowenyoung/home1152026年9月27日 更新

Perform a read-only, defect-first review of a specified code change and return every actionable finding. Use when another agent delegates review of uncommitted changes, a base-branch diff, a commit, or custom review instructions.

日本語の概要は準備中です。原文の説明を表示しています。

theowenyoung/home1152026年9月27日 更新

theowenyoung のスキルをすべて見る

このスキルの問題を報告する