Files
plyngent/pyproject.toml
T
NCBM 10402f5be6 core/config: add the [notify] section
`[notify]` decides what the CLI does when a prompt is waiting on the human:
`grace_seconds` (default 5s, roughly Claude Code's permission notice) before
anything is shown, `min_interval_seconds` between two notifications,
`channels` (`auto` = desktop then terminal), `actions` for the allow/deny/review
buttons, `include_reason` for the one-line reason, and `protocol` to pin the
terminal escape protocol.

The reason stays out by default because it names commands, argv and URLs, and a
notification outlives the prompt and may be mirrored to a lock screen. Unknown
keys degrade to the defaults, the way `[mcp]` does, and `reload()` re-reads the
section.

Desktop notifications need the optional `notify` extra (`desktop-notifier`),
which is the only new dependency and stays off the default install.
2026-10-21 19:53:19 +08:00

188 lines
4.7 KiB
TOML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
[project]
name = "plyngent"
version = "0.10.0"
description = "LLM chat and agent toolkit"
authors = [
{ name = "HivertMoZara", email = "worldmozara@163.com" },
]
dependencies = [
"msgspec>=0.21.1",
"niquests>=3.20",
"typing-extensions>=4.15.0",
"platformdirs>=4.10.0",
"tomlkit>=0.15.0",
"sqlalchemy>=2.0.51",
"aiosqlite>=0.22.1",
"click>=8.4.2",
"awaitlet>=0.0.1",
"pywinpty>=2.0.0; sys_platform == \"win32\"",
"rich>=13"
]
requires-python = ">=3.14,<4"
readme = "README.md"
license = { text = "MIT" }
[project.optional-dependencies]
# Desktop notifications while a prompt waits on the human (see `[notify]`).
notify = ["desktop-notifier>=6.2.0"]
[project.scripts]
plyngent = "plyngent.cli:main"
[dependency-groups]
dev = [
"basedpyright==1.40.2",
"ruff==0.16.10",
"pytest>=9.1.1",
"pytest-asyncio>=1.4.0",
]
[build-system]
requires = ["pdm-backend"]
build-backend = "pdm.backend"
[tool.basedpyright]
typeCheckingMode = "recommended"
strictGenericNarrowing = true
# winpty is Windows-only (pywinpty); stubs live under typings/ (pyright default stubPath).
reportMissingModuleSource = "hint"
reportAny = "hint"
reportExplicitAny = "hint"
reportImplicitStringConcatenation = "hint"
reportImportCycles = "hint"
[[tool.basedpyright.executionEnvironments]]
root = "tests"
extraPaths = ["src", "."]
reportPrivateUsage = "none"
reportUnreachable = "none"
reportUnusedCallResult = "none"
reportUnannotatedClassAttribute = "none"
reportUnknownArgumentType = "none"
reportUnknownLambdaType = "none"
reportUnknownMemberType = "none"
reportUnknownVariableType = "none"
reportUnknownParameterType = "none"
reportMissingParameterType = "none"
reportUnusedParameter = "none"
reportMissingImports = "none"
reportMissingTypeStubs = "none"
reportArgumentType = "none"
reportAttributeAccessIssue = "none"
[[tool.basedpyright.executionEnvironments]]
root = "scripts"
reportUnusedCallResult = "none"
[tool.pytest.ini_options]
asyncio_mode = "auto"
asyncio_default_fixture_loop_scope = "function"
testpaths = ["tests"]
[tool.pdm]
distribution = true
[tool.ruff]
line-length = 120
target-version = "py314"
[tool.ruff.format]
line-ending = "lf"
[tool.ruff.lint]
# For more rules, see https://docs.astral.sh/ruff/rules/.
select = [
"F", # Pyflakes
"W", # pycodestyle warnings
"E", # pycodestyle errors
"I", # isort
"C90", # mccabe
"N", # pep8-naming
"PL", # pylint
"UP", # pyupgrade
"YTT", # flake8-2020
"ANN", # flake8-annotations
"ASYNC", # flake8-async
"BLE", # flake8-blind-except
"FBT", # flake8-boolean-trap
"B", # flake8-bugbear
"A", # flake8-builtins
"COM", # flake8-commas
"C4", # flake8-comprehensions
"DTZ", # flake8-datetimez
"T10", # flake8-debugger
"ICN", # flake8-import-conventions
"PIE", # flake8-pie
"T20", # flake8-print
"PYI", # flake8-pyi
"Q", # flake8-quotes
"RSE", # flake8-raise
"RET", # flake8-return
"SIM", # flake8-simplify
"SLOT", # flake8-slots
"TID", # flake8-tidy-imports
"TC", # flake8-type-checking
"ARG", # flake8-unused-arguments
"PTH", # flake8-use-pathlib
# "ERA", # eradicate
"FAST", # FastAPI
"PERF", # Perflint
"PGH", # pygrep-hooks
"FURB", # refurb
"TRY", # tryceratops
"RUF", # Ruff-specific rules
]
ignore = [
"UP037", # quoted-annotation
# "ANN201", # missing-return-type-undocumented-public-function
"ANN202", # missing-return-type-private-function
"ANN401", # any-type
"COM812", # missing-trailing-comma
"PLC0415", # import-outside-top-level
"TID252",
# Same axis as C901 (conditional branches per function) but a looser default,
# and C901 flags every function it does — keep the one gate (see AGENTS.md).
"PLR0912", # too-many-branches
"PLR0913", # too-many-arguments (common on constructors/composed functions)
"PLR0917", # too-many-positional-arguments (same family as PLR0913 above)
]
allowed-confusables = [
",",
"。",
"“",
"”",
":",
";",
"?",
"!",
"【",
"】",
"《",
"》",
"…",
"—",
"(",
")",
"、"
]
[tool.ruff.lint.per-file-ignores]
"tests/**" = [
"ANN", # type annotations often noisy in tests
"ARG", # unused fixtures/args are common
"ASYNC240", # pathlib in async tests is fine
"PLR2004", # magic values in asserts
"PLR0911", # many returns in fixtures/helpers
"PLR0912", # branching in scripted clients
"PLR0915", # long test functions
"C901", # complexity in scripted fakes
"S101", # assert is the point of tests
"TC", # TYPE_CHECKING import churn
"TRY003", # long exception messages in tests
"FBT", # boolean positional args in helpers
]
"scripts/**" = [
"T201", # CLI scripts print status
"PLR0911", # command dispatch returns
]