operx-cli 0.4.0__tar.gz → 0.6.0__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 (76) hide show
  1. {operx_cli-0.4.0/operx_cli.egg-info → operx_cli-0.6.0}/PKG-INFO +33 -10
  2. operx_cli-0.4.0/PKG-INFO → operx_cli-0.6.0/README.md +266 -257
  3. {operx_cli-0.4.0 → operx_cli-0.6.0}/operx_cli/AGENTES.md +72 -16
  4. {operx_cli-0.4.0 → operx_cli-0.6.0}/operx_cli/__init__.py +1 -1
  5. operx_cli-0.6.0/operx_cli/api_fields.py +232 -0
  6. {operx_cli-0.4.0 → operx_cli-0.6.0}/operx_cli/app.py +9 -2
  7. {operx_cli-0.4.0 → operx_cli-0.6.0}/operx_cli/commands/account.py +6 -3
  8. {operx_cli-0.4.0 → operx_cli-0.6.0}/operx_cli/commands/ambiental.py +12 -6
  9. operx_cli-0.6.0/operx_cli/commands/articulos.py +128 -0
  10. {operx_cli-0.4.0 → operx_cli-0.6.0}/operx_cli/commands/avisos.py +4 -2
  11. {operx_cli-0.4.0 → operx_cli-0.6.0}/operx_cli/commands/common.py +22 -2
  12. operx_cli-0.6.0/operx_cli/commands/completar.py +172 -0
  13. {operx_cli-0.4.0 → operx_cli-0.6.0}/operx_cli/commands/empresas.py +6 -6
  14. {operx_cli-0.4.0 → operx_cli-0.6.0}/operx_cli/commands/inventario.py +19 -12
  15. {operx_cli-0.4.0 → operx_cli-0.6.0}/operx_cli/commands/lecturas.py +9 -5
  16. {operx_cli-0.4.0 → operx_cli-0.6.0}/operx_cli/commands/ordenes.py +20 -12
  17. {operx_cli-0.4.0 → operx_cli-0.6.0}/operx_cli/commands/personas.py +13 -4
  18. {operx_cli-0.4.0 → operx_cli-0.6.0}/operx_cli/commands/planta.py +14 -4
  19. {operx_cli-0.4.0 → operx_cli-0.6.0}/operx_cli/commands/preventivos.py +7 -3
  20. operx_cli-0.6.0/operx_cli/commands/raw.py +288 -0
  21. {operx_cli-0.4.0 → operx_cli-0.6.0}/operx_cli/commands/registros.py +139 -4
  22. {operx_cli-0.4.0 → operx_cli-0.6.0}/operx_cli/commands/sst.py +4 -2
  23. {operx_cli-0.4.0 → operx_cli-0.6.0}/operx_cli/lookup.py +2 -1
  24. {operx_cli-0.4.0 → operx_cli-0.6.0}/operx_cli/record_completion.py +6 -1
  25. {operx_cli-0.4.0 → operx_cli-0.6.0}/operx_cli/settings.py +29 -2
  26. {operx_cli-0.4.0 → operx_cli-0.6.0}/operx_cli/shell.py +1 -0
  27. {operx_cli-0.4.0 → operx_cli-0.6.0}/operx_cli/spreadsheet.py +4 -2
  28. operx_cli-0.6.0/operx_cli/welcome.py +236 -0
  29. operx_cli-0.4.0/README.md → operx_cli-0.6.0/operx_cli.egg-info/PKG-INFO +280 -243
  30. {operx_cli-0.4.0 → operx_cli-0.6.0}/operx_cli.egg-info/SOURCES.txt +7 -0
  31. {operx_cli-0.4.0 → operx_cli-0.6.0}/pyproject.toml +1 -1
  32. operx_cli-0.6.0/tests/test_api_campos.py +166 -0
  33. operx_cli-0.6.0/tests/test_articulos.py +74 -0
  34. operx_cli-0.6.0/tests/test_completar.py +127 -0
  35. operx_cli-0.6.0/tests/test_json_writes.py +184 -0
  36. {operx_cli-0.4.0 → operx_cli-0.6.0}/tests/test_login.py +15 -0
  37. {operx_cli-0.4.0 → operx_cli-0.6.0}/tests/test_logout_and_routes.py +25 -2
  38. {operx_cli-0.4.0 → operx_cli-0.6.0}/tests/test_lookup.py +1 -1
  39. {operx_cli-0.4.0 → operx_cli-0.6.0}/tests/test_record_completion.py +13 -0
  40. {operx_cli-0.4.0 → operx_cli-0.6.0}/tests/test_registros.py +59 -0
  41. {operx_cli-0.4.0 → operx_cli-0.6.0}/tests/test_welcome.py +98 -0
  42. operx_cli-0.4.0/operx_cli/commands/raw.py +0 -151
  43. operx_cli-0.4.0/operx_cli/welcome.py +0 -113
  44. {operx_cli-0.4.0 → operx_cli-0.6.0}/operx_cli/agent_guide.py +0 -0
  45. {operx_cli-0.4.0 → operx_cli-0.6.0}/operx_cli/browser_login.py +0 -0
  46. {operx_cli-0.4.0 → operx_cli-0.6.0}/operx_cli/client.py +0 -0
  47. {operx_cli-0.4.0 → operx_cli-0.6.0}/operx_cli/commands/__init__.py +0 -0
  48. {operx_cli-0.4.0 → operx_cli-0.6.0}/operx_cli/commands/reportes.py +0 -0
  49. {operx_cli-0.4.0 → operx_cli-0.6.0}/operx_cli/commands/search.py +0 -0
  50. {operx_cli-0.4.0 → operx_cli-0.6.0}/operx_cli/commands/update.py +0 -0
  51. {operx_cli-0.4.0 → operx_cli-0.6.0}/operx_cli/output.py +0 -0
  52. {operx_cli-0.4.0 → operx_cli-0.6.0}/operx_cli/self_update.py +0 -0
  53. {operx_cli-0.4.0 → operx_cli-0.6.0}/operx_cli/updates.py +0 -0
  54. {operx_cli-0.4.0 → operx_cli-0.6.0}/operx_cli/values.py +0 -0
  55. {operx_cli-0.4.0 → operx_cli-0.6.0}/operx_cli.egg-info/dependency_links.txt +0 -0
  56. {operx_cli-0.4.0 → operx_cli-0.6.0}/operx_cli.egg-info/entry_points.txt +0 -0
  57. {operx_cli-0.4.0 → operx_cli-0.6.0}/operx_cli.egg-info/requires.txt +0 -0
  58. {operx_cli-0.4.0 → operx_cli-0.6.0}/operx_cli.egg-info/top_level.txt +0 -0
  59. {operx_cli-0.4.0 → operx_cli-0.6.0}/setup.cfg +0 -0
  60. {operx_cli-0.4.0 → operx_cli-0.6.0}/tests/test_agentes.py +0 -0
  61. {operx_cli-0.4.0 → operx_cli-0.6.0}/tests/test_app.py +0 -0
  62. {operx_cli-0.4.0 → operx_cli-0.6.0}/tests/test_cards.py +0 -0
  63. {operx_cli-0.4.0 → operx_cli-0.6.0}/tests/test_client.py +0 -0
  64. {operx_cli-0.4.0 → operx_cli-0.6.0}/tests/test_inventario_lecturas.py +0 -0
  65. {operx_cli-0.4.0 → operx_cli-0.6.0}/tests/test_more_of_the_api.py +0 -0
  66. {operx_cli-0.4.0 → operx_cli-0.6.0}/tests/test_ordenes.py +0 -0
  67. {operx_cli-0.4.0 → operx_cli-0.6.0}/tests/test_output.py +0 -0
  68. {operx_cli-0.4.0 → operx_cli-0.6.0}/tests/test_personas.py +0 -0
  69. {operx_cli-0.4.0 → operx_cli-0.6.0}/tests/test_preventivos.py +0 -0
  70. {operx_cli-0.4.0 → operx_cli-0.6.0}/tests/test_self_update.py +0 -0
  71. {operx_cli-0.4.0 → operx_cli-0.6.0}/tests/test_settings.py +0 -0
  72. {operx_cli-0.4.0 → operx_cli-0.6.0}/tests/test_shell.py +0 -0
  73. {operx_cli-0.4.0 → operx_cli-0.6.0}/tests/test_spreadsheet.py +0 -0
  74. {operx_cli-0.4.0 → operx_cli-0.6.0}/tests/test_sst_ambiental.py +0 -0
  75. {operx_cli-0.4.0 → operx_cli-0.6.0}/tests/test_updates.py +0 -0
  76. {operx_cli-0.4.0 → operx_cli-0.6.0}/tests/test_values.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: operx-cli
3
- Version: 0.4.0
3
+ Version: 0.6.0
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
@@ -80,9 +80,11 @@ este equipo. Un token puesto en `OPERX_TOKEN` no lo toca.
80
80
  ## Modo interactivo
81
81
 
82
82
  Escribe `operx` solo, en una terminal, y se abre la pantalla de bienvenida
83
- (quién eres y los números de hoy: órdenes abiertas, vencidas, artículos bajo
84
- el mínimo) con un prompt. Ahí escribes los comandos sin el `operx`, con
85
- Tab para completar y ↑ para repetir lo anterior:
83
+ con un prompt: quién eres, un aviso si tu acceso vence en menos de una
84
+ semana, y los números de hoy de cada producto de tu empresa (órdenes abiertas
85
+ y vencidas, artículos bajo el mínimo, equipos parados, acciones del SG-SST,
86
+ obligaciones ambientales del mes). Ahí escribes los comandos sin el `operx`,
87
+ con Tab para completar y ↑ para repetir lo anterior:
86
88
 
87
89
  ```
88
90
  operx › ordenes listar --vencidas
@@ -95,6 +97,14 @@ operx › salir
95
97
  muestran solo los comandos de los productos que tiene tu empresa. En un script
96
98
  o una tubería, `operx` solo muestra la ayuda y no espera a nadie.
97
99
 
100
+ ### Tab en PowerShell
101
+
102
+ `operx completar` hace que Tab complete los comandos y las opciones de operx
103
+ también en tu PowerShell de siempre (`operx ord` + Tab → `operx ordenes`).
104
+ Pregunta antes de agregar una línea a tu perfil de PowerShell, y `operx
105
+ completar --quitar` la quita. No toca la política de ejecución: si tu
106
+ PowerShell no corre scripts, te dice la línea para permitir los tuyos.
107
+
98
108
  ## Comandos
99
109
 
100
110
  ```sh
@@ -124,10 +134,17 @@ operx preventivos ejecuciones 12
124
134
  operx equipos listar --buscar compresor
125
135
  operx equipos ver BOM-04
126
136
  operx equipos crear --nombre "Bomba 4" --codigo BOM-04 --lugar "Planta Norte"
137
+ operx equipos editar BOM-04 --estado en-mantenimiento --lugar "Taller"
127
138
  operx clientes listar
128
139
  operx clientes crear --nombre "Acme S.A.S." --nit 900123456
129
140
  operx clientes crear --nombre "Filtros Ltda" --rol proveedor
141
+ operx clientes editar 900123456 --telefono "601 555 0101"
130
142
  operx lugares listar
143
+ operx lugares crear --nombre "Bodega central" --tipo bodega --dentro-de "Planta Norte"
144
+
145
+ operx articulos listar --bajo-minimo
146
+ operx articulos ver FIL-010
147
+ operx articulos crear --nombre "Filtro de aceite" --unidad und --tipo consumible
131
148
 
132
149
  operx inventario existencias --buscar filtro
133
150
  operx inventario entrada --articulo FIL-010 --lugar "Bodega central" --cantidad 10 --costo-unitario 1.500,50
@@ -179,7 +196,9 @@ llevas el SG-SST o lo ambiental de tus clientes, `operx sst empresas` y
179
196
  ### Antes de escribir
180
197
 
181
198
  Todo lo que crea o cambia algo pregunta antes. En un script o una tarea
182
- programada no hay a quién preguntar: agrega `--si`. Cada escritura queda en
199
+ programada no hay a quién preguntar: agrega `--si`. Con `--json`, lo que
200
+ escribe responde el registro creado o cambiado (con su `id`) en vez de una
201
+ frase. Cada escritura queda en
183
202
  el historial del token (Acceso por API › el token › Actividad) marcada como
184
203
  hecha desde la CLI.
185
204
 
@@ -194,13 +213,17 @@ Usuarios y acceso.
194
213
 
195
214
  ### Cualquier otra llamada
196
215
 
197
- Lo que no tiene comando propio se hace con `operx api`. `operx api rutas`
198
- lista todas las direcciones que tu token puede llamar (`operx api rutas
199
- compresor` deja las que lo mencionan); también están en Acceso por API ›
200
- Documentación:
216
+ Lo que no tiene comando propio se hace con `operx api`: todo lo que tu
217
+ token puede hacer, más de 400 llamadas. `operx api rutas` las lista
218
+ (`operx api rutas sst inspections` deja las que tienen esas palabras), y
219
+ `operx api campos RUTA` dice qué lleva una: sus filtros, cada campo con su
220
+ tipo, si es obligatorio y los valores permitidos. También están en Acceso
221
+ por API › Documentación:
201
222
 
202
223
  ```sh
203
- operx api rutas schedules
224
+ operx api rutas repuestos
225
+ operx api campos inventory/work-orders/1234/parts/ --metodo POST
226
+ operx api POST inventory/work-orders/1234/parts/ -d '{"action": "usar", "item": 3, "quantity": "2", "location": 2}'
204
227
  operx api GET pm/schedules/ -q search=compresor
205
228
  operx api POST contacts/ -d @contacto.json
206
229
  operx api GET work-orders/export/ -o ordenes.csv
@@ -1,257 +1,266 @@
1
- Metadata-Version: 2.4
2
- Name: operx-cli
3
- Version: 0.4.0
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: `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 --refresh` lo deja bien.
43
-
44
- ## Entrar
45
-
46
- ```sh
47
- operx login
48
- ```
49
-
50
- 1. La terminal muestra un código y abre el navegador en la página de OperX.
51
- 2. Entras como siempre. La página dice qué terminal pide acceso: apruébalo solo
52
- si acabas de escribir `operx login` en tu propio computador y el código es
53
- el mismo. Escribe el código de 6 dígitos de tu app de autenticación (o tu
54
- contraseña, si no usas una) y elige *Solo lectura* o *Lectura y
55
- escritura*.
56
- 3. Vuelve a la terminal: ya entraste. Nunca ves ni copias un token.
57
-
58
- Tu rol necesita el permiso «Acceso por API» (Ajustes › Usuarios y acceso ›
59
- Roles); un administrador lo da. El acceso dura 90 días y lo ves, y puedes
60
- revocarlo, en el menú de tu cuenta › Acceso por API.
61
-
62
- El token queda en el llavero del sistema (en Windows, el Administrador de
63
- credenciales; en Mac, el Llavero). En un equipo sin llavero, como un servidor
64
- Linux, queda en un archivo de la carpeta de operx que solo tú puedes leer
65
- (`~/.config/operx/token-principal`, permisos 600). En un servidor sin
66
- navegador: `operx login --token` te deja pegar un token creado en Acceso por
67
- API, o puedes usar variables de entorno: `OPERX_TOKEN` (el token) y, si no es
68
- producción, `OPERX_DIRECCION`.
69
-
70
- Para otra dirección u otra empresa, usa un perfil:
71
-
72
- ```sh
73
- operx --perfil pruebas login --direccion https://…
74
- operx --perfil pruebas ordenes listar
75
- ```
76
-
77
- `operx logout` cierra la sesión: revoca el token en el servidor y lo borra de
78
- este equipo. Un token puesto en `OPERX_TOKEN` no lo toca.
79
-
80
- ## Modo interactivo
81
-
82
- Escribe `operx` solo, en una terminal, y se abre la pantalla de bienvenida
83
- (quién eres y los números de hoy: órdenes abiertas, vencidas, artículos bajo
84
- el mínimo) con un prompt. Ahí escribes los comandos sin el `operx`, con
85
- Tab para completar y ↑ para repetir lo anterior:
86
-
87
- ```
88
- operx › ordenes listar --vencidas
89
- operx › buscar "bomba"
90
- operx › ayuda
91
- operx › salir
92
- ```
93
-
94
- `salir` (o Ctrl+D) termina la sesión sin borrar tu token. `ayuda` y Tab
95
- muestran solo los comandos de los productos que tiene tu empresa. En un script
96
- o una tubería, `operx` solo muestra la ayuda y no espera a nadie.
97
-
98
- ## Comandos
99
-
100
- ```sh
101
- operx buscar "bomba" # como la barra de búsqueda de la app
102
-
103
- operx ordenes listar --estado en-progreso --asignada-a yo
104
- operx ordenes ver 1234
105
- operx ordenes crear --titulo "Cambio de rodamiento" --equipo BOM-04 --prioridad alta --vence 30/10/2026
106
- operx ordenes estado 1234 completada
107
- operx ordenes asignar 1234 "Pedro Pérez"
108
- operx ordenes comentar 1234 "Llegó el repuesto"
109
- operx ordenes editar 1234 --prioridad critica --vence 05/11/2026
110
- operx ordenes adjuntar 1234 foto.jpg --momento despues
111
-
112
- operx reportes indicadores --dias 30 # MTTR, MTBF, cumplimiento de preventivos
113
- operx reportes vencidas
114
- operx reportes carga # órdenes por persona
115
- operx avisos # tus avisos sin leer
116
- operx agenda # lo que toca esta semana
117
-
118
- operx preventivos listar --estado vencidos
119
- operx preventivos ver 12
120
- operx preventivos crear --nombre "Lubricar rodamientos" --cada 3 --unidad meses --equipo BOM-04 --proxima 01/11/2026
121
- operx preventivos nota 12 "Usar grasa EP2"
122
- operx preventivos ejecuciones 12
123
-
124
- operx equipos listar --buscar compresor
125
- operx equipos ver BOM-04
126
- operx equipos crear --nombre "Bomba 4" --codigo BOM-04 --lugar "Planta Norte"
127
- operx clientes listar
128
- operx clientes crear --nombre "Acme S.A.S." --nit 900123456
129
- operx clientes crear --nombre "Filtros Ltda" --rol proveedor
130
- operx lugares listar
131
-
132
- operx inventario existencias --buscar filtro
133
- operx inventario entrada --articulo FIL-010 --lugar "Bodega central" --cantidad 10 --costo-unitario 1.500,50
134
- operx inventario salida --articulo FIL-010 --lugar "Bodega central" --cantidad 2 --motivo Consumo
135
- operx inventario traslado --articulo FIL-010 --cantidad 2 --de "Bodega central" --a "Camioneta 1"
136
- operx inventario ajuste --articulo FIL-010 --lugar "Bodega central" --cantidad -1 --motivo Conteo
137
- operx inventario movimientos --articulo FIL-010
138
- operx inventario revertir 4512 # deshace un movimiento equivocado
139
-
140
- operx equipos parar BOM-04 --motivo Falla --minutos 90
141
- operx equipos reanudar 21
142
- operx equipos hallazgo BOM-04 --titulo "Fuga en el sello" --severidad alta
143
- operx lecturas anular 31 --motivo "Lectura de otro equipo"
144
-
145
- operx lecturas puntos BOM-04
146
- operx lecturas registrar --punto 12 --valor 73,4
147
-
148
- operx personas listar --buscar pérez
149
- operx personas importar empleados.xlsx # revisa el archivo, no guarda
150
- operx personas importar empleados.xlsx --confirmar # guarda si ninguna fila tiene errores
151
-
152
- operx sst acciones --estado abiertas
153
- operx sst nueva-accion --titulo "Señalizar la salida" --para 15/11/2026 --responsable "Ana Ruiz"
154
- operx sst accion-hecha 7 --evidencia "Se instalaron dos señales"
155
- operx sst incidentes
156
-
157
- operx ambiental acciones
158
- operx ambiental permisos
159
- operx ambiental obligaciones --mes 11/2026
160
- operx ambiental residuo --corriente "Aceite usado" --kg 12,5
161
- operx ambiental lectura --medidor Acueducto --valor 1.234,5
162
- ```
163
-
164
- SG-SST y Ambiental van por empresa: sin `--empresa`, la de tu cuenta. Si
165
- llevas el SG-SST o lo ambiental de tus clientes, `operx sst empresas` y
166
- `operx ambiental empresas` las listan.
167
-
168
- `operx --help` y `operx ordenes --help` muestran todas las opciones.
169
-
170
- - Los equipos, lugares, clientes, artículos y personas se nombran por su
171
- código o su nombre exacto. Si dos se llaman igual, `operx` lo dice y pide
172
- el id.
173
- - Los números y las fechas se escriben como en la app: `73,4`, `1.500,50`,
174
- `30/10/2026`, `22/10/2026 08:00`.
175
- - Las listas muestran la primera página; `--todas` las trae todas.
176
- - `--json` da todo lo que responde la API; `--csv` da un CSV que Excel abre
177
- bien (`operx equipos listar --todas --csv > equipos.csv`).
178
-
179
- ### Antes de escribir
180
-
181
- Todo lo que crea o cambia algo pregunta antes. En un script o una tarea
182
- programada no hay a quién preguntar: agrega `--si`. Cada escritura queda en
183
- el historial del token (Acceso por API › el token › Actividad) marcada como
184
- hecha desde la CLI.
185
-
186
- ### Importar personas
187
-
188
- La primera columna con el nombre basta. `operx` reconoce las columnas
189
- Nombres, Apellidos, Código, Cargo, Tipo de contrato, Fecha de ingreso, Fin de
190
- contrato, Celular, Sede y las de contacto de emergencia, con o sin tildes.
191
- Una columna con otro nombre se indica con `--mapa "Tu columna=campo"`.
192
- Nadie recibe acceso a la app al importarlo: las invitaciones se envían en
193
- Usuarios y acceso.
194
-
195
- ### Cualquier otra llamada
196
-
197
- Lo que no tiene comando propio se hace con `operx api`. `operx api rutas`
198
- lista todas las direcciones que tu token puede llamar (`operx api rutas
199
- compresor` deja las que lo mencionan); también están en Acceso por API ›
200
- Documentación:
201
-
202
- ```sh
203
- operx api rutas schedules
204
- operx api GET pm/schedules/ -q search=compresor
205
- operx api POST contacts/ -d @contacto.json
206
- operx api GET work-orders/export/ -o ordenes.csv
207
- operx api POST work-orders/1234/attachments/ -a file=foto.jpg -d '{"file_type": "photo"}'
208
- ```
209
-
210
- En Git Bash, una dirección que empieza por `/` se vuelve una ruta de Windows:
211
- escríbela sin la barra inicial, como arriba.
212
-
213
- ## Para agentes de IA
214
-
215
- `operx agentes` imprime una guía para un agente de IA (Claude, ChatGPT,
216
- Copilot, Codex…): las reglas para usar `operx` bien (leer con `--json`,
217
- preguntar antes de escribir, no tocar tokens) y cada comando con sus opciones.
218
- Dile a tu agente: «Ejecuta `operx agentes` y sigue esa guía».
219
-
220
- ## Para desarrollar
221
-
222
- ```sh
223
- cd cli
224
- python -m venv .venv && .venv/Scripts/python -m pip install -e ".[test]"
225
- .venv/Scripts/python -m pytest
226
- ```
227
-
228
- `operx_cli/client.py` es lo único que habla con la red; el servidor MCP lo
229
- usará igual.
230
-
231
- ### Publicar una versión
232
-
233
- El paquete es `operx-cli` en PyPI. Una versión publicada no se puede reemplazar:
234
- si algo falla, se sube la siguiente.
235
-
236
- 1. Sube el número en `pyproject.toml` y en `operx_cli/__init__.py`.
237
- 2. Las funciones nuevas del servidor (como `operx login`) tienen que estar ya
238
- desplegadas en producción antes de publicar: el paquete nuevo las llama.
239
- 3. Desde `cli/`:
240
-
241
- ```sh
242
- uv build --clear
243
- uv publish
244
- ```
245
-
246
- `uv publish` toma el token de PyPI de la variable de entorno
247
- `UV_PUBLISH_TOKEN`. Usa un token solo del proyecto `operx-cli` (PyPI › Account
248
- settings › API tokens). Se guarda una vez, en tu usuario de Windows, desde
249
- PowerShell; lo pegas donde lo pide y no se ve:
250
-
251
- ```powershell
252
- $token = Read-Host "Token de PyPI" -AsSecureString
253
- [Environment]::SetEnvironmentVariable("UV_PUBLISH_TOKEN", [Net.NetworkCredential]::new("", $token).Password, "User")
254
- ```
255
-
256
- Las terminales que abras después ya lo tienen. El token es secreto: nunca va
257
- 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 --refresh` 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; en Mac, el Llavero). En un equipo sin llavero, como un servidor
50
+ Linux, queda en un archivo de la carpeta de operx que solo tú puedes leer
51
+ (`~/.config/operx/token-principal`, permisos 600). En un servidor sin
52
+ navegador: `operx login --token` te deja pegar un token creado en Acceso por
53
+ API, o puedes usar variables de entorno: `OPERX_TOKEN` (el token) y, si no es
54
+ producción, `OPERX_DIRECCION`.
55
+
56
+ Para otra dirección u otra empresa, usa un perfil:
57
+
58
+ ```sh
59
+ operx --perfil pruebas login --direccion https://…
60
+ operx --perfil pruebas ordenes listar
61
+ ```
62
+
63
+ `operx logout` cierra la sesión: revoca el token en el servidor y lo borra de
64
+ este equipo. Un token puesto en `OPERX_TOKEN` no lo toca.
65
+
66
+ ## Modo interactivo
67
+
68
+ Escribe `operx` solo, en una terminal, y se abre la pantalla de bienvenida
69
+ con un prompt: quién eres, un aviso si tu acceso vence en menos de una
70
+ semana, y los números de hoy de cada producto de tu empresa (órdenes abiertas
71
+ y vencidas, artículos bajo el mínimo, equipos parados, acciones del SG-SST,
72
+ obligaciones ambientales del mes). Ahí escribes los comandos sin el `operx`,
73
+ con Tab para completar y ↑ para repetir lo anterior:
74
+
75
+ ```
76
+ operx › ordenes listar --vencidas
77
+ operx › buscar "bomba"
78
+ operx › ayuda
79
+ operx › salir
80
+ ```
81
+
82
+ `salir` (o Ctrl+D) termina la sesión sin borrar tu token. `ayuda` y Tab
83
+ muestran solo los comandos de los productos que tiene tu empresa. En un script
84
+ o una tubería, `operx` solo muestra la ayuda y no espera a nadie.
85
+
86
+ ### Tab en PowerShell
87
+
88
+ `operx completar` hace que Tab complete los comandos y las opciones de operx
89
+ también en tu PowerShell de siempre (`operx ord` + Tab → `operx ordenes`).
90
+ Pregunta antes de agregar una línea a tu perfil de PowerShell, y `operx
91
+ completar --quitar` la quita. No toca la política de ejecución: si tu
92
+ PowerShell no corre scripts, te dice la línea para permitir los tuyos.
93
+
94
+ ## Comandos
95
+
96
+ ```sh
97
+ operx buscar "bomba" # como la barra de búsqueda de la app
98
+
99
+ operx ordenes listar --estado en-progreso --asignada-a yo
100
+ operx ordenes ver 1234
101
+ operx ordenes crear --titulo "Cambio de rodamiento" --equipo BOM-04 --prioridad alta --vence 30/10/2026
102
+ operx ordenes estado 1234 completada
103
+ operx ordenes asignar 1234 "Pedro Pérez"
104
+ operx ordenes comentar 1234 "Llegó el repuesto"
105
+ operx ordenes editar 1234 --prioridad critica --vence 05/11/2026
106
+ operx ordenes adjuntar 1234 foto.jpg --momento despues
107
+
108
+ operx reportes indicadores --dias 30 # MTTR, MTBF, cumplimiento de preventivos
109
+ operx reportes vencidas
110
+ operx reportes carga # órdenes por persona
111
+ operx avisos # tus avisos sin leer
112
+ operx agenda # lo que toca esta semana
113
+
114
+ operx preventivos listar --estado vencidos
115
+ operx preventivos ver 12
116
+ operx preventivos crear --nombre "Lubricar rodamientos" --cada 3 --unidad meses --equipo BOM-04 --proxima 01/11/2026
117
+ operx preventivos nota 12 "Usar grasa EP2"
118
+ operx preventivos ejecuciones 12
119
+
120
+ operx equipos listar --buscar compresor
121
+ operx equipos ver BOM-04
122
+ operx equipos crear --nombre "Bomba 4" --codigo BOM-04 --lugar "Planta Norte"
123
+ operx equipos editar BOM-04 --estado en-mantenimiento --lugar "Taller"
124
+ operx clientes listar
125
+ operx clientes crear --nombre "Acme S.A.S." --nit 900123456
126
+ operx clientes crear --nombre "Filtros Ltda" --rol proveedor
127
+ operx clientes editar 900123456 --telefono "601 555 0101"
128
+ operx lugares listar
129
+ operx lugares crear --nombre "Bodega central" --tipo bodega --dentro-de "Planta Norte"
130
+
131
+ operx articulos listar --bajo-minimo
132
+ operx articulos ver FIL-010
133
+ operx articulos crear --nombre "Filtro de aceite" --unidad und --tipo consumible
134
+
135
+ operx inventario existencias --buscar filtro
136
+ operx inventario entrada --articulo FIL-010 --lugar "Bodega central" --cantidad 10 --costo-unitario 1.500,50
137
+ operx inventario salida --articulo FIL-010 --lugar "Bodega central" --cantidad 2 --motivo Consumo
138
+ operx inventario traslado --articulo FIL-010 --cantidad 2 --de "Bodega central" --a "Camioneta 1"
139
+ operx inventario ajuste --articulo FIL-010 --lugar "Bodega central" --cantidad -1 --motivo Conteo
140
+ operx inventario movimientos --articulo FIL-010
141
+ operx inventario revertir 4512 # deshace un movimiento equivocado
142
+
143
+ operx equipos parar BOM-04 --motivo Falla --minutos 90
144
+ operx equipos reanudar 21
145
+ operx equipos hallazgo BOM-04 --titulo "Fuga en el sello" --severidad alta
146
+ operx lecturas anular 31 --motivo "Lectura de otro equipo"
147
+
148
+ operx lecturas puntos BOM-04
149
+ operx lecturas registrar --punto 12 --valor 73,4
150
+
151
+ operx personas listar --buscar pérez
152
+ operx personas importar empleados.xlsx # revisa el archivo, no guarda
153
+ operx personas importar empleados.xlsx --confirmar # guarda si ninguna fila tiene errores
154
+
155
+ operx sst acciones --estado abiertas
156
+ operx sst nueva-accion --titulo "Señalizar la salida" --para 15/11/2026 --responsable "Ana Ruiz"
157
+ operx sst accion-hecha 7 --evidencia "Se instalaron dos señales"
158
+ operx sst incidentes
159
+
160
+ operx ambiental acciones
161
+ operx ambiental permisos
162
+ operx ambiental obligaciones --mes 11/2026
163
+ operx ambiental residuo --corriente "Aceite usado" --kg 12,5
164
+ operx ambiental lectura --medidor Acueducto --valor 1.234,5
165
+ ```
166
+
167
+ SG-SST y Ambiental van por empresa: sin `--empresa`, la de tu cuenta. Si
168
+ llevas el SG-SST o lo ambiental de tus clientes, `operx sst empresas` y
169
+ `operx ambiental empresas` las listan.
170
+
171
+ `operx --help` y `operx ordenes --help` muestran todas las opciones.
172
+
173
+ - Los equipos, lugares, clientes, artículos y personas se nombran por su
174
+ código o su nombre exacto. Si dos se llaman igual, `operx` lo dice y pide
175
+ el id.
176
+ - Los números y las fechas se escriben como en la app: `73,4`, `1.500,50`,
177
+ `30/10/2026`, `22/10/2026 08:00`.
178
+ - Las listas muestran la primera página; `--todas` las trae todas.
179
+ - `--json` da todo lo que responde la API; `--csv` da un CSV que Excel abre
180
+ bien (`operx equipos listar --todas --csv > equipos.csv`).
181
+
182
+ ### Antes de escribir
183
+
184
+ Todo lo que crea o cambia algo pregunta antes. En un script o una tarea
185
+ programada no hay a quién preguntar: agrega `--si`. Con `--json`, lo que
186
+ escribe responde el registro creado o cambiado (con su `id`) en vez de una
187
+ frase. Cada escritura queda en
188
+ el historial del token (Acceso por API › el token › Actividad) marcada como
189
+ hecha desde la CLI.
190
+
191
+ ### Importar personas
192
+
193
+ La primera columna con el nombre basta. `operx` reconoce las columnas
194
+ Nombres, Apellidos, Código, Cargo, Tipo de contrato, Fecha de ingreso, Fin de
195
+ contrato, Celular, Sede y las de contacto de emergencia, con o sin tildes.
196
+ Una columna con otro nombre se indica con `--mapa "Tu columna=campo"`.
197
+ Nadie recibe acceso a la app al importarlo: las invitaciones se envían en
198
+ Usuarios y acceso.
199
+
200
+ ### Cualquier otra llamada
201
+
202
+ Lo que no tiene comando propio se hace con `operx api`: todo lo que tu
203
+ token puede hacer, más de 400 llamadas. `operx api rutas` las lista
204
+ (`operx api rutas sst inspections` deja las que tienen esas palabras), y
205
+ `operx api campos RUTA` dice qué lleva una: sus filtros, cada campo con su
206
+ tipo, si es obligatorio y los valores permitidos. También están en Acceso
207
+ por API › Documentación:
208
+
209
+ ```sh
210
+ operx api rutas repuestos
211
+ operx api campos inventory/work-orders/1234/parts/ --metodo POST
212
+ operx api POST inventory/work-orders/1234/parts/ -d '{"action": "usar", "item": 3, "quantity": "2", "location": 2}'
213
+ operx api GET pm/schedules/ -q search=compresor
214
+ operx api POST contacts/ -d @contacto.json
215
+ operx api GET work-orders/export/ -o ordenes.csv
216
+ operx api POST work-orders/1234/attachments/ -a file=foto.jpg -d '{"file_type": "photo"}'
217
+ ```
218
+
219
+ En Git Bash, una dirección que empieza por `/` se vuelve una ruta de Windows:
220
+ escríbela sin la barra inicial, como arriba.
221
+
222
+ ## Para agentes de IA
223
+
224
+ `operx agentes` imprime una guía para un agente de IA (Claude, ChatGPT,
225
+ Copilot, Codex…): las reglas para usar `operx` bien (leer con `--json`,
226
+ preguntar antes de escribir, no tocar tokens) y cada comando con sus opciones.
227
+ Dile a tu agente: «Ejecuta `operx agentes` y sigue esa guía».
228
+
229
+ ## Para desarrollar
230
+
231
+ ```sh
232
+ cd cli
233
+ python -m venv .venv && .venv/Scripts/python -m pip install -e ".[test]"
234
+ .venv/Scripts/python -m pytest
235
+ ```
236
+
237
+ `operx_cli/client.py` es lo único que habla con la red; el servidor MCP lo
238
+ usará igual.
239
+
240
+ ### Publicar una versión
241
+
242
+ El paquete es `operx-cli` en PyPI. Una versión publicada no se puede reemplazar:
243
+ si algo falla, se sube la siguiente.
244
+
245
+ 1. Sube el número en `pyproject.toml` y en `operx_cli/__init__.py`.
246
+ 2. Las funciones nuevas del servidor (como `operx login`) tienen que estar ya
247
+ desplegadas en producción antes de publicar: el paquete nuevo las llama.
248
+ 3. Desde `cli/`:
249
+
250
+ ```sh
251
+ uv build --clear
252
+ uv publish
253
+ ```
254
+
255
+ `uv publish` toma el token de PyPI de la variable de entorno
256
+ `UV_PUBLISH_TOKEN`. Usa un token solo del proyecto `operx-cli` (PyPI › Account
257
+ settings › API tokens). Se guarda una vez, en tu usuario de Windows, desde
258
+ PowerShell; lo pegas donde lo pide y no se ve:
259
+
260
+ ```powershell
261
+ $token = Read-Host "Token de PyPI" -AsSecureString
262
+ [Environment]::SetEnvironmentVariable("UV_PUBLISH_TOKEN", [Net.NetworkCredential]::new("", $token).Password, "User")
263
+ ```
264
+
265
+ Las terminales que abras después ya lo tienen. El token es secreto: nunca va
266
+ en un archivo del repositorio ni en un chat.