devtime-ei 0.1.2__tar.gz → 0.1.3__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 (76) hide show
  1. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/PKG-INFO +4 -4
  2. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/README.md +2 -2
  3. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/pyproject.toml +2 -2
  4. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/__init__.py +1 -1
  5. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/scanner/extractors/nextjs.py +74 -1
  6. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/scanner/extractors/typescript.py +15 -0
  7. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime_ei.egg-info/PKG-INFO +4 -4
  8. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/LICENSE +0 -0
  9. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/setup.cfg +0 -0
  10. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/ai/__init__.py +0 -0
  11. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/ai/local.py +0 -0
  12. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/ai/prompts.py +0 -0
  13. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/ai/providers.py +0 -0
  14. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/assets/devtimeignore.starter +0 -0
  15. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/cli.py +0 -0
  16. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/config.py +0 -0
  17. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/db/__init__.py +0 -0
  18. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/db/connection.py +0 -0
  19. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/db/migrations.py +0 -0
  20. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/db/repository.py +0 -0
  21. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/db/schema.sql +0 -0
  22. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/demo.py +0 -0
  23. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/fixtures/__init__.py +0 -0
  24. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/fixtures/assertions.py +0 -0
  25. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/fixtures/loader.py +0 -0
  26. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/fixtures/runner.py +0 -0
  27. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/intelligence/__init__.py +0 -0
  28. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/intelligence/claims.py +0 -0
  29. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/intelligence/concepts.py +0 -0
  30. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/intelligence/context_pack.py +0 -0
  31. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/intelligence/evidence.py +0 -0
  32. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/intelligence/lineage.py +0 -0
  33. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/intelligence/risk.py +0 -0
  34. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/intelligence/scoring.py +0 -0
  35. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/mcp/__init__.py +0 -0
  36. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/mcp/schemas.py +0 -0
  37. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/mcp/server.py +0 -0
  38. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/mcp/tools.py +0 -0
  39. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/mcp/transport.py +0 -0
  40. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/output/__init__.py +0 -0
  41. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/output/json_export.py +0 -0
  42. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/output/markdown.py +0 -0
  43. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/output/terminal.py +0 -0
  44. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/paths.py +0 -0
  45. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/privacy.py +0 -0
  46. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/resources/demo-saas/.devtimeignore +0 -0
  47. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/resources/demo-saas/README.md +0 -0
  48. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/resources/demo-saas/docs/decisions/0001-use-jwt.md +0 -0
  49. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/resources/demo-saas/package.json +0 -0
  50. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/resources/demo-saas/src/admin/permissions.ts +0 -0
  51. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/resources/demo-saas/src/auth/login.ts +0 -0
  52. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/resources/demo-saas/src/auth/middleware.ts +0 -0
  53. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/resources/demo-saas/src/auth/tokens.ts +0 -0
  54. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/resources/demo-saas/src/billing/stripe-webhook.ts +0 -0
  55. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/resources/demo-saas/src/billing/subscription-service.ts +0 -0
  56. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/resources/demo-saas/src/export/export-csv.ts +0 -0
  57. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/resources/demo-saas/src/jobs/email-worker.ts +0 -0
  58. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/resources/demo-saas/src/jobs/queues.ts +0 -0
  59. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/resources/demo-saas/tests/auth-login.test.ts +0 -0
  60. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/resources/demo-saas/tests/stripe-signature.test.ts +0 -0
  61. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/scanner/__init__.py +0 -0
  62. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/scanner/extractors/__init__.py +0 -0
  63. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/scanner/extractors/base.py +0 -0
  64. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/scanner/extractors/config_files.py +0 -0
  65. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/scanner/extractors/docs.py +0 -0
  66. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/scanner/extractors/python.py +0 -0
  67. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/scanner/extractors/tests.py +0 -0
  68. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/scanner/file_walker.py +0 -0
  69. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/scanner/ignore.py +0 -0
  70. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/scanner/language.py +0 -0
  71. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime/scanner/signals.py +0 -0
  72. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime_ei.egg-info/SOURCES.txt +0 -0
  73. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime_ei.egg-info/dependency_links.txt +0 -0
  74. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime_ei.egg-info/entry_points.txt +0 -0
  75. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime_ei.egg-info/requires.txt +0 -0
  76. {devtime_ei-0.1.2 → devtime_ei-0.1.3}/src/devtime_ei.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devtime-ei
3
- Version: 0.1.2
3
+ Version: 0.1.3
4
4
  Summary: Local-first Engineering Intelligence for software repositories
5
5
  Author-email: Aviad Shakargi <aviad94@gmail.com>
6
6
  Maintainer-email: Aviad Shakargi <aviad94@gmail.com>
@@ -8,7 +8,7 @@ License: Apache-2.0
8
8
  Project-URL: Homepage, https://github.com/Shakargy/devtime
9
9
  Project-URL: Repository, https://github.com/Shakargy/devtime
10
10
  Project-URL: Issues, https://github.com/Shakargy/devtime/issues
11
- Project-URL: Release Notes, https://github.com/Shakargy/devtime/releases/tag/v0.1.2
11
+ Project-URL: Release Notes, https://github.com/Shakargy/devtime/releases/tag/v0.1.3
12
12
  Project-URL: Demo, https://youtu.be/1Hiu3Y9J_SI
13
13
  Keywords: devtools,cli,static-analysis,repository-analysis,engineering-intelligence,local-first
14
14
  Classifier: Development Status :: 3 - Alpha
@@ -251,9 +251,9 @@ The agent gets three read-only tools: `list_concepts`, `explain_concept`, and
251
251
  to run, and agent guidance). Local stdio only - no network listener, no write tools,
252
252
  no source code returned, only evidence file paths.
253
253
 
254
- DevTime is listed in the official MCP Registry as `io.github.shakargy/devtime`.
254
+ DevTime is listed in the official MCP Registry as `io.github.Shakargy/devtime`.
255
255
 
256
- <!-- mcp-name: io.github.shakargy/devtime -->
256
+ <!-- mcp-name: io.github.Shakargy/devtime -->
257
257
 
258
258
  ## Installation
259
259
 
@@ -212,9 +212,9 @@ The agent gets three read-only tools: `list_concepts`, `explain_concept`, and
212
212
  to run, and agent guidance). Local stdio only - no network listener, no write tools,
213
213
  no source code returned, only evidence file paths.
214
214
 
215
- DevTime is listed in the official MCP Registry as `io.github.shakargy/devtime`.
215
+ DevTime is listed in the official MCP Registry as `io.github.Shakargy/devtime`.
216
216
 
217
- <!-- mcp-name: io.github.shakargy/devtime -->
217
+ <!-- mcp-name: io.github.Shakargy/devtime -->
218
218
 
219
219
  ## Installation
220
220
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "devtime-ei"
3
- version = "0.1.2"
3
+ version = "0.1.3"
4
4
  description = "Local-first Engineering Intelligence for software repositories"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -50,7 +50,7 @@ dev = [
50
50
  Homepage = "https://github.com/Shakargy/devtime"
51
51
  Repository = "https://github.com/Shakargy/devtime"
52
52
  Issues = "https://github.com/Shakargy/devtime/issues"
53
- "Release Notes" = "https://github.com/Shakargy/devtime/releases/tag/v0.1.2"
53
+ "Release Notes" = "https://github.com/Shakargy/devtime/releases/tag/v0.1.3"
54
54
  Demo = "https://youtu.be/1Hiu3Y9J_SI"
55
55
 
56
56
  [project.scripts]
@@ -1,6 +1,6 @@
1
1
  """DevTime - local-first Engineering Intelligence for repository memory."""
2
2
 
3
- __version__ = "0.1.2"
3
+ __version__ = "0.1.3"
4
4
 
5
5
  # Version metadata (Builder Edition, Chapter 20).
6
6
  EVIDENCE_MODEL = "2026.06.1"
@@ -1,10 +1,16 @@
1
- """Next.js App Router signal extractor.
1
+ """Next.js App Router and Pages Router API signal extractor.
2
2
 
3
3
  Added during V0 Reality Validation: Snapilio and SaaSVoice are Next.js App Router
4
4
  apps whose API surface is file-based (`app/api/**/route.ts` exporting HTTP method
5
5
  handlers). The Express/FastAPI extractors saw none of it, so every concept
6
6
  degraded to weak dependency evidence. This extractor parses route handlers and
7
7
  derives the route path from the directory structure.
8
+
9
+ v0.1.3 (Cal.com proof run): Pages Router API files (`pages/api/**/*.ts`) are also
10
+ routes; without them, admin/trpc surfaces were invisible. Disabled-endpoint stubs
11
+ (handlers whose only behavior is a 404/501 response, e.g. features stripped from a
12
+ community edition) are NOT route behavior and are skipped - a permanently-404
13
+ endpoint must not confirm a concept.
8
14
  """
9
15
 
10
16
  from __future__ import annotations
@@ -57,7 +63,74 @@ def derive_route_path(rel_path: str) -> str:
57
63
  return "/" + "/".join(cleaned)
58
64
 
59
65
 
66
+ _PAGES_API_EXTS = (".ts", ".js", ".tsx", ".jsx")
67
+
68
+ # Pages Router handlers: export default function handler(...) / export default handler
69
+ _PAGES_HANDLER_RE = re.compile(r"export\s+default\s+(?:async\s+)?(?:function\b|\w+)")
70
+
71
+ _STATUS_RE = re.compile(r"(?:res\.status|new\s+Response\s*\([^)]*status\s*:)\s*\(?\s*(\d{3})")
72
+
73
+
74
+ def is_pages_api_route(rel_path: str) -> bool:
75
+ if not rel_path.endswith(_PAGES_API_EXTS):
76
+ return False
77
+ return "pages/api/" in rel_path or rel_path.startswith("pages/api/")
78
+
79
+
80
+ def derive_pages_route_path(rel_path: str) -> str:
81
+ """Turn apps/web/pages/api/trpc/admin/[trpc].ts -> /api/trpc/admin/[trpc]."""
82
+ marker = "pages/api/"
83
+ idx = rel_path.find(marker)
84
+ tail = rel_path[idx + len(marker):]
85
+ # Strip the extension; index files map to their directory.
86
+ for ext in _PAGES_API_EXTS:
87
+ if tail.endswith(ext):
88
+ tail = tail[: -len(ext)]
89
+ break
90
+ if tail.endswith("/index") or tail == "index":
91
+ tail = tail[: -len("index")].rstrip("/")
92
+ return "/api/" + tail if tail else "/api"
93
+
94
+
95
+ def _is_disabled_stub(text: str) -> bool:
96
+ """A handler whose only responses are 404/501 is a disabled-endpoint stub.
97
+
98
+ Cal.com's community edition ships pages/api/stripe/webhook.ts as a handler
99
+ that always returns 404 ("not available in community edition"). A route that
100
+ can never do anything is not behavior evidence for any concept.
101
+ """
102
+ statuses = _STATUS_RE.findall(text)
103
+ if not statuses:
104
+ return False
105
+ if not set(statuses) <= {"404", "501"}:
106
+ return False
107
+ # Real handlers verify, branch, or delegate; stubs are tiny and self-contained.
108
+ if len(text) > 800:
109
+ return False
110
+ return "constructEvent" not in text
111
+
112
+
113
+ def _extract_pages_api(file: WalkedFile) -> list[Signal]:
114
+ text = read_text(file)
115
+ if not _PAGES_HANDLER_RE.search(text):
116
+ return []
117
+ if _is_disabled_stub(text):
118
+ return []
119
+ route_path = derive_pages_route_path(file.rel_path)
120
+ return [
121
+ signal(
122
+ "route",
123
+ name=f"ANY {route_path}",
124
+ file=file,
125
+ confidence=0.78,
126
+ metadata={"method": "ANY", "path": route_path, "framework": "nextjs-pages"},
127
+ )
128
+ ]
129
+
130
+
60
131
  def extract_nextjs_signals(file: WalkedFile) -> list[Signal]:
132
+ if is_pages_api_route(file.rel_path):
133
+ return _extract_pages_api(file)
61
134
  if not is_app_router_route(file.rel_path):
62
135
  return []
63
136
  text = read_text(file)
@@ -23,6 +23,16 @@ _MIDDLEWARE_RE = re.compile(
23
23
  )
24
24
  _BULLMQ_WORKER_RE = re.compile(r"""new\s+Worker\(\s*['"]([^'"]+)['"]""")
25
25
  _BULLMQ_QUEUE_RE = re.compile(r"""new\s+Queue\(\s*['"]([^'"]+)['"]""")
26
+ # Custom task-runner infrastructure (v0.1.3, Cal.com proof run): Cal.com's Tasker
27
+ # (InternalTasker / RedisTasker / task-processor) is real background-job behavior
28
+ # that the BullMQ-only patterns above cannot see. Matches task-runner classes and
29
+ # enqueue/task-processing verbs - NOT bare "task"/"job" words (todo apps,
30
+ # employment taxonomy) and NOT service workers.
31
+ # NOTE: no `\w*` prefixes here - `\w*Tasker` backtracks catastrophically on long
32
+ # identifiers in bundled/minified files (took a 4s Cal.com scan to 135s).
33
+ _TASK_RUNNER_RE = re.compile(
34
+ r"Tasker|task[-_]processor|\btask_queue\b|\.enqueue\s*\(|\bprocessTasks?\s*\("
35
+ )
26
36
 
27
37
 
28
38
  def extract_typescript_signals(file: WalkedFile) -> list[Signal]:
@@ -96,4 +106,9 @@ def extract_typescript_signals(file: WalkedFile) -> list[Signal]:
96
106
  signal("queue", name=f"queue:{match.group(1)}", file=file, confidence=0.8)
97
107
  )
98
108
 
109
+ if _TASK_RUNNER_RE.search(text):
110
+ signals.append(
111
+ signal("background_job", name="task-runner", file=file, confidence=0.75)
112
+ )
113
+
99
114
  return signals
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devtime-ei
3
- Version: 0.1.2
3
+ Version: 0.1.3
4
4
  Summary: Local-first Engineering Intelligence for software repositories
5
5
  Author-email: Aviad Shakargi <aviad94@gmail.com>
6
6
  Maintainer-email: Aviad Shakargi <aviad94@gmail.com>
@@ -8,7 +8,7 @@ License: Apache-2.0
8
8
  Project-URL: Homepage, https://github.com/Shakargy/devtime
9
9
  Project-URL: Repository, https://github.com/Shakargy/devtime
10
10
  Project-URL: Issues, https://github.com/Shakargy/devtime/issues
11
- Project-URL: Release Notes, https://github.com/Shakargy/devtime/releases/tag/v0.1.2
11
+ Project-URL: Release Notes, https://github.com/Shakargy/devtime/releases/tag/v0.1.3
12
12
  Project-URL: Demo, https://youtu.be/1Hiu3Y9J_SI
13
13
  Keywords: devtools,cli,static-analysis,repository-analysis,engineering-intelligence,local-first
14
14
  Classifier: Development Status :: 3 - Alpha
@@ -251,9 +251,9 @@ The agent gets three read-only tools: `list_concepts`, `explain_concept`, and
251
251
  to run, and agent guidance). Local stdio only - no network listener, no write tools,
252
252
  no source code returned, only evidence file paths.
253
253
 
254
- DevTime is listed in the official MCP Registry as `io.github.shakargy/devtime`.
254
+ DevTime is listed in the official MCP Registry as `io.github.Shakargy/devtime`.
255
255
 
256
- <!-- mcp-name: io.github.shakargy/devtime -->
256
+ <!-- mcp-name: io.github.Shakargy/devtime -->
257
257
 
258
258
  ## Installation
259
259
 
File without changes
File without changes