@enzovezzaro/formo-i18n 0.0.0-stage → 0.1.0

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.
@@ -0,0 +1 @@
1
+ {"fileNames":["../../../node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/typescript/lib/lib.es2021.d.ts","../../../node_modules/typescript/lib/lib.es2022.d.ts","../../../node_modules/typescript/lib/lib.es2023.d.ts","../../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../../node_modules/typescript/lib/lib.es2023.array.d.ts","../../../node_modules/typescript/lib/lib.es2023.collection.d.ts","../../../node_modules/typescript/lib/lib.es2023.intl.d.ts","../../../node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../src/index.ts","../../../node_modules/@types/node/compatibility/disposable.d.ts","../../../node_modules/@types/node/compatibility/indexable.d.ts","../../../node_modules/@types/node/compatibility/iterators.d.ts","../../../node_modules/@types/node/compatibility/index.d.ts","../../../node_modules/@types/node/globals.typedarray.d.ts","../../../node_modules/@types/node/buffer.buffer.d.ts","../../../node_modules/@types/node/globals.d.ts","../../../node_modules/@types/node/web-globals/abortcontroller.d.ts","../../../node_modules/@types/node/web-globals/domexception.d.ts","../../../node_modules/@types/node/web-globals/events.d.ts","../../../node_modules/undici-types/header.d.ts","../../../node_modules/undici-types/readable.d.ts","../../../node_modules/undici-types/file.d.ts","../../../node_modules/undici-types/fetch.d.ts","../../../node_modules/undici-types/formdata.d.ts","../../../node_modules/undici-types/connector.d.ts","../../../node_modules/undici-types/client.d.ts","../../../node_modules/undici-types/errors.d.ts","../../../node_modules/undici-types/dispatcher.d.ts","../../../node_modules/undici-types/global-dispatcher.d.ts","../../../node_modules/undici-types/global-origin.d.ts","../../../node_modules/undici-types/pool-stats.d.ts","../../../node_modules/undici-types/pool.d.ts","../../../node_modules/undici-types/handlers.d.ts","../../../node_modules/undici-types/balanced-pool.d.ts","../../../node_modules/undici-types/agent.d.ts","../../../node_modules/undici-types/mock-interceptor.d.ts","../../../node_modules/undici-types/mock-agent.d.ts","../../../node_modules/undici-types/mock-client.d.ts","../../../node_modules/undici-types/mock-pool.d.ts","../../../node_modules/undici-types/mock-errors.d.ts","../../../node_modules/undici-types/proxy-agent.d.ts","../../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../../node_modules/undici-types/retry-handler.d.ts","../../../node_modules/undici-types/retry-agent.d.ts","../../../node_modules/undici-types/api.d.ts","../../../node_modules/undici-types/interceptors.d.ts","../../../node_modules/undici-types/util.d.ts","../../../node_modules/undici-types/cookies.d.ts","../../../node_modules/undici-types/patch.d.ts","../../../node_modules/undici-types/websocket.d.ts","../../../node_modules/undici-types/eventsource.d.ts","../../../node_modules/undici-types/filereader.d.ts","../../../node_modules/undici-types/diagnostics-channel.d.ts","../../../node_modules/undici-types/content-type.d.ts","../../../node_modules/undici-types/cache.d.ts","../../../node_modules/undici-types/index.d.ts","../../../node_modules/@types/node/web-globals/fetch.d.ts","../../../node_modules/@types/node/web-globals/navigator.d.ts","../../../node_modules/@types/node/web-globals/storage.d.ts","../../../node_modules/@types/node/web-globals/streams.d.ts","../../../node_modules/@types/node/assert.d.ts","../../../node_modules/@types/node/assert/strict.d.ts","../../../node_modules/@types/node/async_hooks.d.ts","../../../node_modules/@types/node/buffer.d.ts","../../../node_modules/@types/node/child_process.d.ts","../../../node_modules/@types/node/cluster.d.ts","../../../node_modules/@types/node/console.d.ts","../../../node_modules/@types/node/constants.d.ts","../../../node_modules/@types/node/crypto.d.ts","../../../node_modules/@types/node/dgram.d.ts","../../../node_modules/@types/node/diagnostics_channel.d.ts","../../../node_modules/@types/node/dns.d.ts","../../../node_modules/@types/node/dns/promises.d.ts","../../../node_modules/@types/node/domain.d.ts","../../../node_modules/@types/node/events.d.ts","../../../node_modules/@types/node/fs.d.ts","../../../node_modules/@types/node/fs/promises.d.ts","../../../node_modules/@types/node/http.d.ts","../../../node_modules/@types/node/http2.d.ts","../../../node_modules/@types/node/https.d.ts","../../../node_modules/@types/node/inspector.d.ts","../../../node_modules/@types/node/inspector.generated.d.ts","../../../node_modules/@types/node/module.d.ts","../../../node_modules/@types/node/net.d.ts","../../../node_modules/@types/node/os.d.ts","../../../node_modules/@types/node/path.d.ts","../../../node_modules/@types/node/perf_hooks.d.ts","../../../node_modules/@types/node/process.d.ts","../../../node_modules/@types/node/punycode.d.ts","../../../node_modules/@types/node/querystring.d.ts","../../../node_modules/@types/node/readline.d.ts","../../../node_modules/@types/node/readline/promises.d.ts","../../../node_modules/@types/node/repl.d.ts","../../../node_modules/@types/node/sea.d.ts","../../../node_modules/@types/node/sqlite.d.ts","../../../node_modules/@types/node/stream.d.ts","../../../node_modules/@types/node/stream/promises.d.ts","../../../node_modules/@types/node/stream/consumers.d.ts","../../../node_modules/@types/node/stream/web.d.ts","../../../node_modules/@types/node/string_decoder.d.ts","../../../node_modules/@types/node/test.d.ts","../../../node_modules/@types/node/timers.d.ts","../../../node_modules/@types/node/timers/promises.d.ts","../../../node_modules/@types/node/tls.d.ts","../../../node_modules/@types/node/trace_events.d.ts","../../../node_modules/@types/node/tty.d.ts","../../../node_modules/@types/node/url.d.ts","../../../node_modules/@types/node/util.d.ts","../../../node_modules/@types/node/v8.d.ts","../../../node_modules/@types/node/vm.d.ts","../../../node_modules/@types/node/wasi.d.ts","../../../node_modules/@types/node/worker_threads.d.ts","../../../node_modules/@types/node/zlib.d.ts","../../../node_modules/@types/node/index.d.ts"],"fileIdsList":[[68,114,115,117,134,135],[68,116,117,134,135],[117,134,135],[68,117,122,134,135,152],[68,117,118,123,128,134,135,137,149,160],[68,117,118,119,128,134,135,137],[68,117,134,135],[63,64,65,68,117,134,135],[68,117,120,134,135,161],[68,117,121,122,129,134,135,138],[68,117,122,134,135,149,157],[68,117,123,125,128,134,135,137],[68,116,117,124,134,135],[68,117,125,126,134,135],[68,117,127,128,134,135],[68,116,117,128,134,135],[68,117,128,129,130,134,135,149,160],[68,117,128,129,130,134,135,144,149,152],[68,109,117,125,128,131,134,135,137,149,160],[68,117,128,129,131,132,134,135,137,149,157,160],[68,117,131,133,134,135,149,157,160],[66,67,68,69,70,71,72,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166],[68,117,128,134,135],[68,117,134,135,136,160],[68,117,125,128,134,135,137,149],[68,117,134,135,138],[68,117,134,135,139],[68,116,117,134,135,140],[68,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166],[68,117,134,135,142],[68,117,134,135,143],[68,117,128,134,135,144,145],[68,117,134,135,144,146,161,163],[68,117,129,134,135],[68,117,128,134,135,149,150,152],[68,117,134,135,151,152],[68,117,134,135,149,150],[68,117,134,135,152],[68,117,134,135,153],[68,114,117,134,135,149,154,160],[68,117,128,134,135,155,156],[68,117,134,135,155,156],[68,117,122,134,135,137,149,157],[68,117,134,135,158],[68,117,134,135,137,159],[68,117,131,134,135,143,160],[68,117,122,134,135,161],[68,117,134,135,149,162],[68,117,134,135,136,163],[68,117,134,135,164],[68,109,117,134,135],[68,109,117,128,130,134,135,140,149,152,160,162,163,165],[68,117,134,135,149,166],[68,81,85,117,134,135,160],[68,81,117,134,135,149,160],[68,76,117,134,135],[68,78,81,117,134,135,157,160],[68,117,134,135,137,157],[68,117,134,135,167],[68,76,117,134,135,167],[68,78,81,117,134,135,137,160],[68,73,74,77,80,117,128,134,135,149,160],[68,81,88,117,134,135],[68,73,79,117,134,135],[68,81,102,103,117,134,135],[68,77,81,117,134,135,152,160,167],[68,102,117,134,135,167],[68,75,76,117,134,135,167],[68,81,117,134,135],[68,75,76,77,78,79,80,81,82,83,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,103,104,105,106,107,108,117,134,135],[68,81,96,117,134,135],[68,81,88,89,117,134,135],[68,79,81,89,90,117,134,135],[68,80,117,134,135],[68,73,76,81,117,134,135],[68,81,85,89,90,117,134,135],[68,85,117,134,135],[68,79,81,84,117,134,135,160],[68,73,78,81,88,117,134,135],[68,117,134,135,149],[68,76,81,102,117,134,135,165,167],[68,117,129,134,135,160]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"7383b4c983ae59112501916b0c09eb098b8805899c7b48b31330382b2ec98155","signature":"2a1b02223b0712e81a52237acf80bc5848fca378afc52ec77671232513b942c1","impliedFormat":99},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d97fb21da858fb18b8ae72c314e9743fd52f73ebe2764e12af1db32fc03f853f","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"913be43dad2a40e500104700aa26cfb5c51a976114bedf19624de43fdae7474f","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"78dbea00e90d2df8ea3dbef0cc379d95b8be9b71cd6bde4c28728f306811803b","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e1e46d0a9837ee058c100501080c920fa98081ea3956af0374308ba6f22a33e","impliedFormat":1},{"version":"272ca407e0c9068bdc5152552d876e68037ceae3de62e529306403e973dec8e1","impliedFormat":1},{"version":"fa7834c715d5357e4540cee40ce96c3250ddb67a7b879a6b7fa0e86d6696f121","impliedFormat":1},{"version":"22dfb07a7ab15b66ac043829056fe70124844636ae719551812ac631ba04985b","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"a6f137d651076822d4fe884287e68fd61785a0d3d1fdb250a5059b691fa897db","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"bceb58df66ab8fb00170df20cd813978c5ab84be1d285710c4eb005d8e9d8efb","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"0cb167c371eaa8c869f8a7656a7296f2e4fae43b4d8b803a680236b24794e5f9","impliedFormat":1},{"version":"0a839dba0287cc0481ad4beedd48a1c64acf1e212ae865d1315f7007ca215161","impliedFormat":1},{"version":"38dc4655376cd1a4bd6bb3763d92949233e33d38d3dd3cbea7bbf218175a38ef","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"208a6a0bfb227bdf8fb964799d0a206c75cf03ccd72e63bf5495c9331354c6d6","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"48a679952eefe4cb776d5a0e1ccba2d3eb53b57448bbb7abc1fcebcbd5440188","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"2d14da6ecb49bf828d83948765ec2d3a579d476bbb9645e749610baa6ec880ca","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"0aef708fb4c7a6b915e8305cbfac40cd207b032dbaabe9a01889a5fff3254681","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"ad9bdafb4e7abf14cc53ce7970486a84c87831e62891e5dfe798ddcd55e84701","affectsGlobalScope":true,"impliedFormat":1},{"version":"45479f65af737a3e5c26d8772bd8ab1aa8bebbd09c1a808c2b3faddb9b84afbb","impliedFormat":1},{"version":"71d3ae6a5e73ca4130762560425e00984ebaff64d5353a3333d1bb7eb86ef336","impliedFormat":1}],"root":[62],"options":{"composite":true,"declaration":true,"declarationMap":true,"esModuleInterop":true,"exactOptionalPropertyTypes":true,"module":199,"noFallthroughCasesInSwitch":true,"noImplicitOverride":true,"noUncheckedIndexedAccess":true,"outDir":"./","rootDir":"../src","skipLibCheck":true,"sourceMap":true,"strict":true,"target":10,"tsBuildInfoFile":"./.tsbuildinfo","verbatimModuleSyntax":true},"referencedMap":[[114,1],[115,1],[116,2],[68,3],[117,4],[118,5],[119,6],[63,7],[66,8],[64,7],[65,7],[120,9],[121,10],[122,11],[123,12],[124,13],[125,14],[126,14],[127,15],[128,16],[129,17],[130,18],[69,7],[67,7],[131,19],[132,20],[133,21],[167,22],[134,23],[135,7],[136,24],[137,25],[138,26],[139,27],[140,28],[141,29],[142,30],[143,31],[144,32],[145,32],[146,33],[147,7],[148,34],[149,35],[151,36],[150,37],[152,38],[153,39],[154,40],[155,41],[156,42],[157,43],[158,44],[159,45],[160,46],[161,47],[162,48],[163,49],[164,50],[70,7],[71,7],[72,7],[110,51],[111,7],[112,7],[113,38],[165,52],[166,53],[60,7],[61,7],[12,7],[11,7],[2,7],[13,7],[14,7],[15,7],[16,7],[17,7],[18,7],[19,7],[20,7],[3,7],[21,7],[22,7],[4,7],[23,7],[27,7],[24,7],[25,7],[26,7],[28,7],[29,7],[30,7],[5,7],[31,7],[32,7],[33,7],[34,7],[6,7],[38,7],[35,7],[36,7],[37,7],[39,7],[7,7],[40,7],[45,7],[46,7],[41,7],[42,7],[43,7],[44,7],[8,7],[50,7],[47,7],[48,7],[49,7],[51,7],[9,7],[52,7],[53,7],[54,7],[56,7],[55,7],[57,7],[58,7],[10,7],[59,7],[1,7],[88,54],[98,55],[87,54],[108,56],[79,57],[78,58],[107,59],[101,60],[106,61],[81,62],[95,63],[80,64],[104,65],[76,66],[75,59],[105,67],[77,68],[82,69],[83,7],[86,69],[73,7],[109,70],[99,71],[90,72],[91,73],[93,74],[89,75],[92,76],[102,59],[84,77],[85,78],[94,79],[74,80],[97,71],[96,69],[100,7],[103,81],[62,82]],"latestChangedDtsFile":"./index.d.ts","version":"5.9.3"}
@@ -0,0 +1,19 @@
1
+ export type Locale = "en" | "es";
2
+ export declare const LOCALES: readonly Locale[];
3
+ export type TranslationValue = string | string[] | {
4
+ [key: string]: TranslationValue;
5
+ };
6
+ export type TranslationCatalog = {
7
+ [key: string]: TranslationValue;
8
+ };
9
+ export type TranslationParams = Record<string, string | number>;
10
+ export declare function isLocale(value: string | undefined): value is Locale;
11
+ export declare function normalizeLocale(value: string | undefined, fallback?: Locale): Locale;
12
+ export declare function translate(locale: Locale, key: string, params?: TranslationParams): string;
13
+ export declare function translateList(locale: Locale, key: string): string[];
14
+ export declare function hasTranslation(locale: Locale, key: string): boolean;
15
+ export declare function flattenKeys(value: TranslationValue, prefix?: string): string[];
16
+ export declare function catalogKeys(locale: Locale): string[];
17
+ export declare function missingKeys(source: Locale, target: Locale): string[];
18
+ export declare function localeName(locale: Locale): string;
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;AAEjC,eAAO,MAAM,OAAO,EAAE,SAAS,MAAM,EAA0B,CAAC;AAEhE,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAAA;CAAE,CAAC;AACvF,MAAM,MAAM,kBAAkB,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAAA;CAAE,CAAC;AACrE,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;AAahE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,IAAI,MAAM,CAEnE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,GAAE,MAAa,GAAG,MAAM,CAK1F;AAkBD,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,iBAAsB,GAAG,MAAM,CAQ7F;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAYnE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAEnE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAK,GAAG,MAAM,EAAE,CAS1E;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAEpD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAGpE;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEjD"}
package/dist/index.js ADDED
@@ -0,0 +1,90 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { fileURLToPath } from "node:url";
3
+ export const LOCALES = ["en", "es"];
4
+ const cache = new Map();
5
+ function load(locale) {
6
+ const cached = cache.get(locale);
7
+ if (cached)
8
+ return cached;
9
+ const path = fileURLToPath(new URL(`../locales/${locale}.json`, import.meta.url));
10
+ const parsed = JSON.parse(readFileSync(path, "utf8"));
11
+ cache.set(locale, parsed);
12
+ return parsed;
13
+ }
14
+ export function isLocale(value) {
15
+ return value === "en" || value === "es";
16
+ }
17
+ export function normalizeLocale(value, fallback = "en") {
18
+ if (isLocale(value))
19
+ return value;
20
+ if (value?.toLowerCase().startsWith("es"))
21
+ return "es";
22
+ if (value?.toLowerCase().startsWith("en"))
23
+ return "en";
24
+ return fallback;
25
+ }
26
+ function lookup(catalog, key) {
27
+ let current = catalog;
28
+ for (const part of key.split(".")) {
29
+ if (typeof current !== "object" || Array.isArray(current))
30
+ return undefined;
31
+ current = current[part];
32
+ }
33
+ return current;
34
+ }
35
+ function interpolate(value, params) {
36
+ return value.replace(/\{\{(\w+)\}\}/g, (match, name) => {
37
+ const replacement = params[name];
38
+ return replacement === undefined ? match : String(replacement);
39
+ });
40
+ }
41
+ export function translate(locale, key, params = {}) {
42
+ const found = lookup(load(locale), key);
43
+ if (typeof found === "string")
44
+ return interpolate(found, params);
45
+ if (locale !== "en") {
46
+ const fallback = lookup(load("en"), key);
47
+ if (typeof fallback === "string")
48
+ return interpolate(fallback, params);
49
+ }
50
+ return key;
51
+ }
52
+ export function translateList(locale, key) {
53
+ const found = lookup(load(locale), key);
54
+ if (Array.isArray(found) && found.every((item) => typeof item === "string")) {
55
+ return found;
56
+ }
57
+ if (locale !== "en") {
58
+ const fallback = lookup(load("en"), key);
59
+ if (Array.isArray(fallback) && fallback.every((item) => typeof item === "string")) {
60
+ return fallback;
61
+ }
62
+ }
63
+ return [];
64
+ }
65
+ export function hasTranslation(locale, key) {
66
+ return lookup(load(locale), key) !== undefined;
67
+ }
68
+ export function flattenKeys(value, prefix = "") {
69
+ if (typeof value === "string")
70
+ return prefix ? [prefix] : [];
71
+ if (Array.isArray(value))
72
+ return prefix ? [prefix] : [];
73
+ const keys = [];
74
+ for (const [childKey, child] of Object.entries(value)) {
75
+ const next = prefix ? `${prefix}.${childKey}` : childKey;
76
+ keys.push(...flattenKeys(child, next));
77
+ }
78
+ return keys;
79
+ }
80
+ export function catalogKeys(locale) {
81
+ return flattenKeys(load(locale)).sort();
82
+ }
83
+ export function missingKeys(source, target) {
84
+ const sourceKeys = new Set(catalogKeys(source));
85
+ return catalogKeys(target).filter((key) => !sourceKeys.has(key));
86
+ }
87
+ export function localeName(locale) {
88
+ return locale === "es" ? "Español" : "English";
89
+ }
90
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAIzC,MAAM,CAAC,MAAM,OAAO,GAAsB,CAAC,IAAI,EAAE,IAAI,CAAU,CAAC;AAMhE,MAAM,KAAK,GAAG,IAAI,GAAG,EAA8B,CAAC;AAEpD,SAAS,IAAI,CAAC,MAAc;IAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,cAAc,MAAM,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAClF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAuB,CAAC;IAC5E,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAyB;IAChD,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAyB,EAAE,WAAmB,IAAI;IAChF,IAAI,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAClC,IAAI,KAAK,EAAE,WAAW,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACvD,IAAI,KAAK,EAAE,WAAW,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACvD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,MAAM,CAAC,OAA2B,EAAE,GAAW;IACtD,IAAI,OAAO,GAAiC,OAAO,CAAC;IACpD,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YAAE,OAAO,SAAS,CAAC;QAC5E,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,WAAW,CAAC,KAAa,EAAE,MAAyB;IAC3D,OAAO,KAAK,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;QAC7D,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QACjC,OAAO,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,MAAc,EAAE,GAAW,EAAE,SAA4B,EAAE;IACnF,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;IACxC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACjE,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QACzC,IAAI,OAAO,QAAQ,KAAK,QAAQ;YAAE,OAAO,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,GAAW;IACvD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;IACxC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;QAC5E,OAAO,KAAiB,CAAC;IAC3B,CAAC;IACD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QACzC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;YAClF,OAAO,QAAoB,CAAC;QAC9B,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,GAAW;IACxD,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,KAAK,SAAS,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAuB,EAAE,MAAM,GAAG,EAAE;IAC9D,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7D,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACxD,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;QACzD,IAAI,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,OAAO,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,MAAc;IACxD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;IAChD,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,OAAO,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AACjD,CAAC"}
@@ -0,0 +1,377 @@
1
+ {
2
+ "locale": {
3
+ "name": "English",
4
+ "code": "en"
5
+ },
6
+ "status": {
7
+ "success": "success",
8
+ "failed": "failed",
9
+ "validation_failed": "validation failed",
10
+ "not_configured": "not configured",
11
+ "unsupported": "unsupported",
12
+ "needs_human_review": "needs human review",
13
+ "unauthorized": "authorization required",
14
+ "dry_run": "dry run",
15
+ "ready": "ready",
16
+ "skipped": "skipped",
17
+ "draft": "draft",
18
+ "schema_valid": "schema valid",
19
+ "electrically_reviewed": "electrically reviewed from public documentation",
20
+ "compiled": "compiled",
21
+ "simulated": "simulated",
22
+ "physical_tested": "physically tested"
23
+ },
24
+ "severity": {
25
+ "error": "error",
26
+ "warning": "warning",
27
+ "info": "info"
28
+ },
29
+ "common": {
30
+ "project": "Project",
31
+ "template": "Template",
32
+ "board": "Board",
33
+ "status": "Status",
34
+ "warnings": "Warnings",
35
+ "errors": "Errors",
36
+ "artifacts": "Artifacts",
37
+ "next": "Next step",
38
+ "language": "Language",
39
+ "version": "Version",
40
+ "notAvailable": "not available",
41
+ "yes": "yes",
42
+ "no": "no",
43
+ "none": "none",
44
+ "purchaseNotReady": "Not purchase-ready: prices are snapshots, inventory is not live, and the shipping/tax estimate is absent.",
45
+ "notPhysicallyTested": "This project has not been physically tested by FORMO. It is not a guarantee of safety, fit, or function."
46
+ },
47
+ "cli": {
48
+ "usage": "Usage: formo <command> [options]",
49
+ "unknownCommand": "Unknown command: {{command}}",
50
+ "missingValue": "Option {{option}} requires a value.",
51
+ "unknownOption": "Unknown option: {{option}}",
52
+ "unexpectedArgument": "Unexpected argument: {{argument}}",
53
+ "missingTemplateId": "A template id is required. Run `formo templates list`.",
54
+ "projectNotFound": "No FORMO project was found in {{dir}}. Run `formo init smart-environment-node` first.",
55
+ "templateNotFound": "Template not found: {{id}}",
56
+ "projectExists": "Target directory {{dir}} is not empty. Use --force to overwrite FORMO files.",
57
+ "jsonHint": "Use --json for machine-readable output.",
58
+ "doctorTitle": "FORMO environment doctor",
59
+ "templatesTitle": "Available FORMO templates",
60
+ "noTemplates": "No templates found in {{dir}}.",
61
+ "initCreated": "Created project {{id}} in {{dir}}.",
62
+ "initNext": "Try: cd {{dir}} && formo validate --json && formo firmware build --json",
63
+ "inspectTitle": "Project inspection",
64
+ "validateTitle": "Validation result",
65
+ "validateOk": "Validation passed with {{warnings}} warning(s).",
66
+ "validateFailed": "Validation failed with {{errors}} error(s) and {{warnings}} warning(s).",
67
+ "firmwareTitle": "Firmware build",
68
+ "firmwareRunning": "Running PlatformIO…",
69
+ "firmwareSuccess": "Firmware compiled. Log: {{log}}",
70
+ "firmwareFailed": "Firmware build failed. Log: {{log}}",
71
+ "schematicTitle": "Wiring diagram",
72
+ "schematicWritten": "Wrote {{path}} with {{nets}} connection(s). It is not an ERC-checked schematic.",
73
+ "deviceTitle": "Device description (WoT TD 1.1)",
74
+ "aliveCheckTitle": "ALIVE descriptor check",
75
+ "firmwareNotConfigured": "PlatformIO is not available. {{hint}}",
76
+ "simulateTitle": "Simulation",
77
+ "guideTitle": "Assembly guide",
78
+ "guideWritten": "Wrote {{files}}.",
79
+ "guideAnatomy": "Anatomy visual brief: {{status}}. The brief is explanatory metadata only and does not prove correctness.",
80
+ "quoteTitle": "Kit quote (illustrative fixture data)",
81
+ "cartTitle": "Dry-run cart",
82
+ "cartDryRunOnly": "This command never purchases anything. Checkout is not implemented in this milestone.",
83
+ "cartGaps": "Cart gaps: {{count}}",
84
+ "pluginsTitle": "FORMO adapters and plugins",
85
+ "pluginsDoctorTitle": "Adapter diagnostics",
86
+ "mcpServing": "FORMO MCP server is running on stdio. No network listener is opened.",
87
+ "evidenceTitle": "Physical evidence",
88
+ "evidenceRecorded": "Recorded physical_tested evidence from {{count}} file(s) in {{dir}}.",
89
+ "evidenceListTitle": "Evidence records",
90
+ "installTitle": "Harness installation",
91
+ "installPlanned": "Planned writes (dry run)",
92
+ "installDone": "Installed {{count}} skill(s) for {{harness}}.",
93
+ "done": "Done."
94
+ },
95
+ "doctor": {
96
+ "ok": "Environment is usable.",
97
+ "degraded": "Environment is usable with optional gaps.",
98
+ "check": "{{name}}: {{status}}{{detail}}",
99
+ "detail": " ({{detail}})",
100
+ "required": "required",
101
+ "optional": "optional",
102
+ "found": "found",
103
+ "missing": "missing",
104
+ "templatesFound": "{{count}} template(s) in {{dir}}"
105
+ },
106
+ "validation": {
107
+ "schemaValid": "Manifest, BOM, wiring and documentation match the FORMO schemas.",
108
+ "reference": "All BOM, wiring and firmware references resolve.",
109
+ "electrical": "Voltage, GPIO and I2C checks completed.",
110
+ "power": "Power budget check completed with documented inputs.",
111
+ "supplier": "Supplier records checked for provenance and freshness.",
112
+ "evidence": "Verification statuses are backed by fresh evidence.",
113
+ "summary": "{{checks}} checks, {{warnings}} warning(s), {{errors}} error(s).",
114
+ "notSalesReady": "Not sales-ready: {{reasons}}",
115
+ "evidenceStale": "Evidence is stale for {{subjects}}; the related status was invalidated.",
116
+ "noEvidence": "No evidence record exists for status {{status}} on {{subject}}."
117
+ },
118
+ "wiring": {
119
+ "connection": "{{fromPart}} {{fromPin}} → {{toPart}} {{toPin}}",
120
+ "bus": "I2C bus {{busId}} uses SDA GPIO{{sda}} and SCL GPIO{{scl}}.",
121
+ "pinsUsed": "Pins used: {{pins}}",
122
+ "header": "Header"
123
+ },
124
+ "guide": {
125
+ "title": "{{name}} — assembly guide",
126
+ "subtitle": "A low-voltage ESP32-C3 environmental sensor node",
127
+ "meta": "Generated by FORMO {{version}} · Language: {{lang}} · Template revision: {{templateVersion}}",
128
+ "notPhysicallyTested": "⚠️ Not physically tested. FORMO validated public documentation and compiled the firmware, but no physical unit was assembled or measured. This guide does not prove electrical safety or that your exact parts match.",
129
+ "statusLine": "Verification: {{statuses}}. Physical testing: no.",
130
+ "partsTitle": "Parts",
131
+ "wiringTitle": "Wiring map",
132
+ "stepsTitle": "Assembly steps",
133
+ "limitationsTitle": "Limitations and safety",
134
+ "provenanceTitle": "Provenance",
135
+ "partColumns": ["Component ID", "Part", "Qty", "Supplier part"],
136
+ "wiringColumns": ["Connection ID", "From", "To", "Signal", "Wire"],
137
+ "step": "Step {{order}}",
138
+ "componentIds": "Component IDs: {{ids}}",
139
+ "pinIds": "Pin IDs: {{ids}}",
140
+ "safetyClass": "Safety class: {{class}}",
141
+ "lowVoltage": "low-voltage USB-powered module",
142
+ "visualOptional": "Optional explanatory visual",
143
+ "anatomyNotConfigured": "Anatomy is not installed, so no explanatory visual was generated. Install it with: npx skills add wheresryan22/anatomy -g -a <harness>. The textual guide remains complete.",
144
+ "anatomyBriefWritten": "An Anatomy brief was written to {{path}}. An agent with the Anatomy skill can turn it into an explanatory figure. A figure is teaching material, not proof of wiring correctness.",
145
+ "labels": {
146
+ "componentId": "Component ID",
147
+ "pinId": "Pin ID",
148
+ "gpio": "GPIO",
149
+ "voltage": "Voltage",
150
+ "quantity": "Quantity",
151
+ "supplierPart": "Supplier part",
152
+ "wire": "Wire",
153
+ "check": "Check",
154
+ "why": "Why"
155
+ },
156
+ "steps": {
157
+ "prepare": {
158
+ "title": "Prepare a safe workspace",
159
+ "body": "Work on a dry, non-conductive surface. Disconnect USB power before changing any wire. This project uses only a 5 V USB supply and 3.3 V logic. Do not connect mains voltage, batteries, or external 5 V/3.3 V supplies to the board headers."
160
+ },
161
+ "inspectParts": {
162
+ "title": "Identify every part",
163
+ "body": "Lay out the parts listed in the BOM. Match each component by its canonical component ID, not only by appearance. If a part differs, stop and run `formo validate --json`; do not guess a substitute."
164
+ },
165
+ "prepareModule": {
166
+ "title": "Prepare {{part}} (if needed)",
167
+ "body": "{{part}} may ship without header pins installed, or with bare component leads. Solder a compatible header, trim a lead only where the part allows it, or use a pre-assembled cable or connector when the module supports one. Disconnect power before soldering and let the board cool."
168
+ },
169
+ "wirePower": {
170
+ "title": "Wire power: {{fromPin}} to {{toPin}}",
171
+ "body": "Connect the board {{fromPin}} pin ({{fromName}}) to {{toPart}} {{toPin}} with one {{wire}}. Confirm that {{toPart}} accepts the supplied voltage before applying power. Do not connect a second power source to the board headers."
172
+ },
173
+ "wireGround": {
174
+ "title": "Wire ground: {{fromPin}} to {{toPin}}",
175
+ "body": "Connect the board {{fromPin}} pin ({{fromName}}) to {{toPart}} {{toPin}}. A shared ground is required for I2C. Use a board ground pin on the same header side where possible."
176
+ },
177
+ "wireSda": {
178
+ "title": "Wire I2C data: GPIO{{gpio}} to {{toPin}}",
179
+ "body": "Connect board GPIO{{gpio}} (header {{fromPin}}) to {{toPart}} {{toPin}}. This is the I2C data line (SDA). The firmware uses GPIO{{gpio}} as SDA."
180
+ },
181
+ "wireScl": {
182
+ "title": "Wire I2C clock: GPIO{{gpio}} to {{toPin}}",
183
+ "body": "Connect board GPIO{{gpio}} (header {{fromPin}}) to {{toPart}} {{toPin}}. This is the I2C clock line (SCL). The firmware uses GPIO{{gpio}} as SCL."
184
+ },
185
+ "wireAddress": {
186
+ "title": "Wire the I2C address pin: {{toPin}}",
187
+ "body": "This build connects {{toPart}} {{toPin}}. Confirm from the module documentation which address this selects before applying power; an address change can silently break the firmware binding."
188
+ },
189
+ "wireChipSelect": {
190
+ "title": "Wire chip select: {{fromPin}} to {{toPin}}",
191
+ "body": "Connect board {{fromPin}} to {{toPart}} {{toPin}} with one {{wire}}. Chip select is not an I2C signal; keep it out of the I2C bus unless the datasheet requires it."
192
+ },
193
+ "wireSwitchTerminal": {
194
+ "title": "Wire the switch terminal: {{fromPin}} to {{toPin}}",
195
+ "body": "Connect board {{fromPin}} ({{fromName}}) to {{toPart}} {{toPin}} with one {{wire}}. One switch terminal carries the signal and the other goes to ground. The firmware configures GPIO{{gpio}} with its internal pull-up, so the input reads HIGH when the button is released and LOW while it is pressed."
196
+ },
197
+ "wireResistorLead": {
198
+ "title": "Wire the series resistor: {{fromPin}} to {{toPin}}",
199
+ "body": "Connect board {{fromPin}} ({{fromName}}) to {{toPart}} {{toPin}} with one {{wire}}. The resistor stays in series with the LED so the GPIO never drives the LED directly. Do not replace it with a plain jumper."
200
+ },
201
+ "wireLedAnode": {
202
+ "title": "Connect the resistor to the LED anode",
203
+ "body": "Connect {{fromName}} ({{fromPin}}) to {{toPart}} {{toPin}}. On a 5 mm through-hole LED the longer leg is the anode. If the LED stays dark later, check this orientation before changing any firmware."
204
+ },
205
+ "wireLedCathode": {
206
+ "title": "Wire the LED cathode to ground: {{fromPin}} to {{toPin}}",
207
+ "body": "Connect board {{fromPin}} ({{fromName}}) to {{toPart}} {{toPin}}. The shorter leg of the LED is the cathode and must reach a board ground pin. Never connect the cathode to a GPIO."
208
+ },
209
+ "verifyWiring": {
210
+ "title": "Verify before applying power",
211
+ "body": "Re-check only these connections: {{connections}}. Confirm that no jumper bridges two board pins, that the board is not resting on metal, and that every wire matches the wiring map. Do not add or move a wire without updating wiring/pins.json and re-running validation."
212
+ },
213
+ "connectUsb": {
214
+ "title": "Connect USB power and data",
215
+ "body": "Connect a micro-USB data cable from the board to your computer. Use a USB 2.0 port. The board's 5 V power LED should light. Do not connect a second power source to the 5V or 3V3 header pins."
216
+ },
217
+ "build": {
218
+ "title": "Build the firmware",
219
+ "body": "From the project directory run `formo firmware build --json`. This invokes PlatformIO and records the real exit code and log. If PlatformIO is missing, the command reports `not_configured` with install instructions; it never reports a fake success."
220
+ },
221
+ "flash": {
222
+ "title": "Flash the board (manual, explicit action)",
223
+ "body": "FORMO never flashes a device automatically. After reviewing the build, run `{{buildCommand}} -t upload` yourself or use your normal upload workflow. Confirm the serial port and board before uploading. This guide does not assert that an upload has happened."
224
+ },
225
+ "monitor": {
226
+ "title": "Read the serial output",
227
+ "body": "Open the serial monitor at {{baud}} baud with `pio device monitor -b {{baud}}` or any serial monitor. The exact expected lines are documented in the project docs. If nothing appears, check the connections above before changing the firmware."
228
+ },
229
+ "troubleshoot": {
230
+ "title": "Troubleshoot without guessing",
231
+ "body": "If the device reports that it cannot find the I2C device: confirm {{connections}}; confirm the I2C address is {{address}}; confirm the module is not receiving a logic level above its documented range. Never move to a different board pin without updating wiring/pins.json and re-running validation."
232
+ },
233
+ "troubleshootDigital": {
234
+ "title": "Troubleshoot without guessing",
235
+ "body": "If the LED stays dark: confirm {{connections}}; confirm the resistor is in series with the LED and that the LED legs match the wiring map. If the button does nothing: confirm the same connections and that the firmware was built from this wiring. Never move to a different board pin without updating wiring/pins.json and re-running validation."
236
+ },
237
+ "physicalTest": {
238
+ "title": "Record physical verification separately",
239
+ "body": "After you assemble and test a real unit, record your own evidence. FORMO does not promote a project to `physical_tested` automatically. Keep the build log, serial output, photos and measurements with your project; they are evidence for your unit, not for every copy."
240
+ },
241
+ "safety": {
242
+ "title": "Safety and scope",
243
+ "body": "This is a low-voltage, USB-powered indoor demonstrator. It is not evaluated for outdoor use, condensation, enclosure ingress, batteries, mains, medical, automotive, or safety-critical use. Do not leave it unattended. Disconnect USB before touching the wiring."
244
+ },
245
+ "next": {
246
+ "title": "Next steps",
247
+ "body": "Run `formo inspect --json` for the machine-readable project, `formo kit quote --json` for illustrative costs, and `formo kit cart --dry-run --json` to see orderable lines and gaps. No purchase is performed."
248
+ }
249
+ }
250
+ },
251
+ "errors": {
252
+ "schemaInvalid": "Schema validation failed for {{artifact}}.",
253
+ "referenceMissing": "{{from}} references missing {{kind}} `{{id}}`.",
254
+ "wiringPinMissing": "Wiring references pin `{{pinId}}` on component `{{componentId}}`, but that pin is not declared.",
255
+ "wiringBoardPinMissing": "Board pin `{{pinId}}` is not declared for board `{{boardId}}`.",
256
+ "wiringUnknownGpio": "GPIO{{gpio}} is not available on the selected board.",
257
+ "wiringDuplicateGpio": "GPIO{{gpio}} is assigned more than once ({{signals}}).",
258
+ "wiringSamePin": "The I2C bus uses the same GPIO for SDA and SCL.",
259
+ "wiringStrapping": "GPIO{{gpio}} is a strapping pin and must not be used for {{signal}} without a documented review.",
260
+ "wiringReserved": "GPIO{{gpio}} is reserved for {{purpose}} and must not be used for {{signal}}.",
261
+ "wiringBusMismatch": "Connection `{{connectionId}}` declares bus `{{connectionBus}}` but the bus is `{{busId}}`.",
262
+ "ledSeriesResistor": "GPIO{{gpio}} drives the LED `{{componentId}}` directly. Add a series resistor; a bare GPIO can exceed the LED current rating.",
263
+ "wiringFirmwareMismatch": "Firmware binding ({{binding}}) does not match wiring ({{wiring}}).",
264
+ "voltageIncompatible": "{{componentId}} accepts {{accepted}}, but the connection supplies {{supplied}}.",
265
+ "voltageUnknown": "Voltage for {{componentId}} is unknown; sales-ready status is blocked.",
266
+ "powerUnknown": "Power budget has unknown inputs: {{inputs}}.",
267
+ "supplierMissing": "BOM item `{{itemId}}` has no supplier part record.",
268
+ "supplierIncomplete": "Supplier part `{{partId}}` is missing {{fields}}.",
269
+ "supplierStale": "Supplier observation for `{{partId}}` is older than {{days}} days.",
270
+ "docsMissing": "Documentation file is missing: {{path}}",
271
+ "localeMissing": "Template does not cover locale {{locale}}.",
272
+ "bomQuantity": "BOM item `{{itemId}}` must have a positive integer quantity.",
273
+ "firmwareMissing": "Firmware entry file is missing: {{path}}",
274
+ "catalogMissing": "Catalog component `{{id}}` is missing.",
275
+ "projectManifestInvalid": "Project manifest is invalid: {{reason}}",
276
+ "notAuthorized": "This action requires explicit authorization. Pass authorized=true only after the user approves it.",
277
+ "unsupported": "Unsupported: {{reason}}",
278
+ "notConfigured": "Not configured: {{reason}}",
279
+ "evidenceFilesRequired": "Provide at least one evidence file, such as a photo, serial log or measurement. Nothing was recorded.",
280
+ "evidenceConfirmRequired": "Recording physical evidence is a human action. Re-run with --confirm after checking the files.",
281
+ "installHarnessRequired": "Choose a harness: codex, claude-code or opencode.",
282
+ "installSkillsMissing": "The FORMO skill folders were not found. Set FORMO_SKILLS_DIR to the skills/ directory.",
283
+ "projectIdInvalid": "Project id `{{id}}` must match [a-z0-9][a-z0-9-]*."
284
+ },
285
+ "evidence": {
286
+ "physicalDisclaimer": "Human-supplied evidence for one unit. FORMO stores the files, does not verify them, and never promotes other copies."
287
+ },
288
+ "warnings": {
289
+ "powerHeadroomUnknown": "The board's 3.3 V regulator headroom and peak current are not documented in the selected sources. The sensor load is small, but this remains a human-review item before any sales-ready designation.",
290
+ "boardEol": "The base ESP32-C3-DevKitM-1 is listed as EOL by Espressif. The N4X ordering variant is referenced, but supplier availability is not verified.",
291
+ "boardAvailabilityUnknown": "Board availability and price are unknown. The cart keeps this as a gap.",
292
+ "priceSnapshot": "Prices are manual snapshots from public product pages, not live quotes. Tax, shipping and quantity discounts are not included.",
293
+ "supplierSnapshot": "Supplier availability was observed once and is not live inventory.",
294
+ "pullUpsAssumed": "I2C pull-ups are provided by the BME280 breakout (10 kΩ, verified in the public Eagle schematic). No external pull-ups are added.",
295
+ "notPhysicallyTested": "No physical assembly, measurement or hardware-in-the-loop test has been recorded.",
296
+ "moduleMayNeedSolder": "{{part}} may require soldering a header or connector. A pre-assembled cable avoids soldering when the module supports one.",
297
+ "pullUpsUnknown": "The selected sources do not state the I2C pull-up resistors on this module. The bus may need verified external pull-ups; this is a human-review item.",
298
+ "usbCableUserSupplied": "A micro-USB data cable is required. It is listed as user-supplied unless a verified supplier part is selected.",
299
+ "simulationUnsupported": "No validated Wokwi simulation definition is shipped. Simulation is reported as unsupported, not successful.",
300
+ "anatomyOptional": "Anatomy is optional and explanatory only. Generated figures are not electrical or mechanical proof.",
301
+ "evidenceStale": "Some evidence is stale because the referenced artifact changed.",
302
+ "salesNotReady": "This kit is a demo fixture and is not sales-ready."
303
+ },
304
+ "quote": {
305
+ "line": "{{name}} × {{qty}}",
306
+ "knownSubtotal": "Known item subtotal",
307
+ "unknownLines": "Unknown-price lines",
308
+ "shipping": "Shipping",
309
+ "tax": "Tax",
310
+ "notEstimated": "not estimated",
311
+ "illustrative": "Illustrative fixture/snapshot only",
312
+ "currency": "Currency",
313
+ "unit": "unit",
314
+ "lineTotal": "line total"
315
+ },
316
+ "cart": {
317
+ "line": "{{name}} × {{qty}} — {{status}}",
318
+ "ready": "orderable by hand (supplier link)",
319
+ "gap": "gap: {{reason}}",
320
+ "purchaseBlocked": "Purchasing is blocked in this milestone.",
321
+ "confirmation": "A future checkout will require explicit user confirmation.",
322
+ "noCheckout": "No checkout, payment, order, or supplier credential is used."
323
+ },
324
+ "mcp": {
325
+ "authorizationRequired": "The user/workspace must authorize this tool call explicitly.",
326
+ "noPurchase": "No purchase tool is exposed in the MVP.",
327
+ "toolResult": "FORMO tool result"
328
+ },
329
+ "schematic": {
330
+ "banner": "Generated from wiring/pins.json — a connection diagram, not an ERC-checked schematic.",
331
+ "source": "Source template: {{template}}. Every line is a declared connection; nothing is inferred.",
332
+ "board": "board",
333
+ "part": "part",
334
+ "wire": "Wire: {{wire}}",
335
+ "limitConnections": "Connections are copied from the wiring artifact. No netlist rule check (ERC) has run.",
336
+ "limitLayout": "The layout is schematic-style, not a physical, breadboard-accurate or CAD drawing.",
337
+ "limitElectrical": "Current, voltage drop and power budget are not modeled by this diagram."
338
+ },
339
+ "device": {
340
+ "description": "FORMO body built from template {{template}} on {{board}}. Describes declared signals only.",
341
+ "inputTitle": "{{macro}} — input on GPIO{{gpio}}",
342
+ "outputTitle": "{{macro}} — output on GPIO{{gpio}}",
343
+ "inputDescription": "Digital input on GPIO{{gpio}}.",
344
+ "inputPullUpDescription": "Digital input on GPIO{{gpio}} using the internal pull-up.",
345
+ "outputDescription": "Digital output on GPIO{{gpio}}.",
346
+ "limitForms": "No WoT forms are declared: FORMO runs no servient and exposes no endpoint.",
347
+ "limitAuthorization": "Device authorization, pairing and OAuth scopes belong to the environment host, not this document.",
348
+ "limitElectrical": "Electrical behavior, timing and sensor accuracy are not described.",
349
+ "aliveContract": "Shape follows ALIVE spec/adapters.md (WoT Thing Description 1.1). FORMO produced this document; ALIVE did not.",
350
+ "aliveNamespace": "The id uses FORMO's own urn:formo:project namespace, not an ALIVE adapter URN."
351
+ },
352
+ "alive": {
353
+ "descriptorValid": "Descriptor matches the ALIVE extension schema shape. No environment was contacted.",
354
+ "descriptorInvalid": "Descriptor does not match the ALIVE extension schema. See the failed checks."
355
+ },
356
+ "plugins": {
357
+ "platformio": "PlatformIO (firmware compilation)",
358
+ "wokwi": "Wokwi CLI (optional simulation)",
359
+ "kicad": "KiCad CLI (optional schematic ERC)",
360
+ "anatomy": "Anatomy Agent Skill (optional explanatory visuals)",
361
+ "rea": "REA (optional authorized evidence-based research)",
362
+ "alive": "ALIVE interoperability profile (optional body description)",
363
+ "catalog": "Catalog fixture",
364
+ "templates": "Template registry"
365
+ },
366
+ "adapters": {
367
+ "platformioMissing": "Install PlatformIO with `python3 -m venv .venv && .venv/bin/pip install platformio`, `brew install platformio`, or set FORMO_PIO to a pio binary.",
368
+ "wokwiMissing": "Wokwi simulation is optional. Install wokwi-cli and set WOKWI_CLI_TOKEN; no simulation is executed by default.",
369
+ "kicadMissing": "KiCad ERC is optional. Install KiCad and kicad-cli; no schematic is shipped in this slice.",
370
+ "anatomyMissing": "Install Anatomy with `npx skills add wheresryan22/anatomy -g -a claude-code` (or codex/opencode) and restart your agent.",
371
+ "reaMissing": "REA is not installed. It is optional and only for authorized, evidence-based research; it is not an electrical engineering engine.",
372
+ "noSimulationDefinition": "No compatible simulation definition is shipped. Add a validated definition before simulating.",
373
+ "noSchematic": "No KiCad schematic is shipped in this milestone. ERC is unsupported.",
374
+ "reaUnauthorized": "REA research requires authorized=true and a user-approved target. FORMO did not run it.",
375
+ "aliveMissing": "ALIVE is not configured. Set ALIVE_ORIGIN, ALIVE_REPO or ALIVE_SCHEMA_PATH to a local ALIVE checkout; FORMO never contacts an environment without one."
376
+ }
377
+ }
@@ -0,0 +1,377 @@
1
+ {
2
+ "locale": {
3
+ "name": "Español",
4
+ "code": "es"
5
+ },
6
+ "status": {
7
+ "success": "correcto",
8
+ "failed": "fallido",
9
+ "validation_failed": "validación fallida",
10
+ "not_configured": "sin configurar",
11
+ "unsupported": "no compatible",
12
+ "needs_human_review": "requiere revisión humana",
13
+ "unauthorized": "se requiere autorización",
14
+ "dry_run": "simulación de compra",
15
+ "ready": "listo",
16
+ "skipped": "omitido",
17
+ "draft": "borrador",
18
+ "schema_valid": "esquema válido",
19
+ "electrically_reviewed": "revisado eléctricamente con documentación pública",
20
+ "compiled": "compilado",
21
+ "simulated": "simulado",
22
+ "physical_tested": "probado físicamente"
23
+ },
24
+ "severity": {
25
+ "error": "error",
26
+ "warning": "advertencia",
27
+ "info": "información"
28
+ },
29
+ "common": {
30
+ "project": "Proyecto",
31
+ "template": "Plantilla",
32
+ "board": "Placa",
33
+ "status": "Estado",
34
+ "warnings": "Advertencias",
35
+ "errors": "Errores",
36
+ "artifacts": "Artefactos",
37
+ "next": "Siguiente paso",
38
+ "language": "Idioma",
39
+ "version": "Versión",
40
+ "notAvailable": "no disponible",
41
+ "yes": "sí",
42
+ "no": "no",
43
+ "none": "ninguno",
44
+ "purchaseNotReady": "No listo para comprar: los precios son capturas, el inventario no es en vivo y falta el cálculo de envío e impuestos.",
45
+ "notPhysicallyTested": "FORMO no ha probado este proyecto físicamente. No es una garantía de seguridad, ajuste ni funcionamiento."
46
+ },
47
+ "cli": {
48
+ "usage": "Uso: formo <comando> [opciones]",
49
+ "unknownCommand": "Comando desconocido: {{command}}",
50
+ "missingValue": "La opción {{option}} requiere un valor.",
51
+ "unknownOption": "Opción desconocida: {{option}}",
52
+ "unexpectedArgument": "Argumento inesperado: {{argument}}",
53
+ "missingTemplateId": "Se requiere un id de plantilla. Ejecuta `formo templates list`.",
54
+ "projectNotFound": "No se encontró un proyecto FORMO en {{dir}}. Ejecuta `formo init smart-environment-node` primero.",
55
+ "templateNotFound": "Plantilla no encontrada: {{id}}",
56
+ "projectExists": "El directorio de destino {{dir}} no está vacío. Usa --force para sobrescribir los archivos de FORMO.",
57
+ "jsonHint": "Usa --json para obtener datos legibles por máquina.",
58
+ "doctorTitle": "Diagnóstico del entorno FORMO",
59
+ "templatesTitle": "Plantillas FORMO disponibles",
60
+ "noTemplates": "No se encontraron plantillas en {{dir}}.",
61
+ "initCreated": "Proyecto {{id}} creado en {{dir}}.",
62
+ "initNext": "Prueba: cd {{dir}} && formo validate --json && formo firmware build --json",
63
+ "inspectTitle": "Inspección del proyecto",
64
+ "validateTitle": "Resultado de la validación",
65
+ "validateOk": "La validación pasó con {{warnings}} advertencia(s).",
66
+ "validateFailed": "La validación falló con {{errors}} error(es) y {{warnings}} advertencia(s).",
67
+ "firmwareTitle": "Compilación del firmware",
68
+ "firmwareRunning": "Ejecutando PlatformIO…",
69
+ "firmwareSuccess": "Firmware compilado. Registro: {{log}}",
70
+ "firmwareFailed": "La compilación falló. Registro: {{log}}",
71
+ "schematicTitle": "Diagrama de cableado",
72
+ "schematicWritten": "Se escribió {{path}} con {{nets}} conexión(es). No es un esquemático verificado por ERC.",
73
+ "deviceTitle": "Descripción del dispositivo (WoT TD 1.1)",
74
+ "aliveCheckTitle": "Comprobación de descriptor ALIVE",
75
+ "firmwareNotConfigured": "PlatformIO no está disponible. {{hint}}",
76
+ "simulateTitle": "Simulación",
77
+ "guideTitle": "Guía de montaje",
78
+ "guideWritten": "Se escribieron {{files}}.",
79
+ "guideAnatomy": "Resumen visual para Anatomy: {{status}}. El resumen es metadato explicativo y no demuestra que el cableado sea correcto.",
80
+ "quoteTitle": "Cotización del kit (datos ilustrativos)",
81
+ "cartTitle": "Carrito de prueba",
82
+ "cartDryRunOnly": "Este comando nunca compra nada. El pago no está implementado en esta etapa.",
83
+ "cartGaps": "Faltantes del carrito: {{count}}",
84
+ "pluginsTitle": "Adaptadores y complementos de FORMO",
85
+ "pluginsDoctorTitle": "Diagnóstico de adaptadores",
86
+ "mcpServing": "El servidor MCP de FORMO está activo por stdio. No abre ningún puerto de red.",
87
+ "evidenceTitle": "Evidencia física",
88
+ "evidenceRecorded": "Se registró evidencia physical_tested de {{count}} archivo(s) en {{dir}}.",
89
+ "evidenceListTitle": "Registros de evidencia",
90
+ "installTitle": "Instalación en el harness",
91
+ "installPlanned": "Escrituras previstas (simulación)",
92
+ "installDone": "Se instalaron {{count}} skill(s) para {{harness}}.",
93
+ "done": "Hecho."
94
+ },
95
+ "doctor": {
96
+ "ok": "El entorno es utilizable.",
97
+ "degraded": "El entorno es utilizable con carencias opcionales.",
98
+ "check": "{{name}}: {{status}}{{detail}}",
99
+ "detail": " ({{detail}})",
100
+ "required": "obligatorio",
101
+ "optional": "opcional",
102
+ "found": "encontrado",
103
+ "missing": "faltante",
104
+ "templatesFound": "{{count}} plantilla(s) en {{dir}}"
105
+ },
106
+ "validation": {
107
+ "schemaValid": "El manifiesto, el BOM, el cableado y la documentación cumplen los esquemas de FORMO.",
108
+ "reference": "Todas las referencias del BOM, el cableado y el firmware resuelven.",
109
+ "electrical": "Se completaron las comprobaciones de voltaje, GPIO e I2C.",
110
+ "power": "Se completó el presupuesto de energía con los datos documentados.",
111
+ "supplier": "Se revisaron los registros de proveedores por procedencia y vigencia.",
112
+ "evidence": "Los estados de verificación tienen evidencia vigente.",
113
+ "summary": "{{checks}} comprobaciones, {{warnings}} advertencia(s), {{errors}} error(es).",
114
+ "notSalesReady": "No listo para venta: {{reasons}}",
115
+ "evidenceStale": "La evidencia de {{subjects}} está obsoleta; se invalidó el estado relacionado.",
116
+ "noEvidence": "No existe evidencia para el estado {{status}} de {{subject}}."
117
+ },
118
+ "wiring": {
119
+ "connection": "{{fromPart}} {{fromPin}} → {{toPart}} {{toPin}}",
120
+ "bus": "El bus I2C {{busId}} usa SDA GPIO{{sda}} y SCL GPIO{{scl}}.",
121
+ "pinsUsed": "Pines usados: {{pins}}",
122
+ "header": "Cabecera"
123
+ },
124
+ "guide": {
125
+ "title": "{{name}} — guía de montaje",
126
+ "subtitle": "Un nodo ambiental ESP32-C3 de bajo voltaje",
127
+ "meta": "Generado por FORMO {{version}} · Idioma: {{lang}} · Revisión de plantilla: {{templateVersion}}",
128
+ "notPhysicallyTested": "⚠️ No probado físicamente. FORMO validó documentación pública y compiló el firmware, pero no se montó ni midió una unidad física. Esta guía no demuestra seguridad eléctrica ni que tus piezas exactas coincidan.",
129
+ "statusLine": "Verificación: {{statuses}}. Prueba física: no.",
130
+ "partsTitle": "Piezas",
131
+ "wiringTitle": "Mapa de cableado",
132
+ "stepsTitle": "Pasos de montaje",
133
+ "limitationsTitle": "Limitaciones y seguridad",
134
+ "provenanceTitle": "Procedencia",
135
+ "partColumns": ["ID de componente", "Pieza", "Cant.", "Pieza del proveedor"],
136
+ "wiringColumns": ["ID de conexión", "Desde", "Hacia", "Señal", "Cable"],
137
+ "step": "Paso {{order}}",
138
+ "componentIds": "IDs de componente: {{ids}}",
139
+ "pinIds": "IDs de pin: {{ids}}",
140
+ "safetyClass": "Clase de seguridad: {{class}}",
141
+ "lowVoltage": "módulo alimentado por USB de bajo voltaje",
142
+ "visualOptional": "Visual explicativo opcional",
143
+ "anatomyNotConfigured": "Anatomy no está instalado, así que no se generó un visual explicativo. Instálalo con: npx skills add wheresryan22/anatomy -g -a <harness>. La guía textual sigue completa.",
144
+ "anatomyBriefWritten": "Se escribió un resumen para Anatomy en {{path}}. Un agente con la skill Anatomy puede convertirlo en una figura explicativa. Una figura es material didáctico, no prueba de que el cableado sea correcto.",
145
+ "labels": {
146
+ "componentId": "ID de componente",
147
+ "pinId": "ID de pin",
148
+ "gpio": "GPIO",
149
+ "voltage": "Voltaje",
150
+ "quantity": "Cantidad",
151
+ "supplierPart": "Pieza del proveedor",
152
+ "wire": "Cable",
153
+ "check": "Comprobación",
154
+ "why": "Por qué"
155
+ },
156
+ "steps": {
157
+ "prepare": {
158
+ "title": "Prepara un espacio de trabajo seguro",
159
+ "body": "Trabaja sobre una superficie seca y no conductora. Desconecta la alimentación USB antes de cambiar cualquier cable. Este proyecto usa solo una alimentación USB de 5 V y lógica de 3,3 V. No conectes tensión de red, baterías ni fuentes externas de 5 V/3,3 V a las cabeceras de la placa."
160
+ },
161
+ "inspectParts": {
162
+ "title": "Identifica cada pieza",
163
+ "body": "Coloca las piezas del BOM. Identifica cada componente por su ID canónico, no solo por su apariencia. Si una pieza es distinta, detente y ejecuta `formo validate --json`; no adivines un sustituto."
164
+ },
165
+ "prepareModule": {
166
+ "title": "Prepara {{part}} (si hace falta)",
167
+ "body": "{{part}} puede venir sin pines de cabecera o con patas de componente sin recortar. Suelda una cabecera compatible, recorta una pata solo cuando la pieza lo permita, o usa un cable o conector premontado cuando el módulo lo admita. Desconecta la alimentación antes de soldar y deja enfriar la placa."
168
+ },
169
+ "wirePower": {
170
+ "title": "Cablea la alimentación: {{fromPin}} a {{toPin}}",
171
+ "body": "Conecta el pin {{fromPin}} de la placa ({{fromName}}) a {{toPart}} {{toPin}} con un {{wire}}. Confirma que {{toPart}} acepta la tensión suministrada antes de aplicar energía. No conectes una segunda fuente a las cabeceras de la placa."
172
+ },
173
+ "wireGround": {
174
+ "title": "Cablea la tierra: {{fromPin}} a {{toPin}}",
175
+ "body": "Conecta el pin {{fromPin}} de la placa ({{fromName}}) a {{toPart}} {{toPin}}. La tierra compartida es obligatoria para I2C. Usa un GND de la placa del mismo lado de la cabecera cuando sea posible."
176
+ },
177
+ "wireSda": {
178
+ "title": "Cablea los datos I2C: GPIO{{gpio}} a {{toPin}}",
179
+ "body": "Conecta GPIO{{gpio}} de la placa (cabecera {{fromPin}}) a {{toPart}} {{toPin}}. Esta es la línea de datos I2C (SDA). El firmware usa GPIO{{gpio}} como SDA."
180
+ },
181
+ "wireScl": {
182
+ "title": "Cablea el reloj I2C: GPIO{{gpio}} a {{toPin}}",
183
+ "body": "Conecta GPIO{{gpio}} de la placa (cabecera {{fromPin}}) a {{toPart}} {{toPin}}. Esta es la línea de reloj I2C (SCL). El firmware usa GPIO{{gpio}} como SCL."
184
+ },
185
+ "wireAddress": {
186
+ "title": "Cablea el pin de dirección I2C: {{toPin}}",
187
+ "body": "Este montaje conecta {{toPart}} {{toPin}}. Confirma en la documentación del módulo qué dirección selecciona antes de aplicar energía; un cambio de dirección puede romper la vinculación del firmware sin avisar."
188
+ },
189
+ "wireChipSelect": {
190
+ "title": "Cablea el chip select: {{fromPin}} a {{toPin}}",
191
+ "body": "Conecta {{fromPin}} de la placa a {{toPart}} {{toPin}} con un {{wire}}. Chip select no es una señal I2C; mantenlo fuera del bus salvo que la hoja de datos lo exija."
192
+ },
193
+ "wireSwitchTerminal": {
194
+ "title": "Cablea el terminal del pulsador: {{fromPin}} a {{toPin}}",
195
+ "body": "Conecta el pin {{fromPin}} de la placa ({{fromName}}) a {{toPart}} {{toPin}} con un {{wire}}. Un terminal del pulsador lleva la señal y el otro va a tierra. El firmware configura GPIO{{gpio}} con su pull-up interno, así que la entrada lee HIGH con el botón suelto y LOW mientras se pulsa."
196
+ },
197
+ "wireResistorLead": {
198
+ "title": "Cablea la resistencia en serie: {{fromPin}} a {{toPin}}",
199
+ "body": "Conecta el pin {{fromPin}} de la placa ({{fromName}}) a {{toPart}} {{toPin}} con un {{wire}}. La resistencia queda en serie con el LED para que el GPIO nunca lo alimente directamente. No la sustituyas por un cable."
200
+ },
201
+ "wireLedAnode": {
202
+ "title": "Conecta la resistencia al ánodo del LED",
203
+ "body": "Conecta {{fromName}} ({{fromPin}}) a {{toPart}} {{toPin}}. En un LED de 5 mm de inserción, la pata larga es el ánodo. Si más adelante el LED no enciende, revisa esta orientación antes de cambiar el firmware."
204
+ },
205
+ "wireLedCathode": {
206
+ "title": "Cablea el cátodo del LED a tierra: {{fromPin}} a {{toPin}}",
207
+ "body": "Conecta el pin {{fromPin}} de la placa ({{fromName}}) a {{toPart}} {{toPin}}. La pata corta del LED es el cátodo y debe llegar a un pin de tierra de la placa. Nunca conectes el cátodo a un GPIO."
208
+ },
209
+ "verifyWiring": {
210
+ "title": "Verifica antes de aplicar energía",
211
+ "body": "Vuelve a revisar solo estas conexiones: {{connections}}. Confirma que ningún cable una dos pines de la placa, que la placa no esté sobre metal y que cada cable coincida con el mapa de cableado. No añadas ni muevas un cable sin actualizar wiring/pins.json y volver a validar."
212
+ },
213
+ "connectUsb": {
214
+ "title": "Conecta USB de alimentación y datos",
215
+ "body": "Conecta un cable micro-USB de datos de la placa a tu computadora. Usa un puerto USB 2.0. El LED de alimentación de 5 V de la placa debe encenderse. No conectes una segunda fuente a los pines 5V o 3V3."
216
+ },
217
+ "build": {
218
+ "title": "Compila el firmware",
219
+ "body": "Desde el directorio del proyecto ejecuta `formo firmware build --json`. Esto invoca PlatformIO y registra el código de salida y el registro reales. Si falta PlatformIO, el comando informa `not_configured` con instrucciones de instalación; nunca informa un éxito falso."
220
+ },
221
+ "flash": {
222
+ "title": "Carga la placa (acción manual y explícita)",
223
+ "body": "FORMO nunca flashea un dispositivo automáticamente. Después de revisar la compilación, ejecuta tú mismo `{{buildCommand}} -t upload` o usa tu flujo habitual. Confirma el puerto serie y la placa antes de cargar. Esta guía no afirma que se haya realizado una carga."
224
+ },
225
+ "monitor": {
226
+ "title": "Lee la salida serie",
227
+ "body": "Abre el monitor serie a {{baud}} baudios con `pio device monitor -b {{baud}}` o cualquier monitor serie. Las líneas esperadas exactas están documentadas en los documentos del proyecto. Si no aparece nada, revisa las conexiones anteriores antes de cambiar el firmware."
228
+ },
229
+ "troubleshoot": {
230
+ "title": "Diagnostica sin adivinar",
231
+ "body": "Si el dispositivo informa que no encuentra el dispositivo I2C: confirma {{connections}}; confirma que la dirección I2C es {{address}}; confirma que el módulo no recibe un nivel lógico fuera de su rango documentado. Nunca cambies a otro pin de la placa sin actualizar wiring/pins.json y volver a validar."
232
+ },
233
+ "troubleshootDigital": {
234
+ "title": "Diagnostica sin adivinar",
235
+ "body": "Si el LED no enciende: confirma {{connections}}; confirma que la resistencia está en serie con el LED y que las patas del LED coinciden con el mapa de cableado. Si el botón no hace nada: confirma las mismas conexiones y que el firmware se compiló con este cableado. Nunca cambies a otro pin de la placa sin actualizar wiring/pins.json y volver a validar."
236
+ },
237
+ "physicalTest": {
238
+ "title": "Registra la verificación física por separado",
239
+ "body": "Después de montar y probar una unidad real, registra tu propia evidencia. FORMO no promueve un proyecto a `physical_tested` automáticamente. Guarda el registro de compilación, la salida serie, fotos y mediciones con tu proyecto; son evidencia de tu unidad, no de todas las copias."
240
+ },
241
+ "safety": {
242
+ "title": "Seguridad y alcance",
243
+ "body": "Este es un demostrador interior de bajo voltaje alimentado por USB. No está evaluado para uso exterior, condensación, ingreso de agua en gabinete, baterías, tensión de red, uso médico, automotriz ni de seguridad crítica. No lo dejes desatendido. Desconecta el USB antes de tocar el cableado."
244
+ },
245
+ "next": {
246
+ "title": "Siguientes pasos",
247
+ "body": "Ejecuta `formo inspect --json` para el proyecto legible por máquina, `formo kit quote --json` para costos ilustrativos y `formo kit cart --dry-run --json` para ver líneas pedibles y faltantes. No se realiza ninguna compra."
248
+ }
249
+ }
250
+ },
251
+ "errors": {
252
+ "schemaInvalid": "La validación de esquema falló para {{artifact}}.",
253
+ "referenceMissing": "{{from}} hace referencia a {{kind}} inexistente `{{id}}`.",
254
+ "wiringPinMissing": "El cableado hace referencia al pin `{{pinId}}` del componente `{{componentId}}`, pero ese pin no está declarado.",
255
+ "wiringBoardPinMissing": "El pin de placa `{{pinId}}` no está declarado para la placa `{{boardId}}`.",
256
+ "wiringUnknownGpio": "GPIO{{gpio}} no está disponible en la placa seleccionada.",
257
+ "wiringDuplicateGpio": "GPIO{{gpio}} está asignado más de una vez ({{signals}}).",
258
+ "wiringSamePin": "El bus I2C usa el mismo GPIO para SDA y SCL.",
259
+ "wiringStrapping": "GPIO{{gpio}} es un pin de strapping y no debe usarse para {{signal}} sin una revisión documentada.",
260
+ "wiringReserved": "GPIO{{gpio}} está reservado para {{purpose}} y no debe usarse para {{signal}}.",
261
+ "wiringBusMismatch": "La conexión `{{connectionId}}` declara el bus `{{connectionBus}}`, pero el bus es `{{busId}}`.",
262
+ "ledSeriesResistor": "GPIO{{gpio}} alimenta el LED `{{componentId}}` directamente. Añade una resistencia en serie; un GPIO sin resistencia puede superar la corriente nominal del LED.",
263
+ "wiringFirmwareMismatch": "La vinculación del firmware ({{binding}}) no coincide con el cableado ({{wiring}}).",
264
+ "voltageIncompatible": "{{componentId}} acepta {{accepted}}, pero la conexión suministra {{supplied}}.",
265
+ "voltageUnknown": "El voltaje de {{componentId}} es desconocido; se bloquea el estado listo para venta.",
266
+ "powerUnknown": "El presupuesto de energía tiene entradas desconocidas: {{inputs}}.",
267
+ "supplierMissing": "El ítem del BOM `{{itemId}}` no tiene registro de pieza de proveedor.",
268
+ "supplierIncomplete": "A la pieza de proveedor `{{partId}}` le faltan {{fields}}.",
269
+ "supplierStale": "La observación del proveedor para `{{partId}}` tiene más de {{days}} días.",
270
+ "docsMissing": "Falta el archivo de documentación: {{path}}",
271
+ "localeMissing": "La plantilla no cubre el idioma {{locale}}.",
272
+ "bomQuantity": "El ítem del BOM `{{itemId}}` debe tener una cantidad entera positiva.",
273
+ "firmwareMissing": "Falta el archivo de entrada del firmware: {{path}}",
274
+ "catalogMissing": "Falta el componente de catálogo `{{id}}`.",
275
+ "projectManifestInvalid": "El manifiesto del proyecto no es válido: {{reason}}",
276
+ "notAuthorized": "Esta acción requiere autorización explícita. Pasa authorized=true solo después de que el usuario la apruebe.",
277
+ "unsupported": "No compatible: {{reason}}",
278
+ "notConfigured": "Sin configurar: {{reason}}",
279
+ "evidenceFilesRequired": "Proporciona al menos un archivo de evidencia, como una foto, un registro serie o una medición. No se registró nada.",
280
+ "evidenceConfirmRequired": "Registrar evidencia física es una acción humana. Vuelve a ejecutar con --confirm después de revisar los archivos.",
281
+ "installHarnessRequired": "Elige un harness: codex, claude-code u opencode.",
282
+ "installSkillsMissing": "No se encontraron las carpetas de skills de FORMO. Define FORMO_SKILLS_DIR con el directorio skills/.",
283
+ "projectIdInvalid": "El id de proyecto `{{id}}` debe cumplir [a-z0-9][a-z0-9-]*."
284
+ },
285
+ "evidence": {
286
+ "physicalDisclaimer": "Evidencia aportada por una persona para una unidad. FORMO guarda los archivos, no los verifica y nunca promueve otras copias."
287
+ },
288
+ "warnings": {
289
+ "powerHeadroomUnknown": "La capacidad del regulador de 3,3 V y la corriente pico de la placa no están documentadas en las fuentes seleccionadas. La carga del sensor es pequeña, pero esto sigue siendo un punto de revisión humana antes de declarar el kit listo para venta.",
290
+ "boardEol": "Espressif marca la placa base ESP32-C3-DevKitM-1 como EOL. Se referencia la variante de pedido N4X, pero la disponibilidad del proveedor no está verificada.",
291
+ "boardAvailabilityUnknown": "La disponibilidad y el precio de la placa son desconocidos. El carrito lo mantiene como faltante.",
292
+ "priceSnapshot": "Los precios son capturas manuales de páginas públicas de producto, no cotizaciones en vivo. No incluyen impuestos, envío ni descuentos por cantidad.",
293
+ "supplierSnapshot": "La disponibilidad del proveedor se observó una vez y no es inventario en vivo.",
294
+ "pullUpsAssumed": "Las resistencias de pull-up I2C las incluye el breakout BME280 (10 kΩ, verificadas en el esquema Eagle público). No se añaden pull-ups externos.",
295
+ "notPhysicallyTested": "No se ha registrado montaje físico, medición ni prueba hardware-in-the-loop.",
296
+ "moduleMayNeedSolder": "{{part}} puede requerir soldar una cabecera o conector. Un cable premontado evita la soldadura cuando el módulo lo admite.",
297
+ "pullUpsUnknown": "Las fuentes seleccionadas no indican las resistencias de pull-up I2C de este módulo. El bus puede necesitar pull-ups externos verificados; es un punto de revisión humana.",
298
+ "usbCableUserSupplied": "Se requiere un cable micro-USB de datos. Se lista como suministrado por el usuario salvo que se seleccione una pieza de proveedor verificada.",
299
+ "simulationUnsupported": "No se incluye una definición de simulación Wokwi validada. La simulación se informa como no compatible, no como exitosa.",
300
+ "anatomyOptional": "Anatomy es opcional y solo explicativo. Las figuras generadas no son prueba eléctrica ni mecánica.",
301
+ "evidenceStale": "Parte de la evidencia está obsoleta porque el artefacto referenciado cambió.",
302
+ "salesNotReady": "Este kit es una demostración con datos de ejemplo y no está listo para venta."
303
+ },
304
+ "quote": {
305
+ "line": "{{name}} × {{qty}}",
306
+ "knownSubtotal": "Subtotal de ítems conocidos",
307
+ "unknownLines": "Líneas con precio desconocido",
308
+ "shipping": "Envío",
309
+ "tax": "Impuestos",
310
+ "notEstimated": "no estimado",
311
+ "illustrative": "Solo datos ilustrativos de ejemplo/captura",
312
+ "currency": "Moneda",
313
+ "unit": "unidad",
314
+ "lineTotal": "total de línea"
315
+ },
316
+ "cart": {
317
+ "line": "{{name}} × {{qty}} — {{status}}",
318
+ "ready": "pedible manualmente (enlace del proveedor)",
319
+ "gap": "faltante: {{reason}}",
320
+ "purchaseBlocked": "La compra está bloqueada en esta etapa.",
321
+ "confirmation": "Un checkout futuro requerirá confirmación explícita del usuario.",
322
+ "noCheckout": "No se usa checkout, pago, pedido ni credencial de proveedor."
323
+ },
324
+ "mcp": {
325
+ "authorizationRequired": "El usuario o espacio de trabajo debe autorizar explícitamente esta llamada.",
326
+ "noPurchase": "No se expone ninguna herramienta de compra en el MVP.",
327
+ "toolResult": "Resultado de la herramienta FORMO"
328
+ },
329
+ "schematic": {
330
+ "banner": "Generado desde wiring/pins.json — es un diagrama de conexiones, no un esquemático verificado por ERC.",
331
+ "source": "Plantilla de origen: {{template}}. Cada línea es una conexión declarada; nada se infiere.",
332
+ "board": "placa",
333
+ "part": "componente",
334
+ "wire": "Cable: {{wire}}",
335
+ "limitConnections": "Las conexiones se copian del artefacto de cableado. No se ejecutó ninguna comprobación de reglas de red (ERC).",
336
+ "limitLayout": "El diseño es estilo esquemático, no un dibujo físico, de protoboard ni de CAD.",
337
+ "limitElectrical": "Este diagrama no modela corriente, caída de tensión ni presupuesto de energía."
338
+ },
339
+ "device": {
340
+ "description": "Cuerpo FORMO creado desde la plantilla {{template}} en {{board}}. Solo describe las señales declaradas.",
341
+ "inputTitle": "{{macro}} — entrada en GPIO{{gpio}}",
342
+ "outputTitle": "{{macro}} — salida en GPIO{{gpio}}",
343
+ "inputDescription": "Entrada digital en GPIO{{gpio}}.",
344
+ "inputPullUpDescription": "Entrada digital en GPIO{{gpio}} con pull-up interno.",
345
+ "outputDescription": "Salida digital en GPIO{{gpio}}.",
346
+ "limitForms": "No se declaran forms de WoT: FORMO no ejecuta un servient ni expone un endpoint.",
347
+ "limitAuthorization": "La autorización del dispositivo, el emparejamiento y los scopes OAuth corresponden al host del entorno, no a este documento.",
348
+ "limitElectrical": "No se describe el comportamiento eléctrico, los tiempos ni la precisión de los sensores.",
349
+ "aliveContract": "La forma sigue ALIVE spec/adapters.md (WoT Thing Description 1.1). FORMO produjo este documento; ALIVE no.",
350
+ "aliveNamespace": "El id usa el espacio urn:formo:project propio de FORMO, no un URN de adaptador de ALIVE."
351
+ },
352
+ "alive": {
353
+ "descriptorValid": "El descriptor coincide con la forma del esquema de extensión de ALIVE. No se contactó ningún entorno.",
354
+ "descriptorInvalid": "El descriptor no coincide con el esquema de extensión de ALIVE. Revisa las comprobaciones fallidas."
355
+ },
356
+ "plugins": {
357
+ "platformio": "PlatformIO (compilación de firmware)",
358
+ "wokwi": "Wokwi CLI (simulación opcional)",
359
+ "kicad": "KiCad CLI (ERC de esquema opcional)",
360
+ "anatomy": "Skill Anatomy (visuales explicativos opcionales)",
361
+ "rea": "REA (investigación autorizada opcional basada en evidencia)",
362
+ "alive": "Perfil de interoperabilidad ALIVE (descripción de cuerpo opcional)",
363
+ "catalog": "Catálogo de ejemplo",
364
+ "templates": "Registro de plantillas"
365
+ },
366
+ "adapters": {
367
+ "platformioMissing": "Instala PlatformIO con `python3 -m venv .venv && .venv/bin/pip install platformio`, `brew install platformio`, o define FORMO_PIO con la ruta a un binario pio.",
368
+ "wokwiMissing": "La simulación Wokwi es opcional. Instala wokwi-cli y define WOKWI_CLI_TOKEN; no se ejecuta ninguna simulación por defecto.",
369
+ "kicadMissing": "El ERC de KiCad es opcional. Instala KiCad y kicad-cli; esta etapa no incluye esquemático.",
370
+ "anatomyMissing": "Instala Anatomy con `npx skills add wheresryan22/anatomy -g -a claude-code` (o codex/opencode) y reinicia tu agente.",
371
+ "reaMissing": "REA no está instalado. Es opcional y solo para investigación autorizada basada en evidencia; no es un motor de ingeniería eléctrica.",
372
+ "noSimulationDefinition": "No se incluye una definición de simulación compatible. Añade una definición validada antes de simular.",
373
+ "noSchematic": "Esta etapa no incluye un esquemático KiCad. El ERC no es compatible.",
374
+ "reaUnauthorized": "La investigación con REA requiere authorized=true y un objetivo aprobado por el usuario. FORMO no la ejecutó.",
375
+ "aliveMissing": "ALIVE no está configurado. Define ALIVE_ORIGIN, ALIVE_REPO o ALIVE_SCHEMA_PATH con una copia local de ALIVE; FORMO nunca contacta un entorno sin eso."
376
+ }
377
+ }
package/package.json CHANGED
@@ -1,6 +1,22 @@
1
1
  {
2
2
  "name": "@enzovezzaro/formo-i18n",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "import": "./dist/index.js"
11
+ }
12
+ },
13
+ "files": [
14
+ "dist",
15
+ "locales"
16
+ ],
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "git+https://github.com/EnzoVezzaro/formo.git"
20
+ },
21
+ "homepage": "https://github.com/EnzoVezzaro/formo#readme"
22
+ }
package/README.md DELETED
@@ -1,3 +0,0 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.