@struktoai/mirage-core
Version:
A Unified Virtual Filesystem For AI Agents
100 lines • 4.16 kB
JavaScript
// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========
import { FlagView } from "../../../spec/flag_view.js";
import { createRelease, getLatestRelease, getRelease, listReleases, } from "../../../../core/github/release.js";
import { bodyValue, camel, csvValues, ghBool, listLimit, repoFor, textOut, textValue, typedOut, } from "./accessor.js";
const RELEASE_FIELDS = [
'body',
'createdAt',
'isDraft',
'isLatest',
'isPrerelease',
'name',
'publishedAt',
'tagName',
'targetCommitish',
'url',
];
function release(value) {
const row = camel(value);
const result = row !== null && typeof row === 'object' ? row : {};
if ('draft' in result) {
result.isDraft = result.draft;
delete result.draft;
}
if ('prerelease' in result) {
result.isPrerelease = result.prerelease;
delete result.prerelease;
}
result.isLatest ??= false;
return result;
}
function listText(rows) {
return rows
.map((row) => {
const kind = row.isDraft
? 'Draft'
: row.isPrerelease
? 'Pre-release'
: row.isLatest
? 'Latest'
: '';
return `${textValue(row.name)}\t${textValue(row.tagName)}\t${kind}\t${textValue(row.publishedAt)}\n`;
})
.join('');
}
export async function listCmd(accessor, _paths, _texts, ctx) {
const fl = new FlagView(ctx.flags);
const rows = (await listReleases(accessor.transport, repoFor(accessor, fl), listLimit(fl, 30, null))).map(release);
const latest = rows.find((row) => !row.isDraft && !row.isPrerelease);
if (latest !== undefined)
latest.isLatest = true;
return typedOut(rows, fl, listText(rows), RELEASE_FIELDS, ctx);
}
export async function viewCmd(accessor, _paths, texts, ctx) {
const fl = new FlagView(ctx.flags);
const tag = texts[0] ?? '';
if (tag === '')
throw new Error('a release tag is required');
const transport = accessor.transport;
const ref = repoFor(accessor, fl);
const row = release(await getRelease(transport, ref, tag));
if (csvValues([fl.asStr('json') ?? '']).includes('isLatest')) {
const latest = await getLatestRelease(transport, ref);
const latestRow = latest === null ? {} : release(latest);
row.isLatest = latestRow.tagName === row.tagName;
}
const human = `title:\t${textValue(row.name)}\ntag:\t${textValue(row.tagName)}\ndraft:\t${String(Boolean(row.isDraft))}\nprerelease:\t${String(Boolean(row.isPrerelease))}\n--\n${textValue(row.body)}\n`;
return typedOut(row, fl, human, RELEASE_FIELDS, ctx);
}
export async function createCmd(accessor, _paths, texts, ctx) {
const fl = new FlagView(ctx.flags);
const tag = texts[0] ?? '';
if (tag === '')
throw new Error('a release tag is required in noninteractive mode');
const body = {
tag_name: tag,
name: fl.asNonEmpty('title', tag),
body: (await bodyValue(ctx, fl, { value: 'notes', file: 'notes_file' })) ?? '',
draft: ghBool(fl, 'draft'),
prerelease: ghBool(fl, 'prerelease'),
generate_release_notes: ghBool(fl, 'generate_notes'),
};
const target = fl.asNonEmpty('target');
if (target !== undefined)
body.target_commitish = target;
const created = release(await createRelease(accessor.transport, repoFor(accessor, fl), body));
return textOut(`${textValue(created.url)}\n`);
}
//# sourceMappingURL=release.js.map