deploynator 1.3.3__tar.gz → 1.3.4__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 (42) hide show
  1. {deploynator-1.3.3 → deploynator-1.3.4}/PKG-INFO +39 -6
  2. {deploynator-1.3.3 → deploynator-1.3.4}/README.md +38 -5
  3. {deploynator-1.3.3 → deploynator-1.3.4}/deploynator/__init__.py +1 -1
  4. {deploynator-1.3.3 → deploynator-1.3.4}/deploynator/__main__.py +5 -0
  5. {deploynator-1.3.3 → deploynator-1.3.4}/deploynator/_app.py +2 -0
  6. {deploynator-1.3.3 → deploynator-1.3.4}/deploynator/_deploy.py +6 -4
  7. {deploynator-1.3.3 → deploynator-1.3.4}/deploynator/_pypi.py +13 -3
  8. {deploynator-1.3.3 → deploynator-1.3.4}/.gitignore +0 -0
  9. {deploynator-1.3.3 → deploynator-1.3.4}/LICENSE +0 -0
  10. {deploynator-1.3.3 → deploynator-1.3.4}/deploynator/_changelog.py +0 -0
  11. {deploynator-1.3.3 → deploynator-1.3.4}/deploynator/_config.py +0 -0
  12. {deploynator-1.3.3 → deploynator-1.3.4}/deploynator/_docs.py +0 -0
  13. {deploynator-1.3.3 → deploynator-1.3.4}/deploynator/_git.py +0 -0
  14. {deploynator-1.3.3 → deploynator-1.3.4}/deploynator/_mcp_server.py +0 -0
  15. {deploynator-1.3.3 → deploynator-1.3.4}/deploynator/_models.py +0 -0
  16. {deploynator-1.3.3 → deploynator-1.3.4}/deploynator/_platforms.py +0 -0
  17. {deploynator-1.3.3 → deploynator-1.3.4}/deploynator/_readme.py +0 -0
  18. {deploynator-1.3.3 → deploynator-1.3.4}/deploynator/_runner.py +0 -0
  19. {deploynator-1.3.3 → deploynator-1.3.4}/deploynator/_semver.py +0 -0
  20. {deploynator-1.3.3 → deploynator-1.3.4}/deploynator/_toml.py +0 -0
  21. {deploynator-1.3.3 → deploynator-1.3.4}/example.deploynator.toml +0 -0
  22. {deploynator-1.3.3 → deploynator-1.3.4}/projects/deploynator.yaml +0 -0
  23. {deploynator-1.3.3 → deploynator-1.3.4}/projects/lazyown.yaml +0 -0
  24. {deploynator-1.3.3 → deploynator-1.3.4}/projects/template.yaml +0 -0
  25. {deploynator-1.3.3 → deploynator-1.3.4}/pyproject.toml +0 -0
  26. {deploynator-1.3.3 → deploynator-1.3.4}/specs/deploynator_toml_pipeline.spec.md +0 -0
  27. {deploynator-1.3.3 → deploynator-1.3.4}/tests/__init__.py +0 -0
  28. {deploynator-1.3.3 → deploynator-1.3.4}/tests/bdd_test_deploy.py +0 -0
  29. {deploynator-1.3.3 → deploynator-1.3.4}/tests/test_changelog.py +0 -0
  30. {deploynator-1.3.3 → deploynator-1.3.4}/tests/test_cli_mcp.py +0 -0
  31. {deploynator-1.3.3 → deploynator-1.3.4}/tests/test_config.py +0 -0
  32. {deploynator-1.3.3 → deploynator-1.3.4}/tests/test_deploy.py +0 -0
  33. {deploynator-1.3.3 → deploynator-1.3.4}/tests/test_init.py +0 -0
  34. {deploynator-1.3.3 → deploynator-1.3.4}/tests/test_install_example.py +0 -0
  35. {deploynator-1.3.3 → deploynator-1.3.4}/tests/test_models.py +0 -0
  36. {deploynator-1.3.3 → deploynator-1.3.4}/tests/test_path_deploy.py +0 -0
  37. {deploynator-1.3.3 → deploynator-1.3.4}/tests/test_pipeline.py +0 -0
  38. {deploynator-1.3.3 → deploynator-1.3.4}/tests/test_pypi.py +0 -0
  39. {deploynator-1.3.3 → deploynator-1.3.4}/tests/test_readme_footer.py +0 -0
  40. {deploynator-1.3.3 → deploynator-1.3.4}/tests/test_runner.py +0 -0
  41. {deploynator-1.3.3 → deploynator-1.3.4}/tests/test_semver.py +0 -0
  42. {deploynator-1.3.3 → deploynator-1.3.4}/tests/test_toml.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: deploynator
3
- Version: 1.3.3
3
+ Version: 1.3.4
4
4
  Summary: Multi-platform deployer for GitHub, GitLab, and Bitbucket
5
5
  Project-URL: Homepage, https://github.com/grisuno/deploynator
6
6
  Project-URL: Repository, https://github.com/grisuno/deploynator
@@ -260,22 +260,55 @@ Deployed with [deploynator](https://github.com/grisuno/deploynator)
260
260
  ## Knowledge Base
261
261
 
262
262
  This project has been analyzed by [ReadMenator](https://github.com/grisuno/ReadMenator),
263
- a zero-token polyglot static analysis tool. Analysis outputs are available:
263
+ a zero-token polyglot static analysis tool. Regenerate with
264
+ `pip install readmenator && readmenator . --rebuild`. Analysis outputs:
264
265
 
265
266
  - **[KNOWLEDGE_BASE.md](./KNOWLEDGE_BASE.md)** -- Full architecture reference with all
266
267
  classes, functions, imports, dependency graphs, UML class diagrams, security
267
- audit findings, community analysis, and more.
268
+ audit findings, community analysis, taint paths, hotspots, cycles, and more.
268
269
  - **[readmenator-agent/](./readmenator-agent/)** -- Agent-friendly, grep-optimized index.
269
270
  - `INDEX.md` -- Quick reference: what each file does
271
+ - `SYMBOLS.md` -- Every symbol with file:line
272
+ - `ARCHITECTURE.md` -- Internal dependency pairs + external imports
270
273
  - `API.md` -- Public function contracts
271
- - `GOTCHAS.md` -- Change warnings
272
- - `SECURITY.md` -- Findings by severity
274
+ - `GOTCHAS.md` -- Change warnings (blast radius, cycles, hotspots)
275
+ - `SECURITY.md` -- Findings by severity with fix hints
276
+ - `MEMORY.md` -- Rules, workflow, style, deliverables, session log
277
+ - `MANIFEST.json` -- Freshness (git_commit + source_fingerprint) + read order
278
+ - `KB_<subsystem>.md` -- Per-subsystem context
279
+ - `recipes/*.md` -- Grounded task guides (add-function, fix-cycle, ...)
273
280
  - **[readmenator-wiki/](./readmenator-wiki/)** -- Navigable wiki (start here for the big picture).
274
281
  - `index.md` -- Entry point: overview, reading order, god nodes, connections
275
282
  - `community_*.md` -- One synthesis page per code community
283
+ - `connections.json` -- Typed bridges between communities
284
+ - `queries.md` -- Suggested questions + answer log
276
285
  - `REPORT.md` -- Honest audit: coverage, confidence, limits
286
+ - **[readmenator-graphrag/](./readmenator-graphrag/)** -- Zero-token GraphRAG index.
287
+ - `index.json` + `REPORTS.md` -- Query with `readmenator . ask "<question>"`
288
+ - **[readmenator-apidocs/](./readmenator-apidocs/)** -- API reference (Sphinx/Doxygen style).
289
+ - `index.md` + `modules/*.md` -- Signatures, parameters, returns, raises, examples, call graphs
290
+ - `architecture.md` -- Tiered architecture + execution flows (control flow, call tree, sequence)
291
+ - `classes.md`, `genindex.md`, `COVERAGE.md` -- Hierarchy, A-Z index, doc coverage + warnings
292
+ - `index.html` + `api/` -- Offline searchable browser and machine-readable model (`api/index.json`, `api/modules/*.jsonl` one entity per line)
293
+ - **[readmenator-maps/](./readmenator-maps/)** -- Interactive gallery (`index.html`).
294
+ - 5 system maps: architecture, workflow, sequence, dataflow, lifecycle
295
+ - `graph-force.html` -- Force-graph explorer (2D/3D, reach, paths, lenses)
296
+ - `graph-bundle.html` -- Edge bundle explorer (circle + sphere)
297
+ - `components.html` -- Component diagrams
298
+ - **[docs/](./docs/)** -- Static site (GitHub Pages ready).
299
+ - Gallery copy + `llms.txt` (agent entry point) + `md/` docs + video
300
+ - **[readmenator-diagrams/](./readmenator-diagrams/)** -- Component diagrams.
301
+ - `analysis.json` + `graph LR` markdown + per-component pages + `index.html`
302
+ - **[readmenator-rules/](./readmenator-rules/)** -- Suggested Semgrep rules (`*.yml`),
303
+ `yara_rules.yar` (YARA-lite) + `exclusions.yaml` (false-positive blocklist)
304
+ - **[readmenator.mp4](./readmenator.mp4)** -- Cinematic synthwave overview video
305
+ - **[.cursorrules](./.cursorrules)** -- Generated AI assistant rules
306
+ - **[readmenator_audit.sarif](./readmenator_audit.sarif)** -- SARIF v2.1.0 audit (when security scan is on)
307
+
308
+ Cache (`.readmenator_cache/`), packaged agent skills (`.claude/skills/`), and the
309
+ GitHub wiki mirror are also produced on `run`/`--rebuild`.
277
310
 
278
311
  AI agents: Read `readmenator-wiki/index.md` first for the big picture, then `readmenator-agent/INDEX.md` for grep-friendly lookup.
279
- Developers: Read `KNOWLEDGE_BASE.md` for full architecture reference.
312
+ Developers: Read `KNOWLEDGE_BASE.md` for full architecture reference, open `readmenator-maps/index.html` for the visual gallery.
280
313
  <!-- /readmenator-kb-link -->
281
314
 
@@ -226,22 +226,55 @@ Deployed with [deploynator](https://github.com/grisuno/deploynator)
226
226
  ## Knowledge Base
227
227
 
228
228
  This project has been analyzed by [ReadMenator](https://github.com/grisuno/ReadMenator),
229
- a zero-token polyglot static analysis tool. Analysis outputs are available:
229
+ a zero-token polyglot static analysis tool. Regenerate with
230
+ `pip install readmenator && readmenator . --rebuild`. Analysis outputs:
230
231
 
231
232
  - **[KNOWLEDGE_BASE.md](./KNOWLEDGE_BASE.md)** -- Full architecture reference with all
232
233
  classes, functions, imports, dependency graphs, UML class diagrams, security
233
- audit findings, community analysis, and more.
234
+ audit findings, community analysis, taint paths, hotspots, cycles, and more.
234
235
  - **[readmenator-agent/](./readmenator-agent/)** -- Agent-friendly, grep-optimized index.
235
236
  - `INDEX.md` -- Quick reference: what each file does
237
+ - `SYMBOLS.md` -- Every symbol with file:line
238
+ - `ARCHITECTURE.md` -- Internal dependency pairs + external imports
236
239
  - `API.md` -- Public function contracts
237
- - `GOTCHAS.md` -- Change warnings
238
- - `SECURITY.md` -- Findings by severity
240
+ - `GOTCHAS.md` -- Change warnings (blast radius, cycles, hotspots)
241
+ - `SECURITY.md` -- Findings by severity with fix hints
242
+ - `MEMORY.md` -- Rules, workflow, style, deliverables, session log
243
+ - `MANIFEST.json` -- Freshness (git_commit + source_fingerprint) + read order
244
+ - `KB_<subsystem>.md` -- Per-subsystem context
245
+ - `recipes/*.md` -- Grounded task guides (add-function, fix-cycle, ...)
239
246
  - **[readmenator-wiki/](./readmenator-wiki/)** -- Navigable wiki (start here for the big picture).
240
247
  - `index.md` -- Entry point: overview, reading order, god nodes, connections
241
248
  - `community_*.md` -- One synthesis page per code community
249
+ - `connections.json` -- Typed bridges between communities
250
+ - `queries.md` -- Suggested questions + answer log
242
251
  - `REPORT.md` -- Honest audit: coverage, confidence, limits
252
+ - **[readmenator-graphrag/](./readmenator-graphrag/)** -- Zero-token GraphRAG index.
253
+ - `index.json` + `REPORTS.md` -- Query with `readmenator . ask "<question>"`
254
+ - **[readmenator-apidocs/](./readmenator-apidocs/)** -- API reference (Sphinx/Doxygen style).
255
+ - `index.md` + `modules/*.md` -- Signatures, parameters, returns, raises, examples, call graphs
256
+ - `architecture.md` -- Tiered architecture + execution flows (control flow, call tree, sequence)
257
+ - `classes.md`, `genindex.md`, `COVERAGE.md` -- Hierarchy, A-Z index, doc coverage + warnings
258
+ - `index.html` + `api/` -- Offline searchable browser and machine-readable model (`api/index.json`, `api/modules/*.jsonl` one entity per line)
259
+ - **[readmenator-maps/](./readmenator-maps/)** -- Interactive gallery (`index.html`).
260
+ - 5 system maps: architecture, workflow, sequence, dataflow, lifecycle
261
+ - `graph-force.html` -- Force-graph explorer (2D/3D, reach, paths, lenses)
262
+ - `graph-bundle.html` -- Edge bundle explorer (circle + sphere)
263
+ - `components.html` -- Component diagrams
264
+ - **[docs/](./docs/)** -- Static site (GitHub Pages ready).
265
+ - Gallery copy + `llms.txt` (agent entry point) + `md/` docs + video
266
+ - **[readmenator-diagrams/](./readmenator-diagrams/)** -- Component diagrams.
267
+ - `analysis.json` + `graph LR` markdown + per-component pages + `index.html`
268
+ - **[readmenator-rules/](./readmenator-rules/)** -- Suggested Semgrep rules (`*.yml`),
269
+ `yara_rules.yar` (YARA-lite) + `exclusions.yaml` (false-positive blocklist)
270
+ - **[readmenator.mp4](./readmenator.mp4)** -- Cinematic synthwave overview video
271
+ - **[.cursorrules](./.cursorrules)** -- Generated AI assistant rules
272
+ - **[readmenator_audit.sarif](./readmenator_audit.sarif)** -- SARIF v2.1.0 audit (when security scan is on)
273
+
274
+ Cache (`.readmenator_cache/`), packaged agent skills (`.claude/skills/`), and the
275
+ GitHub wiki mirror are also produced on `run`/`--rebuild`.
243
276
 
244
277
  AI agents: Read `readmenator-wiki/index.md` first for the big picture, then `readmenator-agent/INDEX.md` for grep-friendly lookup.
245
- Developers: Read `KNOWLEDGE_BASE.md` for full architecture reference.
278
+ Developers: Read `KNOWLEDGE_BASE.md` for full architecture reference, open `readmenator-maps/index.html` for the visual gallery.
246
279
  <!-- /readmenator-kb-link -->
247
280
 
@@ -1,4 +1,4 @@
1
1
  from deploynator._app import DeploynatorApp
2
2
 
3
- __version__ = "1.3.3"
3
+ __version__ = "1.3.4"
4
4
  __all__ = ["DeploynatorApp"]
@@ -28,6 +28,10 @@ def build_parser() -> argparse.ArgumentParser:
28
28
  "--workdir", type=str, default="",
29
29
  help="Working directory (default: current dir)",
30
30
  )
31
+ parser.add_argument(
32
+ "--verbose", "-v", action="store_true",
33
+ help="Verbose output (twine --verbose, full command + untruncated errors)",
34
+ )
31
35
 
32
36
  subparsers = parser.add_subparsers(dest="command", help="Available commands")
33
37
 
@@ -199,6 +203,7 @@ def main(argv: list[str] | None = None) -> NoReturn | None:
199
203
  no_test=getattr(args, "no_test", False),
200
204
  no_docs=getattr(args, "no_docs", False),
201
205
  no_pypi=getattr(args, "no_pypi", False),
206
+ verbose=getattr(args, "verbose", False),
202
207
  )
203
208
  sys.exit(0 if all(r.success for r in results) else 1)
204
209
 
@@ -356,6 +356,7 @@ version:
356
356
  no_test: bool = False,
357
357
  no_docs: bool = False,
358
358
  no_pypi: bool = False,
359
+ verbose: bool = False,
359
360
  ) -> list[DeployResult]:
360
361
  base = os.getcwd()
361
362
  ctype = CommitType.from_string(commit_type)
@@ -424,6 +425,7 @@ version:
424
425
  run_docs=not no_docs,
425
426
  force_bump=bump or None,
426
427
  run_pypi=not no_pypi,
428
+ verbose=verbose,
427
429
  )
428
430
  results.append(result)
429
431
  self._print_result(result)
@@ -107,6 +107,7 @@ class DeployOrchestrator:
107
107
  run_docs: bool = True,
108
108
  force_bump: Optional[str] = None,
109
109
  run_pypi: bool = True,
110
+ verbose: bool = False,
110
111
  ) -> DeployResult:
111
112
  repo_path = self._resolve_project_path(project)
112
113
 
@@ -334,7 +335,8 @@ class DeployOrchestrator:
334
335
  print("[!] PyPI packaging detected but no credentials "
335
336
  "(TWINE_PASSWORD/PYPI_TOKEN/~/.pypirc). Skipping upload.")
336
337
  else:
337
- ok, msg = self._pypi.run(repo_path, toml_cfg, new_version_str, token=token)
338
+ ok, msg = self._pypi.run(repo_path, toml_cfg, new_version_str, token=token,
339
+ verbose=verbose)
338
340
  print(f"[{'OK' if ok else 'FAIL'}] {msg}")
339
341
  if not ok:
340
342
  return DeployResult(
@@ -343,10 +345,10 @@ class DeployOrchestrator:
343
345
  success=False,
344
346
  platforms_pushed=platforms_pushed,
345
347
  releases_created=releases_created,
346
- error=msg[:2000],
348
+ error=msg if verbose else msg[:2000],
347
349
  )
348
350
  else:
349
- ok, msg = self._pypi.run(repo_path, toml_cfg, new_version_str)
351
+ ok, msg = self._pypi.run(repo_path, toml_cfg, new_version_str, verbose=verbose)
350
352
  print(f"[{'OK' if ok else 'FAIL'}] {msg}")
351
353
  if not ok:
352
354
  return DeployResult(
@@ -355,7 +357,7 @@ class DeployOrchestrator:
355
357
  success=False,
356
358
  platforms_pushed=platforms_pushed,
357
359
  releases_created=releases_created,
358
- error=msg[:2000],
360
+ error=msg if verbose else msg[:2000],
359
361
  )
360
362
 
361
363
  return DeployResult(
@@ -105,7 +105,7 @@ class PyPIRunner:
105
105
  shutil.rmtree(target)
106
106
 
107
107
  def run(self, project_path: str, toml: TomlConfig, version: str,
108
- token: str | None = None) -> tuple[bool, str]:
108
+ token: str | None = None, verbose: bool = False) -> tuple[bool, str]:
109
109
  if not self.is_packaging_project(project_path):
110
110
  return True, "PyPI skipped: no packaging files"
111
111
  try:
@@ -120,7 +120,10 @@ class PyPIRunner:
120
120
  timeout=toml.pypi_timeout_s,
121
121
  )
122
122
  if build.returncode != 0:
123
- err = (build.stderr or build.stdout or "").strip()[-2000:]
123
+ raw = (build.stderr or build.stdout or "").strip()
124
+ if verbose and raw:
125
+ print(raw)
126
+ err = raw if verbose else raw[-2000:]
124
127
  hint = "" if "build" not in err.lower() else " (pip install build)"
125
128
  return False, f"PyPI build failed for {version}{hint}: {err}"
126
129
  dist_dir = os.path.join(project_path, "dist")
@@ -128,11 +131,15 @@ class PyPIRunner:
128
131
  if not artifacts:
129
132
  return False, f"PyPI build produced no artifacts for {version}"
130
133
  cmd = [sys.executable, "-m", "twine", "upload", "--non-interactive"]
134
+ if verbose:
135
+ cmd += ["--verbose"]
131
136
  if toml.pypi_repo == "testpypi":
132
137
  cmd += ["--repository", "testpypi"]
133
138
  elif toml.pypi_repo not in ("pypi", "testpypi"):
134
139
  cmd += ["--repository-url", toml.pypi_repo]
135
140
  cmd += [os.path.join("dist", a) for a in artifacts]
141
+ if verbose:
142
+ print(f"[...] {subprocess.list2cmdline(cmd)} (cwd={project_path})")
136
143
  env = dict(os.environ)
137
144
  token = token or os.environ.get("PYPI_TOKEN")
138
145
  if token and not os.environ.get("TWINE_PASSWORD"):
@@ -150,6 +157,9 @@ class PyPIRunner:
150
157
  except subprocess.TimeoutExpired:
151
158
  return False, f"PyPI upload timed out after {toml.pypi_timeout_s}s"
152
159
  if upload.returncode != 0:
153
- err = (upload.stderr or upload.stdout or "").strip()[-2000:]
160
+ raw = (upload.stderr or upload.stdout or "").strip()
161
+ if verbose and raw:
162
+ print(raw)
163
+ err = raw if verbose else raw[-2000:]
154
164
  return False, f"PyPI upload failed for {version}: {err}"
155
165
  return True, f"PyPI uploaded {version}: {', '.join(artifacts)}"
File without changes
File without changes
File without changes