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,185 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { readFileSync } from "fs";
|
|
3
|
+
import { join } from "path";
|
|
4
|
+
|
|
5
|
+
interface HookInput {
|
|
6
|
+
session_id: string;
|
|
7
|
+
transcript_path: string;
|
|
8
|
+
cwd: string;
|
|
9
|
+
permission_mode: string;
|
|
10
|
+
prompt: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
interface PromptTriggers {
|
|
14
|
+
keywords?: string[];
|
|
15
|
+
intentPatterns?: string[];
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
interface FileTriggers {
|
|
19
|
+
pathPatterns?: string[];
|
|
20
|
+
pathExclusions?: string[];
|
|
21
|
+
contentPatterns?: string[];
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
interface SkillRule {
|
|
25
|
+
type: "guardrail" | "domain";
|
|
26
|
+
enforcement: "block" | "suggest" | "warn";
|
|
27
|
+
priority: "critical" | "high" | "medium" | "low";
|
|
28
|
+
description?: string;
|
|
29
|
+
promptTriggers?: PromptTriggers;
|
|
30
|
+
fileTriggers?: FileTriggers;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
interface SkillRules {
|
|
34
|
+
version: string;
|
|
35
|
+
description?: string;
|
|
36
|
+
skills: Record<string, SkillRule>;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
interface MatchedSkill {
|
|
40
|
+
name: string;
|
|
41
|
+
matchType: "keyword" | "intent" | "file";
|
|
42
|
+
config: SkillRule;
|
|
43
|
+
matchDetails?: string;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async function main() {
|
|
47
|
+
try {
|
|
48
|
+
// Read input from stdin
|
|
49
|
+
const input = readFileSync(0, "utf-8");
|
|
50
|
+
const data: HookInput = JSON.parse(input);
|
|
51
|
+
const prompt = data.prompt.toLowerCase();
|
|
52
|
+
|
|
53
|
+
// Load skill rules - go up two levels from hooks directory to project root
|
|
54
|
+
const projectDir = process.env.CLAUDE_PROJECT_DIR || join(process.cwd(), "..", "..");
|
|
55
|
+
const rulesPath = join(projectDir, ".claude", "skills", "skill-rules.json");
|
|
56
|
+
|
|
57
|
+
let rules: SkillRules;
|
|
58
|
+
try {
|
|
59
|
+
rules = JSON.parse(readFileSync(rulesPath, "utf-8"));
|
|
60
|
+
} catch (error) {
|
|
61
|
+
// If skill rules file doesn't exist, exit silently
|
|
62
|
+
process.exit(0);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const matchedSkills: MatchedSkill[] = [];
|
|
66
|
+
|
|
67
|
+
// Check each skill for matches
|
|
68
|
+
for (const [skillName, config] of Object.entries(rules.skills)) {
|
|
69
|
+
const triggers = config.promptTriggers;
|
|
70
|
+
if (!triggers) continue;
|
|
71
|
+
|
|
72
|
+
// Keyword matching
|
|
73
|
+
if (triggers.keywords) {
|
|
74
|
+
const matchedKeywords: string[] = [];
|
|
75
|
+
for (const keyword of triggers.keywords) {
|
|
76
|
+
if (prompt.includes(keyword.toLowerCase())) {
|
|
77
|
+
matchedKeywords.push(keyword);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (matchedKeywords.length > 0) {
|
|
82
|
+
matchedSkills.push({
|
|
83
|
+
name: skillName,
|
|
84
|
+
matchType: "keyword",
|
|
85
|
+
config,
|
|
86
|
+
matchDetails: `Keywords: ${matchedKeywords.join(", ")}`
|
|
87
|
+
});
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Intent pattern matching
|
|
93
|
+
if (triggers.intentPatterns) {
|
|
94
|
+
for (const pattern of triggers.intentPatterns) {
|
|
95
|
+
try {
|
|
96
|
+
const regex = new RegExp(pattern, "i");
|
|
97
|
+
if (regex.test(prompt)) {
|
|
98
|
+
matchedSkills.push({
|
|
99
|
+
name: skillName,
|
|
100
|
+
matchType: "intent",
|
|
101
|
+
config,
|
|
102
|
+
matchDetails: `Pattern: ${pattern}`
|
|
103
|
+
});
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
} catch (error) {
|
|
107
|
+
// Skip invalid regex patterns
|
|
108
|
+
console.error(`Invalid regex pattern: ${pattern}`, error);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Generate output if matches found
|
|
115
|
+
if (matchedSkills.length > 0) {
|
|
116
|
+
let output = "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n";
|
|
117
|
+
output += "🎯 SKILL ACTIVATION CHECK\n";
|
|
118
|
+
output += "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n";
|
|
119
|
+
|
|
120
|
+
// Group by priority
|
|
121
|
+
const critical = matchedSkills.filter((s) => s.config.priority === "critical");
|
|
122
|
+
const high = matchedSkills.filter((s) => s.config.priority === "high");
|
|
123
|
+
const medium = matchedSkills.filter((s) => s.config.priority === "medium");
|
|
124
|
+
const low = matchedSkills.filter((s) => s.config.priority === "low");
|
|
125
|
+
|
|
126
|
+
if (critical.length > 0) {
|
|
127
|
+
output += "⚠️ CRITICAL SKILLS (REQUIRED):\n";
|
|
128
|
+
critical.forEach((s) => {
|
|
129
|
+
output += ` → ${s.name}`;
|
|
130
|
+
if (s.config.description) output += ` - ${s.config.description}`;
|
|
131
|
+
output += "\n";
|
|
132
|
+
});
|
|
133
|
+
output += "\n";
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
if (high.length > 0) {
|
|
137
|
+
output += "📚 RECOMMENDED SKILLS:\n";
|
|
138
|
+
high.forEach((s) => {
|
|
139
|
+
output += ` → ${s.name}`;
|
|
140
|
+
if (s.config.description) output += ` - ${s.config.description}`;
|
|
141
|
+
output += "\n";
|
|
142
|
+
});
|
|
143
|
+
output += "\n";
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
if (medium.length > 0) {
|
|
147
|
+
output += "💡 SUGGESTED SKILLS:\n";
|
|
148
|
+
medium.forEach((s) => {
|
|
149
|
+
output += ` → ${s.name}`;
|
|
150
|
+
if (s.config.description) output += ` - ${s.config.description}`;
|
|
151
|
+
output += "\n";
|
|
152
|
+
});
|
|
153
|
+
output += "\n";
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
if (low.length > 0) {
|
|
157
|
+
output += "ℹ️ OPTIONAL SKILLS:\n";
|
|
158
|
+
low.forEach((s) => {
|
|
159
|
+
output += ` → ${s.name}`;
|
|
160
|
+
if (s.config.description) output += ` - ${s.config.description}`;
|
|
161
|
+
output += "\n";
|
|
162
|
+
});
|
|
163
|
+
output += "\n";
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Add call to action
|
|
167
|
+
if (critical.length > 0) {
|
|
168
|
+
output += "⚠️ ACTION: You MUST use the critical skills before proceeding\n";
|
|
169
|
+
} else if (high.length > 0) {
|
|
170
|
+
output += "💡 ACTION: Consider using the Skill tool to activate relevant skills\n";
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
output += "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n";
|
|
174
|
+
|
|
175
|
+
process.stdout.write(output);
|
|
176
|
+
}
|
|
177
|
+
} catch (error) {
|
|
178
|
+
// Silent fail - don't break Claude if hook fails
|
|
179
|
+
// Only log to stderr for debugging, but exit successfully
|
|
180
|
+
console.error("Skill activation hook error:", error);
|
|
181
|
+
process.exit(0);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
main();
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"permissions": {
|
|
3
|
+
"allow": [
|
|
4
|
+
"Bash(find:*)",
|
|
5
|
+
"Bash(rg:*)",
|
|
6
|
+
"Bash(grep:*)",
|
|
7
|
+
"Bash(ls:*)",
|
|
8
|
+
"Bash(cat:*)",
|
|
9
|
+
"Bash(head:*)",
|
|
10
|
+
"Bash(tail:*)",
|
|
11
|
+
"Bash(bundle exec rspec:*)",
|
|
12
|
+
"Bash(bundle exec rubocop:*)",
|
|
13
|
+
"Bash(make test:*)",
|
|
14
|
+
"Bash(bundle exec rake:*)",
|
|
15
|
+
"Bash(gem build:*)",
|
|
16
|
+
"Bash(bundle install:*)"
|
|
17
|
+
],
|
|
18
|
+
"deny": []
|
|
19
|
+
},
|
|
20
|
+
"enableAllProjectMcpServers": true,
|
|
21
|
+
"hooks": {
|
|
22
|
+
"UserPromptSubmit": [
|
|
23
|
+
{
|
|
24
|
+
"hooks": [
|
|
25
|
+
{
|
|
26
|
+
"type": "command",
|
|
27
|
+
"command": "$CLAUDE_PROJECT_DIR/.claude/hooks/skill-activation-prompt.sh"
|
|
28
|
+
}
|
|
29
|
+
]
|
|
30
|
+
}
|
|
31
|
+
]
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Language Operator Skills
|
|
2
|
+
|
|
3
|
+
Domain-specific knowledge modules for Language Operator Ruby gem development.
|
|
4
|
+
|
|
5
|
+
## Available Skills
|
|
6
|
+
|
|
7
|
+
- [ruby-gem-development](ruby-gem-development/SKILL.md) - Ruby gem development patterns with bundler, RSpec, RuboCop, and Language Operator conventions
|
|
8
|
+
- [thor-cli-development](thor-cli-development/SKILL.md) - Thor-based CLI development patterns for the aictl command-line interface
|
|
9
|
+
|
|
10
|
+
## Skill Activation
|
|
11
|
+
|
|
12
|
+
Skills are automatically activated based on:
|
|
13
|
+
- **Keywords** in your prompts (e.g., "gem", "CLI", "Thor", "RSpec")
|
|
14
|
+
- **File patterns** when editing relevant files
|
|
15
|
+
- **Content patterns** when working with specific code structures
|
|
16
|
+
|
|
17
|
+
See [skill-rules.json](skill-rules.json) for detailed trigger configuration.
|
|
18
|
+
|
|
19
|
+
## Usage
|
|
20
|
+
|
|
21
|
+
To manually activate a skill:
|
|
22
|
+
```
|
|
23
|
+
Use the ruby-gem-development skill to help me implement a new feature
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
To see all available skills:
|
|
27
|
+
```
|
|
28
|
+
What skills are available for this project?
|
|
29
|
+
```
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ruby-gem-development
|
|
3
|
+
description: Ruby gem development patterns with bundler, RSpec, RuboCop, and Language Operator conventions
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Ruby Gem Development Patterns
|
|
7
|
+
|
|
8
|
+
## Purpose
|
|
9
|
+
|
|
10
|
+
Provides consistent patterns for developing the Language Operator Ruby gem, including testing, linting, packaging, and release practices.
|
|
11
|
+
|
|
12
|
+
## When to Use This Skill
|
|
13
|
+
|
|
14
|
+
Automatically activates when:
|
|
15
|
+
- Working with gem specification files (*.gemspec)
|
|
16
|
+
- Creating or modifying RSpec tests
|
|
17
|
+
- Running bundler commands
|
|
18
|
+
- Implementing new library features in `lib/`
|
|
19
|
+
- Working with Rakefile tasks
|
|
20
|
+
- Preparing releases or version bumps
|
|
21
|
+
|
|
22
|
+
## Quick Start
|
|
23
|
+
|
|
24
|
+
### New Feature Checklist
|
|
25
|
+
|
|
26
|
+
- [ ] Create feature code in `lib/language_operator/`
|
|
27
|
+
- [ ] Add comprehensive RSpec tests in `spec/`
|
|
28
|
+
- [ ] Update CHANGELOG.md with change
|
|
29
|
+
- [ ] Run `make lint` to check code style
|
|
30
|
+
- [ ] Run `make test` to verify functionality
|
|
31
|
+
- [ ] Update documentation if needed
|
|
32
|
+
- [ ] Bump version in `lib/language_operator/version.rb` (if needed)
|
|
33
|
+
|
|
34
|
+
### Testing Checklist
|
|
35
|
+
|
|
36
|
+
- [ ] Unit tests cover all public methods
|
|
37
|
+
- [ ] Integration tests for complex workflows
|
|
38
|
+
- [ ] Mock external dependencies (HTTP, Kubernetes)
|
|
39
|
+
- [ ] Use `let` blocks for test setup
|
|
40
|
+
- [ ] Follow `describe`/`context`/`it` hierarchy
|
|
41
|
+
- [ ] Test both success and failure paths
|
|
42
|
+
|
|
43
|
+
## Core Principles
|
|
44
|
+
|
|
45
|
+
### 1. Layered Architecture
|
|
46
|
+
|
|
47
|
+
```ruby
|
|
48
|
+
# lib/language_operator/
|
|
49
|
+
# ├── cli/ # Command-line interface (Thor)
|
|
50
|
+
# ├── dsl/ # Domain-specific language
|
|
51
|
+
# ├── agent/ # Agent runtime
|
|
52
|
+
# ├── client/ # LLM + MCP client
|
|
53
|
+
# └── kubernetes/ # K8s integration
|
|
54
|
+
|
|
55
|
+
# Each layer has clear responsibilities:
|
|
56
|
+
# CLI → DSL → Agent → Client → External APIs
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### 2. RSpec Testing Patterns
|
|
60
|
+
|
|
61
|
+
```ruby
|
|
62
|
+
# Good: Descriptive hierarchy
|
|
63
|
+
RSpec.describe LanguageOperator::Agent::Base do
|
|
64
|
+
describe '#execute_goal' do
|
|
65
|
+
context 'when goal is valid' do
|
|
66
|
+
it 'executes successfully' do
|
|
67
|
+
# Test implementation
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
context 'when goal is invalid' do
|
|
72
|
+
it 'raises TaskValidationError' do
|
|
73
|
+
expect { agent.execute_goal('') }.to raise_error(
|
|
74
|
+
LanguageOperator::Agent::TaskValidationError
|
|
75
|
+
)
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Use let blocks for setup
|
|
82
|
+
let(:agent) { described_class.new(config) }
|
|
83
|
+
let(:config) { instance_double(LanguageOperator::Client::Config) }
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### 3. Error Handling Standards
|
|
87
|
+
|
|
88
|
+
```ruby
|
|
89
|
+
# Custom error hierarchy
|
|
90
|
+
module LanguageOperator
|
|
91
|
+
class Error < StandardError; end
|
|
92
|
+
class NetworkError < Error; end
|
|
93
|
+
class ValidationError < Error; end
|
|
94
|
+
class SecurityError < Error; end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# Raise with context
|
|
98
|
+
raise LanguageOperator::ValidationError,
|
|
99
|
+
"Invalid schedule format: #{schedule}"
|
|
100
|
+
|
|
101
|
+
# Handle gracefully
|
|
102
|
+
rescue LanguageOperator::NetworkError => e
|
|
103
|
+
Logger.warn("Network issue, retrying: #{e.message}")
|
|
104
|
+
retry_with_backoff
|
|
105
|
+
end
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### 4. Gem Configuration
|
|
109
|
+
|
|
110
|
+
```ruby
|
|
111
|
+
# language-operator.gemspec
|
|
112
|
+
Gem::Specification.new do |spec|
|
|
113
|
+
spec.name = 'language-operator'
|
|
114
|
+
spec.version = LanguageOperator::VERSION
|
|
115
|
+
spec.required_ruby_version = '>= 3.2.0'
|
|
116
|
+
|
|
117
|
+
# Dependencies
|
|
118
|
+
spec.add_dependency 'ruby_llm', '~> 1.8'
|
|
119
|
+
spec.add_dependency 'thor', '~> 1.3'
|
|
120
|
+
|
|
121
|
+
# Development dependencies
|
|
122
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
|
123
|
+
spec.add_development_dependency 'rubocop', '~> 1.60'
|
|
124
|
+
end
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Common Patterns
|
|
128
|
+
|
|
129
|
+
### Pattern 1: CLI Command Structure
|
|
130
|
+
|
|
131
|
+
```ruby
|
|
132
|
+
module LanguageOperator::CLI::Commands
|
|
133
|
+
class Agent < Thor
|
|
134
|
+
desc 'create NAME', 'Create a new agent'
|
|
135
|
+
option :mode, type: :string, default: 'autonomous'
|
|
136
|
+
|
|
137
|
+
def create(name)
|
|
138
|
+
# Validation
|
|
139
|
+
validate_agent_name!(name)
|
|
140
|
+
|
|
141
|
+
# Wizard for interactive setup
|
|
142
|
+
wizard = Wizards::AgentWizard.new
|
|
143
|
+
config = wizard.run(name, options)
|
|
144
|
+
|
|
145
|
+
# Resource creation
|
|
146
|
+
builder = Kubernetes::ResourceBuilder.new
|
|
147
|
+
manifest = builder.build_agent(config)
|
|
148
|
+
|
|
149
|
+
# Apply to cluster
|
|
150
|
+
client = Kubernetes::Client.new
|
|
151
|
+
client.apply_resource(manifest)
|
|
152
|
+
|
|
153
|
+
say "Agent '#{name}' created successfully", :green
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
private
|
|
157
|
+
|
|
158
|
+
def validate_agent_name!(name)
|
|
159
|
+
return if name.match?(/\A[a-z0-9-]+\z/)
|
|
160
|
+
raise ValidationError, "Invalid agent name: #{name}"
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### Pattern 2: DSL Definition Pattern
|
|
167
|
+
|
|
168
|
+
```ruby
|
|
169
|
+
module LanguageOperator::Dsl
|
|
170
|
+
class AgentDefinition
|
|
171
|
+
attr_reader :name, :mode, :schedule, :tools
|
|
172
|
+
|
|
173
|
+
def initialize(name)
|
|
174
|
+
@name = name
|
|
175
|
+
@tools = []
|
|
176
|
+
yield(self) if block_given?
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
def mode(value)
|
|
180
|
+
@mode = validate_mode!(value)
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
def schedule(expression)
|
|
184
|
+
@schedule = validate_cron!(expression)
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
def tool(name, &block)
|
|
188
|
+
@tools << ToolDefinition.new(name, &block)
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
private
|
|
192
|
+
|
|
193
|
+
def validate_mode!(mode)
|
|
194
|
+
valid_modes = %i[autonomous scheduled reactive]
|
|
195
|
+
return mode if valid_modes.include?(mode)
|
|
196
|
+
raise ValidationError, "Invalid mode: #{mode}"
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### Pattern 3: Test Organization
|
|
203
|
+
|
|
204
|
+
```ruby
|
|
205
|
+
# spec/language_operator/agent/base_spec.rb
|
|
206
|
+
RSpec.describe LanguageOperator::Agent::Base do
|
|
207
|
+
subject(:agent) { described_class.new(config) }
|
|
208
|
+
|
|
209
|
+
let(:config) do
|
|
210
|
+
instance_double(
|
|
211
|
+
LanguageOperator::Client::Config,
|
|
212
|
+
agent_name: 'test-agent',
|
|
213
|
+
mode: :autonomous
|
|
214
|
+
)
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
describe '.new' do
|
|
218
|
+
it 'initializes with config' do
|
|
219
|
+
expect(agent.config).to eq(config)
|
|
220
|
+
end
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
describe '#run' do
|
|
224
|
+
context 'in autonomous mode' do
|
|
225
|
+
before { allow(config).to receive(:mode).and_return(:autonomous) }
|
|
226
|
+
|
|
227
|
+
it 'starts executor loop' do
|
|
228
|
+
executor = instance_double(LanguageOperator::Agent::Executor)
|
|
229
|
+
allow(LanguageOperator::Agent::Executor).to receive(:new).and_return(executor)
|
|
230
|
+
expect(executor).to receive(:run_loop)
|
|
231
|
+
|
|
232
|
+
agent.run
|
|
233
|
+
end
|
|
234
|
+
end
|
|
235
|
+
end
|
|
236
|
+
end
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
## Resource Files
|
|
240
|
+
|
|
241
|
+
For detailed information, see:
|
|
242
|
+
- [Testing Patterns](resources/testing-patterns.md) - Comprehensive RSpec guidelines
|
|
243
|
+
- [Release Process](resources/release-process.md) - Version bumps and gem publishing
|
|
244
|
+
- [Code Style](resources/code-style.md) - RuboCop configuration and standards
|
|
245
|
+
|
|
246
|
+
## Anti-Patterns to Avoid
|
|
247
|
+
|
|
248
|
+
❌ **Mixing layers** - Don't put business logic in CLI classes
|
|
249
|
+
❌ **Missing tests** - No production code without corresponding specs
|
|
250
|
+
❌ **Hardcoded values** - Use configuration and environment variables
|
|
251
|
+
❌ **Silent failures** - Always log and raise meaningful errors
|
|
252
|
+
❌ **Coupling to external services** - Use dependency injection and mocking
|
|
253
|
+
❌ **Inconsistent naming** - Follow Ruby conventions (snake_case, descriptive names)
|
|
254
|
+
|
|
255
|
+
## Quick Reference
|
|
256
|
+
|
|
257
|
+
| Need to... | Use this |
|
|
258
|
+
|-----------|----------|
|
|
259
|
+
| Run all tests | `make test` |
|
|
260
|
+
| Run integration tests | `make test-integration` |
|
|
261
|
+
| Check code style | `make lint` |
|
|
262
|
+
| Auto-fix style issues | `make lint-fix` |
|
|
263
|
+
| Build gem | `make build` |
|
|
264
|
+
| Install locally | `make install` |
|
|
265
|
+
| Generate docs | `make yard-docs` |
|
|
266
|
+
| Open console | `make console` |
|
|
267
|
+
|
|
268
|
+
## Version Management
|
|
269
|
+
|
|
270
|
+
```ruby
|
|
271
|
+
# lib/language_operator/version.rb
|
|
272
|
+
module LanguageOperator
|
|
273
|
+
VERSION = '0.1.81'
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
# Follow semantic versioning:
|
|
277
|
+
# MAJOR.MINOR.PATCH
|
|
278
|
+
# - MAJOR: Breaking changes
|
|
279
|
+
# - MINOR: New features, backward compatible
|
|
280
|
+
# - PATCH: Bug fixes, backward compatible
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
## Release Checklist
|
|
284
|
+
|
|
285
|
+
- [ ] Update `VERSION` in `lib/language_operator/version.rb`
|
|
286
|
+
- [ ] Update `CHANGELOG.md` with changes
|
|
287
|
+
- [ ] Run full test suite: `make test-all`
|
|
288
|
+
- [ ] Check code style: `make lint`
|
|
289
|
+
- [ ] Build gem: `make build`
|
|
290
|
+
- [ ] Test installation: `make install`
|
|
291
|
+
- [ ] Commit and tag: `git tag v0.1.X`
|
|
292
|
+
- [ ] Push with tags: `git push --tags`
|
|
293
|
+
- [ ] Publish to RubyGems: `gem push language-operator-X.gem`
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "1.0",
|
|
3
|
+
"description": "Skill activation triggers for Language Operator Ruby gem development",
|
|
4
|
+
"skills": {
|
|
5
|
+
"ruby-gem-development": {
|
|
6
|
+
"type": "domain",
|
|
7
|
+
"enforcement": "suggest",
|
|
8
|
+
"priority": "high",
|
|
9
|
+
"description": "Ruby gem development patterns with bundler, RSpec, and RuboCop",
|
|
10
|
+
"promptTriggers": {
|
|
11
|
+
"keywords": [
|
|
12
|
+
"gem", "gemspec", "bundler", "bundle",
|
|
13
|
+
"RSpec", "rspec", "test", "spec",
|
|
14
|
+
"RuboCop", "rubocop", "lint",
|
|
15
|
+
"Rakefile", "rake task",
|
|
16
|
+
"version", "release", "publish"
|
|
17
|
+
],
|
|
18
|
+
"intentPatterns": [
|
|
19
|
+
"(create|add|implement|build).*?(gem|library)",
|
|
20
|
+
"(test|spec).*?(pattern|structure)",
|
|
21
|
+
"(fix|improve).*?(test|spec)",
|
|
22
|
+
"(lint|format).*?(code|ruby)",
|
|
23
|
+
"(build|release|publish).*?(gem)",
|
|
24
|
+
"(add|create).*?(rake task)"
|
|
25
|
+
]
|
|
26
|
+
},
|
|
27
|
+
"fileTriggers": {
|
|
28
|
+
"pathPatterns": [
|
|
29
|
+
"*.gemspec",
|
|
30
|
+
"Gemfile",
|
|
31
|
+
"Gemfile.lock",
|
|
32
|
+
"Rakefile",
|
|
33
|
+
"lib/**/*.rb",
|
|
34
|
+
"spec/**/*_spec.rb"
|
|
35
|
+
],
|
|
36
|
+
"pathExclusions": [
|
|
37
|
+
"vendor/**",
|
|
38
|
+
".bundle/**"
|
|
39
|
+
],
|
|
40
|
+
"contentPatterns": [
|
|
41
|
+
"require.*language_operator",
|
|
42
|
+
"describe.*do",
|
|
43
|
+
"it.*do",
|
|
44
|
+
"RSpec\\.describe",
|
|
45
|
+
"Gem::Specification",
|
|
46
|
+
"spec\\.add_"
|
|
47
|
+
]
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
"thor-cli-development": {
|
|
51
|
+
"type": "domain",
|
|
52
|
+
"enforcement": "suggest",
|
|
53
|
+
"priority": "high",
|
|
54
|
+
"description": "Thor-based CLI development patterns for aictl",
|
|
55
|
+
"promptTriggers": {
|
|
56
|
+
"keywords": [
|
|
57
|
+
"CLI", "command", "Thor", "aictl",
|
|
58
|
+
"subcommand", "argument", "option",
|
|
59
|
+
"wizard", "interactive"
|
|
60
|
+
],
|
|
61
|
+
"intentPatterns": [
|
|
62
|
+
"(create|add|implement).*?(command|CLI)",
|
|
63
|
+
"(add|create).*?(subcommand|option)",
|
|
64
|
+
"(implement|build).*?(wizard|interactive)",
|
|
65
|
+
"(format|display).*?(output|table)"
|
|
66
|
+
]
|
|
67
|
+
},
|
|
68
|
+
"fileTriggers": {
|
|
69
|
+
"pathPatterns": [
|
|
70
|
+
"lib/language_operator/cli/**/*.rb",
|
|
71
|
+
"bin/aictl"
|
|
72
|
+
],
|
|
73
|
+
"contentPatterns": [
|
|
74
|
+
"class.*< Thor",
|
|
75
|
+
"desc.*,",
|
|
76
|
+
"option.*:",
|
|
77
|
+
"Commands::",
|
|
78
|
+
"Wizards::"
|
|
79
|
+
]
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
"language-operator-dsl": {
|
|
83
|
+
"type": "domain",
|
|
84
|
+
"enforcement": "suggest",
|
|
85
|
+
"priority": "high",
|
|
86
|
+
"description": "Language Operator DSL patterns for agents, tools, and workflows",
|
|
87
|
+
"promptTriggers": {
|
|
88
|
+
"keywords": [
|
|
89
|
+
"DSL", "agent", "tool", "workflow",
|
|
90
|
+
"MCP", "server", "schema",
|
|
91
|
+
"execution", "kubernetes", "deployment"
|
|
92
|
+
],
|
|
93
|
+
"intentPatterns": [
|
|
94
|
+
"(create|define|implement).*?(agent|tool|workflow)",
|
|
95
|
+
"(add|modify).*?(DSL|schema)",
|
|
96
|
+
"(deploy|run).*?(agent|kubernetes)",
|
|
97
|
+
"(test|validate).*?(DSL|schema)"
|
|
98
|
+
]
|
|
99
|
+
},
|
|
100
|
+
"fileTriggers": {
|
|
101
|
+
"pathPatterns": [
|
|
102
|
+
"lib/language_operator/dsl/**/*.rb",
|
|
103
|
+
"lib/language_operator/agent/**/*.rb",
|
|
104
|
+
"lib/language_operator/kubernetes/**/*.rb"
|
|
105
|
+
],
|
|
106
|
+
"contentPatterns": [
|
|
107
|
+
"LanguageOperator::Dsl",
|
|
108
|
+
"agent.*do",
|
|
109
|
+
"tool.*do",
|
|
110
|
+
"workflow.*do",
|
|
111
|
+
"execute.*do",
|
|
112
|
+
"kubernetes.*apply"
|
|
113
|
+
]
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|