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.
Files changed (74) hide show
  1. luge_cli-0.17.0/.github/workflows/ci.yml +55 -0
  2. luge_cli-0.17.0/.gitignore +18 -0
  3. luge_cli-0.17.0/.pre-commit-config.yaml +34 -0
  4. luge_cli-0.17.0/CHANGELOG.md +123 -0
  5. luge_cli-0.17.0/LICENSE +21 -0
  6. luge_cli-0.17.0/Makefile +65 -0
  7. luge_cli-0.17.0/PKG-INFO +346 -0
  8. luge_cli-0.17.0/README.md +299 -0
  9. luge_cli-0.17.0/pyproject.toml +87 -0
  10. luge_cli-0.17.0/src/luge_cli/__init__.py +7 -0
  11. luge_cli-0.17.0/src/luge_cli/__main__.py +85 -0
  12. luge_cli-0.17.0/src/luge_cli/client/__init__.py +37 -0
  13. luge_cli-0.17.0/src/luge_cli/client/artifacts.py +31 -0
  14. luge_cli-0.17.0/src/luge_cli/client/automations.py +46 -0
  15. luge_cli-0.17.0/src/luge_cli/client/base.py +81 -0
  16. luge_cli-0.17.0/src/luge_cli/client/boards.py +78 -0
  17. luge_cli-0.17.0/src/luge_cli/client/channels.py +42 -0
  18. luge_cli-0.17.0/src/luge_cli/client/chat.py +56 -0
  19. luge_cli-0.17.0/src/luge_cli/client/employees.py +25 -0
  20. luge_cli-0.17.0/src/luge_cli/client/schedules.py +40 -0
  21. luge_cli-0.17.0/src/luge_cli/client/settings.py +41 -0
  22. luge_cli-0.17.0/src/luge_cli/client/skills.py +32 -0
  23. luge_cli-0.17.0/src/luge_cli/client/webhooks.py +42 -0
  24. luge_cli-0.17.0/src/luge_cli/client/workflows.py +70 -0
  25. luge_cli-0.17.0/src/luge_cli/commands/__init__.py +1 -0
  26. luge_cli-0.17.0/src/luge_cli/commands/_common.py +38 -0
  27. luge_cli-0.17.0/src/luge_cli/commands/activity_cmd.py +86 -0
  28. luge_cli-0.17.0/src/luge_cli/commands/agent_cmd.py +165 -0
  29. luge_cli-0.17.0/src/luge_cli/commands/artifact_cmd.py +109 -0
  30. luge_cli-0.17.0/src/luge_cli/commands/auth_cmd.py +40 -0
  31. luge_cli-0.17.0/src/luge_cli/commands/board_cmd.py +42 -0
  32. luge_cli-0.17.0/src/luge_cli/commands/card/__init__.py +16 -0
  33. luge_cli-0.17.0/src/luge_cli/commands/card/read.py +123 -0
  34. luge_cli-0.17.0/src/luge_cli/commands/card/write.py +148 -0
  35. luge_cli-0.17.0/src/luge_cli/commands/channel_cmd.py +161 -0
  36. luge_cli-0.17.0/src/luge_cli/commands/claude_cmd.py +50 -0
  37. luge_cli-0.17.0/src/luge_cli/commands/colleagues_cmd.py +49 -0
  38. luge_cli-0.17.0/src/luge_cli/commands/dm_cmd.py +74 -0
  39. luge_cli-0.17.0/src/luge_cli/commands/schedule_cmd.py +194 -0
  40. luge_cli-0.17.0/src/luge_cli/commands/settings_cmd.py +145 -0
  41. luge_cli-0.17.0/src/luge_cli/commands/skill_cmd.py +142 -0
  42. luge_cli-0.17.0/src/luge_cli/commands/webhook_cmd.py +210 -0
  43. luge_cli-0.17.0/src/luge_cli/commands/workflow_cmd.py +237 -0
  44. luge_cli-0.17.0/src/luge_cli/config.py +72 -0
  45. luge_cli-0.17.0/src/luge_cli/errors.py +12 -0
  46. luge_cli-0.17.0/src/luge_cli/filters.py +96 -0
  47. luge_cli-0.17.0/src/luge_cli/render/__init__.py +83 -0
  48. luge_cli-0.17.0/src/luge_cli/render/_core.py +100 -0
  49. luge_cli-0.17.0/src/luge_cli/render/artifacts.py +51 -0
  50. luge_cli-0.17.0/src/luge_cli/render/automations.py +77 -0
  51. luge_cli-0.17.0/src/luge_cli/render/boards.py +130 -0
  52. luge_cli-0.17.0/src/luge_cli/render/chat.py +124 -0
  53. luge_cli-0.17.0/src/luge_cli/render/config.py +19 -0
  54. luge_cli-0.17.0/src/luge_cli/render/messages.py +43 -0
  55. luge_cli-0.17.0/src/luge_cli/render/schedules.py +67 -0
  56. luge_cli-0.17.0/src/luge_cli/render/settings.py +117 -0
  57. luge_cli-0.17.0/src/luge_cli/render/skills.py +40 -0
  58. luge_cli-0.17.0/src/luge_cli/render/webhooks.py +83 -0
  59. luge_cli-0.17.0/src/luge_cli/render/workflows.py +80 -0
  60. luge_cli-0.17.0/src/luge_cli/resolve.py +155 -0
  61. luge_cli-0.17.0/src/luge_cli/schedule_spec.py +105 -0
  62. luge_cli-0.17.0/src/luge_cli/skill/luge-platform/SKILL.md +247 -0
  63. luge_cli-0.17.0/src/luge_cli/workflow_graph.py +48 -0
  64. luge_cli-0.17.0/tests/conftest.py +50 -0
  65. luge_cli-0.17.0/tests/test_agent_reply.py +32 -0
  66. luge_cli-0.17.0/tests/test_cli.py +136 -0
  67. luge_cli-0.17.0/tests/test_client.py +532 -0
  68. luge_cli-0.17.0/tests/test_config.py +44 -0
  69. luge_cli-0.17.0/tests/test_filters.py +64 -0
  70. luge_cli-0.17.0/tests/test_resolve.py +107 -0
  71. luge_cli-0.17.0/tests/test_schedule_spec.py +55 -0
  72. luge_cli-0.17.0/tests/test_settings_cmd.py +37 -0
  73. luge_cli-0.17.0/tests/test_workflow_graph.py +28 -0
  74. 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
@@ -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.
@@ -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
@@ -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
+ [![CI](https://github.com/Tchat-N-Sign/luge-cli/actions/workflows/ci.yml/badge.svg)](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.