Read canonical feature context
curl --request GET \
--url http://localhost:4000/api/v1/feature-context \
--header 'Authorization: Bearer <token>'import requests
url = "http://localhost:4000/api/v1/feature-context"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('http://localhost:4000/api/v1/feature-context', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_PORT => "4000",
CURLOPT_URL => "http://localhost:4000/api/v1/feature-context",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "http://localhost:4000/api/v1/feature-context"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("http://localhost:4000/api/v1/feature-context")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost:4000/api/v1/feature-context")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": {
"acids": [
{
"acid": "<string>",
"refs_count": 123,
"requirement": "<string>",
"state": {
"comment": "<string>",
"status": "<string>",
"updated_at": "<string>"
},
"test_refs_count": 123,
"deprecated": true,
"note": "<string>",
"refs": [
{
"branch_name": "<string>",
"is_test": true,
"path": "<string>",
"repo_uri": "<string>"
}
],
"replaced_by": [
"<string>"
]
}
],
"feature_name": "<string>",
"implementation_id": "<string>",
"implementation_name": "<string>",
"product_name": "<string>",
"refs_source": {
"source_type": "local",
"branch_names": [
"<string>"
],
"implementation_name": "<string>"
},
"spec_source": {
"source_type": "local",
"branch_names": [
"<string>"
],
"implementation_name": "<string>"
},
"states_source": {
"source_type": "local",
"branch_names": [
"<string>"
],
"implementation_name": "<string>"
},
"summary": {
"status_counts": {},
"total_acids": 123
},
"warnings": [
"<string>"
],
"dangling_states": [
{
"acid": "<string>",
"state": {
"comment": "<string>",
"status": "<string>",
"updated_at": "<string>"
}
}
]
}
}{
"errors": {
"detail": "<string>",
"status": "<string>"
}
}{
"errors": {
"detail": "<string>",
"status": "<string>"
}
}{
"errors": {
"detail": "<string>",
"status": "<string>"
}
}{
"errors": {
"detail": "<string>",
"status": "<string>"
}
}Actions
Read canonical feature context
Return the complete context for one feature in one implementation.
This is the main read endpoint for spec-driven work. It returns the complete list of acceptance criteria, including the requirement definitions, lists of existing references in code, and additional metadata.
Agents should call this before making additional code changes so they work from the same inherited source of truth that reviewers and dashboards use.
GET
/
feature-context
Read canonical feature context
curl --request GET \
--url http://localhost:4000/api/v1/feature-context \
--header 'Authorization: Bearer <token>'import requests
url = "http://localhost:4000/api/v1/feature-context"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('http://localhost:4000/api/v1/feature-context', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_PORT => "4000",
CURLOPT_URL => "http://localhost:4000/api/v1/feature-context",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "http://localhost:4000/api/v1/feature-context"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("http://localhost:4000/api/v1/feature-context")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost:4000/api/v1/feature-context")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": {
"acids": [
{
"acid": "<string>",
"refs_count": 123,
"requirement": "<string>",
"state": {
"comment": "<string>",
"status": "<string>",
"updated_at": "<string>"
},
"test_refs_count": 123,
"deprecated": true,
"note": "<string>",
"refs": [
{
"branch_name": "<string>",
"is_test": true,
"path": "<string>",
"repo_uri": "<string>"
}
],
"replaced_by": [
"<string>"
]
}
],
"feature_name": "<string>",
"implementation_id": "<string>",
"implementation_name": "<string>",
"product_name": "<string>",
"refs_source": {
"source_type": "local",
"branch_names": [
"<string>"
],
"implementation_name": "<string>"
},
"spec_source": {
"source_type": "local",
"branch_names": [
"<string>"
],
"implementation_name": "<string>"
},
"states_source": {
"source_type": "local",
"branch_names": [
"<string>"
],
"implementation_name": "<string>"
},
"summary": {
"status_counts": {},
"total_acids": 123
},
"warnings": [
"<string>"
],
"dangling_states": [
{
"acid": "<string>",
"state": {
"comment": "<string>",
"status": "<string>",
"updated_at": "<string>"
}
}
]
}
}{
"errors": {
"detail": "<string>",
"status": "<string>"
}
}{
"errors": {
"detail": "<string>",
"status": "<string>"
}
}{
"errors": {
"detail": "<string>",
"status": "<string>"
}
}{
"errors": {
"detail": "<string>",
"status": "<string>"
}
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Query Parameters
Product name
Feature name
Implementation name
Include per-ACID ref details
Include dangling stored states
Include deprecated ACIDs
Repeated status filter values; the literal string null means a null status
Response
Feature context
Show child attributes
Show child attributes
⌘I