diff --git a/import-from-ai/README.md b/import-from-ai/README.md index c39eefe..58ee56a 100755 --- a/import-from-ai/README.md +++ b/import-from-ai/README.md @@ -5,13 +5,13 @@ A new Runneth user often has months or years of context already living inside another AI. This use case collapses the ramp-up into a single review session. **Install time:** ~5 minutes -**Requires:** [add-roles-permissions](../add-roles-permissions) (must be installed first) +**Requires:** Nothing --- -## Prerequisites +## Identity -`add-roles-permissions` must be installed and have at least one admin mapped. `import-from-ai` writes to the user's permissions home base (`/agent/brain/users//imports/`), so identity resolution must work before this can run. +Standalone — no other package required. The skill derives the user's handle from the conversation surface (Slack profile email or the Motion `userEmail`, falling back to asking once), files imports under `/agent/brain/users//imports/`, and states the handle and path in the pre-write confirmation so the user can correct it before anything lands. --- @@ -87,7 +87,7 @@ Raises are explicit user calls during chat approval. Never automatic. ## Fallbacks -- **add-roles-permissions not installed:** Skill stops and tells the user to install it first. +- **No email on the conversation surface:** Skill asks once what handle to file imports under. - **Upload not parseable:** Skill explains what went wrong and offers the fallback continuation prompt. - **Source AI truncated output:** Skill detects partial JSON and hands over a follow-up prompt that resumes from where the truncation happened. - **Re-importing same content:** Content-hash dedupe makes it a no-op with a clear "already imported, nothing new" report. diff --git a/import-from-ai/SKILL.md b/import-from-ai/SKILL.md index b83a0b5..39a59d7 100755 --- a/import-from-ai/SKILL.md +++ b/import-from-ai/SKILL.md @@ -7,24 +7,20 @@ description: Import saved memories, custom instructions, projects, and recurring A four-phase flow: **hand over**, **parse**, **review**, **write**. -## Prerequisites — check before anything else - -```bash -[ -f /agent/brain/admin/workspace-map.json ] && echo "OK" || echo "MISSING" -``` - -If MISSING, stop and route the user through `add-roles-permissions` first. This skill writes to `/agent/brain/users//imports/` and needs identity resolution working. - ## Resolve identity -Use the same surface-aware resolver pattern as `team-member-memory`: +This skill is standalone — it resolves who's importing from the conversation surface itself, with no other package required: + +- **Slack:** take the message author's profile email. +- **Motion web:** read `userEmail` from the conversation context. +- **No email available:** ask once — "What handle should I file your imports under? First name works." -- **Slack:** `bash /agent/brain/admin/slack-whoami.sh ` -- **Motion web:** read `userEmail` from the conversations DB, then `bash /agent/brain/admin/motion-whoami.sh ` +Derive the handle from the email's local part: lowercase, dots and spaces become hyphens (`kyra.richards@…` → `kyra-richards`). The import root (`home_base`) is `/agent/brain/users//`. -Both return `{ scope, handle, home_base, status }`. Use `home_base` as the import root. +Two guards: -If `status: "collision"`, stop and follow the permissions collision flow. Do not proceed with the import. +1. **Confirm before the first write.** The Phase 4 restate-and-gate message states the handle and path ("filing under `/agent/brain/users/kyra-richards/imports/`") so the user can correct it before anything lands. +2. **Never write into someone else's folder.** If `.md` already exists and its contents clearly belong to a different person, stop and ask which handle to use instead. --- diff --git a/import-from-ai/behavior-snippet.md b/import-from-ai/behavior-snippet.md index 0430433..475a0e3 100755 --- a/import-from-ai/behavior-snippet.md +++ b/import-from-ai/behavior-snippet.md @@ -1,4 +1,4 @@ - + ### When someone wants to import context from another AI — import-from-ai @@ -6,16 +6,15 @@ Triggers: explicit ("import my ChatGPT context", "bring over my Claude memory", When triggered, load `/agent/.agents/skills/import-from-ai/SKILL.md` and run the full flow: -1. Confirm `add-roles-permissions` is installed. If not, route to install it first. -2. Resolve the source provider from the user's language. Default to ChatGPT if ambiguous and confirm. -3. Hand over the provider-specific extraction prompt from `prompts/.md`. -4. When the user uploads the export, run `lib/parse.py` to normalize and dedupe. -5. Triage the manifest inline with the user's full brain in context. For every item, assign a **bucket** (behavioral or contextual), mark conflicts loudly, and surface raise candidates. -6. Render the review HTML via `lib/render-review.py` and hand it back as an openable file. -7. Wait for chat approval. Parse the approval grammar generously (ranges, negatives, category-level, raises, bucket overrides). -8. Restate what was parsed and require an explicit "go". -9. Write: behavioral items append to `.md` (labeled, dated section, never overwriting); contextual items land in `imports/`; raised items go to org or `user.md` (admin-gated). -10. Update `/agent/INDEX.md` immediately. Final summary in chat. +1. Resolve the source provider from the user's language. Default to ChatGPT if ambiguous and confirm. +2. Hand over the provider-specific extraction prompt from `prompts/.md`. +3. When the user uploads the export, run `lib/parse.py` to normalize and dedupe. +4. Triage the manifest inline with the user's full brain in context. For every item, assign a **bucket** (behavioral or contextual), mark conflicts loudly, and surface raise candidates. +5. Render the review HTML via `lib/render-review.py` and hand it back as an openable file. +6. Wait for chat approval. Parse the approval grammar generously (ranges, negatives, category-level, raises, bucket overrides). +7. Restate what was parsed — including the handle and path the imports will file under — and require an explicit "go". +8. Write: behavioral items append to `.md` (labeled, dated section, never overwriting); contextual items land in `imports/`; raised items go to org or `user.md` (admin-gated). +9. Update `/agent/INDEX.md` immediately. Final summary in chat. **The contract:** - Behavioral preferences load every session because they live in `.md`. diff --git a/import-from-ai/install-config.json b/import-from-ai/install-config.json index e0dcda4..5e4c6da 100755 --- a/import-from-ai/install-config.json +++ b/import-from-ai/install-config.json @@ -1,15 +1,13 @@ { "schema": "1.0", "id": "import-from-ai", - "version": "1.0.2", - "description": "Pull saved memories, custom instructions, projects, and recurring preferences out of ChatGPT, Claude, or Gemini in one paste. Behavioral preferences (tone, voice, format) append to the user's profile so they load every session. Contextual content (projects, memories, decisions) lands in imports and surfaces via INDEX when relevant. Raises to org or user.md are explicit, never automatic.", - "requires": [ - "add-roles-permissions" - ], + "version": "1.1.0", + "description": "Pull saved memories, custom instructions, projects, and recurring preferences out of ChatGPT, Claude, or Gemini in one paste. Behavioral preferences (tone, voice, format) append to the user's profile so they load every session. Contextual content (projects, memories, decisions) lands in imports and surfaces via INDEX when relevant. Raises to org or user.md are explicit, never automatic. Standalone — resolves the user's handle from the conversation surface; no other package required.", + "requires": [], "customize": [ { "token": "{{IMPORTS_ROOT}}", - "description": "Where imported context lands by default. Resolved per-user under the permissions home base unless overridden.", + "description": "Where imported context lands by default. Resolved per-user under the user's brain folder unless overridden.", "required": false, "fallback": "/agent/brain/users//imports" } @@ -58,6 +56,12 @@ } ], "changelog": [ + { + "version": "1.1.0", + "date": "2026-06-12", + "type": "minor", + "notes": "Standalone identity: drop the add-roles-permissions prerequisite and the team-member-memory whoami-resolver dependency. Both of those use cases are hidden from the library while they're reworked, so nothing shown may require or route users to them. The skill now derives the handle from the conversation surface itself (Slack profile email or Motion userEmail, local part slugified; asks once if no email is available), files under /agent/brain/users//, states the handle and path in the Phase 4 restate-and-gate so the user can correct it before the first write, and stops rather than writing into a folder that clearly belongs to someone else. If add-roles-permissions is installed later, its stricter resolvers govern — handles derived the same way stay compatible." + }, { "version": "1.0.2", "date": "2026-05-26", diff --git a/import-from-ai/marketing.md b/import-from-ai/marketing.md index 744dd4a..3230260 100755 --- a/import-from-ai/marketing.md +++ b/import-from-ai/marketing.md @@ -2,7 +2,7 @@ hero_headline: "Move two years of AI memory in one paste." hero_subhead: "ChatGPT, Claude, or Gemini already knows you. Hand that over to Runneth in 15 minutes." install_time: "~5 minutes" -requires: "add-roles-permissions skill" +requires: "Nothing" --- ## Super powers this unlocks diff --git a/import-from-ai/post-install-intro.md b/import-from-ai/post-install-intro.md index 1041416..557f01b 100644 --- a/import-from-ai/post-install-intro.md +++ b/import-from-ai/post-install-intro.md @@ -3,9 +3,5 @@ ## What just opened up You can now pull months or years of saved memories, custom instructions, projects, and recurring preferences out of ChatGPT, Claude, or Gemini in one paste. Runneth normalizes the export, dedupes against what it already knows, triages every item against your existing brain, and writes only what you explicitly approve. Ramp-up collapses from weeks to one review session. -## Compounds with -- **add-roles-permissions:** Imports write into your permissions home base, so identity must resolve before this can run. -- **team-member-memory:** Behavioral items from imports land in your profile so Runneth adapts to you from turn one. - ## Start now Which AI are you importing from: **ChatGPT**, **Claude**, or **Gemini**? Answer and I'll hand over the extraction prompt and walk you through the upload. Or say `skip` and trigger the import any time later with `Import my context from ChatGPT`.