teams-cli 0.1.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.
- teams_cli-0.1.0/.github/dependabot.yml +6 -0
- teams_cli-0.1.0/.github/workflows/ci.yml +47 -0
- teams_cli-0.1.0/.github/workflows/release.yml +258 -0
- teams_cli-0.1.0/.gitignore +5 -0
- teams_cli-0.1.0/CHANGELOG.md +19 -0
- teams_cli-0.1.0/Cargo.lock +4013 -0
- teams_cli-0.1.0/Cargo.toml +43 -0
- teams_cli-0.1.0/DESIGN.md +7 -0
- teams_cli-0.1.0/LICENSE +21 -0
- teams_cli-0.1.0/Makefile +25 -0
- teams_cli-0.1.0/PKG-INFO +108 -0
- teams_cli-0.1.0/PRODUCT.md +73 -0
- teams_cli-0.1.0/README.md +91 -0
- teams_cli-0.1.0/examples/validate_schema.rs +23 -0
- teams_cli-0.1.0/pyproject.toml +25 -0
- teams_cli-0.1.0/src/auth.rs +330 -0
- teams_cli-0.1.0/src/cli.rs +182 -0
- teams_cli-0.1.0/src/config.rs +105 -0
- teams_cli-0.1.0/src/error.rs +107 -0
- teams_cli-0.1.0/src/graph.rs +308 -0
- teams_cli-0.1.0/src/lib.rs +8 -0
- teams_cli-0.1.0/src/main.rs +482 -0
- teams_cli-0.1.0/src/output.rs +78 -0
- teams_cli-0.1.0/src/schema.rs +246 -0
- teams_cli-0.1.0/src/tui.rs +315 -0
- teams_cli-0.1.0/tests/cli.rs +135 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
pull_request:
|
|
6
|
+
workflow_call:
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
test:
|
|
13
|
+
name: Test (${{ matrix.os }})
|
|
14
|
+
strategy:
|
|
15
|
+
fail-fast: false
|
|
16
|
+
matrix:
|
|
17
|
+
os: [ubuntu-latest, macos-latest, windows-latest]
|
|
18
|
+
runs-on: ${{ matrix.os }}
|
|
19
|
+
steps:
|
|
20
|
+
- uses: actions/checkout@v7
|
|
21
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
22
|
+
- uses: Swatinem/rust-cache@v2
|
|
23
|
+
- run: cargo test --locked --all-targets
|
|
24
|
+
|
|
25
|
+
quality:
|
|
26
|
+
name: Formatting and lints
|
|
27
|
+
runs-on: ubuntu-latest
|
|
28
|
+
steps:
|
|
29
|
+
- uses: actions/checkout@v7
|
|
30
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
31
|
+
with:
|
|
32
|
+
components: rustfmt, clippy
|
|
33
|
+
- uses: Swatinem/rust-cache@v2
|
|
34
|
+
- run: cargo fmt -- --check
|
|
35
|
+
- run: cargo clippy --locked --all-targets -- -D warnings
|
|
36
|
+
|
|
37
|
+
security:
|
|
38
|
+
name: Dependency audit
|
|
39
|
+
runs-on: ubuntu-latest
|
|
40
|
+
steps:
|
|
41
|
+
- uses: actions/checkout@v7
|
|
42
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
43
|
+
- uses: Swatinem/rust-cache@v2
|
|
44
|
+
- name: Install cargo-audit
|
|
45
|
+
run: cargo install cargo-audit --version 0.22.2 --locked
|
|
46
|
+
- name: Audit Cargo.lock
|
|
47
|
+
run: cargo audit
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags: ["v[0-9]*.[0-9]*.[0-9]*"]
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
contents: read
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
version:
|
|
12
|
+
name: Verify release version
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@v7
|
|
16
|
+
- name: Match tag to package version
|
|
17
|
+
run: |
|
|
18
|
+
version="$(sed -n 's/^version = "\([^"]*\)"/\1/p' Cargo.toml | head -1)"
|
|
19
|
+
test "v${version}" = "$GITHUB_REF_NAME"
|
|
20
|
+
|
|
21
|
+
verify:
|
|
22
|
+
uses: ./.github/workflows/ci.yml
|
|
23
|
+
|
|
24
|
+
binaries:
|
|
25
|
+
name: Binary (${{ matrix.target }})
|
|
26
|
+
needs: [version, verify]
|
|
27
|
+
strategy:
|
|
28
|
+
fail-fast: false
|
|
29
|
+
matrix:
|
|
30
|
+
include:
|
|
31
|
+
- os: ubuntu-latest
|
|
32
|
+
target: x86_64-unknown-linux-gnu
|
|
33
|
+
binary: teams
|
|
34
|
+
- os: macos-15-intel
|
|
35
|
+
target: x86_64-apple-darwin
|
|
36
|
+
binary: teams
|
|
37
|
+
- os: macos-latest
|
|
38
|
+
target: aarch64-apple-darwin
|
|
39
|
+
binary: teams
|
|
40
|
+
- os: windows-latest
|
|
41
|
+
target: x86_64-pc-windows-msvc
|
|
42
|
+
binary: teams.exe
|
|
43
|
+
runs-on: ${{ matrix.os }}
|
|
44
|
+
permissions:
|
|
45
|
+
contents: read
|
|
46
|
+
id-token: write
|
|
47
|
+
attestations: write
|
|
48
|
+
steps:
|
|
49
|
+
- uses: actions/checkout@v7
|
|
50
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
51
|
+
with:
|
|
52
|
+
targets: ${{ matrix.target }}
|
|
53
|
+
- uses: Swatinem/rust-cache@v2
|
|
54
|
+
with:
|
|
55
|
+
key: ${{ matrix.target }}
|
|
56
|
+
- run: cargo build --locked --release --target ${{ matrix.target }}
|
|
57
|
+
- name: Package binary
|
|
58
|
+
shell: bash
|
|
59
|
+
run: |
|
|
60
|
+
mkdir -p dist/package
|
|
61
|
+
cp "target/${{ matrix.target }}/release/${{ matrix.binary }}" dist/package/
|
|
62
|
+
cp README.md LICENSE CHANGELOG.md dist/package/
|
|
63
|
+
tar -C dist/package -czf "dist/teams-cli-${GITHUB_REF_NAME}-${{ matrix.target }}.tar.gz" .
|
|
64
|
+
rm -rf dist/package
|
|
65
|
+
- name: Attest build provenance
|
|
66
|
+
uses: actions/attest@v4
|
|
67
|
+
with:
|
|
68
|
+
subject-path: dist/*.tar.gz
|
|
69
|
+
- uses: actions/upload-artifact@v7
|
|
70
|
+
with:
|
|
71
|
+
name: binary-${{ matrix.target }}
|
|
72
|
+
path: dist/*.tar.gz
|
|
73
|
+
if-no-files-found: error
|
|
74
|
+
|
|
75
|
+
python-wheels:
|
|
76
|
+
name: Python wheel (${{ matrix.target }})
|
|
77
|
+
needs: [version, verify]
|
|
78
|
+
strategy:
|
|
79
|
+
fail-fast: false
|
|
80
|
+
matrix:
|
|
81
|
+
include:
|
|
82
|
+
- os: ubuntu-latest
|
|
83
|
+
target: x86_64
|
|
84
|
+
manylinux: "2_28"
|
|
85
|
+
- os: ubuntu-latest
|
|
86
|
+
target: aarch64
|
|
87
|
+
manylinux: "2_28"
|
|
88
|
+
- os: macos-latest
|
|
89
|
+
target: universal2-apple-darwin
|
|
90
|
+
manylinux: auto
|
|
91
|
+
- os: windows-latest
|
|
92
|
+
target: x64
|
|
93
|
+
manylinux: auto
|
|
94
|
+
runs-on: ${{ matrix.os }}
|
|
95
|
+
steps:
|
|
96
|
+
- uses: actions/checkout@v7
|
|
97
|
+
- uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b # v1.51.0
|
|
98
|
+
with:
|
|
99
|
+
maturin-version: v1.14.1
|
|
100
|
+
command: build
|
|
101
|
+
target: ${{ matrix.target }}
|
|
102
|
+
manylinux: ${{ matrix.manylinux }}
|
|
103
|
+
args: --release --locked --compatibility pypi --out dist
|
|
104
|
+
- uses: actions/upload-artifact@v7
|
|
105
|
+
with:
|
|
106
|
+
name: wheel-${{ matrix.target }}
|
|
107
|
+
path: dist/*.whl
|
|
108
|
+
if-no-files-found: error
|
|
109
|
+
|
|
110
|
+
source-distributions:
|
|
111
|
+
name: Source distributions
|
|
112
|
+
needs: [version, verify]
|
|
113
|
+
runs-on: ubuntu-latest
|
|
114
|
+
steps:
|
|
115
|
+
- uses: actions/checkout@v7
|
|
116
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
117
|
+
- run: cargo package --locked
|
|
118
|
+
- uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b # v1.51.0
|
|
119
|
+
with:
|
|
120
|
+
maturin-version: v1.14.1
|
|
121
|
+
command: sdist
|
|
122
|
+
args: --out dist
|
|
123
|
+
- run: cp target/package/*.crate dist/
|
|
124
|
+
- uses: actions/upload-artifact@v7
|
|
125
|
+
with:
|
|
126
|
+
name: source-distributions
|
|
127
|
+
path: dist/*
|
|
128
|
+
if-no-files-found: error
|
|
129
|
+
|
|
130
|
+
github-release:
|
|
131
|
+
name: GitHub release
|
|
132
|
+
needs: [binaries, python-wheels, source-distributions]
|
|
133
|
+
runs-on: ubuntu-latest
|
|
134
|
+
permissions:
|
|
135
|
+
contents: write
|
|
136
|
+
id-token: write
|
|
137
|
+
attestations: write
|
|
138
|
+
steps:
|
|
139
|
+
- uses: actions/checkout@v7
|
|
140
|
+
- uses: actions/download-artifact@v8
|
|
141
|
+
with:
|
|
142
|
+
pattern: binary-*
|
|
143
|
+
path: dist
|
|
144
|
+
merge-multiple: true
|
|
145
|
+
- uses: actions/download-artifact@v8
|
|
146
|
+
with:
|
|
147
|
+
name: source-distributions
|
|
148
|
+
path: dist
|
|
149
|
+
- name: Generate CycloneDX SBOM
|
|
150
|
+
run: |
|
|
151
|
+
cargo install cargo-cyclonedx --version 0.5.9 --locked
|
|
152
|
+
cargo cyclonedx --format json --override-filename teams-cli.cdx
|
|
153
|
+
cp teams-cli.cdx.json dist/
|
|
154
|
+
- name: Generate checksums
|
|
155
|
+
working-directory: dist
|
|
156
|
+
run: sha256sum ./*.tar.gz ./*.crate ./*.json > SHA256SUMS
|
|
157
|
+
- name: Attest artifacts and SBOM
|
|
158
|
+
uses: actions/attest@v4
|
|
159
|
+
with:
|
|
160
|
+
subject-path: dist/*
|
|
161
|
+
sbom-path: dist/teams-cli.cdx.json
|
|
162
|
+
- name: Create GitHub release
|
|
163
|
+
env:
|
|
164
|
+
GH_TOKEN: ${{ github.token }}
|
|
165
|
+
run: gh release create "$GITHUB_REF_NAME" dist/* --verify-tag --generate-notes
|
|
166
|
+
|
|
167
|
+
crates-io:
|
|
168
|
+
name: Publish crates.io
|
|
169
|
+
needs: github-release
|
|
170
|
+
runs-on: ubuntu-latest
|
|
171
|
+
environment: crates-io
|
|
172
|
+
permissions:
|
|
173
|
+
id-token: write
|
|
174
|
+
steps:
|
|
175
|
+
- uses: actions/checkout@v7
|
|
176
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
177
|
+
- name: Check whether this version is already published
|
|
178
|
+
id: crate
|
|
179
|
+
shell: bash
|
|
180
|
+
run: |
|
|
181
|
+
version="${GITHUB_REF_NAME#v}"
|
|
182
|
+
if curl -fsSL "https://crates.io/api/v1/crates/teams-cli/${version}" > /dev/null; then
|
|
183
|
+
echo "exists=true" >> "$GITHUB_OUTPUT"
|
|
184
|
+
else
|
|
185
|
+
echo "exists=false" >> "$GITHUB_OUTPUT"
|
|
186
|
+
fi
|
|
187
|
+
- name: Get temporary crates.io token
|
|
188
|
+
if: steps.crate.outputs.exists != 'true'
|
|
189
|
+
id: crates-auth
|
|
190
|
+
uses: rust-lang/crates-io-auth-action@v1
|
|
191
|
+
- if: steps.crate.outputs.exists != 'true'
|
|
192
|
+
run: cargo publish --locked
|
|
193
|
+
env:
|
|
194
|
+
CARGO_REGISTRY_TOKEN: ${{ steps.crates-auth.outputs.token }}
|
|
195
|
+
- if: steps.crate.outputs.exists == 'true'
|
|
196
|
+
run: echo "teams-cli ${GITHUB_REF_NAME#v} is already available on crates.io."
|
|
197
|
+
|
|
198
|
+
pypi:
|
|
199
|
+
name: Publish PyPI
|
|
200
|
+
needs: github-release
|
|
201
|
+
runs-on: ubuntu-latest
|
|
202
|
+
environment:
|
|
203
|
+
name: pypi
|
|
204
|
+
url: https://pypi.org/p/teams-cli
|
|
205
|
+
permissions:
|
|
206
|
+
id-token: write
|
|
207
|
+
steps:
|
|
208
|
+
- uses: actions/download-artifact@v8
|
|
209
|
+
with:
|
|
210
|
+
pattern: wheel-*
|
|
211
|
+
path: dist
|
|
212
|
+
merge-multiple: true
|
|
213
|
+
- uses: actions/download-artifact@v8
|
|
214
|
+
with:
|
|
215
|
+
name: source-distributions
|
|
216
|
+
path: source
|
|
217
|
+
- name: Collect Python distributions
|
|
218
|
+
run: find source -name '*.tar.gz' -exec cp {} dist/ \;
|
|
219
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
|
220
|
+
with:
|
|
221
|
+
packages-dir: dist
|
|
222
|
+
|
|
223
|
+
post-publish-smoke:
|
|
224
|
+
name: Verify public packages
|
|
225
|
+
needs: [crates-io, pypi]
|
|
226
|
+
runs-on: ubuntu-latest
|
|
227
|
+
steps:
|
|
228
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
229
|
+
- uses: actions/setup-python@v7
|
|
230
|
+
with:
|
|
231
|
+
python-version: "3.x"
|
|
232
|
+
- name: Install and run the crates.io package
|
|
233
|
+
shell: bash
|
|
234
|
+
run: |
|
|
235
|
+
version="${GITHUB_REF_NAME#v}"
|
|
236
|
+
root="${RUNNER_TEMP}/cargo-smoke"
|
|
237
|
+
for _ in 1 2 3 4 5 6; do
|
|
238
|
+
if cargo install --root "$root" teams-cli --version "$version" --locked; then
|
|
239
|
+
"$root/bin/teams" --version | grep -F "teams $version"
|
|
240
|
+
exit 0
|
|
241
|
+
fi
|
|
242
|
+
sleep 10
|
|
243
|
+
done
|
|
244
|
+
exit 1
|
|
245
|
+
- name: Install and run the PyPI package
|
|
246
|
+
shell: bash
|
|
247
|
+
run: |
|
|
248
|
+
version="${GITHUB_REF_NAME#v}"
|
|
249
|
+
environment="${RUNNER_TEMP}/pypi-smoke"
|
|
250
|
+
python -m venv "$environment"
|
|
251
|
+
for _ in 1 2 3 4 5 6; do
|
|
252
|
+
if "$environment/bin/pip" install --no-cache-dir "teams-cli==$version"; then
|
|
253
|
+
"$environment/bin/teams" --version | grep -F "teams $version"
|
|
254
|
+
exit 0
|
|
255
|
+
fi
|
|
256
|
+
sleep 10
|
|
257
|
+
done
|
|
258
|
+
exit 1
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project are documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [0.1.0] - 2026-08-24
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- Human-first commands and a responsive Ratatui interface for Microsoft Teams.
|
|
13
|
+
- Agent-first CLI Spec v0.3 schema, JSON envelopes, stable errors, and safe noninteractive behavior.
|
|
14
|
+
- Delegated Microsoft OAuth with browser PKCE, explicit device-code login, and OS-keyring credential storage.
|
|
15
|
+
- Commands for identity, joined teams, channels, chats, and reading or sending messages through Microsoft Graph.
|
|
16
|
+
- Guided onboarding, diagnostics, completions, bounded collections, and deterministic TUI snapshots.
|
|
17
|
+
- Distribution through crates.io, PyPI binary wheels, and signed GitHub release artifacts.
|
|
18
|
+
|
|
19
|
+
[0.1.0]: https://github.com/rvben/teams-cli/releases/tag/v0.1.0
|