feat(core): implement lifecycle tracking issues for features

- Add GitHub issue template for tracking feature maturity (Alpha/Beta/GA).
- Add issueUrl field to FeatureSpec metadata.
- Update /features UI to display tracking issue links.
- Update documentation with requirement for lifecycle trackers.
This commit is contained in:
Jerop Kipruto
2026-02-18 12:29:02 -05:00
parent f1bf34ceee
commit 4663dff8e2
5 changed files with 138 additions and 10 deletions
@@ -130,12 +130,22 @@ export const FeaturesList: React.FC<FeaturesListProps> = ({ features }) => {
</Box>
</Box>
{feature.description && (
<Box marginLeft={2} marginBottom={1}>
<Box marginLeft={2}>
<Text dimColor color={theme.text.primary}>
{feature.description}
</Text>
</Box>
)}
{feature.issueUrl && (
<Box marginLeft={2} marginBottom={1}>
<Text color={theme.text.accent}>
Tracker: <Text dimColor>{feature.issueUrl}</Text>
</Text>
</Box>
)}
{!feature.issueUrl && feature.description && (
<Box marginBottom={1} />
)}
</Box>
))}
</Box>
+22
View File
@@ -131,6 +131,7 @@ describe('FeatureGate', () => {
since: '0.1.0',
until: undefined,
description: 'Feature 1',
issueUrl: undefined,
});
expect(feat2).toEqual({
key: 'feat2',
@@ -139,6 +140,27 @@ describe('FeatureGate', () => {
since: '0.2.0',
until: '0.3.0',
description: 'Feature 2',
issueUrl: undefined,
});
});
it('should include issueUrl in feature info', () => {
const gate = DefaultFeatureGate.deepCopy();
gate.add({
featWithUrl: [
{
preRelease: FeatureStage.Alpha,
issueUrl: 'https://github.com/google/gemini-cli/issues/1',
},
],
});
const info = gate.getFeatureInfo();
const feat = info.find((f) => f.key === 'featWithUrl');
expect(feat).toMatchObject({
key: 'featWithUrl',
issueUrl: 'https://github.com/google/gemini-cli/issues/1',
});
});
+6
View File
@@ -65,6 +65,10 @@ export interface FeatureSpec {
* Description of the feature.
*/
description?: string;
/**
* Link to the Lifecycle Tracking Issue on GitHub.
*/
issueUrl?: string;
}
/**
@@ -77,6 +81,7 @@ export interface FeatureInfo {
since?: string;
until?: string;
description?: string;
issueUrl?: string;
}
/**
@@ -216,6 +221,7 @@ class FeatureGateImpl implements MutableFeatureGate {
since: latestSpec.since,
until: latestSpec.until,
description: latestSpec.description,
issueUrl: latestSpec.issueUrl,
};
})
.sort((a, b) => a.key.localeCompare(b.key));