language-operator 0.1.81 → 0.1.82
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.claude/agents/README.md +16 -0
- data/.claude/agents/changelog-writer.md +181 -0
- data/.claude/hooks/README.md +43 -0
- data/.claude/hooks/node_modules/.bin/esbuild +1 -0
- data/.claude/hooks/node_modules/.bin/tsc +1 -0
- data/.claude/hooks/node_modules/.bin/tsserver +1 -0
- data/.claude/hooks/node_modules/.bin/tsx +1 -0
- data/.claude/hooks/node_modules/.package-lock.json +136 -0
- data/.claude/hooks/node_modules/@esbuild/linux-x64/README.md +3 -0
- data/.claude/hooks/node_modules/@esbuild/linux-x64/bin/esbuild +0 -0
- data/.claude/hooks/node_modules/@esbuild/linux-x64/package.json +20 -0
- data/.claude/hooks/node_modules/@types/node/LICENSE +21 -0
- data/.claude/hooks/node_modules/@types/node/README.md +15 -0
- data/.claude/hooks/node_modules/@types/node/assert/strict.d.ts +105 -0
- data/.claude/hooks/node_modules/@types/node/assert.d.ts +955 -0
- data/.claude/hooks/node_modules/@types/node/async_hooks.d.ts +623 -0
- data/.claude/hooks/node_modules/@types/node/buffer.buffer.d.ts +466 -0
- data/.claude/hooks/node_modules/@types/node/buffer.d.ts +1810 -0
- data/.claude/hooks/node_modules/@types/node/child_process.d.ts +1428 -0
- data/.claude/hooks/node_modules/@types/node/cluster.d.ts +486 -0
- data/.claude/hooks/node_modules/@types/node/compatibility/iterators.d.ts +21 -0
- data/.claude/hooks/node_modules/@types/node/console.d.ts +151 -0
- data/.claude/hooks/node_modules/@types/node/constants.d.ts +20 -0
- data/.claude/hooks/node_modules/@types/node/crypto.d.ts +4065 -0
- data/.claude/hooks/node_modules/@types/node/dgram.d.ts +564 -0
- data/.claude/hooks/node_modules/@types/node/diagnostics_channel.d.ts +576 -0
- data/.claude/hooks/node_modules/@types/node/dns/promises.d.ts +503 -0
- data/.claude/hooks/node_modules/@types/node/dns.d.ts +922 -0
- data/.claude/hooks/node_modules/@types/node/domain.d.ts +166 -0
- data/.claude/hooks/node_modules/@types/node/events.d.ts +1054 -0
- data/.claude/hooks/node_modules/@types/node/fs/promises.d.ts +1316 -0
- data/.claude/hooks/node_modules/@types/node/fs.d.ts +4676 -0
- data/.claude/hooks/node_modules/@types/node/globals.d.ts +150 -0
- data/.claude/hooks/node_modules/@types/node/globals.typedarray.d.ts +101 -0
- data/.claude/hooks/node_modules/@types/node/http.d.ts +2143 -0
- data/.claude/hooks/node_modules/@types/node/http2.d.ts +2480 -0
- data/.claude/hooks/node_modules/@types/node/https.d.ts +399 -0
- data/.claude/hooks/node_modules/@types/node/index.d.ts +115 -0
- data/.claude/hooks/node_modules/@types/node/inspector/promises.d.ts +41 -0
- data/.claude/hooks/node_modules/@types/node/inspector.d.ts +224 -0
- data/.claude/hooks/node_modules/@types/node/inspector.generated.d.ts +4226 -0
- data/.claude/hooks/node_modules/@types/node/module.d.ts +819 -0
- data/.claude/hooks/node_modules/@types/node/net.d.ts +933 -0
- data/.claude/hooks/node_modules/@types/node/os.d.ts +507 -0
- data/.claude/hooks/node_modules/@types/node/package.json +155 -0
- data/.claude/hooks/node_modules/@types/node/path/posix.d.ts +8 -0
- data/.claude/hooks/node_modules/@types/node/path/win32.d.ts +8 -0
- data/.claude/hooks/node_modules/@types/node/path.d.ts +187 -0
- data/.claude/hooks/node_modules/@types/node/perf_hooks.d.ts +621 -0
- data/.claude/hooks/node_modules/@types/node/process.d.ts +2097 -0
- data/.claude/hooks/node_modules/@types/node/punycode.d.ts +117 -0
- data/.claude/hooks/node_modules/@types/node/querystring.d.ts +152 -0
- data/.claude/hooks/node_modules/@types/node/quic.d.ts +910 -0
- data/.claude/hooks/node_modules/@types/node/readline/promises.d.ts +161 -0
- data/.claude/hooks/node_modules/@types/node/readline.d.ts +541 -0
- data/.claude/hooks/node_modules/@types/node/repl.d.ts +415 -0
- data/.claude/hooks/node_modules/@types/node/sea.d.ts +162 -0
- data/.claude/hooks/node_modules/@types/node/sqlite.d.ts +937 -0
- data/.claude/hooks/node_modules/@types/node/stream/consumers.d.ts +38 -0
- data/.claude/hooks/node_modules/@types/node/stream/promises.d.ts +211 -0
- data/.claude/hooks/node_modules/@types/node/stream/web.d.ts +296 -0
- data/.claude/hooks/node_modules/@types/node/stream.d.ts +1760 -0
- data/.claude/hooks/node_modules/@types/node/string_decoder.d.ts +67 -0
- data/.claude/hooks/node_modules/@types/node/test/reporters.d.ts +96 -0
- data/.claude/hooks/node_modules/@types/node/test.d.ts +2239 -0
- data/.claude/hooks/node_modules/@types/node/timers/promises.d.ts +108 -0
- data/.claude/hooks/node_modules/@types/node/timers.d.ts +159 -0
- data/.claude/hooks/node_modules/@types/node/tls.d.ts +1194 -0
- data/.claude/hooks/node_modules/@types/node/trace_events.d.ts +197 -0
- data/.claude/hooks/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +462 -0
- data/.claude/hooks/node_modules/@types/node/ts5.6/compatibility/float16array.d.ts +71 -0
- data/.claude/hooks/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +36 -0
- data/.claude/hooks/node_modules/@types/node/ts5.6/index.d.ts +117 -0
- data/.claude/hooks/node_modules/@types/node/ts5.7/compatibility/float16array.d.ts +72 -0
- data/.claude/hooks/node_modules/@types/node/ts5.7/index.d.ts +117 -0
- data/.claude/hooks/node_modules/@types/node/tty.d.ts +250 -0
- data/.claude/hooks/node_modules/@types/node/url.d.ts +519 -0
- data/.claude/hooks/node_modules/@types/node/util/types.d.ts +558 -0
- data/.claude/hooks/node_modules/@types/node/util.d.ts +1653 -0
- data/.claude/hooks/node_modules/@types/node/v8.d.ts +979 -0
- data/.claude/hooks/node_modules/@types/node/vm.d.ts +1180 -0
- data/.claude/hooks/node_modules/@types/node/wasi.d.ts +202 -0
- data/.claude/hooks/node_modules/@types/node/web-globals/abortcontroller.d.ts +59 -0
- data/.claude/hooks/node_modules/@types/node/web-globals/blob.d.ts +23 -0
- data/.claude/hooks/node_modules/@types/node/web-globals/console.d.ts +9 -0
- data/.claude/hooks/node_modules/@types/node/web-globals/crypto.d.ts +39 -0
- data/.claude/hooks/node_modules/@types/node/web-globals/domexception.d.ts +68 -0
- data/.claude/hooks/node_modules/@types/node/web-globals/encoding.d.ts +11 -0
- data/.claude/hooks/node_modules/@types/node/web-globals/events.d.ts +106 -0
- data/.claude/hooks/node_modules/@types/node/web-globals/fetch.d.ts +54 -0
- data/.claude/hooks/node_modules/@types/node/web-globals/importmeta.d.ts +13 -0
- data/.claude/hooks/node_modules/@types/node/web-globals/messaging.d.ts +23 -0
- data/.claude/hooks/node_modules/@types/node/web-globals/navigator.d.ts +25 -0
- data/.claude/hooks/node_modules/@types/node/web-globals/performance.d.ts +45 -0
- data/.claude/hooks/node_modules/@types/node/web-globals/storage.d.ts +24 -0
- data/.claude/hooks/node_modules/@types/node/web-globals/streams.d.ts +115 -0
- data/.claude/hooks/node_modules/@types/node/web-globals/timers.d.ts +44 -0
- data/.claude/hooks/node_modules/@types/node/web-globals/url.d.ts +24 -0
- data/.claude/hooks/node_modules/@types/node/worker_threads.d.ts +714 -0
- data/.claude/hooks/node_modules/@types/node/zlib.d.ts +618 -0
- data/.claude/hooks/node_modules/esbuild/LICENSE.md +21 -0
- data/.claude/hooks/node_modules/esbuild/README.md +3 -0
- data/.claude/hooks/node_modules/esbuild/bin/esbuild +0 -0
- data/.claude/hooks/node_modules/esbuild/install.js +289 -0
- data/.claude/hooks/node_modules/esbuild/lib/main.d.ts +716 -0
- data/.claude/hooks/node_modules/esbuild/lib/main.js +2242 -0
- data/.claude/hooks/node_modules/esbuild/package.json +49 -0
- data/.claude/hooks/node_modules/get-tsconfig/LICENSE +21 -0
- data/.claude/hooks/node_modules/get-tsconfig/README.md +235 -0
- data/.claude/hooks/node_modules/get-tsconfig/dist/index.cjs +7 -0
- data/.claude/hooks/node_modules/get-tsconfig/dist/index.d.cts +2088 -0
- data/.claude/hooks/node_modules/get-tsconfig/dist/index.d.mts +2088 -0
- data/.claude/hooks/node_modules/get-tsconfig/dist/index.mjs +7 -0
- data/.claude/hooks/node_modules/get-tsconfig/package.json +46 -0
- data/.claude/hooks/node_modules/resolve-pkg-maps/LICENSE +21 -0
- data/.claude/hooks/node_modules/resolve-pkg-maps/README.md +216 -0
- data/.claude/hooks/node_modules/resolve-pkg-maps/dist/index.cjs +1 -0
- data/.claude/hooks/node_modules/resolve-pkg-maps/dist/index.d.cts +11 -0
- data/.claude/hooks/node_modules/resolve-pkg-maps/dist/index.d.mts +11 -0
- data/.claude/hooks/node_modules/resolve-pkg-maps/dist/index.mjs +1 -0
- data/.claude/hooks/node_modules/resolve-pkg-maps/package.json +42 -0
- data/.claude/hooks/node_modules/tsx/LICENSE +21 -0
- data/.claude/hooks/node_modules/tsx/README.md +32 -0
- data/.claude/hooks/node_modules/tsx/dist/cjs/api/index.cjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/cjs/api/index.d.cts +35 -0
- data/.claude/hooks/node_modules/tsx/dist/cjs/api/index.d.mts +35 -0
- data/.claude/hooks/node_modules/tsx/dist/cjs/api/index.mjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/cjs/index.cjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/cjs/index.mjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/cli.cjs +54 -0
- data/.claude/hooks/node_modules/tsx/dist/cli.mjs +55 -0
- data/.claude/hooks/node_modules/tsx/dist/client-BQVF1NaW.mjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/client-D6NvIMSC.cjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/esm/api/index.cjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/esm/api/index.d.cts +35 -0
- data/.claude/hooks/node_modules/tsx/dist/esm/api/index.d.mts +35 -0
- data/.claude/hooks/node_modules/tsx/dist/esm/api/index.mjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/esm/index.cjs +2 -0
- data/.claude/hooks/node_modules/tsx/dist/esm/index.mjs +2 -0
- data/.claude/hooks/node_modules/tsx/dist/get-pipe-path-BHW2eJdv.mjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/get-pipe-path-BoR10qr8.cjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/index-7AaEi15b.mjs +14 -0
- data/.claude/hooks/node_modules/tsx/dist/index-BWFBUo6r.cjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/index-gbaejti9.mjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/index-gckBtVBf.cjs +14 -0
- data/.claude/hooks/node_modules/tsx/dist/lexer-DQCqS3nf.mjs +3 -0
- data/.claude/hooks/node_modules/tsx/dist/lexer-DgIbo0BU.cjs +3 -0
- data/.claude/hooks/node_modules/tsx/dist/loader.cjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/loader.mjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/node-features-_8ZFwP_x.mjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/node-features-roYmp9jK.cjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/package-CeBgXWuR.mjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/package-Dxt5kIHw.cjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/patch-repl.cjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/patch-repl.mjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/preflight.cjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/preflight.mjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/register-2sWVXuRQ.cjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/register-B7jrtLTO.mjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/register-CFH5oNdT.mjs +4 -0
- data/.claude/hooks/node_modules/tsx/dist/register-D46fvsV_.cjs +4 -0
- data/.claude/hooks/node_modules/tsx/dist/repl.cjs +3 -0
- data/.claude/hooks/node_modules/tsx/dist/repl.mjs +3 -0
- data/.claude/hooks/node_modules/tsx/dist/require-D4F1Lv60.cjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/require-DQxpCAr4.mjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/suppress-warnings.cjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/suppress-warnings.mjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/temporary-directory-B83uKxJF.cjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/temporary-directory-CwHp0_NW.mjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/types-Cxp8y2TL.d.ts +5 -0
- data/.claude/hooks/node_modules/tsx/package.json +68 -0
- data/.claude/hooks/node_modules/typescript/LICENSE.txt +55 -0
- data/.claude/hooks/node_modules/typescript/README.md +50 -0
- data/.claude/hooks/node_modules/typescript/SECURITY.md +41 -0
- data/.claude/hooks/node_modules/typescript/ThirdPartyNoticeText.txt +193 -0
- data/.claude/hooks/node_modules/typescript/bin/tsc +2 -0
- data/.claude/hooks/node_modules/typescript/bin/tsserver +2 -0
- data/.claude/hooks/node_modules/typescript/lib/_tsc.js +133818 -0
- data/.claude/hooks/node_modules/typescript/lib/_tsserver.js +659 -0
- data/.claude/hooks/node_modules/typescript/lib/_typingsInstaller.js +222 -0
- data/.claude/hooks/node_modules/typescript/lib/cs/diagnosticMessages.generated.json +2122 -0
- data/.claude/hooks/node_modules/typescript/lib/de/diagnosticMessages.generated.json +2122 -0
- data/.claude/hooks/node_modules/typescript/lib/es/diagnosticMessages.generated.json +2122 -0
- data/.claude/hooks/node_modules/typescript/lib/fr/diagnosticMessages.generated.json +2122 -0
- data/.claude/hooks/node_modules/typescript/lib/it/diagnosticMessages.generated.json +2122 -0
- data/.claude/hooks/node_modules/typescript/lib/ja/diagnosticMessages.generated.json +2122 -0
- data/.claude/hooks/node_modules/typescript/lib/ko/diagnosticMessages.generated.json +2122 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.d.ts +22 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.decorators.d.ts +384 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.decorators.legacy.d.ts +22 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.dom.asynciterable.d.ts +41 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.dom.d.ts +39429 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.dom.iterable.d.ts +571 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2015.collection.d.ts +147 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2015.core.d.ts +597 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2015.d.ts +28 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2015.generator.d.ts +77 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2015.iterable.d.ts +605 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2015.promise.d.ts +81 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2015.proxy.d.ts +128 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2015.reflect.d.ts +144 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2015.symbol.d.ts +46 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts +326 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2016.array.include.d.ts +116 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2016.d.ts +21 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2016.full.d.ts +23 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2016.intl.d.ts +31 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts +21 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2017.d.ts +26 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2017.date.d.ts +31 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2017.full.d.ts +23 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2017.intl.d.ts +44 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2017.object.d.ts +49 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts +135 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2017.string.d.ts +45 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts +53 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts +77 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts +53 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2018.d.ts +24 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2018.full.d.ts +24 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2018.intl.d.ts +83 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2018.promise.d.ts +30 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2018.regexp.d.ts +37 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2019.array.d.ts +79 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2019.d.ts +24 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2019.full.d.ts +24 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2019.intl.d.ts +23 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2019.object.d.ts +33 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2019.string.d.ts +37 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2019.symbol.d.ts +24 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2020.bigint.d.ts +765 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2020.d.ts +27 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2020.date.d.ts +42 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2020.full.d.ts +24 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2020.intl.d.ts +474 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2020.number.d.ts +28 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2020.promise.d.ts +47 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts +99 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2020.string.d.ts +44 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts +41 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2021.d.ts +23 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2021.full.d.ts +24 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2021.intl.d.ts +166 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2021.promise.d.ts +48 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2021.string.d.ts +33 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2021.weakref.d.ts +78 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2022.array.d.ts +121 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2022.d.ts +25 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2022.error.d.ts +75 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2022.full.d.ts +24 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2022.intl.d.ts +145 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2022.object.d.ts +26 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2022.regexp.d.ts +39 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2022.string.d.ts +25 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2023.array.d.ts +924 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2023.collection.d.ts +21 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2023.d.ts +22 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2023.full.d.ts +24 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2023.intl.d.ts +56 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts +65 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2024.collection.d.ts +29 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2024.d.ts +26 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2024.full.d.ts +24 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2024.object.d.ts +29 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2024.promise.d.ts +35 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2024.regexp.d.ts +25 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts +68 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2024.string.d.ts +29 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es5.d.ts +4601 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es6.d.ts +23 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.esnext.array.d.ts +35 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.esnext.collection.d.ts +96 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.esnext.d.ts +29 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.esnext.decorators.d.ts +28 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.esnext.disposable.d.ts +193 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.esnext.error.d.ts +24 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.esnext.float16.d.ts +445 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.esnext.full.d.ts +24 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.esnext.intl.d.ts +21 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.esnext.iterator.d.ts +148 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.esnext.promise.d.ts +34 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts +25 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.scripthost.d.ts +322 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.webworker.asynciterable.d.ts +41 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.webworker.d.ts +13150 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.webworker.importscripts.d.ts +23 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.webworker.iterable.d.ts +340 -0
- data/.claude/hooks/node_modules/typescript/lib/pl/diagnosticMessages.generated.json +2122 -0
- data/.claude/hooks/node_modules/typescript/lib/pt-br/diagnosticMessages.generated.json +2122 -0
- data/.claude/hooks/node_modules/typescript/lib/ru/diagnosticMessages.generated.json +2122 -0
- data/.claude/hooks/node_modules/typescript/lib/tr/diagnosticMessages.generated.json +2122 -0
- data/.claude/hooks/node_modules/typescript/lib/tsc.js +8 -0
- data/.claude/hooks/node_modules/typescript/lib/tsserver.js +8 -0
- data/.claude/hooks/node_modules/typescript/lib/tsserverlibrary.d.ts +17 -0
- data/.claude/hooks/node_modules/typescript/lib/tsserverlibrary.js +21 -0
- data/.claude/hooks/node_modules/typescript/lib/typesMap.json +497 -0
- data/.claude/hooks/node_modules/typescript/lib/typescript.d.ts +11437 -0
- data/.claude/hooks/node_modules/typescript/lib/typescript.js +200276 -0
- data/.claude/hooks/node_modules/typescript/lib/typingsInstaller.js +8 -0
- data/.claude/hooks/node_modules/typescript/lib/watchGuard.js +53 -0
- data/.claude/hooks/node_modules/typescript/lib/zh-cn/diagnosticMessages.generated.json +2122 -0
- data/.claude/hooks/node_modules/typescript/lib/zh-tw/diagnosticMessages.generated.json +2122 -0
- data/.claude/hooks/node_modules/typescript/package.json +120 -0
- data/.claude/hooks/node_modules/undici-types/LICENSE +21 -0
- data/.claude/hooks/node_modules/undici-types/README.md +6 -0
- data/.claude/hooks/node_modules/undici-types/agent.d.ts +32 -0
- data/.claude/hooks/node_modules/undici-types/api.d.ts +43 -0
- data/.claude/hooks/node_modules/undici-types/balanced-pool.d.ts +29 -0
- data/.claude/hooks/node_modules/undici-types/cache-interceptor.d.ts +172 -0
- data/.claude/hooks/node_modules/undici-types/cache.d.ts +36 -0
- data/.claude/hooks/node_modules/undici-types/client-stats.d.ts +15 -0
- data/.claude/hooks/node_modules/undici-types/client.d.ts +108 -0
- data/.claude/hooks/node_modules/undici-types/connector.d.ts +34 -0
- data/.claude/hooks/node_modules/undici-types/content-type.d.ts +21 -0
- data/.claude/hooks/node_modules/undici-types/cookies.d.ts +30 -0
- data/.claude/hooks/node_modules/undici-types/diagnostics-channel.d.ts +74 -0
- data/.claude/hooks/node_modules/undici-types/dispatcher.d.ts +276 -0
- data/.claude/hooks/node_modules/undici-types/env-http-proxy-agent.d.ts +22 -0
- data/.claude/hooks/node_modules/undici-types/errors.d.ts +161 -0
- data/.claude/hooks/node_modules/undici-types/eventsource.d.ts +66 -0
- data/.claude/hooks/node_modules/undici-types/fetch.d.ts +211 -0
- data/.claude/hooks/node_modules/undici-types/formdata.d.ts +108 -0
- data/.claude/hooks/node_modules/undici-types/global-dispatcher.d.ts +9 -0
- data/.claude/hooks/node_modules/undici-types/global-origin.d.ts +7 -0
- data/.claude/hooks/node_modules/undici-types/h2c-client.d.ts +73 -0
- data/.claude/hooks/node_modules/undici-types/handlers.d.ts +15 -0
- data/.claude/hooks/node_modules/undici-types/header.d.ts +160 -0
- data/.claude/hooks/node_modules/undici-types/index.d.ts +80 -0
- data/.claude/hooks/node_modules/undici-types/interceptors.d.ts +39 -0
- data/.claude/hooks/node_modules/undici-types/mock-agent.d.ts +68 -0
- data/.claude/hooks/node_modules/undici-types/mock-call-history.d.ts +111 -0
- data/.claude/hooks/node_modules/undici-types/mock-client.d.ts +27 -0
- data/.claude/hooks/node_modules/undici-types/mock-errors.d.ts +12 -0
- data/.claude/hooks/node_modules/undici-types/mock-interceptor.d.ts +94 -0
- data/.claude/hooks/node_modules/undici-types/mock-pool.d.ts +27 -0
- data/.claude/hooks/node_modules/undici-types/package.json +55 -0
- data/.claude/hooks/node_modules/undici-types/patch.d.ts +29 -0
- data/.claude/hooks/node_modules/undici-types/pool-stats.d.ts +19 -0
- data/.claude/hooks/node_modules/undici-types/pool.d.ts +41 -0
- data/.claude/hooks/node_modules/undici-types/proxy-agent.d.ts +29 -0
- data/.claude/hooks/node_modules/undici-types/readable.d.ts +68 -0
- data/.claude/hooks/node_modules/undici-types/retry-agent.d.ts +8 -0
- data/.claude/hooks/node_modules/undici-types/retry-handler.d.ts +125 -0
- data/.claude/hooks/node_modules/undici-types/snapshot-agent.d.ts +109 -0
- data/.claude/hooks/node_modules/undici-types/util.d.ts +18 -0
- data/.claude/hooks/node_modules/undici-types/utility.d.ts +7 -0
- data/.claude/hooks/node_modules/undici-types/webidl.d.ts +341 -0
- data/.claude/hooks/node_modules/undici-types/websocket.d.ts +186 -0
- data/.claude/hooks/package-lock.json +562 -0
- data/.claude/hooks/package.json +19 -0
- data/.claude/hooks/skill-activation-prompt.sh +11 -0
- data/.claude/hooks/skill-activation-prompt.ts +185 -0
- data/.claude/hooks/tsconfig.json +12 -0
- data/.claude/settings.json +33 -0
- data/.claude/skills/README.md +29 -0
- data/.claude/skills/ruby-gem-development/SKILL.md +293 -0
- data/.claude/skills/skill-rules.json +117 -0
- data/.claude/skills/thor-cli-development/SKILL.md +431 -0
- data/CHANGELOG.md +7 -0
- data/Gemfile.lock +3 -1
- data/completions/{_aictl → _langop} +37 -37
- data/completions/{aictl.bash → langop.bash} +16 -16
- data/completions/langop.fish +114 -0
- data/components/agent/Gemfile +1 -1
- data/components/tool/Gemfile +1 -1
- data/docs/README.md +10 -10
- data/docs/agent-internals.md +1 -1
- data/docs/cheat-sheet.md +76 -76
- data/docs/cli-reference.md +71 -71
- data/docs/how-agents-work.md +1 -1
- data/docs/installation.md +30 -30
- data/docs/quickstart.md +30 -30
- data/docs/using-tools.md +11 -11
- data/docs/webhooks.md +6 -6
- data/examples/ux_helpers_demo.rb +4 -4
- data/lib/language_operator/agent/task_executor.rb +0 -37
- data/lib/language_operator/agent/web_server.rb +311 -323
- data/lib/language_operator/cli/commands/agent/base.rb +16 -15
- data/lib/language_operator/cli/commands/agent/code_operations.rb +6 -6
- data/lib/language_operator/cli/commands/agent/helpers/synthesis_watcher.rb +1 -1
- data/lib/language_operator/cli/commands/agent/lifecycle.rb +2 -2
- data/lib/language_operator/cli/commands/agent/logs.rb +2 -2
- data/lib/language_operator/cli/commands/agent/workspace.rb +8 -8
- data/lib/language_operator/cli/commands/cluster.rb +172 -158
- data/lib/language_operator/cli/commands/install.rb +878 -81
- data/lib/language_operator/cli/commands/model/base.rb +7 -6
- data/lib/language_operator/cli/commands/organization.rb +61 -0
- data/lib/language_operator/cli/commands/persona.rb +10 -8
- data/lib/language_operator/cli/commands/status.rb +83 -13
- data/lib/language_operator/cli/commands/system/exec.rb +10 -10
- data/lib/language_operator/cli/commands/system/schema.rb +6 -6
- data/lib/language_operator/cli/commands/system/synthesis_template.rb +6 -6
- data/lib/language_operator/cli/commands/system/synthesize.rb +14 -14
- data/lib/language_operator/cli/commands/system/validate_template.rb +4 -4
- data/lib/language_operator/cli/commands/tool/base.rb +1 -1
- data/lib/language_operator/cli/commands/tool/install.rb +2 -2
- data/lib/language_operator/cli/commands/tool/search.rb +3 -3
- data/lib/language_operator/cli/commands/ui.rb +173 -0
- data/lib/language_operator/cli/commands/use.rb +80 -9
- data/lib/language_operator/cli/errors/suggestions.rb +21 -21
- data/lib/language_operator/cli/formatters/progress_formatter.rb +2 -1
- data/lib/language_operator/cli/formatters/table_formatter.rb +21 -1
- data/lib/language_operator/cli/helpers/cluster_validator.rb +2 -2
- data/lib/language_operator/cli/helpers/health_checker.rb +263 -0
- data/lib/language_operator/cli/helpers/kubeconfig_validator.rb +3 -3
- data/lib/language_operator/cli/helpers/ux_helper.rb +4 -3
- data/lib/language_operator/cli/main.rb +30 -21
- data/lib/language_operator/cli/wizards/model_wizard.rb +7 -5
- data/lib/language_operator/config/cluster_config.rb +3 -3
- data/lib/language_operator/constants/kubernetes_labels.rb +1 -1
- data/lib/language_operator/kubernetes/client.rb +53 -109
- data/lib/language_operator/kubernetes/resource_builder.rb +46 -14
- data/lib/language_operator/templates/schema/agent_dsl_openapi.yaml +1 -1
- data/lib/language_operator/templates/schema/agent_dsl_schema.json +1 -1
- data/lib/language_operator/utils/org_context.rb +100 -0
- data/lib/language_operator/version.rb +1 -1
- data/synth/001/Makefile +1 -1
- data/synth/002/Makefile +1 -1
- data/synth/003/Makefile +1 -1
- data/synth/004/Makefile +1 -1
- metadata +384 -11
- data/completions/aictl.fish +0 -114
- data/lib/language_operator/agent/event_config.rb +0 -172
- data/lib/language_operator/cli/commands/quickstart.rb +0 -22
- data/lib/language_operator/cli/wizards/quickstart_wizard.rb +0 -561
- /data/bin/{aictl → langop} +0 -0
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: thor-cli-development
|
|
3
|
+
description: Thor-based CLI development patterns for the aictl command-line interface
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Thor CLI Development Patterns
|
|
7
|
+
|
|
8
|
+
## Purpose
|
|
9
|
+
|
|
10
|
+
Provides consistent patterns for building the `aictl` CLI using Thor framework, including command structure, argument parsing, output formatting, and user experience patterns.
|
|
11
|
+
|
|
12
|
+
## When to Use This Skill
|
|
13
|
+
|
|
14
|
+
Automatically activates when:
|
|
15
|
+
- Creating or modifying CLI commands in `lib/language_operator/cli/commands/`
|
|
16
|
+
- Working with Thor command definitions
|
|
17
|
+
- Implementing interactive wizards
|
|
18
|
+
- Adding new subcommands to aictl
|
|
19
|
+
- Working with command-line argument parsing and validation
|
|
20
|
+
- Formatting CLI output (tables, progress, etc.)
|
|
21
|
+
|
|
22
|
+
## Quick Start
|
|
23
|
+
|
|
24
|
+
### New Command Checklist
|
|
25
|
+
|
|
26
|
+
- [ ] Create command class in `lib/language_operator/cli/commands/`
|
|
27
|
+
- [ ] Register command in `lib/language_operator/cli/main.rb`
|
|
28
|
+
- [ ] Add comprehensive help text with examples
|
|
29
|
+
- [ ] Implement input validation and error handling
|
|
30
|
+
- [ ] Add progress indicators for long-running operations
|
|
31
|
+
- [ ] Write RSpec tests in `spec/language_operator/cli/commands/`
|
|
32
|
+
- [ ] Update shell completions if needed
|
|
33
|
+
|
|
34
|
+
### Command Structure Checklist
|
|
35
|
+
|
|
36
|
+
- [ ] Inherit from appropriate base class
|
|
37
|
+
- [ ] Use descriptive `desc` and `long_desc`
|
|
38
|
+
- [ ] Define options with types and defaults
|
|
39
|
+
- [ ] Validate inputs early
|
|
40
|
+
- [ ] Use consistent output formatting
|
|
41
|
+
- [ ] Handle errors gracefully with helpful messages
|
|
42
|
+
|
|
43
|
+
## Core Principles
|
|
44
|
+
|
|
45
|
+
### 1. Thor Command Hierarchy
|
|
46
|
+
|
|
47
|
+
```ruby
|
|
48
|
+
# lib/language_operator/cli/main.rb
|
|
49
|
+
module LanguageOperator::CLI
|
|
50
|
+
class Main < Thor
|
|
51
|
+
desc 'agent SUBCOMMAND ...ARGS', 'Manage agents'
|
|
52
|
+
subcommand 'agent', Commands::Agent
|
|
53
|
+
|
|
54
|
+
desc 'model SUBCOMMAND ...ARGS', 'Manage language models'
|
|
55
|
+
subcommand 'model', Commands::Model
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Commands are organized by domain:
|
|
60
|
+
# agent/ - Agent lifecycle management
|
|
61
|
+
# model/ - Language model operations
|
|
62
|
+
# tool/ - Tool management
|
|
63
|
+
# cluster/ - Kubernetes cluster operations
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### 2. Command Class Pattern
|
|
67
|
+
|
|
68
|
+
```ruby
|
|
69
|
+
module LanguageOperator::CLI::Commands
|
|
70
|
+
class Agent < Thor
|
|
71
|
+
include CLI::Helpers::ClusterContext
|
|
72
|
+
include CLI::Helpers::ValidationHelper
|
|
73
|
+
|
|
74
|
+
desc 'create NAME', 'Create a new agent'
|
|
75
|
+
long_desc <<~DESC
|
|
76
|
+
Create a new autonomous agent with the specified name.
|
|
77
|
+
|
|
78
|
+
The agent will be deployed to the current Kubernetes cluster
|
|
79
|
+
and configured with the specified mode and schedule.
|
|
80
|
+
|
|
81
|
+
Examples:
|
|
82
|
+
aictl agent create my-agent
|
|
83
|
+
aictl agent create scheduler --mode scheduled --schedule "0 */6 * * *"
|
|
84
|
+
DESC
|
|
85
|
+
option :mode, type: :string, default: 'autonomous',
|
|
86
|
+
desc: 'Agent execution mode (autonomous, scheduled, reactive)'
|
|
87
|
+
option :schedule, type: :string,
|
|
88
|
+
desc: 'Cron schedule for scheduled agents'
|
|
89
|
+
|
|
90
|
+
def create(name)
|
|
91
|
+
# 1. Validate inputs
|
|
92
|
+
validate_agent_name!(name)
|
|
93
|
+
validate_cluster_connection!
|
|
94
|
+
|
|
95
|
+
# 2. Interactive wizard if needed
|
|
96
|
+
wizard = Wizards::AgentWizard.new
|
|
97
|
+
config = wizard.run(name, options)
|
|
98
|
+
|
|
99
|
+
# 3. Progress indication
|
|
100
|
+
spinner = TTY::Spinner.new("[:spinner] Creating agent...")
|
|
101
|
+
spinner.auto_spin
|
|
102
|
+
|
|
103
|
+
# 4. Main operation
|
|
104
|
+
builder = Kubernetes::ResourceBuilder.new
|
|
105
|
+
manifest = builder.build_agent(config)
|
|
106
|
+
client = Kubernetes::Client.new
|
|
107
|
+
result = client.apply_resource(manifest)
|
|
108
|
+
|
|
109
|
+
spinner.success
|
|
110
|
+
|
|
111
|
+
# 5. Success output
|
|
112
|
+
say_status(:success, "Agent '#{name}' created", :green)
|
|
113
|
+
display_agent_info(result)
|
|
114
|
+
|
|
115
|
+
rescue LanguageOperator::ValidationError => e
|
|
116
|
+
say_error("Validation failed: #{e.message}")
|
|
117
|
+
exit(1)
|
|
118
|
+
rescue LanguageOperator::NetworkError => e
|
|
119
|
+
say_error("Network error: #{e.message}")
|
|
120
|
+
exit(1)
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
private
|
|
124
|
+
|
|
125
|
+
def validate_agent_name!(name)
|
|
126
|
+
return if name.match?(/\A[a-z0-9-]+\z/)
|
|
127
|
+
raise ValidationError, "Invalid agent name: #{name}. Use lowercase letters, numbers, and hyphens."
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def display_agent_info(result)
|
|
131
|
+
table = TTY::Table.new(
|
|
132
|
+
header: ['Property', 'Value'],
|
|
133
|
+
rows: [
|
|
134
|
+
['Name', result.metadata.name],
|
|
135
|
+
['Mode', result.spec.mode],
|
|
136
|
+
['Status', result.status&.phase || 'Creating']
|
|
137
|
+
]
|
|
138
|
+
)
|
|
139
|
+
puts table.render(:ascii)
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### 3. Input Validation Patterns
|
|
146
|
+
|
|
147
|
+
```ruby
|
|
148
|
+
# Validate required arguments
|
|
149
|
+
def create(name)
|
|
150
|
+
if name.nil? || name.empty?
|
|
151
|
+
say_error("Agent name is required")
|
|
152
|
+
invoke(:help, ['create'])
|
|
153
|
+
exit(1)
|
|
154
|
+
end
|
|
155
|
+
# ... rest of implementation
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
# Validate option combinations
|
|
159
|
+
def deploy(name)
|
|
160
|
+
if options[:mode] == 'scheduled' && options[:schedule].nil?
|
|
161
|
+
say_error("Schedule is required for scheduled agents")
|
|
162
|
+
say("Example: aictl agent deploy #{name} --mode scheduled --schedule '0 */6 * * *'")
|
|
163
|
+
exit(1)
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
# Validate environment dependencies
|
|
168
|
+
def status
|
|
169
|
+
validate_cluster_connection!
|
|
170
|
+
validate_agent_exists!(options[:agent])
|
|
171
|
+
end
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### 4. Output Formatting Standards
|
|
175
|
+
|
|
176
|
+
```ruby
|
|
177
|
+
# Success messages
|
|
178
|
+
say_status(:success, "Operation completed", :green)
|
|
179
|
+
|
|
180
|
+
# Error messages
|
|
181
|
+
say_error("Something went wrong: #{error.message}")
|
|
182
|
+
|
|
183
|
+
# Info messages
|
|
184
|
+
say_status(:info, "Checking cluster status...", :cyan)
|
|
185
|
+
|
|
186
|
+
# Tables for structured data
|
|
187
|
+
table = TTY::Table.new(
|
|
188
|
+
header: ['Name', 'Status', 'Mode'],
|
|
189
|
+
rows: agents.map { |a| [a.name, a.status, a.mode] }
|
|
190
|
+
)
|
|
191
|
+
puts table.render(:ascii, padding: [0, 1])
|
|
192
|
+
|
|
193
|
+
# Progress indicators
|
|
194
|
+
spinner = TTY::Spinner.new("[:spinner] Processing...")
|
|
195
|
+
spinner.auto_spin
|
|
196
|
+
# ... operation ...
|
|
197
|
+
spinner.success("✓ Done!")
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
## Common Patterns
|
|
201
|
+
|
|
202
|
+
### Pattern 1: Interactive Wizard
|
|
203
|
+
|
|
204
|
+
```ruby
|
|
205
|
+
module LanguageOperator::CLI::Wizards
|
|
206
|
+
class AgentWizard
|
|
207
|
+
include CLI::Helpers::UserPrompts
|
|
208
|
+
|
|
209
|
+
def run(name, options = {})
|
|
210
|
+
say_header("Agent Creation Wizard")
|
|
211
|
+
|
|
212
|
+
config = AgentConfig.new(name)
|
|
213
|
+
|
|
214
|
+
# Mode selection
|
|
215
|
+
config.mode = options[:mode] || select_mode
|
|
216
|
+
|
|
217
|
+
# Schedule if needed
|
|
218
|
+
if config.mode == 'scheduled'
|
|
219
|
+
config.schedule = options[:schedule] || prompt_for_schedule
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
# Model selection
|
|
223
|
+
config.model = select_model
|
|
224
|
+
|
|
225
|
+
# Confirmation
|
|
226
|
+
display_summary(config)
|
|
227
|
+
return config if yes?("Create agent with these settings?")
|
|
228
|
+
|
|
229
|
+
say("Agent creation cancelled", :yellow)
|
|
230
|
+
exit(0)
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
private
|
|
234
|
+
|
|
235
|
+
def select_mode
|
|
236
|
+
prompt.select(
|
|
237
|
+
"Select execution mode:",
|
|
238
|
+
{
|
|
239
|
+
"Autonomous" => :autonomous,
|
|
240
|
+
"Scheduled" => :scheduled,
|
|
241
|
+
"Reactive" => :reactive
|
|
242
|
+
}
|
|
243
|
+
)
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
def prompt_for_schedule
|
|
247
|
+
prompt.ask(
|
|
248
|
+
"Enter cron schedule:",
|
|
249
|
+
default: "0 */6 * * *",
|
|
250
|
+
validate: ->(input) { CronParser.new(input).valid? }
|
|
251
|
+
)
|
|
252
|
+
end
|
|
253
|
+
end
|
|
254
|
+
end
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
### Pattern 2: Error Handling with Context
|
|
258
|
+
|
|
259
|
+
```ruby
|
|
260
|
+
# Global error handler in base command
|
|
261
|
+
module LanguageOperator::CLI
|
|
262
|
+
class BaseCommand < Thor
|
|
263
|
+
def self.exit_on_failure?
|
|
264
|
+
true
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
private
|
|
268
|
+
|
|
269
|
+
def say_error(message)
|
|
270
|
+
say("ERROR: #{message}", :red)
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
def handle_kubernetes_error(error)
|
|
274
|
+
case error
|
|
275
|
+
when K8s::Error::NotFound
|
|
276
|
+
say_error("Resource not found. Check if the agent exists.")
|
|
277
|
+
say("Run 'aictl agent list' to see available agents.")
|
|
278
|
+
when K8s::Error::Unauthorized
|
|
279
|
+
say_error("Access denied. Check your cluster permissions.")
|
|
280
|
+
say("Run 'aictl cluster status' to verify connection.")
|
|
281
|
+
else
|
|
282
|
+
say_error("Kubernetes error: #{error.message}")
|
|
283
|
+
say("Check cluster connectivity and try again.")
|
|
284
|
+
end
|
|
285
|
+
end
|
|
286
|
+
end
|
|
287
|
+
end
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
### Pattern 3: Subcommand Registration
|
|
291
|
+
|
|
292
|
+
```ruby
|
|
293
|
+
# lib/language_operator/cli/main.rb
|
|
294
|
+
module LanguageOperator::CLI
|
|
295
|
+
class Main < Thor
|
|
296
|
+
desc 'version', 'Show version information'
|
|
297
|
+
def version
|
|
298
|
+
say("aictl version #{LanguageOperator::VERSION}")
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
desc 'status', 'Show cluster and agent status'
|
|
302
|
+
def status
|
|
303
|
+
Commands::Status.new.invoke(:all)
|
|
304
|
+
end
|
|
305
|
+
|
|
306
|
+
# Subcommands
|
|
307
|
+
register(Commands::Agent, 'agent', 'agent SUBCOMMAND', 'Manage agents')
|
|
308
|
+
register(Commands::Model, 'model', 'model SUBCOMMAND', 'Manage models')
|
|
309
|
+
register(Commands::Tool, 'tool', 'tool SUBCOMMAND', 'Manage tools')
|
|
310
|
+
register(Commands::Cluster, 'cluster', 'cluster SUBCOMMAND', 'Manage clusters')
|
|
311
|
+
end
|
|
312
|
+
end
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
### Pattern 4: Configuration and Context
|
|
316
|
+
|
|
317
|
+
```ruby
|
|
318
|
+
module LanguageOperator::CLI::Helpers
|
|
319
|
+
module ClusterContext
|
|
320
|
+
def current_cluster
|
|
321
|
+
@current_cluster ||= begin
|
|
322
|
+
context = Kubernetes::Client.new.current_context
|
|
323
|
+
ClusterConfig.new(context)
|
|
324
|
+
end
|
|
325
|
+
end
|
|
326
|
+
|
|
327
|
+
def validate_cluster_connection!
|
|
328
|
+
current_cluster.validate_connection!
|
|
329
|
+
rescue LanguageOperator::NetworkError => e
|
|
330
|
+
say_error("Cannot connect to cluster: #{e.message}")
|
|
331
|
+
say("Check your kubeconfig and cluster status.")
|
|
332
|
+
exit(1)
|
|
333
|
+
end
|
|
334
|
+
|
|
335
|
+
def with_cluster_context(&block)
|
|
336
|
+
say_status(:info, "Using cluster: #{current_cluster.name}", :cyan)
|
|
337
|
+
yield(current_cluster)
|
|
338
|
+
end
|
|
339
|
+
end
|
|
340
|
+
end
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
## Resource Files
|
|
344
|
+
|
|
345
|
+
For detailed information, see:
|
|
346
|
+
- [Command Templates](resources/command-templates.md) - Boilerplate for new commands
|
|
347
|
+
- [Testing CLIs](resources/testing-patterns.md) - RSpec patterns for CLI testing
|
|
348
|
+
- [User Experience](resources/ux-patterns.md) - Consistent user experience guidelines
|
|
349
|
+
|
|
350
|
+
## Anti-Patterns to Avoid
|
|
351
|
+
|
|
352
|
+
❌ **Missing help text** - Always provide `desc` and examples
|
|
353
|
+
❌ **Silent failures** - Show clear error messages and exit codes
|
|
354
|
+
❌ **Inconsistent output** - Use standardized formatting helpers
|
|
355
|
+
❌ **No input validation** - Validate early and show helpful errors
|
|
356
|
+
❌ **Long-running without feedback** - Use progress indicators
|
|
357
|
+
❌ **Poor error recovery** - Provide actionable suggestions
|
|
358
|
+
|
|
359
|
+
## Quick Reference
|
|
360
|
+
|
|
361
|
+
| Command Element | Pattern |
|
|
362
|
+
|----------------|---------|
|
|
363
|
+
| Command definition | `desc 'name ARGS', 'Description'` |
|
|
364
|
+
| Options | `option :name, type: :string, default: 'value'` |
|
|
365
|
+
| Validation | `validate_something!(value)` |
|
|
366
|
+
| Success output | `say_status(:success, message, :green)` |
|
|
367
|
+
| Error output | `say_error(message)` |
|
|
368
|
+
| Tables | `TTY::Table.new(header: [...], rows: [...])` |
|
|
369
|
+
| Progress | `TTY::Spinner.new("[:spinner] Message...")` |
|
|
370
|
+
| User input | `prompt.ask/select/yes?` |
|
|
371
|
+
|
|
372
|
+
## Testing Patterns
|
|
373
|
+
|
|
374
|
+
```ruby
|
|
375
|
+
# spec/language_operator/cli/commands/agent_spec.rb
|
|
376
|
+
RSpec.describe LanguageOperator::CLI::Commands::Agent do
|
|
377
|
+
subject(:command) { described_class.new }
|
|
378
|
+
|
|
379
|
+
let(:kubernetes_client) { instance_double(LanguageOperator::Kubernetes::Client) }
|
|
380
|
+
|
|
381
|
+
before do
|
|
382
|
+
allow(LanguageOperator::Kubernetes::Client).to receive(:new).and_return(kubernetes_client)
|
|
383
|
+
allow($stdout).to receive(:puts) # Suppress output during tests
|
|
384
|
+
end
|
|
385
|
+
|
|
386
|
+
describe '#create' do
|
|
387
|
+
context 'with valid agent name' do
|
|
388
|
+
it 'creates the agent successfully' do
|
|
389
|
+
expect(kubernetes_client).to receive(:apply_resource).and_return(mock_agent)
|
|
390
|
+
|
|
391
|
+
command.create('test-agent')
|
|
392
|
+
|
|
393
|
+
expect($stdout).to have_received(:puts).with(/success/i)
|
|
394
|
+
end
|
|
395
|
+
end
|
|
396
|
+
|
|
397
|
+
context 'with invalid agent name' do
|
|
398
|
+
it 'shows validation error and exits' do
|
|
399
|
+
expect { command.create('Invalid_Name') }.to raise_error(SystemExit)
|
|
400
|
+
end
|
|
401
|
+
end
|
|
402
|
+
end
|
|
403
|
+
end
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
## Shell Completions
|
|
407
|
+
|
|
408
|
+
```bash
|
|
409
|
+
# completions/aictl.bash
|
|
410
|
+
_aictl() {
|
|
411
|
+
local cur prev opts
|
|
412
|
+
COMPREPLY=()
|
|
413
|
+
cur="${COMP_WORDS[COMP_CWORD]}"
|
|
414
|
+
prev="${COMP_WORDS[COMP_CWORD-1]}"
|
|
415
|
+
|
|
416
|
+
case "${prev}" in
|
|
417
|
+
aictl)
|
|
418
|
+
opts="agent model tool cluster status version help"
|
|
419
|
+
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
|
|
420
|
+
return 0
|
|
421
|
+
;;
|
|
422
|
+
agent)
|
|
423
|
+
opts="create delete list inspect logs"
|
|
424
|
+
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
|
|
425
|
+
return 0
|
|
426
|
+
;;
|
|
427
|
+
esac
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
complete -F _aictl aictl
|
|
431
|
+
```
|
data/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
### Changed
|
|
11
|
+
- **BREAKING**: Renamed CLI binary from `aictl` to `langop`
|
|
12
|
+
- Binary renamed: `bin/aictl` → `bin/langop`
|
|
13
|
+
- Shell completions updated: `completions/aictl.*` → `completions/langop.*`
|
|
14
|
+
- All documentation updated to reference `langop`
|
|
15
|
+
- Migration required: Replace `aictl` with `langop` in scripts and automation
|
|
16
|
+
|
|
10
17
|
### Removed
|
|
11
18
|
- **BREAKING**: Removed deprecated DSL v0 (workflow/step model)
|
|
12
19
|
- Deleted `WorkflowDefinition` and `StepDefinition` classes
|
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
language-operator (0.1.
|
|
4
|
+
language-operator (0.1.82)
|
|
5
|
+
bcrypt (~> 3.1)
|
|
5
6
|
faraday (~> 2.0)
|
|
6
7
|
json-schema (~> 5.0)
|
|
7
8
|
k8s-ruby (~> 0.17)
|
|
@@ -32,6 +33,7 @@ GEM
|
|
|
32
33
|
public_suffix (>= 2.0.2, < 8.0)
|
|
33
34
|
ast (2.4.3)
|
|
34
35
|
base64 (0.3.0)
|
|
36
|
+
bcrypt (3.1.20)
|
|
35
37
|
benchmark (0.5.0)
|
|
36
38
|
bigdecimal (3.3.1)
|
|
37
39
|
coderay (1.1.3)
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
#compdef
|
|
1
|
+
#compdef langop
|
|
2
2
|
|
|
3
|
-
# zsh completion for
|
|
3
|
+
# zsh completion for langop
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
_langop() {
|
|
6
6
|
local -a commands
|
|
7
7
|
local curcontext="$curcontext" state line
|
|
8
8
|
typeset -A opt_args
|
|
@@ -14,7 +14,7 @@ _aictl() {
|
|
|
14
14
|
'persona:Manage agent personas'
|
|
15
15
|
'tool:Manage MCP tools'
|
|
16
16
|
'status:Show system status and overview'
|
|
17
|
-
'version:Show
|
|
17
|
+
'version:Show langop and operator version'
|
|
18
18
|
'new:Generate a new tool or agent project'
|
|
19
19
|
'serve:Start an MCP server for tools'
|
|
20
20
|
'test:Test tool definitions'
|
|
@@ -29,34 +29,34 @@ _aictl() {
|
|
|
29
29
|
|
|
30
30
|
case $state in
|
|
31
31
|
command)
|
|
32
|
-
_describe '
|
|
32
|
+
_describe 'langop command' commands
|
|
33
33
|
;;
|
|
34
34
|
args)
|
|
35
35
|
case $line[1] in
|
|
36
36
|
cluster)
|
|
37
|
-
|
|
37
|
+
_langop_cluster
|
|
38
38
|
;;
|
|
39
39
|
use)
|
|
40
|
-
|
|
40
|
+
_langop_use
|
|
41
41
|
;;
|
|
42
42
|
agent)
|
|
43
|
-
|
|
43
|
+
_langop_agent
|
|
44
44
|
;;
|
|
45
45
|
persona)
|
|
46
|
-
|
|
46
|
+
_langop_persona
|
|
47
47
|
;;
|
|
48
48
|
tool)
|
|
49
|
-
|
|
49
|
+
_langop_tool
|
|
50
50
|
;;
|
|
51
51
|
new)
|
|
52
|
-
|
|
52
|
+
_langop_new
|
|
53
53
|
;;
|
|
54
54
|
esac
|
|
55
55
|
;;
|
|
56
56
|
esac
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
-
|
|
59
|
+
_langop_cluster() {
|
|
60
60
|
local -a subcommands
|
|
61
61
|
subcommands=(
|
|
62
62
|
'create:Create a new language cluster'
|
|
@@ -77,18 +77,18 @@ _aictl_cluster() {
|
|
|
77
77
|
args)
|
|
78
78
|
case $line[1] in
|
|
79
79
|
inspect|delete)
|
|
80
|
-
|
|
80
|
+
_langop_clusters
|
|
81
81
|
;;
|
|
82
82
|
esac
|
|
83
83
|
;;
|
|
84
84
|
esac
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
-
|
|
88
|
-
|
|
87
|
+
_langop_use() {
|
|
88
|
+
_langop_clusters
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
-
|
|
91
|
+
_langop_agent() {
|
|
92
92
|
local -a subcommands
|
|
93
93
|
subcommands=(
|
|
94
94
|
'create:Create a new autonomous agent'
|
|
@@ -114,25 +114,25 @@ _aictl_agent() {
|
|
|
114
114
|
case $line[1] in
|
|
115
115
|
create)
|
|
116
116
|
_arguments \
|
|
117
|
-
'--cluster=[Override current cluster context]:cluster:
|
|
117
|
+
'--cluster=[Override current cluster context]:cluster:_langop_clusters' \
|
|
118
118
|
'--create-cluster=[Create cluster inline]:name:' \
|
|
119
|
-
'--persona=[Use specific persona]:persona:
|
|
119
|
+
'--persona=[Use specific persona]:persona:_langop_personas' \
|
|
120
120
|
'--dry-run[Preview without creating]'
|
|
121
121
|
;;
|
|
122
122
|
list)
|
|
123
123
|
_arguments \
|
|
124
124
|
'--all-clusters[Show agents from all clusters]' \
|
|
125
|
-
'--cluster=[Show agents from specific cluster]:cluster:
|
|
125
|
+
'--cluster=[Show agents from specific cluster]:cluster:_langop_clusters'
|
|
126
126
|
;;
|
|
127
127
|
inspect|delete|logs|code|edit|pause|resume)
|
|
128
|
-
|
|
128
|
+
_langop_agents
|
|
129
129
|
;;
|
|
130
130
|
esac
|
|
131
131
|
;;
|
|
132
132
|
esac
|
|
133
133
|
}
|
|
134
134
|
|
|
135
|
-
|
|
135
|
+
_langop_persona() {
|
|
136
136
|
local -a subcommands
|
|
137
137
|
subcommands=(
|
|
138
138
|
'list:List available personas'
|
|
@@ -154,18 +154,18 @@ _aictl_persona() {
|
|
|
154
154
|
case $line[1] in
|
|
155
155
|
create)
|
|
156
156
|
_arguments \
|
|
157
|
-
'--from=[Inherit from existing persona]:persona:
|
|
158
|
-
'--cluster=[Override current cluster]:cluster:
|
|
157
|
+
'--from=[Inherit from existing persona]:persona:_langop_personas' \
|
|
158
|
+
'--cluster=[Override current cluster]:cluster:_langop_clusters'
|
|
159
159
|
;;
|
|
160
160
|
show|edit|delete)
|
|
161
|
-
|
|
161
|
+
_langop_personas
|
|
162
162
|
;;
|
|
163
163
|
esac
|
|
164
164
|
;;
|
|
165
165
|
esac
|
|
166
166
|
}
|
|
167
167
|
|
|
168
|
-
|
|
168
|
+
_langop_tool() {
|
|
169
169
|
local -a subcommands
|
|
170
170
|
subcommands=(
|
|
171
171
|
'list:List tools in current cluster'
|
|
@@ -186,18 +186,18 @@ _aictl_tool() {
|
|
|
186
186
|
args)
|
|
187
187
|
case $line[1] in
|
|
188
188
|
auth|test|delete)
|
|
189
|
-
|
|
189
|
+
_langop_tools
|
|
190
190
|
;;
|
|
191
191
|
list)
|
|
192
192
|
_arguments \
|
|
193
|
-
'--cluster=[Override current cluster]:cluster:
|
|
193
|
+
'--cluster=[Override current cluster]:cluster:_langop_clusters'
|
|
194
194
|
;;
|
|
195
195
|
esac
|
|
196
196
|
;;
|
|
197
197
|
esac
|
|
198
198
|
}
|
|
199
199
|
|
|
200
|
-
|
|
200
|
+
_langop_new() {
|
|
201
201
|
local -a types
|
|
202
202
|
types=('tool:Generate a new tool project' 'agent:Generate a new agent project')
|
|
203
203
|
_describe 'project type' types
|
|
@@ -205,28 +205,28 @@ _aictl_new() {
|
|
|
205
205
|
|
|
206
206
|
# Helper functions for dynamic completion
|
|
207
207
|
|
|
208
|
-
|
|
208
|
+
_langop_clusters() {
|
|
209
209
|
local -a clusters
|
|
210
|
-
clusters=(${(f)"$(
|
|
210
|
+
clusters=(${(f)"$(langop cluster list 2>/dev/null | tail -n +2 | awk '{print $1}' | grep -v '^─' | grep -v '^NAME')"})
|
|
211
211
|
_describe 'cluster' clusters
|
|
212
212
|
}
|
|
213
213
|
|
|
214
|
-
|
|
214
|
+
_langop_agents() {
|
|
215
215
|
local -a agents
|
|
216
|
-
agents=(${(f)"$(
|
|
216
|
+
agents=(${(f)"$(langop agent list 2>/dev/null | tail -n +2 | awk '{print $1}' | grep -v '^─' | grep -v '^NAME')"})
|
|
217
217
|
_describe 'agent' agents
|
|
218
218
|
}
|
|
219
219
|
|
|
220
|
-
|
|
220
|
+
_langop_personas() {
|
|
221
221
|
local -a personas
|
|
222
|
-
personas=(${(f)"$(
|
|
222
|
+
personas=(${(f)"$(langop persona list 2>/dev/null | tail -n +2 | awk '{print $1}' | grep -v '^─' | grep -v '^NAME')"})
|
|
223
223
|
_describe 'persona' personas
|
|
224
224
|
}
|
|
225
225
|
|
|
226
|
-
|
|
226
|
+
_langop_tools() {
|
|
227
227
|
local -a tools
|
|
228
|
-
tools=(${(f)"$(
|
|
228
|
+
tools=(${(f)"$(langop tool list 2>/dev/null | tail -n +2 | awk '{print $1}' | grep -v '^─' | grep -v '^NAME')"})
|
|
229
229
|
_describe 'tool' tools
|
|
230
230
|
}
|
|
231
231
|
|
|
232
|
-
|
|
232
|
+
_langop "$@"
|