luge-cli 0.17.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.
- luge_cli-0.17.0/.github/workflows/ci.yml +55 -0
- luge_cli-0.17.0/.gitignore +18 -0
- luge_cli-0.17.0/.pre-commit-config.yaml +34 -0
- luge_cli-0.17.0/CHANGELOG.md +123 -0
- luge_cli-0.17.0/LICENSE +21 -0
- luge_cli-0.17.0/Makefile +65 -0
- luge_cli-0.17.0/PKG-INFO +346 -0
- luge_cli-0.17.0/README.md +299 -0
- luge_cli-0.17.0/pyproject.toml +87 -0
- luge_cli-0.17.0/src/luge_cli/__init__.py +7 -0
- luge_cli-0.17.0/src/luge_cli/__main__.py +85 -0
- luge_cli-0.17.0/src/luge_cli/client/__init__.py +37 -0
- luge_cli-0.17.0/src/luge_cli/client/artifacts.py +31 -0
- luge_cli-0.17.0/src/luge_cli/client/automations.py +46 -0
- luge_cli-0.17.0/src/luge_cli/client/base.py +81 -0
- luge_cli-0.17.0/src/luge_cli/client/boards.py +78 -0
- luge_cli-0.17.0/src/luge_cli/client/channels.py +42 -0
- luge_cli-0.17.0/src/luge_cli/client/chat.py +56 -0
- luge_cli-0.17.0/src/luge_cli/client/employees.py +25 -0
- luge_cli-0.17.0/src/luge_cli/client/schedules.py +40 -0
- luge_cli-0.17.0/src/luge_cli/client/settings.py +41 -0
- luge_cli-0.17.0/src/luge_cli/client/skills.py +32 -0
- luge_cli-0.17.0/src/luge_cli/client/webhooks.py +42 -0
- luge_cli-0.17.0/src/luge_cli/client/workflows.py +70 -0
- luge_cli-0.17.0/src/luge_cli/commands/__init__.py +1 -0
- luge_cli-0.17.0/src/luge_cli/commands/_common.py +38 -0
- luge_cli-0.17.0/src/luge_cli/commands/activity_cmd.py +86 -0
- luge_cli-0.17.0/src/luge_cli/commands/agent_cmd.py +165 -0
- luge_cli-0.17.0/src/luge_cli/commands/artifact_cmd.py +109 -0
- luge_cli-0.17.0/src/luge_cli/commands/auth_cmd.py +40 -0
- luge_cli-0.17.0/src/luge_cli/commands/board_cmd.py +42 -0
- luge_cli-0.17.0/src/luge_cli/commands/card/__init__.py +16 -0
- luge_cli-0.17.0/src/luge_cli/commands/card/read.py +123 -0
- luge_cli-0.17.0/src/luge_cli/commands/card/write.py +148 -0
- luge_cli-0.17.0/src/luge_cli/commands/channel_cmd.py +161 -0
- luge_cli-0.17.0/src/luge_cli/commands/claude_cmd.py +50 -0
- luge_cli-0.17.0/src/luge_cli/commands/colleagues_cmd.py +49 -0
- luge_cli-0.17.0/src/luge_cli/commands/dm_cmd.py +74 -0
- luge_cli-0.17.0/src/luge_cli/commands/schedule_cmd.py +194 -0
- luge_cli-0.17.0/src/luge_cli/commands/settings_cmd.py +145 -0
- luge_cli-0.17.0/src/luge_cli/commands/skill_cmd.py +142 -0
- luge_cli-0.17.0/src/luge_cli/commands/webhook_cmd.py +210 -0
- luge_cli-0.17.0/src/luge_cli/commands/workflow_cmd.py +237 -0
- luge_cli-0.17.0/src/luge_cli/config.py +72 -0
- luge_cli-0.17.0/src/luge_cli/errors.py +12 -0
- luge_cli-0.17.0/src/luge_cli/filters.py +96 -0
- luge_cli-0.17.0/src/luge_cli/render/__init__.py +83 -0
- luge_cli-0.17.0/src/luge_cli/render/_core.py +100 -0
- luge_cli-0.17.0/src/luge_cli/render/artifacts.py +51 -0
- luge_cli-0.17.0/src/luge_cli/render/automations.py +77 -0
- luge_cli-0.17.0/src/luge_cli/render/boards.py +130 -0
- luge_cli-0.17.0/src/luge_cli/render/chat.py +124 -0
- luge_cli-0.17.0/src/luge_cli/render/config.py +19 -0
- luge_cli-0.17.0/src/luge_cli/render/messages.py +43 -0
- luge_cli-0.17.0/src/luge_cli/render/schedules.py +67 -0
- luge_cli-0.17.0/src/luge_cli/render/settings.py +117 -0
- luge_cli-0.17.0/src/luge_cli/render/skills.py +40 -0
- luge_cli-0.17.0/src/luge_cli/render/webhooks.py +83 -0
- luge_cli-0.17.0/src/luge_cli/render/workflows.py +80 -0
- luge_cli-0.17.0/src/luge_cli/resolve.py +155 -0
- luge_cli-0.17.0/src/luge_cli/schedule_spec.py +105 -0
- luge_cli-0.17.0/src/luge_cli/skill/luge-platform/SKILL.md +247 -0
- luge_cli-0.17.0/src/luge_cli/workflow_graph.py +48 -0
- luge_cli-0.17.0/tests/conftest.py +50 -0
- luge_cli-0.17.0/tests/test_agent_reply.py +32 -0
- luge_cli-0.17.0/tests/test_cli.py +136 -0
- luge_cli-0.17.0/tests/test_client.py +532 -0
- luge_cli-0.17.0/tests/test_config.py +44 -0
- luge_cli-0.17.0/tests/test_filters.py +64 -0
- luge_cli-0.17.0/tests/test_resolve.py +107 -0
- luge_cli-0.17.0/tests/test_schedule_spec.py +55 -0
- luge_cli-0.17.0/tests/test_settings_cmd.py +37 -0
- luge_cli-0.17.0/tests/test_workflow_graph.py +28 -0
- luge_cli-0.17.0/uv.lock +986 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
11
|
+
concurrency:
|
|
12
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
13
|
+
cancel-in-progress: true
|
|
14
|
+
|
|
15
|
+
jobs:
|
|
16
|
+
lint:
|
|
17
|
+
name: Lint & Format
|
|
18
|
+
runs-on: ubuntu-latest
|
|
19
|
+
steps:
|
|
20
|
+
- uses: actions/checkout@v4
|
|
21
|
+
- uses: astral-sh/setup-uv@v5
|
|
22
|
+
with:
|
|
23
|
+
python-version: "3.12"
|
|
24
|
+
enable-cache: true
|
|
25
|
+
- run: uv sync
|
|
26
|
+
- name: Ruff lint
|
|
27
|
+
run: uv run ruff check --output-format=github .
|
|
28
|
+
- name: Ruff format check
|
|
29
|
+
run: uv run ruff format --check .
|
|
30
|
+
|
|
31
|
+
typecheck:
|
|
32
|
+
name: Type Check
|
|
33
|
+
runs-on: ubuntu-latest
|
|
34
|
+
steps:
|
|
35
|
+
- uses: actions/checkout@v4
|
|
36
|
+
- uses: astral-sh/setup-uv@v5
|
|
37
|
+
with:
|
|
38
|
+
python-version: "3.12"
|
|
39
|
+
enable-cache: true
|
|
40
|
+
- run: uv sync
|
|
41
|
+
- name: mypy
|
|
42
|
+
run: uv run mypy src/luge_cli
|
|
43
|
+
|
|
44
|
+
test:
|
|
45
|
+
name: Test
|
|
46
|
+
runs-on: ubuntu-latest
|
|
47
|
+
steps:
|
|
48
|
+
- uses: actions/checkout@v4
|
|
49
|
+
- uses: astral-sh/setup-uv@v5
|
|
50
|
+
with:
|
|
51
|
+
python-version: "3.12"
|
|
52
|
+
enable-cache: true
|
|
53
|
+
- run: uv sync
|
|
54
|
+
- name: pytest
|
|
55
|
+
run: uv run pytest -q
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
.venv/
|
|
5
|
+
*.egg-info/
|
|
6
|
+
dist/
|
|
7
|
+
build/
|
|
8
|
+
|
|
9
|
+
# Tooling
|
|
10
|
+
.pytest_cache/
|
|
11
|
+
.ruff_cache/
|
|
12
|
+
.mypy_cache/
|
|
13
|
+
|
|
14
|
+
# Local credentials must never be committed
|
|
15
|
+
config.toml
|
|
16
|
+
|
|
17
|
+
# Local working notes (plans, lessons) — not project content
|
|
18
|
+
tasks/
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Run `uv run pre-commit install` once (or `make hooks`) to enable.
|
|
2
|
+
# ruff/mypy run via `uv run` so the hook uses the same versions as CI and `make`.
|
|
3
|
+
repos:
|
|
4
|
+
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
5
|
+
rev: v5.0.0
|
|
6
|
+
hooks:
|
|
7
|
+
- id: trailing-whitespace
|
|
8
|
+
- id: end-of-file-fixer
|
|
9
|
+
- id: check-yaml
|
|
10
|
+
- id: check-toml
|
|
11
|
+
- id: check-json
|
|
12
|
+
- id: check-added-large-files
|
|
13
|
+
- id: check-merge-conflict
|
|
14
|
+
- id: detect-private-key
|
|
15
|
+
- id: debug-statements
|
|
16
|
+
|
|
17
|
+
- repo: local
|
|
18
|
+
hooks:
|
|
19
|
+
- id: ruff
|
|
20
|
+
name: ruff (lint)
|
|
21
|
+
entry: uv run ruff check --fix
|
|
22
|
+
language: system
|
|
23
|
+
types: [python]
|
|
24
|
+
- id: ruff-format
|
|
25
|
+
name: ruff (format)
|
|
26
|
+
entry: uv run ruff format
|
|
27
|
+
language: system
|
|
28
|
+
types: [python]
|
|
29
|
+
- id: mypy
|
|
30
|
+
name: mypy
|
|
31
|
+
entry: uv run mypy src/luge_cli
|
|
32
|
+
language: system
|
|
33
|
+
pass_filenames: false
|
|
34
|
+
types: [python]
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project are documented here. The format is based on
|
|
4
|
+
[Keep a Changelog](https://keepachangelog.com/), and this project adheres to
|
|
5
|
+
[Semantic Versioning](https://semver.org/).
|
|
6
|
+
|
|
7
|
+
## [Unreleased]
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
- Quality gates: `ruff` (lint + format) and `mypy` config, with `make lint /
|
|
11
|
+
format / typecheck / check`.
|
|
12
|
+
- GitHub Actions CI (lint, type-check, test) and pre-commit hooks (`make hooks`).
|
|
13
|
+
- PyPI packaging: full project metadata, MIT `LICENSE`, and `make build / publish`
|
|
14
|
+
(twine via `~/.pypirc`).
|
|
15
|
+
- This changelog and `make tag / release` (git tag + GitHub release).
|
|
16
|
+
|
|
17
|
+
## [0.17.0]
|
|
18
|
+
|
|
19
|
+
### Added
|
|
20
|
+
- `skill` group — manage your **personal** Luge skills (`list / show / create /
|
|
21
|
+
update / delete` over `/skills/personal`; `--require`, `--trigger`,
|
|
22
|
+
`--instructions-file`).
|
|
23
|
+
|
|
24
|
+
## [0.16.0]
|
|
25
|
+
|
|
26
|
+
### Changed
|
|
27
|
+
- The Claude Code skill installer moved from `luge-cli skill` to `luge-cli claude
|
|
28
|
+
skill install / path`, freeing the top-level `skill` namespace for Luge skills.
|
|
29
|
+
|
|
30
|
+
## [0.15.0]
|
|
31
|
+
|
|
32
|
+
### Changed
|
|
33
|
+
- Split the catch-all `chat` group into the three conversation kinds:
|
|
34
|
+
`channel` (group chat), `dm` (direct message, one-shot `dm send`), and `agent`
|
|
35
|
+
(talk to an AI), plus `colleagues` (people directory) as its own section.
|
|
36
|
+
- Renamed the bundled skill `luge-kanban` → `luge-platform`.
|
|
37
|
+
|
|
38
|
+
## [0.14.0]
|
|
39
|
+
|
|
40
|
+
### Changed
|
|
41
|
+
- `chat colleagues` now lists the full platform people directory (`/employees`);
|
|
42
|
+
`chat dm` resolves a colleague against it (replaces the tenant-only member list).
|
|
43
|
+
|
|
44
|
+
## [0.13.1]
|
|
45
|
+
|
|
46
|
+
### Fixed
|
|
47
|
+
- `chat show` / `chat post` resolve DM ids of the form `dm-<uuid>` (previously
|
|
48
|
+
treated as names, erroring).
|
|
49
|
+
|
|
50
|
+
## [0.13.0]
|
|
51
|
+
|
|
52
|
+
### Added
|
|
53
|
+
- `chat dm` (create/reopen a 1:1 direct message) and `chat members`.
|
|
54
|
+
|
|
55
|
+
## [0.12.0]
|
|
56
|
+
|
|
57
|
+
### Added
|
|
58
|
+
- `chat send --wait` polls for the agent's reply (`--timeout` / `--interval`;
|
|
59
|
+
`--wait --json` → `{conversation_id, reply}`).
|
|
60
|
+
|
|
61
|
+
### Fixed
|
|
62
|
+
- `chat send --agent` resolves an agent by name (a name previously 500'd).
|
|
63
|
+
|
|
64
|
+
## [0.11.0]
|
|
65
|
+
|
|
66
|
+
### Added
|
|
67
|
+
- `webhook` group — manage inbound webhook endpoints (`create --to agent|workflow|
|
|
68
|
+
log_only`, deliveries), returning the `inbound_url` and one-time secret.
|
|
69
|
+
|
|
70
|
+
## [0.10.0]
|
|
71
|
+
|
|
72
|
+
### Added
|
|
73
|
+
- `workflow create` (single-agent builder or `--graph <file>`) and `workflow delete`.
|
|
74
|
+
|
|
75
|
+
## [0.9.0]
|
|
76
|
+
|
|
77
|
+
### Added
|
|
78
|
+
- `artifact` group (per-room deliverables: `list / mine / show / create / delete`).
|
|
79
|
+
- The bundled skill was expanded to cover the whole CLI.
|
|
80
|
+
|
|
81
|
+
## [0.8.0]
|
|
82
|
+
|
|
83
|
+
### Added
|
|
84
|
+
- `channel` (team chat / group chats) and `chat` (agent conversations, messages).
|
|
85
|
+
|
|
86
|
+
## [0.7.0]
|
|
87
|
+
|
|
88
|
+
### Added
|
|
89
|
+
- `settings` group — read/update tenant settings, agents, providers, credentials.
|
|
90
|
+
|
|
91
|
+
## [0.6.0]
|
|
92
|
+
|
|
93
|
+
### Added
|
|
94
|
+
- `workflow` (list/show/trigger/runs) and `activity` (cross-surface run inbox).
|
|
95
|
+
|
|
96
|
+
## [0.5.0]
|
|
97
|
+
|
|
98
|
+
### Added
|
|
99
|
+
- `schedule` group — scheduled-tasks CRUD with an ergonomic `--every` recurrence.
|
|
100
|
+
|
|
101
|
+
## [0.4.0]
|
|
102
|
+
|
|
103
|
+
### Changed
|
|
104
|
+
- Restructured commands into noun-first groups (`board`, `card`, `auth`); the flat
|
|
105
|
+
root commands and `config` were removed (clean break).
|
|
106
|
+
|
|
107
|
+
## [0.3.0]
|
|
108
|
+
|
|
109
|
+
### Added
|
|
110
|
+
- Create cards on a board (`create`).
|
|
111
|
+
|
|
112
|
+
## [0.2.0]
|
|
113
|
+
|
|
114
|
+
### Added
|
|
115
|
+
- Attach/detach card documents (upload + link).
|
|
116
|
+
|
|
117
|
+
## [0.1.1]
|
|
118
|
+
|
|
119
|
+
### Added
|
|
120
|
+
- Read card attachments (documents + artifacts).
|
|
121
|
+
|
|
122
|
+
[Unreleased]: https://github.com/Tchat-N-Sign/luge-cli/compare/v0.17.0...HEAD
|
|
123
|
+
[0.17.0]: https://github.com/Tchat-N-Sign/luge-cli/releases/tag/v0.17.0
|
luge_cli-0.17.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Sylvain Boily, Tchat-N-Sign
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
luge_cli-0.17.0/Makefile
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
.PHONY: help install install-cli install-skill uninstall reinstall sync test \
|
|
2
|
+
lint format typecheck check hooks build publish clean tag release
|
|
3
|
+
|
|
4
|
+
VERSION := $(shell grep -m1 '^version' pyproject.toml | cut -d'"' -f2)
|
|
5
|
+
|
|
6
|
+
help: ## Show this help
|
|
7
|
+
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | \
|
|
8
|
+
awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-14s\033[0m %s\n", $$1, $$2}'
|
|
9
|
+
|
|
10
|
+
install: install-cli install-skill ## Install the luge CLI globally + the Claude Code skill
|
|
11
|
+
|
|
12
|
+
install-cli: ## Install/upgrade the `luge` command globally (editable)
|
|
13
|
+
uv tool install --editable . --force
|
|
14
|
+
|
|
15
|
+
install-skill: ## Install the luge-platform skill into ~/.claude/skills
|
|
16
|
+
luge-cli claude skill install --force
|
|
17
|
+
|
|
18
|
+
uninstall: ## Remove the CLI and the skill
|
|
19
|
+
-uv tool uninstall luge-cli
|
|
20
|
+
-rm -rf $(HOME)/.claude/skills/luge-platform
|
|
21
|
+
|
|
22
|
+
reinstall: uninstall install ## Clean reinstall
|
|
23
|
+
|
|
24
|
+
sync: ## Create/refresh the local dev environment
|
|
25
|
+
uv sync
|
|
26
|
+
|
|
27
|
+
test: ## Run the test suite
|
|
28
|
+
uv run pytest -q
|
|
29
|
+
|
|
30
|
+
lint: ## Lint with ruff (check only)
|
|
31
|
+
uv run ruff check .
|
|
32
|
+
|
|
33
|
+
format: ## Auto-fix lint issues and format with ruff
|
|
34
|
+
uv run ruff check --fix .
|
|
35
|
+
uv run ruff format .
|
|
36
|
+
|
|
37
|
+
typecheck: ## Type-check with mypy
|
|
38
|
+
uv run mypy src/luge_cli
|
|
39
|
+
|
|
40
|
+
check: lint typecheck test ## Lint + type-check + test (what CI runs)
|
|
41
|
+
uv run ruff format --check .
|
|
42
|
+
|
|
43
|
+
hooks: ## Install the pre-commit git hooks
|
|
44
|
+
uv run pre-commit install
|
|
45
|
+
|
|
46
|
+
clean: ## Remove build artifacts
|
|
47
|
+
rm -rf dist build ./*.egg-info
|
|
48
|
+
|
|
49
|
+
build: clean check ## Build the sdist + wheel (runs checks first)
|
|
50
|
+
uv build
|
|
51
|
+
|
|
52
|
+
# Uploads to the repository configured in ~/.pypirc (override: make publish REPO=testpypi).
|
|
53
|
+
REPO ?= pypi
|
|
54
|
+
publish: build ## Build and upload to PyPI (via twine + ~/.pypirc)
|
|
55
|
+
uv run twine check dist/*
|
|
56
|
+
uv run twine upload -r $(REPO) dist/*
|
|
57
|
+
|
|
58
|
+
tag: ## Tag the current version (vX.Y.Z) and push the tag
|
|
59
|
+
git tag -a v$(VERSION) -m "v$(VERSION)"
|
|
60
|
+
git push origin v$(VERSION)
|
|
61
|
+
|
|
62
|
+
release: tag ## Tag + create a GitHub release with notes from CHANGELOG.md
|
|
63
|
+
@awk '/^## \[$(VERSION)\]/{f=1;next} /^## \[/{f=0} f' CHANGELOG.md > .release-notes.md
|
|
64
|
+
gh release create v$(VERSION) --title "v$(VERSION)" --notes-file .release-notes.md
|
|
65
|
+
@rm -f .release-notes.md
|
luge_cli-0.17.0/PKG-INFO
ADDED
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: luge-cli
|
|
3
|
+
Version: 0.17.0
|
|
4
|
+
Summary: Drive the Luge AI-employee platform from the command line — boards, agents, chat, workflows, and more, built for agents like Claude Code.
|
|
5
|
+
Project-URL: Homepage, https://github.com/Tchat-N-Sign/luge-cli
|
|
6
|
+
Project-URL: Repository, https://github.com/Tchat-N-Sign/luge-cli
|
|
7
|
+
Project-URL: Issues, https://github.com/Tchat-N-Sign/luge-cli/issues
|
|
8
|
+
Author-email: Sylvain Boily <sylvainboilydroid@gmail.com>
|
|
9
|
+
License: MIT License
|
|
10
|
+
|
|
11
|
+
Copyright (c) 2025 Sylvain Boily, Tchat-N-Sign
|
|
12
|
+
|
|
13
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
14
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
15
|
+
in the Software without restriction, including without limitation the rights
|
|
16
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
17
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
18
|
+
furnished to do so, subject to the following conditions:
|
|
19
|
+
|
|
20
|
+
The above copyright notice and this permission notice shall be included in all
|
|
21
|
+
copies or substantial portions of the Software.
|
|
22
|
+
|
|
23
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
24
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
25
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
26
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
27
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
28
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
29
|
+
SOFTWARE.
|
|
30
|
+
License-File: LICENSE
|
|
31
|
+
Keywords: agent,ai,claude-code,cli,kanban,luge
|
|
32
|
+
Classifier: Development Status :: 4 - Beta
|
|
33
|
+
Classifier: Environment :: Console
|
|
34
|
+
Classifier: Intended Audience :: Developers
|
|
35
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
36
|
+
Classifier: Operating System :: OS Independent
|
|
37
|
+
Classifier: Programming Language :: Python :: 3
|
|
38
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
39
|
+
Classifier: Topic :: Software Development
|
|
40
|
+
Classifier: Topic :: Utilities
|
|
41
|
+
Requires-Python: >=3.12
|
|
42
|
+
Requires-Dist: httpx>=0.27
|
|
43
|
+
Requires-Dist: rich>=13.7
|
|
44
|
+
Requires-Dist: tomli-w>=1.0
|
|
45
|
+
Requires-Dist: typer>=0.12
|
|
46
|
+
Description-Content-Type: text/markdown
|
|
47
|
+
|
|
48
|
+
# luge-cli
|
|
49
|
+
|
|
50
|
+
[](https://github.com/Tchat-N-Sign/luge-cli/actions/workflows/ci.yml)
|
|
51
|
+
|
|
52
|
+
A command-line client for the **Luge AI-employee platform** — built to let an
|
|
53
|
+
agent (Claude Code) drive Luge: work kanban boards, run scheduled tasks and
|
|
54
|
+
workflows, chat in channels / DMs / with AI agents, manage artifacts, personal
|
|
55
|
+
skills, and inbound webhooks, and read/update tenant settings.
|
|
56
|
+
|
|
57
|
+
Commands are grouped by noun: `board` and `card` (read + work a board),
|
|
58
|
+
`schedule` (recurring agent tasks), `workflow` + `activity` (run and inspect
|
|
59
|
+
agent workflows and their runs), `channel` / `dm` / `agent` / `colleagues` (group
|
|
60
|
+
chats, direct messages, talking to an AI, and the people directory), `artifact`
|
|
61
|
+
(conversation deliverables), `skill` (your personal Luge skills), `webhook`
|
|
62
|
+
(inbound webhook endpoints), `settings` (tenant config), and `auth` (local
|
|
63
|
+
credentials). No card deletion, no board/column management.
|
|
64
|
+
|
|
65
|
+
## Install
|
|
66
|
+
|
|
67
|
+
Installs the `luge-cli` command globally (as an editable [uv tool](https://docs.astral.sh/uv/concepts/tools/))
|
|
68
|
+
and the bundled Claude Code skill in one step:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
cd luge-cli
|
|
72
|
+
make install # = install-cli + install-skill
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
`make help` lists the targets (`install-cli`, `install-skill`, `uninstall`,
|
|
76
|
+
`reinstall`, `test`). `--editable` means `git pull` in this repo updates the
|
|
77
|
+
command with no reinstall.
|
|
78
|
+
|
|
79
|
+
Make sure uv's tool bin dir is on your `PATH` (once): `uv tool update-shell`.
|
|
80
|
+
|
|
81
|
+
## Configure
|
|
82
|
+
|
|
83
|
+
Needs the Luge API base URL and a tenant API key (`luge_…`). The base URL is the
|
|
84
|
+
full API base, including any deployment prefix (usually `/api`).
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
luge-cli auth init --url https://luge.example.com/api --token luge_xxx
|
|
88
|
+
luge-cli auth show # verify (token is masked)
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
`LUGE_URL` / `LUGE_TOKEN` environment variables override the stored file. The
|
|
92
|
+
config lives at `${XDG_CONFIG_HOME:-~/.config}/luge-cli/config.toml`, written
|
|
93
|
+
`0600` — never commit it.
|
|
94
|
+
|
|
95
|
+
## Use
|
|
96
|
+
|
|
97
|
+
Commands are grouped by noun (`board`, `card`, `auth`, `skill`):
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
luge-cli board list # boards you can access
|
|
101
|
+
luge-cli board show Roadmap # columns + cards (id or name substring)
|
|
102
|
+
luge-cli card list Roadmap --status open --tag bug # filter by tag/color/column/assignee/priority
|
|
103
|
+
luge-cli card show Roadmap ROL-17 # one card + comment thread + artifacts
|
|
104
|
+
luge-cli card mine # cards assigned to you
|
|
105
|
+
luge-cli card search "login" --status open # free-text across your boards
|
|
106
|
+
|
|
107
|
+
luge-cli card create Roadmap "In progress" "Fix login bug" --priority high --tag bug
|
|
108
|
+
luge-cli card comment Roadmap ROL-17 "Picking this up"
|
|
109
|
+
luge-cli card move Roadmap ROL-17 "In progress"
|
|
110
|
+
luge-cli card done Roadmap ROL-17 # sets the completed flag (not the column)
|
|
111
|
+
luge-cli card reopen Roadmap ROL-17
|
|
112
|
+
|
|
113
|
+
luge-cli card attach Roadmap ROL-17 ./report.pdf # upload a local file and link it to the card
|
|
114
|
+
luge-cli card detach Roadmap ROL-17 3 # detach attachment #3 (or its link id)
|
|
115
|
+
luge-cli card read Roadmap ROL-17 1 # read attachment #1's content
|
|
116
|
+
|
|
117
|
+
luge-cli <group> <command> --json # structured output for scripts/agents
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Boards, cards and columns are referenced by id **or** a unique name/`display_id`
|
|
121
|
+
substring; an ambiguous reference is a loud error, never a silent guess.
|
|
122
|
+
|
|
123
|
+
## Scheduled tasks
|
|
124
|
+
|
|
125
|
+
A scheduled task is a recurring prompt that fires an agent run. Manage them under
|
|
126
|
+
`luge-cli schedule`:
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
luge-cli schedule list [--enabled] # tasks you can see
|
|
130
|
+
luge-cli schedule show "Daily digest" # one task (id or name)
|
|
131
|
+
luge-cli schedule create "Daily digest" --prompt "Summarise open cards" \
|
|
132
|
+
--every daily --at 09:00 # see --every below
|
|
133
|
+
luge-cli schedule update "Daily digest" --every weekly:mon,fri --at 08:30
|
|
134
|
+
luge-cli schedule toggle "Daily digest" # pause / resume
|
|
135
|
+
luge-cli schedule run "Daily digest" # trigger a one-off run now
|
|
136
|
+
luge-cli schedule delete "Daily digest" # (asks to confirm; -y to skip)
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
`--every` is a compact recurrence spec (the API uses structured recurrence, not
|
|
140
|
+
cron): `daily`, `hourly`, `weekly:mon,wed,fri`, `monthly:15`, `interval:4h`,
|
|
141
|
+
`interval:2d`, `once:2026-08-01T18:00`. `--at HH:MM` sets the time(s) of day
|
|
142
|
+
(repeatable; defaults to `09:00`). A run's history/result isn't on the task — a
|
|
143
|
+
triggered run surfaces under `luge-cli activity` (see below).
|
|
144
|
+
|
|
145
|
+
## Workflows and activity
|
|
146
|
+
|
|
147
|
+
`luge-cli workflow` inspects, creates and runs multi-step agent workflows:
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
luge-cli workflow list [--trigger-type event] [--enabled] # workflow definitions
|
|
151
|
+
luge-cli workflow show "veille-techno" # one definition (id or name)
|
|
152
|
+
luge-cli workflow create "Greeter" --agent "General Agent" --prompt "Say hi and the time"
|
|
153
|
+
luge-cli workflow create "Complex" --graph ./graph.json --trigger-type event
|
|
154
|
+
luge-cli workflow delete "Greeter" # (asks to confirm; -y to skip)
|
|
155
|
+
luge-cli workflow trigger "veille-techno" --data topic=rust # start a run (repeatable --data)
|
|
156
|
+
luge-cli workflow runs "veille-techno" # a workflow's run history
|
|
157
|
+
luge-cli workflow run "veille-techno" <run-id> # one run in full
|
|
158
|
+
luge-cli workflow cancel "veille-techno" <run-id> # cancel a running run
|
|
159
|
+
luge-cli workflow retry "veille-techno" <run-id> # retry a failed/cancelled run
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
`create --agent <id|name> --prompt "..."` builds a linear single-agent workflow
|
|
163
|
+
(start → agent → end) for you; `create --graph <file.json>` posts an arbitrary
|
|
164
|
+
roomkit-graph you supply (for branches, human-review, notifications, etc.).
|
|
165
|
+
|
|
166
|
+
`luge-cli activity` is the cross-surface run inbox — every run (schedule,
|
|
167
|
+
workflow, webhook, notetaker, …), for diagnosing what fired and what failed:
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
luge-cli activity list [--status failed] [--kind schedule] [--search "..."]
|
|
171
|
+
luge-cli activity show <id> # a run's message thread + human-review steps
|
|
172
|
+
luge-cli activity retry <id> # re-run a failed/cancelled run
|
|
173
|
+
luge-cli activity stats [--days 7]
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
The `id` in `activity list` is what `show` / `retry` take; workflow runs show no
|
|
177
|
+
`id` (they have no chat room) — inspect those with `workflow runs` instead.
|
|
178
|
+
|
|
179
|
+
## Settings
|
|
180
|
+
|
|
181
|
+
`luge-cli settings` reads and updates tenant configuration. **Most of it needs an
|
|
182
|
+
admin-role API key** — a member key gets 403 on the memory/pii/compliance/
|
|
183
|
+
web-search slices and on credentials; `agents`, `providers` and the `tenant` read
|
|
184
|
+
are member-safe.
|
|
185
|
+
|
|
186
|
+
```bash
|
|
187
|
+
luge-cli settings get memory # memory | pii | compliance | web-search | tenant
|
|
188
|
+
luge-cli settings set web-search web_search_provider=brave # partial patch (only keys you pass)
|
|
189
|
+
luge-cli settings set memory rag_max_chunks=8 summarization_enabled=true
|
|
190
|
+
luge-cli settings agents # the tenant's agents (provider/model live here)
|
|
191
|
+
luge-cli settings agent "General Agent" # one agent's config (id or name)
|
|
192
|
+
luge-cli settings providers # AI provider/model catalogue
|
|
193
|
+
luge-cli settings credentials # configured credentials (secrets never returned)
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
`set` values are typed: `true`/`false` → bool, numbers → int/float, `json:[...]`
|
|
197
|
+
or `json:{...}` for lists/objects, anything else a string.
|
|
198
|
+
|
|
199
|
+
## Conversations: channels, DMs, agents
|
|
200
|
+
|
|
201
|
+
Sending a message has three distinct surfaces — one command group each — plus a
|
|
202
|
+
`colleagues` directory to find who to DM.
|
|
203
|
+
|
|
204
|
+
**Group chat** — `luge-cli channel` participates in **team channels**. Reads and
|
|
205
|
+
posts are plain; the AI answers only when a message `@luge`-mentions it.
|
|
206
|
+
|
|
207
|
+
```bash
|
|
208
|
+
luge-cli channel list ; luge-cli channel browse # channels you can see / can join
|
|
209
|
+
luge-cli channel show general # one channel (id or name)
|
|
210
|
+
luge-cli channel messages general --limit 50 # message history (oldest-first)
|
|
211
|
+
luge-cli channel post general "ship it @luge" # @luge to invoke the agent
|
|
212
|
+
luge-cli channel join general ; luge-cli channel leave general
|
|
213
|
+
luge-cli channel create team --display "Team" --public --agent <id>
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
**Direct message** — `luge-cli dm` sends a 1:1 message to a colleague (human↔human,
|
|
217
|
+
never triggers the AI). `dm send` opens the DM (get-or-create) and posts in one go.
|
|
218
|
+
|
|
219
|
+
```bash
|
|
220
|
+
luge-cli dm send "Alex" "got a sec?" # colleague by id, email, or name
|
|
221
|
+
luge-cli dm list # your DMs
|
|
222
|
+
luge-cli dm show "Alex" --limit 50 # read the thread
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
**Agent chat** — `luge-cli agent` talks to an AI agent.
|
|
226
|
+
|
|
227
|
+
```bash
|
|
228
|
+
luge-cli agent send "Summarise the open cards" [--agent <id|name>] [--conversation <id>]
|
|
229
|
+
luge-cli agent send "Any blockers?" --wait --json # wait for the reply → {conversation_id, reply}
|
|
230
|
+
luge-cli agent list # your agent conversations
|
|
231
|
+
luge-cli agent show <id> --limit 50 # a conversation + its messages
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
By default `agent send` is **fire-and-forget**: it invokes an agent and returns the
|
|
235
|
+
conversation id immediately (read the reply later with `agent show <id>`). With
|
|
236
|
+
`--wait` it polls until the agent's text reply arrives and prints it (intermediate
|
|
237
|
+
tool-call steps are skipped; tune with `--timeout` / `--interval`) — the
|
|
238
|
+
agent-friendly "ask → answer" form, especially with `--json`. `--agent` accepts an
|
|
239
|
+
id or a name.
|
|
240
|
+
|
|
241
|
+
**Colleagues** — `luge-cli colleagues` is the platform people directory.
|
|
242
|
+
|
|
243
|
+
```bash
|
|
244
|
+
luge-cli colleagues list [--type human] # the roster
|
|
245
|
+
luge-cli colleagues get "Alex" # a colleague's profile (id, role, skills)
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
## Artifacts
|
|
249
|
+
|
|
250
|
+
`luge-cli artifact` works with conversation artifacts (markdown/html/code
|
|
251
|
+
deliverables). Every artifact lives in a room — the `--room` id is a
|
|
252
|
+
conversation/channel id (shown by `chat show` / `channel messages`).
|
|
253
|
+
|
|
254
|
+
```bash
|
|
255
|
+
luge-cli artifact mine # your artifacts (summaries)
|
|
256
|
+
luge-cli artifact list --room <room-id> # a room's artifacts (with content)
|
|
257
|
+
luge-cli artifact show <id> # one artifact + its content
|
|
258
|
+
luge-cli artifact create --room <room-id> "Notes" ./notes.md --type markdown
|
|
259
|
+
echo "# Draft" | luge-cli artifact create --room <room-id> "Draft" - # from stdin
|
|
260
|
+
luge-cli artifact delete <id> # (asks to confirm; -y to skip)
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
There is no update-in-place — `create` always inserts a new artifact.
|
|
264
|
+
|
|
265
|
+
## Personal skills
|
|
266
|
+
|
|
267
|
+
`luge-cli skill` manages your **personal Luge skills** — authored instruction sets
|
|
268
|
+
(name, description, instructions body, required tools, trigger phrases) that agents
|
|
269
|
+
can use, visible only to you. Reading works with any key; create/update/delete need
|
|
270
|
+
the skill-manage capability (an admin/owner key).
|
|
271
|
+
|
|
272
|
+
```bash
|
|
273
|
+
luge-cli skill list # your personal skills
|
|
274
|
+
luge-cli skill show <name> # description, instructions, requires, triggers
|
|
275
|
+
luge-cli skill create my-skill --description "..." --instructions "..." \
|
|
276
|
+
--require terminal_run --trigger "do the thing"
|
|
277
|
+
luge-cli skill create my-skill --instructions-file ./SKILL.md # body from a file
|
|
278
|
+
luge-cli skill update my-skill --description "..." [--instructions … --require … --trigger …]
|
|
279
|
+
luge-cli skill delete my-skill # (asks to confirm; -y to skip)
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
(Not to be confused with `luge-cli claude skill`, which installs *this CLI's own*
|
|
283
|
+
Claude Code skill — see [Claude Code skill](#claude-code-skill) below.)
|
|
284
|
+
|
|
285
|
+
## Inbound webhooks
|
|
286
|
+
|
|
287
|
+
`luge-cli webhook` manages inbound webhook endpoints — receivers Luge hosts so an
|
|
288
|
+
external system can drive automation. Each endpoint POSTs arriving at its
|
|
289
|
+
`inbound_url` are routed to an **agent** or a **workflow** (or just logged). The
|
|
290
|
+
CLI creates/inspects endpoints and reads their deliveries; Luge's server receives
|
|
291
|
+
the webhooks.
|
|
292
|
+
|
|
293
|
+
```bash
|
|
294
|
+
luge-cli webhook list
|
|
295
|
+
luge-cli webhook create "GitHub CI" --to agent --target "General Agent" --source github
|
|
296
|
+
# prints the inbound_url + signing secret (secret is shown ONCE — save it)
|
|
297
|
+
luge-cli webhook create "Stripe" --to workflow --target "veille-techno" --source stripe
|
|
298
|
+
luge-cli webhook create "Debug" --to log_only # just log, triggers nothing
|
|
299
|
+
luge-cli webhook show <id|name>
|
|
300
|
+
luge-cli webhook deliveries <id|name> # what has arrived (the journal)
|
|
301
|
+
luge-cli webhook delivery <id|name> <delivery-id> # one delivery in full
|
|
302
|
+
luge-cli webhook update <id|name> --disable | --regenerate-secret
|
|
303
|
+
luge-cli webhook delete <id|name>
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
`--to agent|workflow` resolves `--target` (an agent or workflow, by id or name)
|
|
307
|
+
into the endpoint's destination. The signing `secret` is returned only on create
|
|
308
|
+
and `--regenerate-secret` — capture it then, it is not shown again.
|
|
309
|
+
|
|
310
|
+
## Claude Code skill
|
|
311
|
+
|
|
312
|
+
The package bundles a Claude Code skill (`luge-platform`) that teaches an agent the
|
|
313
|
+
whole CLI — the card-work protocol (read the thread, announce, deliver, mark done
|
|
314
|
+
only when asked) plus the schedule / workflow / activity / channel / dm / agent /
|
|
315
|
+
artifact / webhook / settings surfaces and their non-obvious semantics. `make
|
|
316
|
+
install` installs it; to (re)install it on its own:
|
|
317
|
+
|
|
318
|
+
```bash
|
|
319
|
+
luge-cli claude skill install --force # copies it to ~/.claude/skills/luge-platform
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
Unlike the editable CLI, the skill is a **copy** — it does not update on
|
|
323
|
+
`git pull`. Re-run `luge-cli claude skill install --force` after the bundled skill
|
|
324
|
+
changes.
|
|
325
|
+
|
|
326
|
+
## Develop
|
|
327
|
+
|
|
328
|
+
```bash
|
|
329
|
+
make sync # create/refresh the dev environment
|
|
330
|
+
make hooks # install the pre-commit git hooks (once)
|
|
331
|
+
make check # lint (ruff) + type-check (mypy) + test (pytest) — what CI runs
|
|
332
|
+
make format # auto-fix lint issues and format
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
`make test` runs the suite (filters, resolution, HTTP client mocked, config, CLI
|
|
336
|
+
wiring). CI (GitHub Actions) runs lint, type-check, and test on every push and PR.
|
|
337
|
+
|
|
338
|
+
### Release
|
|
339
|
+
|
|
340
|
+
```bash
|
|
341
|
+
make build # sdist + wheel (runs `check` first)
|
|
342
|
+
make publish # upload to PyPI via twine + ~/.pypirc (REPO=testpypi to test)
|
|
343
|
+
make release # tag vX.Y.Z + create a GitHub release from CHANGELOG.md
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
Bump `version` in `pyproject.toml` and add a `CHANGELOG.md` entry before releasing.
|