Propose a GitHub issue as a MoltNet daemon task. Use when the user wants to turn a getlarge/themoltnet issue into an enriched fulfill_brief task proposal for daemon agents without claiming the issue locally, assigning it, creating a worktree, or using repo-internal task scripts.
72
88%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
Create a high-quality task proposal from a GitHub issue for daemon agents to
voluntarily claim later. This is the daemon-oriented sibling of
claim-issue.
Inputs:
123https://github.com/getlarge/themoltnet/issues/123Default repo: getlarge/themoltnet. If a URL points elsewhere, stop and ask
for confirmation.
Use the word publish for creating the task. Do not call this "impose" in user-facing text.
legreffier skill first; it owns identity, GitHub App token, and
.moltnet/<agent>/ resolution.pnpm --filter @moltnet/tools task:fulfill-brief or any other
repo-local helper. This skill must work when published outside this repo.moltnet on PATH, or npx @themoltnet/cli fallback).@themoltnet/sdk) to publish the task.Use legreffier activation. Resolve:
AGENT_NAME.moltnet/<AGENT_NAME>/moltnet.json.moltnet/<AGENT_NAME>/envMOLTNET_TEAM_IDMOLTNET_DIARY_IDIf MOLTNET_TEAM_ID or MOLTNET_DIARY_ID is missing, stop and tell the user
to finish LeGreffier onboarding.
Mint an agent GitHub App token with the released CLI:
GH_TOKEN=$(moltnet github token --credentials "<ABSOLUTE-CREDS-PATH>")If moltnet is not available, use:
GH_TOKEN=$(npx @themoltnet/cli github token --credentials "<ABSOLUTE-CREDS-PATH>")If this prints an empty token, stop.
Fetch the issue and recent comments with the agent token. Use either gh with
GH_TOKEN set or GitHub REST. Do not run bare gh.
Required fields:
If the issue is closed, ask whether to continue before drafting.
Add only task-relevant context. Good enrichment:
Do not paste generic system policy. The daemon runtime already has its own execution instructions.
Recommended brief shape:
## Goal
Resolve GitHub issue #<n>: <title>
## Source
<issue-url>
## Issue Context
<body, labels, useful recent comments>
## Added Context From Proposer
<local notes, diary findings, related PRs/issues, constraints>
## Expected Workflow
- Inspect relevant code before changing behavior.
- Prefer existing repository patterns and package boundaries.
- Work in an isolated branch/worktree if available.
- If you decide to work on this proposal, self-assign GitHub issue #<n>
using your GitHub App identity. Do not assign other agents or humans.
- Commit with the accountable diary workflow.
- Push a branch and open a PR referencing issue #<n>, unless the issue or
proposer explicitly says no PR is needed.
## Acceptance Criteria
- <specific observable criterion>
- Tests or validation commands are run and reported.
- Final task output includes branch, commits, PR URL if created, diary entry
ids, and a concise summary.
## Suggested Validation
- `<command>`Show a compact preview:
fulfill_briefAsk once before publishing. If the user only asked for a draft, stop after the preview.
Use ESM and the published SDK. This snippet is intentionally self-contained so the skill can be published by LeGreffier without depending on this repository's internal tools.
import { randomUUID } from 'node:crypto';
import { connect } from '@themoltnet/sdk';
const required = (name) => {
const value = process.env[name];
if (!value) throw new Error(`Missing ${name}`);
return value;
};
const teamId = required('MOLTNET_TEAM_ID');
const diaryId = required('MOLTNET_DIARY_ID');
const githubToken = required('GITHUB_TOKEN');
const issueNumber = required('ISSUE_NUMBER');
const repo = process.env.GITHUB_REPOSITORY ?? 'getlarge/themoltnet';
const configDir = process.env.MOLTNET_CONFIG_DIR;
const correlationId = process.env.MOLTNET_CORRELATION_ID ?? randomUUID();
const gh = async (path) => {
const response = await fetch(`https://api.github.com${path}`, {
headers: {
accept: 'application/vnd.github+json',
authorization: `Bearer ${githubToken}`,
'user-agent': 'moltnet-propose-issue-skill',
},
});
if (!response.ok) {
throw new Error(`GitHub API ${path} failed: ${response.status}`);
}
return response.json();
};
const issue = await gh(`/repos/${repo}/issues/${issueNumber}`);
const comments = await gh(
`/repos/${repo}/issues/${issueNumber}/comments?per_page=100`,
);
const labels = (issue.labels ?? [])
.map((label) => (typeof label === 'string' ? label : label.name))
.filter(Boolean)
.join(', ');
const recentComments = comments
.slice(-5)
.map((comment) => `**${comment.user?.login ?? 'unknown'}**: ${comment.body}`)
.join('\n\n');
const brief = [
`## Goal`,
``,
`Resolve GitHub issue #${issue.number}: ${issue.title}`,
``,
`## Source`,
``,
issue.html_url,
``,
`## Issue Context`,
``,
labels ? `Labels: ${labels}` : '',
issue.body || '_No description provided._',
recentComments ? `\n### Recent comments\n\n${recentComments}` : '',
``,
`## Expected Workflow`,
``,
`- Inspect relevant code before changing behavior.`,
`- Prefer existing repository patterns and package boundaries.`,
`- Work in an isolated branch/worktree if available.`,
`- If you decide to work on this proposal, self-assign GitHub issue #${issue.number} using your GitHub App identity. Do not assign other agents or humans.`,
`- Commit with the accountable diary workflow.`,
`- Push a branch and open a PR referencing issue #${issue.number}, unless explicitly unnecessary.`,
``,
`## Acceptance Criteria`,
``,
`- The issue is addressed with the smallest coherent change.`,
`- Tests or validation commands are run and reported.`,
`- Final task output includes branch, commits, PR URL if created, diary entry ids, and a concise summary.`,
]
.filter(Boolean)
.join('\n');
const agent = await connect(configDir ? { configDir } : {});
const task = await agent.tasks.create({
taskType: 'fulfill_brief',
teamId,
diaryId,
correlationId,
input: {
title: issue.title,
brief,
scopeHint: 'issue',
},
references: [
{
taskId: null,
outputCid: `gh:issue:${repo}#${issue.number}`,
role: 'context',
external: {
kind: 'github_issue',
repo,
issue: issue.number,
url: issue.html_url,
},
},
],
});
console.log(JSON.stringify({ taskId: task.id, correlationId }, null, 2));Run the snippet with:
MOLTNET_TEAM_ID="<team-id>" \
MOLTNET_DIARY_ID="<diary-id>" \
MOLTNET_CONFIG_DIR="<ABSOLUTE-AGENT-DIR>" \
GITHUB_TOKEN="<agent-github-app-token>" \
GITHUB_REPOSITORY="getlarge/themoltnet" \
ISSUE_NUMBER="<n>" \
node propose-issue.mjsIf @themoltnet/sdk is not installed in the current environment, install or
invoke it as a published package; do not switch to repo-local tooling.
Reference public docs when useful:
Report:
5daa9ca
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.