{"_id":"@codesook/omp-prompt-border-style","_rev":"3-e46590b50be355ccf369ee3ee0f2a80e","name":"@codesook/omp-prompt-border-style","dist-tags":{"latest":"1.0.3"},"versions":{"1.0.0":{"name":"@codesook/omp-prompt-border-style","version":"1.0.0","license":"MIT","_id":"@codesook/omp-prompt-border-style@1.0.0","maintainers":[{"name":"hadesgod","email":"um_oom@hotmail.com"}],"omp":{"extensions":["./src/main.ts"]},"dist":{"shasum":"e439c8f563fd962e9173cade54b0ed77b66a07e8","tarball":"https://registry.npmjs.org/@codesook/omp-prompt-border-style/-/omp-prompt-border-style-1.0.0.tgz","fileCount":4,"integrity":"sha512-91iE/tJURopUIaXXEjL5fHYLJj6vfETLz31UCgsVJ2qLc+QnilSNK4k1GAJ+5y1BxMwdsHkCvhGypUU7V2MD2A==","signatures":[{"sig":"MEQCIGohoxF48nvk0rdKbWCBtF1t4b+1WiM8yI0UBcHpEaJyAiAgabNOOAgyvJshMu+keUFhzxdhbWqU7qbZVMkBssrGTw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":26957},"type":"module","gitHead":"286c34aa7f318182a1ce1793a2a387c0dbc665d0","scripts":{"test":"bun test src/main.test.ts","check":"bun --bun tsc --noEmit"},"_npmUser":{"name":"hadesgod","email":"um_oom@hotmail.com"},"_npmVersion":"10.9.3","description":"Prompt input border styles for oh-my-pi","directories":{},"_nodeVersion":"22.20.0","_hasShrinkwrap":false,"devDependencies":{"bun-types":"latest","typescript":"latest","@oh-my-pi/pi-tui":">=16.1.7","@oh-my-pi/pi-coding-agent":">=16.1.7"},"peerDependencies":{"@oh-my-pi/pi-tui":">=16.1.7","@oh-my-pi/pi-coding-agent":">=16.1.7"},"_npmOperationalInternal":{"tmp":"tmp/omp-prompt-border-style_1.0.0_1782096308199_0.6884988609367433","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@codesook/omp-prompt-border-style","version":"1.0.1","license":"MIT","_id":"@codesook/omp-prompt-border-style@1.0.1","maintainers":[{"name":"hadesgod","email":"um_oom@hotmail.com"}],"omp":{"extensions":["./src/main.ts"]},"dist":{"shasum":"3f66eb1732e58a502f397c2b31c81d5b2db96aee","tarball":"https://registry.npmjs.org/@codesook/omp-prompt-border-style/-/omp-prompt-border-style-1.0.1.tgz","fileCount":4,"integrity":"sha512-W8TihxOugGfgSirYdjVH5qlrpL9OkOz5lDKYR0x3HUJOHXWrVzMlFn1p0PI0NxEdBmRtwErXE2ZVpykfxySnrQ==","signatures":[{"sig":"MEUCIAiT9MxG04X7oFMejLyLrjFsXOwh9s/wEDYuovw2ZZGbAiEArphAqRXYnPUS3NfeK9Jo0vo7rR2sJrocl5KPPdnU1d0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":49449},"type":"module","gitHead":"e8121db307cf5cfcfa8e134036fcdfad3d7552e3","scripts":{"test":"bun test src/main.test.ts","check":"bun --bun tsc --noEmit"},"_npmUser":{"name":"hadesgod","email":"um_oom@hotmail.com"},"_npmVersion":"10.9.3","description":"Prompt input border styles for oh-my-pi","directories":{},"_nodeVersion":"22.20.0","_hasShrinkwrap":false,"devDependencies":{"bun-types":"latest","typescript":"latest","@oh-my-pi/pi-tui":">=16.1.7","@oh-my-pi/pi-coding-agent":">=16.1.7"},"peerDependencies":{"@oh-my-pi/pi-tui":">=16.1.7","@oh-my-pi/pi-coding-agent":">=16.1.7"},"_npmOperationalInternal":{"tmp":"tmp/omp-prompt-border-style_1.0.1_1782196446100_0.08437345324485457","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@codesook/omp-prompt-border-style","version":"1.0.3","type":"module","description":"Prompt input border styles for oh-my-pi","license":"MIT","scripts":{"check":"bun --bun tsc --noEmit","test":"bun test src/main.test.ts","lint":"bun --bun tsc --noEmit","build":"bun --bun tsc --noEmit"},"publishConfig":{"access":"public"},"peerDependencies":{"@oh-my-pi/pi-coding-agent":">=16.1.7","@oh-my-pi/pi-tui":">=16.1.7"},"devDependencies":{"@oh-my-pi/pi-coding-agent":">=16.1.7","@oh-my-pi/pi-tui":">=16.1.7","bun-types":"latest","typescript":"latest"},"omp":{"extensions":["./src/main.ts"]},"gitHead":"f7f1de33d918277bfd9c3df241e3192af34b4a44","_id":"@codesook/omp-prompt-border-style@1.0.3","_nodeVersion":"24.18.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-TFL4o/UdvThIOxoctBJ56iSCkfbn1D5YsudKyAD24VhBAeFSWjOpl+casjwPdiIdu++nfY1DQC4BKlvzvqwKew==","shasum":"6c9621a97b96c2c45b16652051f1d43c9acfc329","tarball":"https://registry.npmjs.org/@codesook/omp-prompt-border-style/-/omp-prompt-border-style-1.0.3.tgz","fileCount":4,"unpackedSize":113648,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQChViwzeiU/vD4mTNyMEjQMQFUOROpju2z7aaai9Ks16AIhAK7CyjGcE3tYeCDTyRGpI5hO8vXRZ4zvH36uDsr6gn2J"}]},"_npmUser":{"name":"hadesgod","email":"um_oom@hotmail.com"},"directories":{},"maintainers":[{"name":"hadesgod","email":"um_oom@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/omp-prompt-border-style_1.0.3_1782976648340_0.8389710234970209"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-22T02:45:07.975Z","modified":"2026-07-02T07:17:28.598Z","1.0.0":"2026-06-22T02:45:08.325Z","1.0.1":"2026-06-23T06:34:06.236Z","1.0.3":"2026-07-02T07:17:28.467Z"},"license":"MIT","description":"Prompt input border styles for oh-my-pi","maintainers":[{"name":"hadesgod","email":"um_oom@hotmail.com"}],"readme":"# omp-prompt-border-style\n\n![Preview](assets/preview.png)\n\nPrompt border styles for the oh-my-pi input editor.\n\n## What this plugin does\n\nThis plugin registers a `/prompt-border` command that lets you switch the prompt editor border style and layout at runtime.\n\nIt customizes:\n- the top status-line border glyphs\n- the editor side borders\n- a synthetic bottom border for layouts that use one\n- config-driven animated left/right cursor-row glyphs when glyph text is configured\n- config-driven status and activity spinner glyphs that preserve Oh My Pi defaults for any unconfigured spinner group\n- slash-command argument completions for the command itself\n\nThe default active state is:\n- style: `double`\n- layout: `full`\n\n## Requirements\n\n- `omp` with plugin support\n- `@oh-my-pi/pi-coding-agent` `>=16.1.7`\n- `@oh-my-pi/pi-tui` `>=16.1.7`\n\nThis package declares the OMP packages as peer dependencies because it extends the host editor UI.\n\n## Install\n\nFrom a published package name:\n\n```bash\nomp plugin install omp-prompt-border-style\n```\n\nFrom a local checkout during development:\n\n```bash\nomp plugin install /absolute/path/to/omp-prompt-border-style\n```\n\nThis repo exposes the extension through `omp.extensions` in `package.json`, pointing at `./src/main.ts`.\n\n## Command\n\n```text\n/prompt-border <style> [layout]\n/prompt-border layout <layout>\n/prompt-border reset\n/prompt-loading-glyphs debug <frames|demo|on|off>\n```\n\nIf the arguments are invalid, the plugin shows the matching command usage string in the UI.\n\n## Styles\n\n- `round`\n- `sharp`\n- `heavy`\n- `dashed`\n- `heavy-dashed`\n- `heavy-top`\n- `double`\n- `double-top`\n- `double-side`\n- `ascii`\n- `block`\n- `vertical`\n- `double-vertical`\n- `horizontal`\n- `double-horizontal`\n\n## Layouts\n\n- `full` — full top border, side borders, and a separate synthetic bottom border\n- `bottom` — keeps the upstream top/status row and adds only the separate synthetic bottom border\n- `sides` — keeps only the left and right editor borders around the body rows\n- `top-bottom` — keeps the top border and separate synthetic bottom border, hides side borders in body rows\n- `default` — uses the upstream editor layout, restyled with the selected border glyph set\n\nFor non-`default` layouts, the plugin inserts the synthetic bottom border before autocomplete rows so slash-command suggestions stay below the editor body.\n\n## Configuration\n\nThe plugin reads optional settings from `~/.config/codesook-omp/config.json` and writes `style`/`layout` changes there when `/prompt-border` applies a new selection. That JSON is safe to share across computers.\n\n`style` and `layout` set the initial prompt border. The same shared file may also contain a `welcomeScreen` section managed by `codesook-omp`; this plugin preserves that section when it updates `promptBorder`. Local glyph frame text lives next to the JSON in `~/.config/codesook-omp/prompt-border-left-glyphs.txt`, `~/.config/codesook-omp/prompt-border-right-glyphs.txt`, `~/.config/codesook-omp/prompt-border-status-spinner-glyphs.txt`, and `~/.config/codesook-omp/prompt-border-activity-spinner-glyphs.txt`. Frames are whitespace-separated in those text files. Oh My Pi currently has two spinner groups: status and activity. Status frames are used by theme.spinnerFrames/status UI spinners; activity frames are used by getSymbolTheme().spinnerFrames/loading activity spinners.\n\n```json\n{\n  \"promptBorder\": {\n    \"style\": \"double\",\n    \"layout\": \"full\",\n    \"leftGlyph\": {\n      \"frameMs\": 70\n    },\n    \"rightGlyph\": {\n      \"frameMs\": 70\n    },\n    \"spinnerGlyphs\": {\n      \"status\": {\n        \"frameMs\": 80\n      },\n      \"activity\": {\n        \"frameMs\": 80\n      }\n    }\n  }\n}\n```\n\n`spinnerGlyphs.status.frameMs` and `spinnerGlyphs.activity.frameMs` set the desired source-frame duration in milliseconds for each spinner group.\n\n```text\n# ~/.config/codesook-omp/prompt-border-left-glyphs.txt\n􁦘􁦙  􁦚􁦛\n```\n\n```text\n# ~/.config/codesook-omp/prompt-border-right-glyphs.txt\n\n```\n\n```text\n# ~/.config/codesook-omp/prompt-border-status-spinner-glyphs.txt\nS0  S1  S2\n```\n\n```text\n# ~/.config/codesook-omp/prompt-border-activity-spinner-glyphs.txt\n􁦘􁦙  􁦚􁦛\n```\n\n```text\n# With activity.frameMs = 240, each activity frame is repeated internally for about 240ms.\n# With activity.frameMs = 40, the plugin skips source frames because Oh My Pi cannot repaint the spinner faster than 80ms.\n```\n\nEach spinner file may contain one or more whitespace-separated frames. The plugin adapts those configured frames to Oh My Pi's fixed 80ms host spinner tick by repeating frames for slower `frameMs` values and skipping source frames for faster ones. There is no plugin-imposed maximum frame count, but very high `frameMs` values duplicate frames internally, so huge source lists plus slow timings create larger in-memory spinner arrays. If a spinner file is empty or missing, that spinner group is not patched and Oh My Pi uses its built-in frames for that group.\n\nThe left and right glyph files affect only the cursor/input row. They do not change border style, layout, side borders, top borders, autocomplete rows, or synthetic bottom borders.\n\n## Debugging loading glyphs\n\nUse the dedicated loading-glyph debug command instead of spending model tokens:\n\n```text\n/prompt-loading-glyphs debug frames\n/prompt-loading-glyphs debug demo\n/prompt-loading-glyphs debug on\n/prompt-loading-glyphs debug off\n```\n\n`debug frames` prints the source and visible frame sequence for each loading group after `frameMs` adaptation. `debug demo` renders a local no-token preview for every loading group listed by the plugin, currently `status loading` and `activity loading`.\nAfter editing `~/.config/codesook-omp/prompt-border-status-spinner-glyphs.txt`, `~/.config/codesook-omp/prompt-border-activity-spinner-glyphs.txt`, or the matching `spinnerGlyphs.*.frameMs` values in `~/.config/codesook-omp/config.json`, run `/prompt-loading-glyphs debug frames` first and then `/prompt-loading-glyphs debug demo` to verify the actual visible sequence and animation.\nFor example, with `frameMs = 20` a source list such as `F0 F1 F2 F3 F4 F5 F6 F7` may render as `F0 F4`, so the loop must stay smooth on that visible subsequence rather than only on the full source list.\n\n## Examples\n\n```text\n/prompt-border round\n/prompt-border heavy\n/prompt-border dashed\n/prompt-border double bottom\n/prompt-border sharp sides\n/prompt-border double top-bottom\n/prompt-border layout full\n/prompt-border layout bottom\n/prompt-border layout sides\n/prompt-border layout default\n/prompt-border reset\n```\n\n## Autocomplete behavior\n\nTyping `/prompt-border ` and then pressing Space or Tab opens command completions.\n\n- First position: all style names, plus `layout` and `reset`\n- After a style: all layout names\n- After `layout`: all layout names, returned as `layout <name>` completions\n\n## Development\n\nInstall dependencies:\n\n```bash\nbun install\n```\n\nRun the typecheck:\n\n```bash\nbun run check\n```\n\nRun the tests:\n\n```bash\nbun test src/main.test.ts\n```\n\n## Release\n\nThis package is published automatically when a Git tag is pushed.\n\nExample:\n\n```bash\ngit checkout main\ngit pull\n\ngit tag -a v0.1.0 -m \"Release v0.1.0\"\ngit push origin v0.1.0\n```\n\nThe GitHub Actions workflow reads the tag name, sets the package version inside CI, builds the package, and publishes it to npm.\n\nThe tag is the source of truth for the published npm version.\n\n## Repository contents\n\n- `src/main.ts` — plugin implementation, border rendering, status/activity spinner glyph patching, and command registration\n- `src/main.test.ts` — parser, renderer, command, and completion tests\n- `package.json` — package metadata, peer dependencies, scripts, and OMP extension entrypoint\n- `tsconfig.json` — TypeScript configuration\n","readmeFilename":"README.md"}