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