feat: Add git-standup-digest template#233
Conversation
Adds a single-flow Lamatic template that fetches GitHub repository activity (commits, merged PRs, open issues) via the GitHub REST API and synthesizes it into a human-readable daily standup digest using an LLM — replacing manual log scanning with an AI-written morning briefing. Flow nodes: graphqlNode → codeNode (compute since) → 3x apiNode (GitHub) → codeNode (format) → LLMNode (generate) → graphqlResponseNode Signed-off-by: saiashok103@gmail.com
WalkthroughChangesThe PR adds a Git Standup Digest Lamatic template that collects GitHub activity, formats commits, pull requests, and issues, generates an LLM-based digest, and returns Git Standup Digest
Suggested reviewers: 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
:robot_face: AgentKit Structural ValidationNew Contributions Detected
Check Results
🎉 All checks passed! This contribution follows the AgentKit structure. |
Removing registry.json from the PR changes to resolve the validation warning and allow the PR to receive the 'passing-checks' label. Changes outside of the kits/ directory are not permitted for new contributions. Signed-off-by: saiashok103@gmail.com
There was a problem hiding this comment.
Actionable comments posted: 6
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@kits/git-standup-digest/agent.md`:
- Around line 38-45: Update the flow walkthrough and architecture diagram to
include the Compute Since codeNode_compute_since step between API Request and
Fetch Commits. Document that it defaults since to 24 hours ago and splits repo
into owner and repoName for API paths, preserving the existing downstream fetch
sequence.
In `@kits/git-standup-digest/flows/git-standup-digest.ts`:
- Around line 254-280: Update the digest data handling around rawCommits,
rawPRs, and rawIssues to detect non-array error outputs before converting them
to empty lists. Surface a clear API failure indication in the generated digest,
including which GitHub data source failed when identifiable, while preserving
the existing formatting for valid array responses.
- Around line 184-187: Validate the repo input in the Compute Since flow before
deriving owner and repoName: require a non-empty owner/repository pair separated
by a slash, and fail clearly when the format is invalid. Update the parsing
around the graphqlNode_trigger repo handling while preserving normal owner/repo
processing for valid inputs.
- Line 379: Update the digest mapping to use the generatedResponse field from
LLMNode_generate_standup.output rather than routing the entire output object,
preserving the existing output reference structure.
In
`@kits/git-standup-digest/prompts/git-standup-digest_generate-standup_system.md`:
- Around line 38-40: Remove the “Activity Input” section and its
{{codeNode_format.output}} placeholder from the system prompt, leaving activity
data to be supplied through the existing userPrompt in the LLMNode flow.
In `@kits/git-standup-digest/README.md`:
- Around line 21-26: Update the node overview in the README to state that the
flow contains 8 nodes, and add the codeNode_compute_since (Compute Since) node
to the list. Preserve the existing node descriptions while ensuring the listed
nodes and multiplicities total 8.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI (base), Organization UI (inherited)
Review profile: ASSERTIVE
Plan: Pro
Run ID: 37ba2dc4-f62a-4943-8708-2891fca06373
📒 Files selected for processing (8)
kits/git-standup-digest/.gitignorekits/git-standup-digest/README.mdkits/git-standup-digest/agent.mdkits/git-standup-digest/constitutions/default.mdkits/git-standup-digest/flows/git-standup-digest.tskits/git-standup-digest/lamatic.config.tskits/git-standup-digest/model-configs/git-standup-digest_generate-standup.tskits/git-standup-digest/prompts/git-standup-digest_generate-standup_system.md
| **What it does:** | ||
| 1. `API Request` (`graphqlNode`) — receives the inbound payload with `repo`, `github_token`, and `since` | ||
| 2. `Fetch Commits` (`apiNode`) — calls `GET /repos/{owner}/{repo}/commits?since={since}` with Bearer auth; returns up to 30 recent commits | ||
| 3. `Fetch Merged PRs` (`apiNode`) — calls `GET /repos/{owner}/{repo}/pulls?state=closed&sort=updated&direction=desc` to get recently merged pull requests | ||
| 4. `Fetch Open Issues` (`apiNode`) — calls `GET /repos/{owner}/{repo}/issues?state=open&sort=updated&direction=desc` to surface active blockers | ||
| 5. `Format Activity` (`codeNode`) — collects the three API responses, extracts relevant fields (commit messages, PR titles, issue titles), and formats them into a clean text block for the LLM | ||
| 6. `Generate Standup` (`LLMNode`) — runs the system prompt with the formatted activity block and synthesizes a human-readable digest | ||
| 7. `API Response` (`graphqlResponseNode`) — returns `{ digest, highlights, blockers }` to the caller |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Flow walkthrough skips the Compute Since node.
The step-by-step jumps from API Request directly to Fetch Commits, omitting the Compute Since (codeNode_compute_since) node that defaults since to 24 hours ago and splits repo into owner/repoName for the API paths. The architecture diagram (lines 80–94) has the same omission. Add the missing step for documentation accuracy.
🧰 Tools
🪛 LanguageTool
[uncategorized] ~39-~39: The official name of this software platform is spelled with a capital “H”.
Context: ...ceives the inbound payload with repo, github_token, and since 2. Fetch Commits ...
(GITHUB)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@kits/git-standup-digest/agent.md` around lines 38 - 45, Update the flow
walkthrough and architecture diagram to include the Compute Since
codeNode_compute_since step between API Request and Fetch Commits. Document that
it defaults since to 24 hours ago and splits repo into owner and repoName for
API paths, preserving the existing downstream fetch sequence.
| const repo = inputs.graphqlNode_trigger?.repo || ""; | ||
| const parts = repo.split("/"); | ||
| const owner = parts[0] || ""; | ||
| const repoName = parts[1] || ""; |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
No validation of repo format allows malformed API URLs.
If repo is empty, missing, or lacks the owner/repo slash, owner and repoName resolve to empty strings, producing broken GitHub API URLs like https://api.github.com/repos//commits. The flow fails downstream with confusing 404s instead of a clear input error. Validate the format before proceeding.
🛡️ Proposed fix: validate repo format in Compute Since
const repo = inputs.graphqlNode_trigger?.repo || "";
-const parts = repo.split("/");
-const owner = parts[0] || "";
-const repoName = parts[1] || "";
+const parts = repo.split("/");
+if (parts.length < 2 || !parts[0] || !parts[1]) {
+ throw new Error("Invalid repo format. Expected 'owner/repo' (e.g. 'vercel/next.js').");
+}
+const owner = parts[0];
+const repoName = parts[1];📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| const repo = inputs.graphqlNode_trigger?.repo || ""; | |
| const parts = repo.split("/"); | |
| const owner = parts[0] || ""; | |
| const repoName = parts[1] || ""; | |
| const repo = inputs.graphqlNode_trigger?.repo || ""; | |
| const parts = repo.split("/"); | |
| if (parts.length < 2 || !parts[0] || !parts[1]) { | |
| throw new Error("Invalid repo format. Expected 'owner/repo' (e.g. 'vercel/next.js')."); | |
| } | |
| const owner = parts[0]; | |
| const repoName = parts[1]; |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@kits/git-standup-digest/flows/git-standup-digest.ts` around lines 184 - 187,
Validate the repo input in the Compute Since flow before deriving owner and
repoName: require a non-empty owner/repository pair separated by a slash, and
fail clearly when the format is invalid. Update the parsing around the
graphqlNode_trigger repo handling while preserving normal owner/repo processing
for valid inputs.
| const rawCommits = inputs.apiNode_commits?.output || []; | ||
| const commits = Array.isArray(rawCommits) | ||
| ? rawCommits.slice(0, 12).map((c) => { | ||
| const sha = (c.sha || "").slice(0, 7); | ||
| const msg = (c.commit?.message || "").split("\\n")[0].trim(); | ||
| return \` - [\${sha}] \${msg}\`; | ||
| }) | ||
| : []; | ||
|
|
||
| // ── Merged PRs ─────────────────────────────────────────────────────────────── | ||
| const rawPRs = inputs.apiNode_merged_prs?.output || []; | ||
| const now = new Date(); | ||
| const mergedPRs = Array.isArray(rawPRs) | ||
| ? rawPRs | ||
| .filter((pr) => pr.merged_at) | ||
| .slice(0, 10) | ||
| .map((pr) => { | ||
| const ageDays = Math.floor( | ||
| (now - new Date(pr.merged_at)) / (1000 * 60 * 60 * 24) | ||
| ); | ||
| return \` - #\${pr.number} — \${pr.title} (merged \${ageDays === 0 ? "today" : ageDays + "d ago"})\`; | ||
| }) | ||
| : []; | ||
|
|
||
| // ── Open Issues ─────────────────────────────────────────────────────────────── | ||
| // GitHub issues endpoint returns both issues and PRs; filter out PRs | ||
| const rawIssues = inputs.apiNode_open_issues?.output || []; |
There was a problem hiding this comment.
🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win
Failed GitHub API calls are silently swallowed.
When an API call fails (401, 404, rate limit), output may be an error object rather than an array. The Array.isArray() guard converts it to [], so the user receives a digest saying "No activity" with no indication that the API calls actually failed. Consider checking for error responses and surfacing them.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@kits/git-standup-digest/flows/git-standup-digest.ts` around lines 254 - 280,
Update the digest data handling around rawCommits, rawPRs, and rawIssues to
detect non-array error outputs before converting them to empty lists. Surface a
clear API failure indication in the generated digest, including which GitHub
data source failed when identifiable, while preserving the existing formatting
for valid array responses.
| label: "API Response", | ||
| data: { | ||
| output: { | ||
| digest: "{{LLMNode_generate_standup.output}}", |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Description: Check LLMNode output mapping patterns across existing kits.
rg -n 'LLMNode.*\.output' --type ts -g 'kits/*/flows/*.ts' -C1 | head -40Repository: Lamatic/AgentKit
Length of output: 154
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== LLMNode output mapping usage =="
rg -n 'generatedResponse|LLMNode_generate_standup|\.output(\b|[^A-Za-z_])' kits -g 'kits/*/flows/*.ts' -C 2 || true
echo
echo "== Relevant file slice =="
sed -n '340,395p' kits/git-standup-digest/flows/git-standup-digest.ts
echo
echo "== Any flow docs or config references =="
rg -n 'git-standup-digest|standup.*digest|generatedResponse' kits -g '!**/node_modules/**' -C 1 || trueRepository: Lamatic/AgentKit
Length of output: 50373
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== File metadata =="
wc -l kits/git-standup-digest/flows/git-standup-digest.ts
echo
echo "== AST outline =="
ast-grep outline kits/git-standup-digest/flows/git-standup-digest.ts --view expanded
echo
echo "== Search for outputMapping and response fields =="
rg -n 'outputMapping|generatedResponse|responseField|digest:' kits/git-standup-digest/flows/git-standup-digest.ts -C 2Repository: Lamatic/AgentKit
Length of output: 707
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== Target file slice =="
sed -n '350,390p' kits/git-standup-digest/flows/git-standup-digest.ts
echo
echo "== Search for LLMNode output shape in repo =="
rg -n 'generatedResponse|LLMNode|outputMapping' . -g '!**/node_modules/**' -g '!*dist*' -g '!*build*' -C 2 || trueRepository: Lamatic/AgentKit
Length of output: 50373
🌐 Web query:
Lamatic LLMNode outputMapping generatedResponse output generatedResponse site:docs.lamatic.ai OR site:lamatic.ai
💡 Result:
In the Lamatic.ai platform, generatedResponse is the primary field containing the text output produced by an LLM node (such as the Text Agent or Generate Text node) [1][2]. When configuring a flow, outputMapping is used to map, transform, or reference data produced by previous nodes for use in subsequent steps [3][4][5]. For example, to reference the text output of an LLM node named LLMNode_746 in an output mapping or elsewhere in a flow, you would typically use the syntax: {{LLMNode_746.output.generatedResponse}} [5] The structure of the node output generally includes the generatedResponse string alongside a _meta object, which contains metadata such as token usage (prompt_tokens, completion_tokens) and model details (model_name, model_provider) [1][2]. Key technical points: - generatedResponse: The actual string output from the LLM [2]. - outputMapping: A configuration mechanism within a node or flow to define how data is passed between nodes [4][5]. - Schema: You can verify the availability of these fields by checking the Schema tab in the Node Configuration panel for any specific AI node [3].
Citations:
- 1: https://lamatic.ai/docs/nodes/ai/mcp-node
- 2: https://lamatic.ai/docs/agents/text-agent
- 3: https://lamatic.ai/docs/flows/node-config
- 4: https://lamatic.ai/docs/flows/flow-config
- 5: https://lamatic.ai/docs/interface/graphql
Route digest to generatedResponse — LLMNode_generate_standup exposes the text in output.generatedResponse, so digest should map {{LLMNode_generate_standup.output.generatedResponse}} instead of the full output object.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@kits/git-standup-digest/flows/git-standup-digest.ts` at line 379, Update the
digest mapping to use the generatedResponse field from
LLMNode_generate_standup.output rather than routing the entire output object,
preserving the existing output reference structure.
Source: Learnings
| ## Activity Input | ||
|
|
||
| {{codeNode_format.output}} |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Activity data placeholder in system prompt is redundant with the user prompt.
The {{codeNode_format.output}} placeholder at line 40 duplicates the activity data that's already passed as userPrompt in the LLMNode (flow line 366). If the runtime interpolates system prompt files, the LLM receives the activity block twice; if it doesn't, the LLM sees a literal {{codeNode_format.output}} string. Remove the placeholder from the system prompt since the user prompt already carries the data.
♻️ Proposed fix: remove redundant placeholder
## Output format
Git Standup — {repo}
Period: {since} → now
✅ Shipped (Merged PRs)
- {list of merged PRs with title and number}
🔨 Recent Commits
- {list of commit messages, max 8}
🚧 In Progress / Needs Attention
- {list of open PRs with age in days if > 1 day}
🐛 Open Issues
- {list of open issues with title}
Summary: {highlights one-liner} | Blockers: {blockers one-liner}
-## Activity Input
-
-{{codeNode_format.output}}
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| ## Activity Input | |
| {{codeNode_format.output}} |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In
`@kits/git-standup-digest/prompts/git-standup-digest_generate-standup_system.md`
around lines 38 - 40, Remove the “Activity Input” section and its
{{codeNode_format.output}} placeholder from the system prompt, leaving activity
data to be supplied through the existing userPrompt in the LLMNode flow.
| This flow includes **6 nodes** working together to produce the digest: | ||
| - `graphqlNode` (API Request trigger) | ||
| - `apiNode` × 3 (commits, merged PRs, open issues) | ||
| - `codeNode` (format activity) | ||
| - `LLMNode` (generate standup) | ||
| - `graphqlResponseNode` (API Response) |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Node count is incorrect and Compute Since node is missing from the list.
The README states "6 nodes" but the actual flow has 8 nodes, and the listed items add up to 7. The codeNode_compute_since (Compute Since) node — which defaults since to 24 hours ago and splits repo into owner/repoName — is entirely absent from the list.
💚 Proposed fix: correct node count and add missing node
-This flow includes **6 nodes** working together to produce the digest:
+This flow includes **8 nodes** working together to produce the digest:
- `graphqlNode` (API Request trigger)
+- `codeNode` (compute default `since` timestamp and split `repo` into owner/repoName)
- `apiNode` × 3 (commits, merged PRs, open issues)
- `codeNode` (format activity)
- `LLMNode` (generate standup)
- `graphqlResponseNode` (API Response)📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| This flow includes **6 nodes** working together to produce the digest: | |
| - `graphqlNode` (API Request trigger) | |
| - `apiNode` × 3 (commits, merged PRs, open issues) | |
| - `codeNode` (format activity) | |
| - `LLMNode` (generate standup) | |
| - `graphqlResponseNode` (API Response) | |
| This flow includes **8 nodes** working together to produce the digest: | |
| - `graphqlNode` (API Request trigger) | |
| - `codeNode` (compute default `since` timestamp and split `repo` into owner/repoName) | |
| - `apiNode` × 3 (commits, merged PRs, open issues) | |
| - `codeNode` (format activity) | |
| - `LLMNode` (generate standup) | |
| - `graphqlResponseNode` (API Response) |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@kits/git-standup-digest/README.md` around lines 21 - 26, Update the node
overview in the README to state that the flow contains 8 nodes, and add the
codeNode_compute_since (Compute Since) node to the list. Preserve the existing
node descriptions while ensuring the listed nodes and multiplicities total 8.
|
Hi @saiashok0981! 👋 Before this PR can be reviewed by maintainers, please resolve all comments and requested changes from the CodeRabbit automated review. Steps to follow:
This helps keep the review process efficient for everyone. Thank you! 🙏 |
|
@coderabbitai review |
✅ Action performedReview finished.
|
Adds
git-standup-digest— a Lamatic template that fetches GitHub repository activity (commits, merged PRs, open issues) and synthesizes it into a human-readable daily standup digest.Why: Developers spend 10–15 min every morning scanning GitHub tabs. This template replaces that with a single API call that returns an AI-written morning briefing.
Files changed:
kits/git-standup-digest/lamatic.config.tskits/git-standup-digest/agent.mdkits/git-standup-digest/README.mdkits/git-standup-digest/flows/git-standup-digest.tskits/git-standup-digest/constitutions/default.mdkits/git-standup-digest/prompts/git-standup-digest_generate-standup_system.mdkits/git-standup-digest/model-configs/git-standup-digest_generate-standup.tsregistry.json(new entry added)Checklist:
lamatic.config.tstype istemplateagent.md,README.md,flows/,constitutions/all presentfeat:git-standup-digestLamatic template and supporting configuration.digest,highlights, andblockers..gitignoreentries for environment files, dependencies, and macOS metadata.lamatic.config.ts.