operx-cli 0.2.2__tar.gz → 0.3.1__tar.gz

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.
Files changed (63) hide show
  1. {operx_cli-0.2.2/operx_cli.egg-info → operx_cli-0.3.1}/PKG-INFO +37 -8
  2. operx_cli-0.2.2/PKG-INFO → operx_cli-0.3.1/README.md +224 -209
  3. {operx_cli-0.2.2 → operx_cli-0.3.1}/operx_cli/AGENTES.md +27 -5
  4. {operx_cli-0.2.2 → operx_cli-0.3.1}/operx_cli/__init__.py +1 -1
  5. {operx_cli-0.2.2 → operx_cli-0.3.1}/operx_cli/app.py +9 -1
  6. {operx_cli-0.2.2 → operx_cli-0.3.1}/operx_cli/browser_login.py +24 -10
  7. {operx_cli-0.2.2 → operx_cli-0.3.1}/operx_cli/commands/account.py +61 -10
  8. operx_cli-0.3.1/operx_cli/commands/ambiental.py +174 -0
  9. {operx_cli-0.2.2 → operx_cli-0.3.1}/operx_cli/commands/common.py +20 -1
  10. operx_cli-0.3.1/operx_cli/commands/empresas.py +137 -0
  11. {operx_cli-0.2.2 → operx_cli-0.3.1}/operx_cli/commands/ordenes.py +26 -2
  12. {operx_cli-0.2.2 → operx_cli-0.3.1}/operx_cli/commands/personas.py +24 -1
  13. operx_cli-0.3.1/operx_cli/commands/preventivos.py +183 -0
  14. {operx_cli-0.2.2 → operx_cli-0.3.1}/operx_cli/commands/raw.py +41 -4
  15. {operx_cli-0.2.2 → operx_cli-0.3.1}/operx_cli/commands/registros.py +46 -3
  16. operx_cli-0.3.1/operx_cli/commands/sst.py +99 -0
  17. operx_cli-0.3.1/operx_cli/commands/update.py +37 -0
  18. {operx_cli-0.2.2 → operx_cli-0.3.1}/operx_cli/output.py +47 -1
  19. operx_cli-0.3.1/operx_cli/record_completion.py +93 -0
  20. operx_cli-0.3.1/operx_cli/self_update.py +76 -0
  21. {operx_cli-0.2.2 → operx_cli-0.3.1}/operx_cli/settings.py +5 -0
  22. {operx_cli-0.2.2 → operx_cli-0.3.1}/operx_cli/shell.py +68 -28
  23. operx_cli-0.3.1/operx_cli/updates.py +78 -0
  24. {operx_cli-0.2.2 → operx_cli-0.3.1}/operx_cli/values.py +30 -0
  25. {operx_cli-0.2.2 → operx_cli-0.3.1}/operx_cli/welcome.py +4 -1
  26. operx_cli-0.2.2/README.md → operx_cli-0.3.1/operx_cli.egg-info/PKG-INFO +238 -195
  27. {operx_cli-0.2.2 → operx_cli-0.3.1}/operx_cli.egg-info/SOURCES.txt +15 -0
  28. {operx_cli-0.2.2 → operx_cli-0.3.1}/pyproject.toml +1 -1
  29. operx_cli-0.3.1/tests/test_cards.py +101 -0
  30. {operx_cli-0.2.2 → operx_cli-0.3.1}/tests/test_login.py +33 -0
  31. operx_cli-0.3.1/tests/test_logout_and_routes.py +90 -0
  32. operx_cli-0.3.1/tests/test_preventivos.py +105 -0
  33. operx_cli-0.3.1/tests/test_record_completion.py +82 -0
  34. operx_cli-0.3.1/tests/test_self_update.py +133 -0
  35. {operx_cli-0.2.2 → operx_cli-0.3.1}/tests/test_shell.py +54 -2
  36. operx_cli-0.3.1/tests/test_sst_ambiental.py +248 -0
  37. operx_cli-0.3.1/tests/test_updates.py +72 -0
  38. {operx_cli-0.2.2 → operx_cli-0.3.1}/tests/test_welcome.py +12 -0
  39. {operx_cli-0.2.2 → operx_cli-0.3.1}/operx_cli/agent_guide.py +0 -0
  40. {operx_cli-0.2.2 → operx_cli-0.3.1}/operx_cli/client.py +0 -0
  41. {operx_cli-0.2.2 → operx_cli-0.3.1}/operx_cli/commands/__init__.py +0 -0
  42. {operx_cli-0.2.2 → operx_cli-0.3.1}/operx_cli/commands/inventario.py +0 -0
  43. {operx_cli-0.2.2 → operx_cli-0.3.1}/operx_cli/commands/lecturas.py +0 -0
  44. {operx_cli-0.2.2 → operx_cli-0.3.1}/operx_cli/commands/search.py +0 -0
  45. {operx_cli-0.2.2 → operx_cli-0.3.1}/operx_cli/lookup.py +0 -0
  46. {operx_cli-0.2.2 → operx_cli-0.3.1}/operx_cli/spreadsheet.py +0 -0
  47. {operx_cli-0.2.2 → operx_cli-0.3.1}/operx_cli.egg-info/dependency_links.txt +0 -0
  48. {operx_cli-0.2.2 → operx_cli-0.3.1}/operx_cli.egg-info/entry_points.txt +0 -0
  49. {operx_cli-0.2.2 → operx_cli-0.3.1}/operx_cli.egg-info/requires.txt +0 -0
  50. {operx_cli-0.2.2 → operx_cli-0.3.1}/operx_cli.egg-info/top_level.txt +0 -0
  51. {operx_cli-0.2.2 → operx_cli-0.3.1}/setup.cfg +0 -0
  52. {operx_cli-0.2.2 → operx_cli-0.3.1}/tests/test_agentes.py +0 -0
  53. {operx_cli-0.2.2 → operx_cli-0.3.1}/tests/test_app.py +0 -0
  54. {operx_cli-0.2.2 → operx_cli-0.3.1}/tests/test_client.py +0 -0
  55. {operx_cli-0.2.2 → operx_cli-0.3.1}/tests/test_inventario_lecturas.py +0 -0
  56. {operx_cli-0.2.2 → operx_cli-0.3.1}/tests/test_lookup.py +0 -0
  57. {operx_cli-0.2.2 → operx_cli-0.3.1}/tests/test_ordenes.py +0 -0
  58. {operx_cli-0.2.2 → operx_cli-0.3.1}/tests/test_output.py +0 -0
  59. {operx_cli-0.2.2 → operx_cli-0.3.1}/tests/test_personas.py +0 -0
  60. {operx_cli-0.2.2 → operx_cli-0.3.1}/tests/test_registros.py +0 -0
  61. {operx_cli-0.2.2 → operx_cli-0.3.1}/tests/test_settings.py +0 -0
  62. {operx_cli-0.2.2 → operx_cli-0.3.1}/tests/test_spreadsheet.py +0 -0
  63. {operx_cli-0.2.2 → operx_cli-0.3.1}/tests/test_values.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: operx-cli
3
- Version: 0.2.2
3
+ Version: 0.3.1
4
4
  Summary: La línea de comandos de OperX: tu empresa desde la terminal, con tu token de API.
5
5
  Requires-Python: >=3.10
6
6
  Description-Content-Type: text/markdown
@@ -36,7 +36,10 @@ curl -LsSf https://astral.sh/uv/install.sh | sh && uv tool install operx-cli
36
36
  Python 3.10 o más nuevo, también sirve `pipx install operx-cli`. Abre una
37
37
  terminal nueva y comprueba con `operx --version`.
38
38
 
39
- Para actualizar: `uv tool upgrade operx-cli`.
39
+ Para actualizar: `operx update`. La pantalla de bienvenida avisa cuando hay una
40
+ versión nueva. En Windows la instala otra ventana, que espera a que se cierre
41
+ `operx` (Windows no deja reemplazar un programa abierto); si quedó a medias,
42
+ `uv tool install operx-cli --force` lo deja bien.
40
43
 
41
44
  ## Entrar
42
45
 
@@ -69,8 +72,8 @@ operx --perfil pruebas login --direccion https://…
69
72
  operx --perfil pruebas ordenes listar
70
73
  ```
71
74
 
72
- `operx logout` borra el token de este equipo; para que deje de funcionar,
73
- revócalo en Acceso por API.
75
+ `operx logout` cierra la sesión: revoca el token en el servidor y lo borra de
76
+ este equipo. Un token puesto en `OPERX_TOKEN` no lo toca.
74
77
 
75
78
  ## Modo interactivo
76
79
 
@@ -86,8 +89,9 @@ operx › ayuda
86
89
  operx › salir
87
90
  ```
88
91
 
89
- `salir` (o Ctrl+D) termina la sesión sin borrar tu token. En un script o una
90
- tubería, `operx` solo muestra la ayuda y no espera a nadie.
92
+ `salir` (o Ctrl+D) termina la sesión sin borrar tu token. `ayuda` y Tab
93
+ muestran solo los comandos de los productos que tiene tu empresa. En un script
94
+ o una tubería, `operx` solo muestra la ayuda y no espera a nadie.
91
95
 
92
96
  ## Comandos
93
97
 
@@ -101,6 +105,12 @@ operx ordenes estado 1234 completada
101
105
  operx ordenes asignar 1234 "Pedro Pérez"
102
106
  operx ordenes comentar 1234 "Llegó el repuesto"
103
107
 
108
+ operx preventivos listar --estado vencidos
109
+ operx preventivos ver 12
110
+ operx preventivos crear --nombre "Lubricar rodamientos" --cada 3 --unidad meses --equipo BOM-04 --proxima 01/11/2026
111
+ operx preventivos nota 12 "Usar grasa EP2"
112
+ operx preventivos ejecuciones 12
113
+
104
114
  operx equipos listar --buscar compresor
105
115
  operx equipos ver BOM-04
106
116
  operx equipos crear --nombre "Bomba 4" --codigo BOM-04 --lugar "Planta Norte"
@@ -116,10 +126,26 @@ operx inventario salida --articulo FIL-010 --lugar "Bodega central" --cantidad 2
116
126
  operx lecturas puntos BOM-04
117
127
  operx lecturas registrar --punto 12 --valor 73,4
118
128
 
129
+ operx personas listar --buscar pérez
119
130
  operx personas importar empleados.xlsx # revisa el archivo, no guarda
120
131
  operx personas importar empleados.xlsx --confirmar # guarda si ninguna fila tiene errores
132
+
133
+ operx sst acciones --estado abiertas
134
+ operx sst nueva-accion --titulo "Señalizar la salida" --para 15/11/2026 --responsable "Ana Ruiz"
135
+ operx sst accion-hecha 7 --evidencia "Se instalaron dos señales"
136
+ operx sst incidentes
137
+
138
+ operx ambiental acciones
139
+ operx ambiental permisos
140
+ operx ambiental obligaciones --mes 11/2026
141
+ operx ambiental residuo --corriente "Aceite usado" --kg 12,5
142
+ operx ambiental lectura --medidor Acueducto --valor 1.234,5
121
143
  ```
122
144
 
145
+ SG-SST y Ambiental van por empresa: sin `--empresa`, la de tu cuenta. Si
146
+ llevas el SG-SST o lo ambiental de tus clientes, `operx sst empresas` y
147
+ `operx ambiental empresas` las listan.
148
+
123
149
  `operx --help` y `operx ordenes --help` muestran todas las opciones.
124
150
 
125
151
  - Los equipos, lugares, clientes, artículos y personas se nombran por su
@@ -149,10 +175,13 @@ Usuarios y acceso.
149
175
 
150
176
  ### Cualquier otra llamada
151
177
 
152
- Lo que no tiene comando propio se hace con `operx api`, con las direcciones
153
- de Acceso por API › Documentación (sin `/api/v1/`):
178
+ Lo que no tiene comando propio se hace con `operx api`. `operx api rutas`
179
+ lista todas las direcciones que tu token puede llamar (`operx api rutas
180
+ compresor` deja las que lo mencionan); también están en Acceso por API ›
181
+ Documentación:
154
182
 
155
183
  ```sh
184
+ operx api rutas schedules
156
185
  operx api GET pm/schedules/ -q search=compresor
157
186
  operx api POST contacts/ -d @contacto.json
158
187
  operx api GET work-orders/export/ -o ordenes.csv
@@ -1,209 +1,224 @@
1
- Metadata-Version: 2.4
2
- Name: operx-cli
3
- Version: 0.2.2
4
- Summary: La línea de comandos de OperX: tu empresa desde la terminal, con tu token de API.
5
- Requires-Python: >=3.10
6
- Description-Content-Type: text/markdown
7
- Requires-Dist: typer>=0.27
8
- Requires-Dist: httpx>=0.28
9
- Requires-Dist: keyring>=25
10
- Requires-Dist: openpyxl>=3.1
11
- Requires-Dist: prompt_toolkit>=3.0
12
- Provides-Extra: test
13
- Requires-Dist: pytest>=8; extra == "test"
14
-
15
- # operx: OperX desde la terminal
16
-
17
- `operx` usa la API de OperX con tu token personal: lo mismo que puedes hacer
18
- en la app, desde una terminal, un script o una tarea programada. Actúa como
19
- tú, con tu rol, y solo en tu empresa.
20
-
21
- ## Instalar
22
-
23
- Windows (PowerShell):
24
-
25
- ```powershell
26
- powershell -c "irm https://astral.sh/uv/install.ps1 | iex"; uv tool install operx-cli
27
- ```
28
-
29
- Mac y Linux:
30
-
31
- ```sh
32
- curl -LsSf https://astral.sh/uv/install.sh | sh && uv tool install operx-cli
33
- ```
34
-
35
- `uv` instala su propio Python, así que no necesitas tener uno. Si ya tienes
36
- Python 3.10 o más nuevo, también sirve `pipx install operx-cli`. Abre una
37
- terminal nueva y comprueba con `operx --version`.
38
-
39
- Para actualizar: `uv tool upgrade operx-cli`.
40
-
41
- ## Entrar
42
-
43
- ```sh
44
- operx login
45
- ```
46
-
47
- 1. La terminal muestra un código y abre el navegador en la página de OperX.
48
- 2. Entras como siempre. La página dice qué terminal pide acceso: apruébalo solo
49
- si acabas de escribir `operx login` en tu propio computador y el código es
50
- el mismo. Escribe el código de 6 dígitos de tu app de autenticación (o tu
51
- contraseña, si no usas una) y elige *Solo lectura* o *Lectura y
52
- escritura*.
53
- 3. Vuelve a la terminal: ya entraste. Nunca ves ni copias un token.
54
-
55
- Tu rol necesita el permiso «Acceso por API» (Ajustes › Usuarios y acceso ›
56
- Roles); un administrador lo da. El acceso dura 90 días y lo ves, y puedes
57
- revocarlo, en el menú de tu cuenta › Acceso por API.
58
-
59
- El token queda en el llavero del sistema (en Windows, el Administrador de
60
- credenciales), nunca en un archivo. En un servidor sin navegador ni llavero:
61
- `operx login --token` te deja pegar un token creado en Acceso por API, o puedes
62
- usar variables de entorno: `OPERX_TOKEN` (el token) y, si no es producción,
63
- `OPERX_DIRECCION`.
64
-
65
- Para otra dirección u otra empresa, usa un perfil:
66
-
67
- ```sh
68
- operx --perfil pruebas login --direccion https://…
69
- operx --perfil pruebas ordenes listar
70
- ```
71
-
72
- `operx logout` borra el token de este equipo; para que deje de funcionar,
73
- revócalo en Acceso por API.
74
-
75
- ## Modo interactivo
76
-
77
- Escribe `operx` solo, en una terminal, y se abre la pantalla de bienvenida
78
- (quién eres y los números de hoy: órdenes abiertas, vencidas, artículos bajo
79
- el mínimo) con un prompt. Ahí escribes los comandos sin el `operx`, con
80
- Tab para completar y ↑ para repetir lo anterior:
81
-
82
- ```
83
- operx › ordenes listar --vencidas
84
- operx › buscar "bomba"
85
- operx › ayuda
86
- operx › salir
87
- ```
88
-
89
- `salir` (o Ctrl+D) termina la sesión sin borrar tu token. En un script o una
90
- tubería, `operx` solo muestra la ayuda y no espera a nadie.
91
-
92
- ## Comandos
93
-
94
- ```sh
95
- operx buscar "bomba" # como la barra de búsqueda de la app
96
-
97
- operx ordenes listar --estado en-progreso --asignada-a yo
98
- operx ordenes ver 1234
99
- operx ordenes crear --titulo "Cambio de rodamiento" --equipo BOM-04 --prioridad alta --vence 30/10/2026
100
- operx ordenes estado 1234 completada
101
- operx ordenes asignar 1234 "Pedro Pérez"
102
- operx ordenes comentar 1234 "Llegó el repuesto"
103
-
104
- operx equipos listar --buscar compresor
105
- operx equipos ver BOM-04
106
- operx equipos crear --nombre "Bomba 4" --codigo BOM-04 --lugar "Planta Norte"
107
- operx clientes listar
108
- operx clientes crear --nombre "Acme S.A.S." --nit 900123456
109
- operx clientes crear --nombre "Filtros Ltda" --rol proveedor
110
- operx lugares listar
111
-
112
- operx inventario existencias --buscar filtro
113
- operx inventario entrada --articulo FIL-010 --lugar "Bodega central" --cantidad 10 --costo-unitario 1.500,50
114
- operx inventario salida --articulo FIL-010 --lugar "Bodega central" --cantidad 2 --motivo Consumo
115
-
116
- operx lecturas puntos BOM-04
117
- operx lecturas registrar --punto 12 --valor 73,4
118
-
119
- operx personas importar empleados.xlsx # revisa el archivo, no guarda
120
- operx personas importar empleados.xlsx --confirmar # guarda si ninguna fila tiene errores
121
- ```
122
-
123
- `operx --help` y `operx ordenes --help` muestran todas las opciones.
124
-
125
- - Los equipos, lugares, clientes, artículos y personas se nombran por su
126
- código o su nombre exacto. Si dos se llaman igual, `operx` lo dice y pide
127
- el id.
128
- - Los números y las fechas se escriben como en la app: `73,4`, `1.500,50`,
129
- `30/10/2026`, `22/10/2026 08:00`.
130
- - Las listas muestran la primera página; `--todas` las trae todas.
131
- - `--json` da todo lo que responde la API; `--csv` da un CSV que Excel abre
132
- bien (`operx equipos listar --todas --csv > equipos.csv`).
133
-
134
- ### Antes de escribir
135
-
136
- Todo lo que crea o cambia algo pregunta antes. En un script o una tarea
137
- programada no hay a quién preguntar: agrega `--si`. Cada escritura queda en
138
- el historial del token (Acceso por API › el token › Actividad) marcada como
139
- hecha desde la CLI.
140
-
141
- ### Importar personas
142
-
143
- La primera columna con el nombre basta. `operx` reconoce las columnas
144
- Nombres, Apellidos, Código, Cargo, Tipo de contrato, Fecha de ingreso, Fin de
145
- contrato, Celular, Sede y las de contacto de emergencia, con o sin tildes.
146
- Una columna con otro nombre se indica con `--mapa "Tu columna=campo"`.
147
- Nadie recibe acceso a la app al importarlo: las invitaciones se envían en
148
- Usuarios y acceso.
149
-
150
- ### Cualquier otra llamada
151
-
152
- Lo que no tiene comando propio se hace con `operx api`, con las direcciones
153
- de Acceso por API › Documentación (sin `/api/v1/`):
154
-
155
- ```sh
156
- operx api GET pm/schedules/ -q search=compresor
157
- operx api POST contacts/ -d @contacto.json
158
- operx api GET work-orders/export/ -o ordenes.csv
159
- operx api POST work-orders/1234/attachments/ -a file=foto.jpg -d '{"file_type": "photo"}'
160
- ```
161
-
162
- En Git Bash, una dirección que empieza por `/` se vuelve una ruta de Windows:
163
- escríbela sin la barra inicial, como arriba.
164
-
165
- ## Para agentes de IA
166
-
167
- `operx agentes` imprime una guía para un agente de IA (Claude, ChatGPT,
168
- Copilot, Codex…): las reglas para usar `operx` bien (leer con `--json`,
169
- preguntar antes de escribir, no tocar tokens) y cada comando con sus opciones.
170
- Dile a tu agente: «Ejecuta `operx agentes` y sigue esa guía».
171
-
172
- ## Para desarrollar
173
-
174
- ```sh
175
- cd cli
176
- python -m venv .venv && .venv/Scripts/python -m pip install -e ".[test]"
177
- .venv/Scripts/python -m pytest
178
- ```
179
-
180
- `operx_cli/client.py` es lo único que habla con la red; el servidor MCP lo
181
- usará igual.
182
-
183
- ### Publicar una versión
184
-
185
- El paquete es `operx-cli` en PyPI. Una versión publicada no se puede reemplazar:
186
- si algo falla, se sube la siguiente.
187
-
188
- 1. Sube el número en `pyproject.toml` y en `operx_cli/__init__.py`.
189
- 2. Las funciones nuevas del servidor (como `operx login`) tienen que estar ya
190
- desplegadas en producción antes de publicar: el paquete nuevo las llama.
191
- 3. Desde `cli/`:
192
-
193
- ```sh
194
- uv build --clear
195
- uv publish
196
- ```
197
-
198
- `uv publish` toma el token de PyPI de la variable de entorno
199
- `UV_PUBLISH_TOKEN`. Usa un token solo del proyecto `operx-cli` (PyPI › Account
200
- settings › API tokens). Se guarda una vez, en tu usuario de Windows, desde
201
- PowerShell; lo pegas donde lo pide y no se ve:
202
-
203
- ```powershell
204
- $token = Read-Host "Token de PyPI" -AsSecureString
205
- [Environment]::SetEnvironmentVariable("UV_PUBLISH_TOKEN", [Net.NetworkCredential]::new("", $token).Password, "User")
206
- ```
207
-
208
- Las terminales que abras después ya lo tienen. El token es secreto: nunca va
209
- en un archivo del repositorio ni en un chat.
1
+ # operx: OperX desde la terminal
2
+
3
+ `operx` usa la API de OperX con tu token personal: lo mismo que puedes hacer
4
+ en la app, desde una terminal, un script o una tarea programada. Actúa como
5
+ tú, con tu rol, y solo en tu empresa.
6
+
7
+ ## Instalar
8
+
9
+ Windows (PowerShell):
10
+
11
+ ```powershell
12
+ powershell -c "irm https://astral.sh/uv/install.ps1 | iex"; uv tool install operx-cli
13
+ ```
14
+
15
+ Mac y Linux:
16
+
17
+ ```sh
18
+ curl -LsSf https://astral.sh/uv/install.sh | sh && uv tool install operx-cli
19
+ ```
20
+
21
+ `uv` instala su propio Python, así que no necesitas tener uno. Si ya tienes
22
+ Python 3.10 o más nuevo, también sirve `pipx install operx-cli`. Abre una
23
+ terminal nueva y comprueba con `operx --version`.
24
+
25
+ Para actualizar: `operx update`. La pantalla de bienvenida avisa cuando hay una
26
+ versión nueva. En Windows la instala otra ventana, que espera a que se cierre
27
+ `operx` (Windows no deja reemplazar un programa abierto); si quedó a medias,
28
+ `uv tool install operx-cli --force` lo deja bien.
29
+
30
+ ## Entrar
31
+
32
+ ```sh
33
+ operx login
34
+ ```
35
+
36
+ 1. La terminal muestra un código y abre el navegador en la página de OperX.
37
+ 2. Entras como siempre. La página dice qué terminal pide acceso: apruébalo solo
38
+ si acabas de escribir `operx login` en tu propio computador y el código es
39
+ el mismo. Escribe el código de 6 dígitos de tu app de autenticación (o tu
40
+ contraseña, si no usas una) y elige *Solo lectura* o *Lectura y
41
+ escritura*.
42
+ 3. Vuelve a la terminal: ya entraste. Nunca ves ni copias un token.
43
+
44
+ Tu rol necesita el permiso «Acceso por API» (Ajustes › Usuarios y acceso ›
45
+ Roles); un administrador lo da. El acceso dura 90 días y lo ves, y puedes
46
+ revocarlo, en el menú de tu cuenta › Acceso por API.
47
+
48
+ El token queda en el llavero del sistema (en Windows, el Administrador de
49
+ credenciales), nunca en un archivo. En un servidor sin navegador ni llavero:
50
+ `operx login --token` te deja pegar un token creado en Acceso por API, o puedes
51
+ usar variables de entorno: `OPERX_TOKEN` (el token) y, si no es producción,
52
+ `OPERX_DIRECCION`.
53
+
54
+ Para otra dirección u otra empresa, usa un perfil:
55
+
56
+ ```sh
57
+ operx --perfil pruebas login --direccion https://…
58
+ operx --perfil pruebas ordenes listar
59
+ ```
60
+
61
+ `operx logout` cierra la sesión: revoca el token en el servidor y lo borra de
62
+ este equipo. Un token puesto en `OPERX_TOKEN` no lo toca.
63
+
64
+ ## Modo interactivo
65
+
66
+ Escribe `operx` solo, en una terminal, y se abre la pantalla de bienvenida
67
+ (quién eres y los números de hoy: órdenes abiertas, vencidas, artículos bajo
68
+ el mínimo) con un prompt. Ahí escribes los comandos sin el `operx`, con
69
+ Tab para completar y ↑ para repetir lo anterior:
70
+
71
+ ```
72
+ operx › ordenes listar --vencidas
73
+ operx › buscar "bomba"
74
+ operx › ayuda
75
+ operx › salir
76
+ ```
77
+
78
+ `salir` (o Ctrl+D) termina la sesión sin borrar tu token. `ayuda` y Tab
79
+ muestran solo los comandos de los productos que tiene tu empresa. En un script
80
+ o una tubería, `operx` solo muestra la ayuda y no espera a nadie.
81
+
82
+ ## Comandos
83
+
84
+ ```sh
85
+ operx buscar "bomba" # como la barra de búsqueda de la app
86
+
87
+ operx ordenes listar --estado en-progreso --asignada-a yo
88
+ operx ordenes ver 1234
89
+ operx ordenes crear --titulo "Cambio de rodamiento" --equipo BOM-04 --prioridad alta --vence 30/10/2026
90
+ operx ordenes estado 1234 completada
91
+ operx ordenes asignar 1234 "Pedro Pérez"
92
+ operx ordenes comentar 1234 "Llegó el repuesto"
93
+
94
+ operx preventivos listar --estado vencidos
95
+ operx preventivos ver 12
96
+ operx preventivos crear --nombre "Lubricar rodamientos" --cada 3 --unidad meses --equipo BOM-04 --proxima 01/11/2026
97
+ operx preventivos nota 12 "Usar grasa EP2"
98
+ operx preventivos ejecuciones 12
99
+
100
+ operx equipos listar --buscar compresor
101
+ operx equipos ver BOM-04
102
+ operx equipos crear --nombre "Bomba 4" --codigo BOM-04 --lugar "Planta Norte"
103
+ operx clientes listar
104
+ operx clientes crear --nombre "Acme S.A.S." --nit 900123456
105
+ operx clientes crear --nombre "Filtros Ltda" --rol proveedor
106
+ operx lugares listar
107
+
108
+ operx inventario existencias --buscar filtro
109
+ operx inventario entrada --articulo FIL-010 --lugar "Bodega central" --cantidad 10 --costo-unitario 1.500,50
110
+ operx inventario salida --articulo FIL-010 --lugar "Bodega central" --cantidad 2 --motivo Consumo
111
+
112
+ operx lecturas puntos BOM-04
113
+ operx lecturas registrar --punto 12 --valor 73,4
114
+
115
+ operx personas listar --buscar pérez
116
+ operx personas importar empleados.xlsx # revisa el archivo, no guarda
117
+ operx personas importar empleados.xlsx --confirmar # guarda si ninguna fila tiene errores
118
+
119
+ operx sst acciones --estado abiertas
120
+ operx sst nueva-accion --titulo "Señalizar la salida" --para 15/11/2026 --responsable "Ana Ruiz"
121
+ operx sst accion-hecha 7 --evidencia "Se instalaron dos señales"
122
+ operx sst incidentes
123
+
124
+ operx ambiental acciones
125
+ operx ambiental permisos
126
+ operx ambiental obligaciones --mes 11/2026
127
+ operx ambiental residuo --corriente "Aceite usado" --kg 12,5
128
+ operx ambiental lectura --medidor Acueducto --valor 1.234,5
129
+ ```
130
+
131
+ SG-SST y Ambiental van por empresa: sin `--empresa`, la de tu cuenta. Si
132
+ llevas el SG-SST o lo ambiental de tus clientes, `operx sst empresas` y
133
+ `operx ambiental empresas` las listan.
134
+
135
+ `operx --help` y `operx ordenes --help` muestran todas las opciones.
136
+
137
+ - Los equipos, lugares, clientes, artículos y personas se nombran por su
138
+ código o su nombre exacto. Si dos se llaman igual, `operx` lo dice y pide
139
+ el id.
140
+ - Los números y las fechas se escriben como en la app: `73,4`, `1.500,50`,
141
+ `30/10/2026`, `22/10/2026 08:00`.
142
+ - Las listas muestran la primera página; `--todas` las trae todas.
143
+ - `--json` da todo lo que responde la API; `--csv` da un CSV que Excel abre
144
+ bien (`operx equipos listar --todas --csv > equipos.csv`).
145
+
146
+ ### Antes de escribir
147
+
148
+ Todo lo que crea o cambia algo pregunta antes. En un script o una tarea
149
+ programada no hay a quién preguntar: agrega `--si`. Cada escritura queda en
150
+ el historial del token (Acceso por API › el token › Actividad) marcada como
151
+ hecha desde la CLI.
152
+
153
+ ### Importar personas
154
+
155
+ La primera columna con el nombre basta. `operx` reconoce las columnas
156
+ Nombres, Apellidos, Código, Cargo, Tipo de contrato, Fecha de ingreso, Fin de
157
+ contrato, Celular, Sede y las de contacto de emergencia, con o sin tildes.
158
+ Una columna con otro nombre se indica con `--mapa "Tu columna=campo"`.
159
+ Nadie recibe acceso a la app al importarlo: las invitaciones se envían en
160
+ Usuarios y acceso.
161
+
162
+ ### Cualquier otra llamada
163
+
164
+ Lo que no tiene comando propio se hace con `operx api`. `operx api rutas`
165
+ lista todas las direcciones que tu token puede llamar (`operx api rutas
166
+ compresor` deja las que lo mencionan); también están en Acceso por API ›
167
+ Documentación:
168
+
169
+ ```sh
170
+ operx api rutas schedules
171
+ operx api GET pm/schedules/ -q search=compresor
172
+ operx api POST contacts/ -d @contacto.json
173
+ operx api GET work-orders/export/ -o ordenes.csv
174
+ operx api POST work-orders/1234/attachments/ -a file=foto.jpg -d '{"file_type": "photo"}'
175
+ ```
176
+
177
+ En Git Bash, una dirección que empieza por `/` se vuelve una ruta de Windows:
178
+ escríbela sin la barra inicial, como arriba.
179
+
180
+ ## Para agentes de IA
181
+
182
+ `operx agentes` imprime una guía para un agente de IA (Claude, ChatGPT,
183
+ Copilot, Codex…): las reglas para usar `operx` bien (leer con `--json`,
184
+ preguntar antes de escribir, no tocar tokens) y cada comando con sus opciones.
185
+ Dile a tu agente: «Ejecuta `operx agentes` y sigue esa guía».
186
+
187
+ ## Para desarrollar
188
+
189
+ ```sh
190
+ cd cli
191
+ python -m venv .venv && .venv/Scripts/python -m pip install -e ".[test]"
192
+ .venv/Scripts/python -m pytest
193
+ ```
194
+
195
+ `operx_cli/client.py` es lo único que habla con la red; el servidor MCP lo
196
+ usará igual.
197
+
198
+ ### Publicar una versión
199
+
200
+ El paquete es `operx-cli` en PyPI. Una versión publicada no se puede reemplazar:
201
+ si algo falla, se sube la siguiente.
202
+
203
+ 1. Sube el número en `pyproject.toml` y en `operx_cli/__init__.py`.
204
+ 2. Las funciones nuevas del servidor (como `operx login`) tienen que estar ya
205
+ desplegadas en producción antes de publicar: el paquete nuevo las llama.
206
+ 3. Desde `cli/`:
207
+
208
+ ```sh
209
+ uv build --clear
210
+ uv publish
211
+ ```
212
+
213
+ `uv publish` toma el token de PyPI de la variable de entorno
214
+ `UV_PUBLISH_TOKEN`. Usa un token solo del proyecto `operx-cli` (PyPI › Account
215
+ settings › API tokens). Se guarda una vez, en tu usuario de Windows, desde
216
+ PowerShell; lo pegas donde lo pide y no se ve:
217
+
218
+ ```powershell
219
+ $token = Read-Host "Token de PyPI" -AsSecureString
220
+ [Environment]::SetEnvironmentVariable("UV_PUBLISH_TOKEN", [Net.NetworkCredential]::new("", $token).Password, "User")
221
+ ```
222
+
223
+ Las terminales que abras después ya lo tienen. El token es secreto: nunca va
224
+ en un archivo del repositorio ni en un chat.
@@ -53,9 +53,18 @@ llamada queda en el historial del token, marcada como hecha desde la CLI.
53
53
  ## Escribir
54
54
 
55
55
  - Escriben: `ordenes crear`, `ordenes estado`, `ordenes asignar`,
56
- `ordenes comentar`, `equipos crear`, `clientes crear`, `inventario entrada`,
57
- `inventario salida`, `lecturas registrar`, `personas importar --confirmar`,
58
- y `operx api` con POST, PUT, PATCH o DELETE. Todos llevan `--si`.
56
+ `ordenes comentar`, `preventivos crear`, `preventivos nota`,
57
+ `equipos crear`, `clientes crear`, `inventario entrada`, `inventario salida`,
58
+ `lecturas registrar`, `personas importar --confirmar`, `sst nueva-accion`,
59
+ `sst accion-hecha`, `ambiental nueva-accion`, `ambiental accion-hecha`,
60
+ `ambiental residuo`, `ambiental lectura`, y `operx api` con POST, PUT,
61
+ PATCH o DELETE. Todos llevan `--si`.
62
+ - SG-SST y Ambiental van por empresa: sin `--empresa`, la de la cuenta. Una
63
+ cuenta que lleva el SG-SST o lo ambiental de sus clientes ve las demás con
64
+ `operx sst empresas` o `operx ambiental empresas`.
65
+ - El responsable de una acción es una persona de la empresa (su nombre o
66
+ código exacto) o, si no está en la empresa, alguien de afuera por su nombre:
67
+ `operx` avisa cuál de las dos tomó.
59
68
  - `operx personas importar ARCHIVO` sin `--confirmar` solo revisa el archivo
60
69
  y no guarda nada: hazlo primero y muéstrale el resultado a la persona.
61
70
  - Un acceso de solo lectura no escribe: la API responde 403.
@@ -97,8 +106,10 @@ Lo que responde la API:
97
106
  ## Cualquier otra llamada: `operx api`
98
107
 
99
108
  `operx api MÉTODO RUTA` hace cualquier llamada que el token pueda hacer y
100
- responde el JSON de la API. Las rutas están en la app, en Acceso por API ›
101
- Documentación; escríbelas sin `/api/v1/` y sin barra inicial.
109
+ responde el JSON de la API. `operx api rutas --json` lista todas las rutas
110
+ que el token puede llamar, con lo que hace cada una; `operx api rutas TEXTO`
111
+ deja solo las que lo mencionan. Escríbelas como salen ahí: sin `/api/v1/` y
112
+ sin barra inicial.
102
113
 
103
114
  - `-q nombre=valor`: un filtro. Se repite.
104
115
  - `-d '{"campo": "valor"}'` o `-d @archivo.json`: el cuerpo de la llamada.
@@ -107,6 +118,7 @@ Documentación; escríbelas sin `/api/v1/` y sin barra inicial.
107
118
  - `-o archivo`: guarda una respuesta que es un archivo (CSV, PDF).
108
119
 
109
120
  ```sh
121
+ operx api rutas schedules --json
110
122
  operx api GET pm/schedules/ -q search=compresor
111
123
  operx api POST contacts/ -d @contacto.json --si
112
124
  operx api GET work-orders/export/ -o ordenes.csv
@@ -131,4 +143,14 @@ operx inventario salida --articulo FIL-010 --lugar "Bodega central" --cantidad 2
131
143
 
132
144
  # Los equipos en un CSV para Excel
133
145
  operx equipos listar --todas --csv > equipos.csv
146
+
147
+ # Los planes preventivos vencidos
148
+ operx preventivos listar --estado vencidos --json
149
+
150
+ # El plan de acción del SG-SST que sigue abierto
151
+ operx sst acciones --estado abiertas --json
152
+
153
+ # Lo que vence este mes en lo ambiental, y registrar residuos
154
+ operx ambiental obligaciones --json
155
+ operx ambiental residuo --corriente "Aceite usado" --kg 12,5 --si
134
156
  ```
@@ -2,4 +2,4 @@
2
2
  API (backend/users/api_allowlist.py) from a terminal, with a personal API
3
3
  token."""
4
4
 
5
- __version__ = "0.2.2"
5
+ __version__ = "0.3.1"
@@ -12,7 +12,9 @@ from typer.core import TyperGroup
12
12
  from . import __version__, settings, shell
13
13
  from .agent_guide import guide_text
14
14
  from .client import ApiError
15
- from .commands import account, inventario, lecturas, ordenes, personas, raw, registros, search
15
+ from .commands import (
16
+ account, ambiental, inventario, lecturas, ordenes, personas, preventivos, raw, registros, search, sst, update,
17
+ )
16
18
  from .commands.common import CliError, Session
17
19
  from .lookup import NoSingleMatch
18
20
  from .spreadsheet import SpreadsheetError
@@ -123,15 +125,21 @@ app.command()(account.logout)
123
125
  app.command(name="entrar", hidden=True)(account.entrar)
124
126
  app.command(name="salir", hidden=True)(account.logout)
125
127
  app.command()(account.cuenta)
128
+ app.command()(update.update)
129
+ # In Spanish too, as the other commands are: out of the help.
130
+ app.command(name="actualizar", hidden=True)(update.update)
126
131
  app.command()(search.buscar)
127
132
  app.command()(raw.api)
128
133
  app.add_typer(ordenes.app, name="ordenes")
134
+ app.add_typer(preventivos.app, name="preventivos")
129
135
  app.add_typer(registros.equipos, name="equipos")
130
136
  app.add_typer(registros.clientes, name="clientes")
131
137
  app.add_typer(registros.lugares, name="lugares")
132
138
  app.add_typer(inventario.app, name="inventario")
133
139
  app.add_typer(lecturas.app, name="lecturas")
134
140
  app.add_typer(personas.app, name="personas")
141
+ app.add_typer(sst.app, name="sst")
142
+ app.add_typer(ambiental.app, name="ambiental")
135
143
 
136
144
 
137
145
  @app.command()