chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,25 @@
|
||||
import { ConfluenceClient } from 'src/client'
|
||||
import { debugLog, errorLog } from 'src/logger'
|
||||
import * as bp from '.botpress'
|
||||
|
||||
export const createPage: bp.IntegrationProps['actions']['createPage'] = async ({ input, logger, ctx }) => {
|
||||
const pageId = input.item.id
|
||||
|
||||
if (!pageId) {
|
||||
debugLog(logger, 'createPage', 'Page ID is required')
|
||||
}
|
||||
|
||||
try {
|
||||
const client = ConfluenceClient(ctx.configuration)
|
||||
|
||||
const pageData = await client.createPage(input)
|
||||
|
||||
if (!pageData) {
|
||||
errorLog(logger, 'createPage', `Page with ID ${pageId} not found`)
|
||||
}
|
||||
|
||||
return pageData
|
||||
} catch (error) {
|
||||
errorLog(logger, 'createPage', 'Error in while fetching confluence page: ' + error)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
import { ConfluenceClient } from 'src/client'
|
||||
import { errorLog } from 'src/logger'
|
||||
import * as bp from '.botpress'
|
||||
|
||||
export const deletePage: bp.IntegrationProps['actions']['deletePage'] = async ({ input, logger, ctx }) => {
|
||||
const pageId = parseInt(input.id)
|
||||
|
||||
if (!pageId) {
|
||||
errorLog(logger, 'deletePage', 'Page ID is required')
|
||||
}
|
||||
|
||||
try {
|
||||
const client = ConfluenceClient(ctx.configuration)
|
||||
|
||||
const pageData = await client.deletePage(input.id)
|
||||
|
||||
if (!pageData) {
|
||||
errorLog(logger, 'deletePage', `Page with ID ${pageId} not found`)
|
||||
}
|
||||
|
||||
return pageData
|
||||
} catch (error) {
|
||||
errorLog(logger, 'deletePage', 'Error in while fetching confluence page: ' + error)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
import { ConfluenceClient } from 'src/client'
|
||||
import { errorLog } from 'src/logger'
|
||||
import * as bp from '.botpress'
|
||||
|
||||
export const getPage: bp.IntegrationProps['actions']['getPage'] = async ({ input, logger, ctx }) => {
|
||||
const pageId = parseInt(input.id)
|
||||
|
||||
if (!pageId) {
|
||||
errorLog(logger, 'getPage', 'Page ID is required')
|
||||
}
|
||||
|
||||
try {
|
||||
const client = ConfluenceClient(ctx.configuration)
|
||||
const pageData = await client.getPage({ pageId })
|
||||
|
||||
if (!pageData) {
|
||||
errorLog(logger, 'getPage', `Page with ID ${pageId} not found`)
|
||||
logger.error(`Page with ID ${pageId} not found`)
|
||||
}
|
||||
|
||||
return { item: pageData }
|
||||
} catch (thrown: unknown) {
|
||||
errorLog(logger, 'getPage', 'Error in while fetching confluence page' + thrown)
|
||||
throw thrown
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,138 @@
|
||||
import * as sdk from '@botpress/sdk'
|
||||
import { ConfluenceClient } from 'src/client'
|
||||
import * as bp from '.botpress'
|
||||
|
||||
import type { Actions } from '.botpress/implementation/typings/actions'
|
||||
|
||||
type FilesReadonlyItem = Actions['filesReadonlyListItemsInFolder']['output']['items'][number]
|
||||
|
||||
const PAGE_ENTITY = 'page'
|
||||
const SPACE_ENTITY = 'space'
|
||||
const PREFIX_SEPARATOR = ':'
|
||||
const SPACE_PREFIX = `${SPACE_ENTITY}${PREFIX_SEPARATOR}`
|
||||
const PAGE_PREFIX = `${PAGE_ENTITY}${PREFIX_SEPARATOR}`
|
||||
type EntityType = 'space' | 'folder' | 'page' | 'database' | 'embed' | 'whiteboard'
|
||||
|
||||
export const filesReadonlyListItemsInFolder: bp.IntegrationProps['actions']['filesReadonlyListItemsInFolder'] = async ({
|
||||
ctx,
|
||||
input,
|
||||
}) => {
|
||||
const client = ConfluenceClient(ctx.configuration)
|
||||
|
||||
if (!input.folderId) {
|
||||
// Enumerate spaces:
|
||||
const { items, token } = await client.getAllSpaces({ nextToken: input.nextToken })
|
||||
|
||||
const mappedItems = items.map(
|
||||
(item) =>
|
||||
({
|
||||
id: `${SPACE_PREFIX}${item.id}`,
|
||||
type: 'folder',
|
||||
name: item.name,
|
||||
}) satisfies FilesReadonlyItem
|
||||
)
|
||||
|
||||
return {
|
||||
items: mappedItems,
|
||||
meta: {
|
||||
nextToken: token,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// Else, enumerate a specific entity and its children:
|
||||
|
||||
const [entityType_, entityId_] = input.folderId.split(PREFIX_SEPARATOR)
|
||||
|
||||
if (!entityType_ || !entityId_) {
|
||||
throw new sdk.RuntimeError('Invalid folderId format')
|
||||
}
|
||||
|
||||
const entityId = parseInt(entityId_, 10)
|
||||
const entityType = entityType_ as EntityType
|
||||
|
||||
const mappedItems: FilesReadonlyItem[] = []
|
||||
let nextToken: string | undefined
|
||||
|
||||
switch (entityType) {
|
||||
case 'space':
|
||||
const space = await client.getSpace({ spaceId: entityId })
|
||||
const homePage = await client.getPage({ pageId: parseInt(space.homepageId, 10) })
|
||||
|
||||
mappedItems.push({
|
||||
id: `${PAGE_PREFIX}${homePage.id}`,
|
||||
type: 'folder',
|
||||
name: homePage.title ?? 'Temporary title',
|
||||
parentId: homePage.parentId ?? undefined,
|
||||
absolutePath: homePage._links.webui ?? undefined,
|
||||
} satisfies FilesReadonlyItem)
|
||||
break
|
||||
|
||||
case 'database':
|
||||
case 'embed':
|
||||
case 'whiteboard':
|
||||
case 'folder':
|
||||
const { items: children, token: entityNextToken } = await client.getDirectChildren({
|
||||
entityId,
|
||||
entityType,
|
||||
nextToken: input.nextToken,
|
||||
})
|
||||
|
||||
mappedItems.push(
|
||||
...children.map(
|
||||
(item) =>
|
||||
({
|
||||
id: `${item.type}${PREFIX_SEPARATOR}${item.id ?? '0'}`,
|
||||
type: 'folder',
|
||||
name: item.title ?? 'Temporary title',
|
||||
}) satisfies FilesReadonlyItem
|
||||
)
|
||||
)
|
||||
|
||||
nextToken = entityNextToken
|
||||
break
|
||||
|
||||
case 'page':
|
||||
if (!input.nextToken) {
|
||||
const item = await client.getPage({ pageId: entityId })
|
||||
mappedItems.push({
|
||||
id: item.id ?? '0',
|
||||
type: 'file',
|
||||
name: 'page.html',
|
||||
parentId: item.parentId ?? undefined,
|
||||
absolutePath: item._links.webui ?? undefined,
|
||||
sizeInBytes: undefined,
|
||||
lastModifiedDate: item.version?.createdAt,
|
||||
contentHash: item.version?.number.toString(),
|
||||
} satisfies FilesReadonlyItem)
|
||||
}
|
||||
|
||||
const { items: subPages, token: pageNextToken } = await client.getDirectChildren({
|
||||
entityId,
|
||||
entityType,
|
||||
nextToken: input.nextToken,
|
||||
})
|
||||
mappedItems.push(
|
||||
...subPages.map(
|
||||
(item) =>
|
||||
({
|
||||
id: `${item.type}${PREFIX_SEPARATOR}${item.id ?? '0'}`,
|
||||
type: 'folder',
|
||||
name: item.title ?? 'Temporary title',
|
||||
}) satisfies FilesReadonlyItem
|
||||
)
|
||||
)
|
||||
nextToken = pageNextToken
|
||||
break
|
||||
|
||||
default:
|
||||
entityType satisfies never
|
||||
}
|
||||
|
||||
return {
|
||||
items: mappedItems,
|
||||
meta: {
|
||||
nextToken,
|
||||
},
|
||||
} satisfies { items: FilesReadonlyItem[]; meta: { nextToken?: string } }
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
import { RuntimeError } from '@botpress/sdk'
|
||||
import { ConfluenceClient } from 'src/client'
|
||||
import { debugLog } from 'src/logger'
|
||||
import * as bp from '.botpress'
|
||||
|
||||
export const filesReadonlyTransferFileToBotpress: bp.IntegrationProps['actions']['filesReadonlyTransferFileToBotpress'] =
|
||||
async ({ logger, client, ctx, input: { file, fileKey, shouldIndex } }) => {
|
||||
debugLog(logger, 'filesReadonlyTransferFileToBotpress', 'Transferring file to botpress')
|
||||
const confluenceClient = ConfluenceClient(ctx.configuration)
|
||||
const pageContents = await confluenceClient.getPageHtml({ pageId: parseInt(file.id) })
|
||||
|
||||
if (!pageContents) {
|
||||
throw new RuntimeError('Page is empty or not found')
|
||||
}
|
||||
|
||||
const { file: uploadedFile } = await client.uploadFile({
|
||||
key: fileKey,
|
||||
content: pageContents,
|
||||
contentType: 'text/html',
|
||||
index: shouldIndex ?? true,
|
||||
})
|
||||
|
||||
return { botpressFileId: uploadedFile.id }
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
import { ConfluenceClient } from 'src/client'
|
||||
import { errorLog } from 'src/logger'
|
||||
import * as bp from '.botpress'
|
||||
|
||||
export const updatePage: bp.IntegrationProps['actions']['updatePage'] = async ({ input, logger, ctx }) => {
|
||||
const pageId = parseInt(input.id)
|
||||
|
||||
if (!pageId) {
|
||||
errorLog(logger, 'updatePage', 'Page ID is required')
|
||||
}
|
||||
|
||||
try {
|
||||
const client = ConfluenceClient(ctx.configuration)
|
||||
|
||||
const pageData = await client.updatePage(input)
|
||||
|
||||
if (!pageData) {
|
||||
errorLog(logger, 'updatePage', `Page with ID ${pageId} not found`)
|
||||
}
|
||||
|
||||
return pageData
|
||||
} catch (error) {
|
||||
errorLog(logger, 'updatePage', 'Error in while fetching confluence page: ' + error)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
import { createPage } from './implementations/create-page'
|
||||
import { deletePage } from './implementations/delete-page'
|
||||
import { getPage } from './implementations/get-page'
|
||||
import { filesReadonlyListItemsInFolder } from './implementations/list-items-in-folder'
|
||||
import { filesReadonlyTransferFileToBotpress } from './implementations/transfer-file-to-botpress'
|
||||
import { updatePage } from './implementations/update-page'
|
||||
import * as bp from '.botpress'
|
||||
|
||||
export const actions = {
|
||||
getPage,
|
||||
createPage,
|
||||
deletePage,
|
||||
updatePage,
|
||||
filesReadonlyListItemsInFolder,
|
||||
filesReadonlyTransferFileToBotpress,
|
||||
} as const satisfies bp.IntegrationProps['actions']
|
||||
@@ -0,0 +1,10 @@
|
||||
import { PageCommentPublisher } from './publishers/page-comment'
|
||||
import * as bp from '.botpress'
|
||||
|
||||
export const channels = {
|
||||
comment: {
|
||||
messages: {
|
||||
text: PageCommentPublisher.publishFooterComment,
|
||||
},
|
||||
},
|
||||
} as const satisfies bp.IntegrationProps['channels']
|
||||
@@ -0,0 +1,41 @@
|
||||
import { IntegrationLogger } from '@botpress/sdk'
|
||||
import { ConfluenceClient } from 'src/client'
|
||||
import type { Context } from '.botpress'
|
||||
|
||||
type PageCommentPublisherArgs = {
|
||||
payload: Record<string, unknown>
|
||||
logger: IntegrationLogger
|
||||
ctx: Context
|
||||
}
|
||||
|
||||
export namespace PageCommentPublisher {
|
||||
export const publishFooterComment = async (args: PageCommentPublisherArgs) => {
|
||||
const pageId = args.payload.pageId as number
|
||||
|
||||
if (!pageId) {
|
||||
args.logger.error('Page ID must be set')
|
||||
}
|
||||
|
||||
const content = args.payload.text as string
|
||||
|
||||
args.logger.forBot().info(`Creating comment on page "${pageId}" with content: "${content}"`)
|
||||
|
||||
const client = ConfluenceClient(args.ctx.configuration)
|
||||
|
||||
await client.writeFooterComment({ pageId: pageId.toString(), text: content })
|
||||
}
|
||||
|
||||
export const getFooterComment = async (args: PageCommentPublisherArgs) => {
|
||||
const pageId = args.payload.pageId as number
|
||||
|
||||
if (!pageId) {
|
||||
args.logger.error('Page ID must be set')
|
||||
}
|
||||
|
||||
args.logger.forBot().info(`Getting comments on page "${pageId}"`)
|
||||
|
||||
const client = ConfluenceClient(args.ctx.configuration)
|
||||
|
||||
await client.getFooterComments({ pageId: pageId.toString() })
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,193 @@
|
||||
import axios from 'axios'
|
||||
|
||||
import type { Page } from 'definitions/entities/page'
|
||||
import { convertMarkdownToHtml } from './parser/markdownToHtml'
|
||||
import type { configuration } from '.botpress'
|
||||
|
||||
type BasePageBody = {
|
||||
status: string | null
|
||||
title: string | null
|
||||
parentId: string | null
|
||||
body: Body | null
|
||||
}
|
||||
|
||||
type Body = {
|
||||
representation: Representation
|
||||
value: string
|
||||
}
|
||||
|
||||
type Representation =
|
||||
| 'storage' // storage means HTML
|
||||
| 'atlas_doc_format' // format parsed for conversion to markdown
|
||||
| 'view'
|
||||
export type CreatePageBody = {
|
||||
spaceId: string
|
||||
} & BasePageBody
|
||||
|
||||
export type UpdatePageBody = {
|
||||
id: string | null
|
||||
version: {
|
||||
number: number
|
||||
message: string
|
||||
} | null
|
||||
} & BasePageBody
|
||||
|
||||
type CreateFooterBody = {
|
||||
pageId: string
|
||||
body: Body
|
||||
}
|
||||
|
||||
export const ConfluenceClient = ({ user, host, apiToken }: configuration.Configuration) => {
|
||||
const auth = Buffer.from(`${user}:${apiToken}`).toString('base64')
|
||||
|
||||
const config = {
|
||||
headers: {
|
||||
Authorization: `Basic ${auth}`,
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
}
|
||||
|
||||
const apiBase = `${host}/wiki/api/v2` as const
|
||||
|
||||
const _extractNextToken = (response: { data: { _links?: { next?: string } } }) =>
|
||||
response?.data?._links?.next
|
||||
? (new URLSearchParams(response.data._links.next.split('?')[1]).get('cursor') ?? undefined)
|
||||
: undefined
|
||||
|
||||
type Space = {
|
||||
id: string
|
||||
name: string
|
||||
type: 'global' | 'collaboration' | 'knowledge_base' | 'personal'
|
||||
status: 'current' | 'archived'
|
||||
homepageId: string
|
||||
}
|
||||
|
||||
type HierarchicalContentType = 'database' | 'embed' | 'folder' | 'page' | 'whiteboard'
|
||||
type HierarchicalChild = {
|
||||
id: string
|
||||
type: HierarchicalContentType
|
||||
status: 'current' | 'archived'
|
||||
title: string
|
||||
spaceId: string
|
||||
}
|
||||
|
||||
return {
|
||||
getAllSpaces: async ({ nextToken: prevToken }: { nextToken?: string }) => {
|
||||
const queryParams = new URLSearchParams({
|
||||
limit: '250', // maximum limit for Confluence API
|
||||
status: 'current', // we don't want archived spaces
|
||||
...(prevToken ? { cursor: prevToken } : {}),
|
||||
})
|
||||
const response = await axios.get(`${apiBase}/spaces?${queryParams.toString()}`, config)
|
||||
const nextToken = _extractNextToken(response)
|
||||
const results = response.data.results as Space[]
|
||||
return {
|
||||
items: results.filter((item) => item.status === 'current'),
|
||||
token: nextToken,
|
||||
}
|
||||
},
|
||||
getSpace: async ({ spaceId }: { spaceId: number }) => {
|
||||
const response = await axios.get(`${apiBase}/spaces/${spaceId}`, config)
|
||||
return response.data as Space
|
||||
},
|
||||
getPage: async ({ pageId }: { pageId: number }) => {
|
||||
const response = await axios.get(`${apiBase}/pages/${pageId}?body-format=ATLAS_DOC_FORMAT`, config)
|
||||
return response.data as Page.InferredType
|
||||
},
|
||||
getPageHtml: async ({ pageId }: { pageId: number }): Promise<string | undefined> => {
|
||||
const response = await axios.get(`${apiBase}/pages/${pageId}?body-format=view`, config)
|
||||
return response.data.body?.view?.value
|
||||
},
|
||||
getDirectChildren: async ({
|
||||
entityId,
|
||||
entityType,
|
||||
nextToken: prevToken,
|
||||
}: {
|
||||
entityId: number
|
||||
entityType: HierarchicalContentType
|
||||
nextToken?: string
|
||||
}) => {
|
||||
const queryParams = new URLSearchParams({
|
||||
limit: '250', // maximum limit for Confluence API
|
||||
...(prevToken ? { cursor: prevToken } : {}),
|
||||
})
|
||||
const response = await axios.get(
|
||||
`${apiBase}/${entityType}s/${entityId}/direct-children?${queryParams.toString()}`,
|
||||
config
|
||||
)
|
||||
const nextToken = _extractNextToken(response)
|
||||
const results = response.data.results as HierarchicalChild[]
|
||||
return {
|
||||
items: results.filter((item) => item.status === 'current'),
|
||||
token: nextToken,
|
||||
}
|
||||
},
|
||||
writeFooterComment: async ({ pageId, text }: { pageId: string; text: string }) => {
|
||||
const footerBody: CreateFooterBody = {
|
||||
pageId,
|
||||
body: {
|
||||
representation: 'storage',
|
||||
value: text,
|
||||
},
|
||||
}
|
||||
const response = await axios.post(`${apiBase}/footer-comments`, footerBody, config)
|
||||
return response?.data
|
||||
},
|
||||
getFooterComments: async ({ pageId }: { pageId: string }) => {
|
||||
const response = await axios.get(
|
||||
`${apiBase}/pages/${pageId}/footer-comments?body-format=atlas_doc_format`,
|
||||
config
|
||||
)
|
||||
return response?.data
|
||||
},
|
||||
createPage: async (input: { item: Page.InferredType }) => {
|
||||
if (!input.item.body) {
|
||||
throw new Error('Body is required')
|
||||
}
|
||||
|
||||
const value = await convertMarkdownToHtml(input.item.body.atlas_doc_format.value)
|
||||
const request: CreatePageBody = {
|
||||
spaceId: input.item.spaceId,
|
||||
status: 'current',
|
||||
title: input.item.title ?? 'Temporary title',
|
||||
parentId: input.item.parentId,
|
||||
body: {
|
||||
representation: 'storage',
|
||||
value,
|
||||
},
|
||||
}
|
||||
|
||||
const response = await axios.post(`${apiBase}/pages`, request, config)
|
||||
return response.data
|
||||
},
|
||||
deletePage: async (pageId: string) => {
|
||||
const response = await axios.delete(`${apiBase}/pages/${pageId}`, config)
|
||||
return response.data
|
||||
},
|
||||
updatePage: async (input: { item: Page.InferredType }) => {
|
||||
if (!input.item.body) {
|
||||
throw new Error('Body is required')
|
||||
}
|
||||
|
||||
const value = await convertMarkdownToHtml(input.item.body.atlas_doc_format.value)
|
||||
|
||||
const request: UpdatePageBody = {
|
||||
id: input.item.id,
|
||||
status: 'current',
|
||||
title: input.item.title ?? 'Temporary title',
|
||||
parentId: input.item.parentId,
|
||||
body: {
|
||||
representation: 'storage',
|
||||
value,
|
||||
},
|
||||
version: {
|
||||
number: input?.item?.version?.number ?? 0,
|
||||
message: 'Updated by botpress',
|
||||
},
|
||||
}
|
||||
|
||||
const response = await axios.post(`${apiBase}/page/${input.item.id}`, request, config)
|
||||
return response.data
|
||||
},
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,84 @@
|
||||
import * as sdk from '@botpress/sdk'
|
||||
|
||||
import { actions } from './actions'
|
||||
import { channels } from './channels'
|
||||
import * as bp from '.botpress'
|
||||
|
||||
export default new bp.Integration({
|
||||
register: async () => {},
|
||||
unregister: async () => {},
|
||||
actions,
|
||||
channels,
|
||||
handler: async (props) => {
|
||||
const {
|
||||
client,
|
||||
req: { body },
|
||||
} = props
|
||||
|
||||
if (!body) {
|
||||
return {
|
||||
status: 400,
|
||||
body: JSON.stringify({ error: 'No body' }),
|
||||
}
|
||||
}
|
||||
|
||||
let parsedBody: unknown
|
||||
try {
|
||||
parsedBody = JSON.parse(body)
|
||||
} catch {
|
||||
return {
|
||||
status: 400,
|
||||
body: JSON.stringify({ error: 'Invalid JSON Body' }),
|
||||
}
|
||||
}
|
||||
|
||||
const parseResult = sdk.z
|
||||
.object({
|
||||
userId: sdk.z.string(),
|
||||
conversationId: sdk.z.string(),
|
||||
text: sdk.z.string(),
|
||||
})
|
||||
.safeParse(parsedBody)
|
||||
|
||||
if (!parseResult.success) {
|
||||
return {
|
||||
status: 400,
|
||||
body: JSON.stringify({ error: 'Invalid body' }),
|
||||
}
|
||||
}
|
||||
|
||||
const { userId, conversationId, text } = parseResult.data
|
||||
|
||||
const { conversation } = await client.getOrCreateConversation({
|
||||
channel: 'comment',
|
||||
tags: {
|
||||
id: conversationId,
|
||||
},
|
||||
})
|
||||
|
||||
const { user } = await client.getOrCreateUser({
|
||||
tags: {
|
||||
id: userId,
|
||||
},
|
||||
})
|
||||
|
||||
const { message } = await client.createMessage({
|
||||
type: 'text',
|
||||
conversationId: conversation.id,
|
||||
userId: user.id,
|
||||
payload: {
|
||||
text,
|
||||
},
|
||||
tags: {},
|
||||
})
|
||||
|
||||
const response = {
|
||||
message,
|
||||
}
|
||||
|
||||
return {
|
||||
status: 200,
|
||||
body: JSON.stringify(response),
|
||||
}
|
||||
},
|
||||
})
|
||||
@@ -0,0 +1,9 @@
|
||||
import { IntegrationLogger } from '@botpress/sdk'
|
||||
|
||||
export const debugLog = (logger: IntegrationLogger, functionName: string, message: string) => {
|
||||
logger.debug(`Debug :: [${functionName}] ${message}`)
|
||||
}
|
||||
|
||||
export const errorLog = (logger: IntegrationLogger, functionName: string, message: string) => {
|
||||
logger.error(`Error :: [${functionName}] ${message}`)
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
import rehypeStringify from 'rehype-stringify'
|
||||
import remarkGfm from 'remark-gfm'
|
||||
import remarkParse from 'remark-parse'
|
||||
import remarkRehype from 'remark-rehype'
|
||||
import { unified } from 'unified'
|
||||
|
||||
export const convertMarkdownToHtml = (gfm: string): Promise<string> =>
|
||||
unified()
|
||||
.use(remarkParse)
|
||||
.use(remarkGfm)
|
||||
.use(remarkRehype)
|
||||
.use(rehypeStringify)
|
||||
.process(gfm)
|
||||
.then((htmlFile) => htmlFile.toString())
|
||||
+296
@@ -0,0 +1,296 @@
|
||||
{
|
||||
"version": 1,
|
||||
"type": "doc",
|
||||
"content": [
|
||||
{
|
||||
"type": "heading",
|
||||
"attrs": {
|
||||
"level": 1
|
||||
},
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "🧙 Game Design Document - Legends of Eldoria"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "Date de création: "
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "2025-04-10",
|
||||
"marks": [
|
||||
{
|
||||
"type": "strong"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": " | Auteur: "
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "Jean Dupuis",
|
||||
"marks": [
|
||||
{
|
||||
"type": "strong"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": " | Version: "
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "1.2",
|
||||
"marks": [
|
||||
{
|
||||
"type": "strong"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "heading",
|
||||
"attrs": {
|
||||
"level": 2
|
||||
},
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "🎯 Vue d’ensemble"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "table",
|
||||
"content": [
|
||||
{
|
||||
"type": "tableRow",
|
||||
"content": [
|
||||
{
|
||||
"type": "tableHeader",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "Élément"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableHeader",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "Détail"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableRow",
|
||||
"content": [
|
||||
{
|
||||
"type": "tableCell",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "Nom du jeu"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableCell",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "Legends of Eldoria"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableRow",
|
||||
"content": [
|
||||
{
|
||||
"type": "tableCell",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "Genre"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableCell",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "Action-RPG en monde semi-ouvert"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableRow",
|
||||
"content": [
|
||||
{
|
||||
"type": "tableCell",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "Vue"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableCell",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "3D isométrique"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableRow",
|
||||
"content": [
|
||||
{
|
||||
"type": "tableCell",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "Mode de jeu"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableCell",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "Solo & Coop en ligne jusqu’à 4 joueurs"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableRow",
|
||||
"content": [
|
||||
{
|
||||
"type": "tableCell",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "Durée de jeu"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableCell",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "25-40h de contenu principal"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableRow",
|
||||
"content": [
|
||||
{
|
||||
"type": "tableCell",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "Plateformes"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableCell",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "PC (Steam), Xbox Series X/S, PS5"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableRow",
|
||||
"content": [
|
||||
{
|
||||
"type": "tableCell",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "Moteur"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableCell",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "Unity 2023 LTS"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "heading",
|
||||
"attrs": {
|
||||
"level": 2
|
||||
},
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "🧵 Pitch"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "\"Un monde brisé. Des héros oubliés. Et un empire à reconstruire.\""
|
||||
},
|
||||
{
|
||||
"type": "hardBreak"
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "Legends of Eldoria est un RPG coopératif où le joueur incarne un ancien héros réincarné. Explorez des terres ravagées, restaurez des cités, et défiez des entités magiques pour ramener l'équilibre dans un monde en ruine."
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
# 🧙 Game Design Document - Legends of Eldoria
|
||||
|
||||
Date de création: **2025-04-10** | Auteur: **Jean Dupuis** | Version: **1.2**
|
||||
|
||||
## 🎯 Vue d’ensemble
|
||||
|
||||
| Élément | Détail |
|
||||
| ------------ | -------------------------------------- |
|
||||
| Nom du jeu | Legends of Eldoria |
|
||||
| Genre | Action-RPG en monde semi-ouvert |
|
||||
| Vue | 3D isométrique |
|
||||
| Mode de jeu | Solo & Coop en ligne jusqu’à 4 joueurs |
|
||||
| Durée de jeu | 25-40h de contenu principal |
|
||||
| Plateformes | PC (Steam), Xbox Series X/S, PS5 |
|
||||
| Moteur | Unity 2023 LTS |
|
||||
|
||||
## 🧵 Pitch
|
||||
|
||||
"Un monde brisé. Des héros oubliés. Et un empire à reconstruire."
|
||||
Legends of Eldoria est un RPG coopératif où le joueur incarne un ancien héros réincarné. Explorez des terres ravagées, restaurez des cités, et défiez des entités magiques pour ramener l'équilibre dans un monde en ruine.
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,132 @@
|
||||
```info
|
||||
Nous avons ajouté un exemple de contenu pour vous aider à démarrer les tests de votre plan de projet. Explorez ce contenu et modifiez-le pour vous l'approprier.
|
||||
```
|
||||
|
||||
| **🚗 Meneur** | @Michael Masson |
|
||||
| ---------------------- | ------------------------------------------------ |
|
||||
| **⚡️ Équipe** | _Mentionnez les contributeurs (p. ex., @xavier)_ |
|
||||
| |
|
||||
| **📆 Date d'échéance** | 03/04/2025 |
|
||||
| **État** | **[en cours]** |
|
||||
|
||||
## 🤔 Énoncé du problème
|
||||
|
||||
_Décrivez le problème et son impact. Incluez l'hypothèse qui sous-tend votre travail (« Nous pensons que X fera Y, et nous saurons que nous avons réussi si Z »)._
|
||||
D'après une récente étude menée auprès de clients, nous souhaitons augmenter le chiffre d'affaires de nos secteurs d'activité.
|
||||
|
||||
## 🎯 Portée
|
||||
|
||||
| **Requis :** | - _Ajoutez les principales exigences de votre projet._
|
||||
|
||||
- | Revitaliser la croissance et les revenus du client en identifiant et en capturant un nouveau segment de marché grâce à l'innovation |
|
||||
| ----------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- |
|
||||
| **Souhaitable :** | - _Ajoutez quelque chose que vous aimeriez avoir, mais dont vous n'avez pas absolument besoin._ |
|
||||
|
||||
- Revitaliser plus d'un segment du client |
|
||||
| **Hors périmètre :** | - _Ajoutez tout ce que vous ne souhaitez pas inclure._
|
||||
|
||||
- Tout travail qui ne concerne pas notre produit principal |
|
||||
|
||||
## 🗓 Chronologie
|
||||
|
||||
_Saisissez /planificateur pour créer une feuille de route visuelle et aider votre équipe à rester sur la bonne voie. Pour modifier des flux de travail ou des dates, sélectionnez l'élément générique ci-dessous et appuyez sur l'icône en forme de crayon._
|
||||
|
||||
# Planificateur de feuille de route
|
||||
|
||||
**Timeline**: From 2024-03-01 00:00:00 to 2024-11-30 00:00:00
|
||||
|
||||
## Phase 1 : identification du problème (Color: #654982)
|
||||
|
||||
Description:
|
||||
|
||||
### Nouvelle barre
|
||||
|
||||
- **Description**:
|
||||
- **Start Date**: 2020-01-01 00:00:00
|
||||
- **Duration**: 1 months
|
||||
|
||||
### Lancement de projet
|
||||
|
||||
- **Description**:
|
||||
- **Start Date**: 2024-03-01 09:12:28
|
||||
- **Duration**: 1 months
|
||||
|
||||
### Analyse des entreprises concurrentes
|
||||
|
||||
- **Description**:
|
||||
- **Start Date**: 2024-03-31 02:11:59
|
||||
- **Duration**: 3 months
|
||||
|
||||
### Analyser les données produit
|
||||
|
||||
- **Description**:
|
||||
- **Start Date**: 2024-04-01 00:17:18
|
||||
- **Duration**: 3 months
|
||||
|
||||
### Réfléchir à des solutions
|
||||
|
||||
- **Description**:
|
||||
- **Start Date**: 2024-06-12 19:50:31
|
||||
- **Duration**: 2 months
|
||||
|
||||
### Nouvelle barre
|
||||
|
||||
- **Description**:
|
||||
- **Start Date**: 2020-01-01 00:00:00
|
||||
- **Duration**: 1 months
|
||||
|
||||
## Phase 2 : élaboration de la solution (Color: #3b7fc4)
|
||||
|
||||
Description:
|
||||
|
||||
### Nouvelle barre
|
||||
|
||||
- **Description**:
|
||||
- **Start Date**: 2020-01-01 00:00:00
|
||||
- **Duration**: 1 months
|
||||
|
||||
### Recherches sur les clients de type entreprise
|
||||
|
||||
- **Description**:
|
||||
- **Start Date**: 2024-07-24 07:09:02
|
||||
- **Duration**: 2 months
|
||||
|
||||
### Peaufiner les solutions
|
||||
|
||||
- **Description**:
|
||||
- **Start Date**: 2024-08-17 12:23:24
|
||||
- **Duration**: 2 months
|
||||
|
||||
### Lancement de produit
|
||||
|
||||
- **Description**:
|
||||
- **Start Date**: 2024-10-15 10:13:04
|
||||
- **Duration**: 2 months
|
||||
|
||||
### Nouvelle barre
|
||||
|
||||
- **Description**:
|
||||
- **Start Date**: 2020-01-01 00:00:00
|
||||
- **Duration**: 1 months
|
||||
|
||||
## Milestones
|
||||
|
||||
- **Atelier avec des parties prenantes**: 2024-07-30 11:10:05
|
||||
- **Revue du leadership nº 1**: 2024-10-16 00:53:15
|
||||
_Saisissez /trello pour ajouter une carte ou un tableau à cette page ou /jira pour inclure un ticket, un graphique ou un projet Jira._
|
||||
|
||||
## 🚩 Étapes importantes et échéances
|
||||
|
||||
| **Étape importante** | **Propriétaire** | **Échéance** | **État** |
|
||||
| -------------------- | ---------------- | ------------ | -------- |
|
||||
|
||||
| _p. ex., Finaliser les conceptions pour la v1_
|
||||
| _@propriétaires_
|
||||
| _Saisissez // pour ajouter une date_
|
||||
| |
|
||||
| ➕ Invitez des membres de l'équipe à rejoindre votre projet | | 03/04/2025 | **[À faire]** |
|
||||
| 🥳 Terminez le plan du projet et assignez des tâches | | 03/04/2025 | **[À faire]** |
|
||||
|
||||
## 🔗 Supports connexes
|
||||
|
||||
[https://botpress.atlassian.net/wiki/pages/resumedraft.action?draftId=131178](https://botpress.atlassian.net/wiki/pages/resumedraft.action?draftId=131178)
|
||||
@@ -0,0 +1,779 @@
|
||||
{
|
||||
"type": "doc",
|
||||
"content": [
|
||||
{
|
||||
"type": "panel",
|
||||
"attrs": {
|
||||
"panelType": "note"
|
||||
},
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"text": "Ce modèle vous est proposé par Mural, une app de collaboration visuelle.",
|
||||
"type": "text"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "heading",
|
||||
"attrs": {
|
||||
"level": 2
|
||||
},
|
||||
"content": [
|
||||
{
|
||||
"type": "emoji",
|
||||
"attrs": {
|
||||
"id": "2753",
|
||||
"text": "❓",
|
||||
"shortName": ":question:"
|
||||
}
|
||||
},
|
||||
{
|
||||
"text": "Besoins non satisfaits",
|
||||
"type": "text",
|
||||
"marks": [
|
||||
{
|
||||
"type": "annotation",
|
||||
"attrs": {
|
||||
"annotationType": "inlineComment",
|
||||
"id": "8526d93f-957f-4825-a069-5c7014e1d96a"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "placeholder",
|
||||
"attrs": {
|
||||
"text": "Pourquoi faisons-nous cela ? Quelle tâche impossible l'utilisateur cherche-t-il à accomplir ? Pourquoi est-il important de résoudre ce problème ?"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "paragraph"
|
||||
},
|
||||
{
|
||||
"type": "heading",
|
||||
"attrs": {
|
||||
"level": 2
|
||||
},
|
||||
"content": [
|
||||
{
|
||||
"type": "emoji",
|
||||
"attrs": {
|
||||
"id": "1f3f9",
|
||||
"text": "🏹",
|
||||
"shortName": ":bow_and_arrow:"
|
||||
}
|
||||
},
|
||||
{
|
||||
"text": " Objectifs",
|
||||
"type": "text"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "placeholder",
|
||||
"attrs": {
|
||||
"text": "Que souhaitons-nous atteindre avec ce projet ?"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "paragraph"
|
||||
},
|
||||
{
|
||||
"type": "heading",
|
||||
"attrs": {
|
||||
"level": 2
|
||||
},
|
||||
"content": [
|
||||
{
|
||||
"type": "emoji",
|
||||
"attrs": {
|
||||
"id": "1f465",
|
||||
"text": "👥",
|
||||
"shortName": ":busts_in_silhouette:"
|
||||
}
|
||||
},
|
||||
{
|
||||
"text": " Personas utilisateur",
|
||||
"type": "text"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "placeholder",
|
||||
"attrs": {
|
||||
"text": "Parmi nos personas, lequel est la cible principale pour ce changement ? Vous pouvez utiliser le modèle de persona pour préciser cela."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "paragraph"
|
||||
},
|
||||
{
|
||||
"type": "heading",
|
||||
"attrs": {
|
||||
"level": 2
|
||||
},
|
||||
"content": [
|
||||
{
|
||||
"type": "emoji",
|
||||
"attrs": {
|
||||
"id": "1f4aa",
|
||||
"text": "💪",
|
||||
"shortName": ":muscle:"
|
||||
}
|
||||
},
|
||||
{
|
||||
"text": " Emplois à pourvoir",
|
||||
"type": "text"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "bulletList",
|
||||
"content": [
|
||||
{
|
||||
"type": "listItem",
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"text": "Lorsque je",
|
||||
"type": "text",
|
||||
"marks": [
|
||||
{
|
||||
"type": "annotation",
|
||||
"attrs": {
|
||||
"annotationType": "inlineComment",
|
||||
"id": "f96966e8-32f7-4ce5-9dba-ada0e2d4a7e9"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "placeholder",
|
||||
"attrs": {
|
||||
"text": "<describe the specific context>"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "listItem",
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"text": "Je souhaite",
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"type": "placeholder",
|
||||
"attrs": {
|
||||
"text": "<describe user need>"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "listItem",
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"text": "Afin de pouvoir",
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"type": "placeholder",
|
||||
"attrs": {
|
||||
"text": "<describe the reason for the need>"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "paragraph"
|
||||
},
|
||||
{
|
||||
"type": "heading",
|
||||
"attrs": {
|
||||
"level": 2
|
||||
},
|
||||
"content": [
|
||||
{
|
||||
"type": "emoji",
|
||||
"attrs": {
|
||||
"id": "1f4dc",
|
||||
"text": "📜",
|
||||
"shortName": ":scroll:"
|
||||
}
|
||||
},
|
||||
{
|
||||
"text": " Un peu d'histoire",
|
||||
"type": "text"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "placeholder",
|
||||
"attrs": {
|
||||
"text": "Si le problème a déjà été étudié par le passé, ou si nous avons testé d'autres stratégies et si nous en avons tiré des enseignements pertinents."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "paragraph"
|
||||
},
|
||||
{
|
||||
"type": "heading",
|
||||
"attrs": {
|
||||
"level": 2
|
||||
},
|
||||
"content": [
|
||||
{
|
||||
"type": "emoji",
|
||||
"attrs": {
|
||||
"id": "1f440",
|
||||
"text": "👀",
|
||||
"shortName": ":eyes:"
|
||||
}
|
||||
},
|
||||
{
|
||||
"text": " Contraintes",
|
||||
"type": "text"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "placeholder",
|
||||
"attrs": {
|
||||
"text": "Si ce problème est affecté par ou affecte un autre projet."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "paragraph"
|
||||
},
|
||||
{
|
||||
"type": "heading",
|
||||
"attrs": {
|
||||
"level": 2
|
||||
},
|
||||
"content": [
|
||||
{
|
||||
"type": "emoji",
|
||||
"attrs": {
|
||||
"id": "1f5fa",
|
||||
"text": "🗺",
|
||||
"shortName": ":map:"
|
||||
}
|
||||
},
|
||||
{
|
||||
"text": " Explorations + décisions",
|
||||
"type": "text"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "placeholder",
|
||||
"attrs": {
|
||||
"text": "Décrivez les types d'approches envisagées, ainsi que les avantages et les inconvénients de chacune. Quelles décisions avons-nous prises, et pourquoi ?"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "paragraph"
|
||||
},
|
||||
{
|
||||
"type": "heading",
|
||||
"attrs": {
|
||||
"level": 2
|
||||
},
|
||||
"content": [
|
||||
{
|
||||
"type": "emoji",
|
||||
"attrs": {
|
||||
"id": "1f5d3",
|
||||
"text": "🗓",
|
||||
"shortName": ":calendar_spiral:"
|
||||
}
|
||||
},
|
||||
{
|
||||
"text": " Versions",
|
||||
"type": "text"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "placeholder",
|
||||
"attrs": {
|
||||
"text": "Si ce projet implique des versions, décrivez-les ici."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "table",
|
||||
"attrs": {
|
||||
"layout": "default",
|
||||
"width": 760,
|
||||
"localId": "7c7a619b-3415-4046-b9c9-31753eeb2a00"
|
||||
},
|
||||
"content": [
|
||||
{
|
||||
"type": "tableRow",
|
||||
"content": [
|
||||
{
|
||||
"type": "tableHeader",
|
||||
"attrs": {
|
||||
"colspan": 1,
|
||||
"rowspan": 1
|
||||
},
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"text": "Nom de la version",
|
||||
"type": "text",
|
||||
"marks": [
|
||||
{
|
||||
"type": "strong"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableHeader",
|
||||
"attrs": {
|
||||
"colspan": 1,
|
||||
"rowspan": 1
|
||||
},
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"text": "Valeur ajoutée",
|
||||
"type": "text",
|
||||
"marks": [
|
||||
{
|
||||
"type": "strong"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableHeader",
|
||||
"attrs": {
|
||||
"colspan": 1,
|
||||
"rowspan": 1
|
||||
},
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"text": "Champ",
|
||||
"type": "text",
|
||||
"marks": [
|
||||
{
|
||||
"type": "strong"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableHeader",
|
||||
"attrs": {
|
||||
"colspan": 1,
|
||||
"rowspan": 1
|
||||
},
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"text": "État",
|
||||
"type": "text",
|
||||
"marks": [
|
||||
{
|
||||
"type": "strong"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableHeader",
|
||||
"attrs": {
|
||||
"colspan": 1,
|
||||
"rowspan": 1
|
||||
},
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"text": "Date d'achèvement",
|
||||
"type": "text",
|
||||
"marks": [
|
||||
{
|
||||
"type": "strong"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableRow",
|
||||
"content": [
|
||||
{
|
||||
"type": "tableCell",
|
||||
"attrs": {
|
||||
"colspan": 1,
|
||||
"rowspan": 1
|
||||
},
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableCell",
|
||||
"attrs": {
|
||||
"colspan": 1,
|
||||
"rowspan": 1
|
||||
},
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableCell",
|
||||
"attrs": {
|
||||
"colspan": 1,
|
||||
"rowspan": 1
|
||||
},
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableCell",
|
||||
"attrs": {
|
||||
"colspan": 1,
|
||||
"rowspan": 1
|
||||
},
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "status",
|
||||
"attrs": {
|
||||
"color": "neutral",
|
||||
"style": "bold",
|
||||
"text": "À faire",
|
||||
"localId": "18475d09-f549-402d-8aa5-0d1b31ccabf2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"text": " / ",
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"type": "status",
|
||||
"attrs": {
|
||||
"color": "blue",
|
||||
"style": "bold",
|
||||
"text": "En cours",
|
||||
"localId": "6ef6d88f-17d1-41e8-ba07-b52465c44c3a"
|
||||
}
|
||||
},
|
||||
{
|
||||
"text": " / ",
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"type": "status",
|
||||
"attrs": {
|
||||
"color": "red",
|
||||
"style": "bold",
|
||||
"text": "Bloqué",
|
||||
"localId": "ec3963e0-cb63-4cd1-a288-e35829fc33de"
|
||||
}
|
||||
},
|
||||
{
|
||||
"text": " / ",
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"type": "status",
|
||||
"attrs": {
|
||||
"color": "yellow",
|
||||
"style": "bold",
|
||||
"text": "En attente de feedback",
|
||||
"localId": "b3b32843-0c19-4b71-9fe1-08ebb7ee4991"
|
||||
}
|
||||
},
|
||||
{
|
||||
"text": " / ",
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"type": "status",
|
||||
"attrs": {
|
||||
"color": "green",
|
||||
"style": "bold",
|
||||
"text": "Terminé",
|
||||
"localId": "9300ae4d-6e8f-464c-b43c-c3e87a575ae9"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableCell",
|
||||
"attrs": {
|
||||
"colspan": 1,
|
||||
"rowspan": 1
|
||||
},
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "date",
|
||||
"attrs": {
|
||||
"timestamp": "1744243200000"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "heading",
|
||||
"attrs": {
|
||||
"level": 2
|
||||
},
|
||||
"content": [
|
||||
{
|
||||
"type": "emoji",
|
||||
"attrs": {
|
||||
"id": "1f463",
|
||||
"text": "👣",
|
||||
"shortName": ":footprints:"
|
||||
}
|
||||
},
|
||||
{
|
||||
"text": " Étapes suivantes",
|
||||
"type": "text"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "taskList",
|
||||
"attrs": {
|
||||
"localId": ""
|
||||
},
|
||||
"content": [
|
||||
{
|
||||
"type": "taskItem",
|
||||
"attrs": {
|
||||
"state": "DONE",
|
||||
"localId": "2"
|
||||
},
|
||||
"content": [
|
||||
{
|
||||
"text": "Blabla",
|
||||
"type": "text"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "taskItem",
|
||||
"attrs": {
|
||||
"state": "DONE",
|
||||
"localId": "1"
|
||||
},
|
||||
"content": [
|
||||
{
|
||||
"type": "placeholder",
|
||||
"attrs": {
|
||||
"text": "Que devons-nous faire ensuite ?"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "status",
|
||||
"attrs": {
|
||||
"color": "neutral",
|
||||
"style": "bold",
|
||||
"text": "Définir un état",
|
||||
"localId": "cdddc2a2-9520-4062-a90f-cbca71f507be"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "paragraph"
|
||||
},
|
||||
{
|
||||
"type": "heading",
|
||||
"attrs": {
|
||||
"level": 2
|
||||
},
|
||||
"content": [
|
||||
{
|
||||
"type": "emoji",
|
||||
"attrs": {
|
||||
"id": "1f4c8",
|
||||
"text": "📈",
|
||||
"shortName": ":chart_with_upwards_trend:"
|
||||
}
|
||||
},
|
||||
{
|
||||
"text": " Impact",
|
||||
"type": "text"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "placeholder",
|
||||
"attrs": {
|
||||
"text": "Ajoutez des métriques clés et d'autres indicateurs de performance qui font l'objet d'un suivi."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "paragraph"
|
||||
},
|
||||
{
|
||||
"type": "heading",
|
||||
"attrs": {
|
||||
"level": 2
|
||||
},
|
||||
"content": [
|
||||
{
|
||||
"type": "emoji",
|
||||
"attrs": {
|
||||
"id": "1f517",
|
||||
"text": "🔗",
|
||||
"shortName": ":link:"
|
||||
}
|
||||
},
|
||||
{
|
||||
"text": " Autres documents",
|
||||
"type": "text"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "bulletList",
|
||||
"content": [
|
||||
{
|
||||
"type": "listItem",
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "placeholder",
|
||||
"attrs": {
|
||||
"text": "Exemple"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "paragraph"
|
||||
},
|
||||
{
|
||||
"type": "paragraph"
|
||||
}
|
||||
],
|
||||
"version": 1
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
```note
|
||||
Ce modèle vous est proposé par Mural, une app de collaboration visuelle.
|
||||
```
|
||||
|
||||
## ❓Besoins non satisfaits
|
||||
|
||||
_Pourquoi faisons-nous cela ? Quelle tâche impossible l'utilisateur cherche-t-il à accomplir ? Pourquoi est-il important de résoudre ce problème ?_
|
||||
|
||||
## 🏹 Objectifs
|
||||
|
||||
_Que souhaitons-nous atteindre avec ce projet ?_
|
||||
|
||||
## 👥 Personas utilisateur
|
||||
|
||||
_Parmi nos personas, lequel est la cible principale pour ce changement ? Vous pouvez utiliser le modèle de persona pour préciser cela._
|
||||
|
||||
## 💪 Emplois à pourvoir
|
||||
|
||||
- Lorsque je*<describe the specific context>*
|
||||
|
||||
- Je souhaite*<describe user need>*
|
||||
|
||||
- Afin de pouvoir*<describe the reason for the need>*
|
||||
|
||||
## 📜 Un peu d'histoire
|
||||
|
||||
_Si le problème a déjà été étudié par le passé, ou si nous avons testé d'autres stratégies et si nous en avons tiré des enseignements pertinents._
|
||||
|
||||
## 👀 Contraintes
|
||||
|
||||
_Si ce problème est affecté par ou affecte un autre projet._
|
||||
|
||||
## 🗺 Explorations + décisions
|
||||
|
||||
_Décrivez les types d'approches envisagées, ainsi que les avantages et les inconvénients de chacune. Quelles décisions avons-nous prises, et pourquoi ?_
|
||||
|
||||
## 🗓 Versions
|
||||
|
||||
_Si ce projet implique des versions, décrivez-les ici._
|
||||
| **Nom de la version** | **Valeur ajoutée** | **Champ** | **État** | **Date d'achèvement** |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| | | | **[À faire]** / **[En cours]** / **[Bloqué]** / **[En attente de feedback]** / **[Terminé]** | 09/04/2025 |
|
||||
|
||||
## 👣 Étapes suivantes
|
||||
|
||||
[x]Blabla
|
||||
[x]_Que devons-nous faire ensuite ?_
|
||||
**[Définir un état]**
|
||||
|
||||
## 📈 Impact
|
||||
|
||||
_Ajoutez des métriques clés et d'autres indicateurs de performance qui font l'objet d'un suivi._
|
||||
|
||||
## 🔗 Autres documents
|
||||
|
||||
- _Exemple_
|
||||
@@ -0,0 +1,801 @@
|
||||
{
|
||||
"type": "doc",
|
||||
"content": [
|
||||
{
|
||||
"type": "bodiedExtension",
|
||||
"attrs": {
|
||||
"layout": "default",
|
||||
"extensionType": "com.atlassian.confluence.macro.core",
|
||||
"extensionKey": "details",
|
||||
"parameters": {
|
||||
"macroParams": {},
|
||||
"macroMetadata": {
|
||||
"macroId": { "value": "d858d8e03b5e1daef385609bd282d5dd" },
|
||||
"schemaVersion": { "value": "1" },
|
||||
"title": "Page Properties"
|
||||
}
|
||||
},
|
||||
"localId": "a750237f-a9f2-44f7-ae29-0fd5dbd51be8"
|
||||
},
|
||||
"content": [
|
||||
{
|
||||
"type": "table",
|
||||
"attrs": { "layout": "default" },
|
||||
"content": [
|
||||
{
|
||||
"type": "tableRow",
|
||||
"content": [
|
||||
{
|
||||
"type": "tableHeader",
|
||||
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": [166.0] },
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"text": "Date cible du lancement de la version",
|
||||
"type": "text",
|
||||
"marks": [{ "type": "strong" }]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableCell",
|
||||
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": [560.0] },
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"text": "Saisissez // pour ajouter une date de publication cible",
|
||||
"type": "text",
|
||||
"marks": [{ "type": "textColor", "attrs": { "color": "#97a0af" } }]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableRow",
|
||||
"content": [
|
||||
{
|
||||
"type": "tableHeader",
|
||||
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": [166.0] },
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [{ "text": "Épopée", "type": "text", "marks": [{ "type": "strong" }] }]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableCell",
|
||||
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": [560.0] },
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"text": "Saisissez /Jira pour ajouter des epics et des tickets Jira",
|
||||
"type": "text",
|
||||
"marks": [{ "type": "textColor", "attrs": { "color": "#97a0af" } }]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableRow",
|
||||
"content": [
|
||||
{
|
||||
"type": "tableHeader",
|
||||
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": [166.0] },
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [{ "text": "État du document", "type": "text", "marks": [{ "type": "strong" }] }]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableCell",
|
||||
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": [560.0] },
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "status",
|
||||
"attrs": {
|
||||
"color": "neutral",
|
||||
"style": "bold",
|
||||
"text": "BROUILLON",
|
||||
"localId": "185e9452-e5d1-41f2-8a2f-8575587f5a14"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableRow",
|
||||
"content": [
|
||||
{
|
||||
"type": "tableHeader",
|
||||
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": [166.0] },
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{ "text": "Propriétaire du document", "type": "text", "marks": [{ "type": "strong" }] }
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableCell",
|
||||
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": [560.0] },
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"text": "@Mentionnez le propriétaire",
|
||||
"type": "text",
|
||||
"marks": [{ "type": "textColor", "attrs": { "color": "#97a0af" } }]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableRow",
|
||||
"content": [
|
||||
{
|
||||
"type": "tableHeader",
|
||||
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": [166.0] },
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [{ "text": "Designer", "type": "text", "marks": [{ "type": "strong" }] }]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableCell",
|
||||
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": [560.0] },
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"text": "Mentionnez le designer (p. ex. @john)",
|
||||
"type": "text",
|
||||
"marks": [{ "type": "textColor", "attrs": { "color": "#97a0af" } }]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableRow",
|
||||
"content": [
|
||||
{
|
||||
"type": "tableHeader",
|
||||
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": [166.0] },
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [{ "text": "Responsable technique", "type": "text", "marks": [{ "type": "strong" }] }]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableCell",
|
||||
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": [560.0] },
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"text": "Mentionnez le responsable (p. ex., @marie)",
|
||||
"type": "text",
|
||||
"marks": [{ "type": "textColor", "attrs": { "color": "#97a0af" } }]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableRow",
|
||||
"content": [
|
||||
{
|
||||
"type": "tableHeader",
|
||||
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": [166.0] },
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [{ "text": "Rédacteurs techniques", "type": "text", "marks": [{ "type": "strong" }] }]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableCell",
|
||||
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": [560.0] },
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"text": "Mentionnez les rédacteurs (p. ex., @claire)",
|
||||
"type": "text",
|
||||
"marks": [{ "type": "textColor", "attrs": { "color": "#97a0af" } }]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableRow",
|
||||
"content": [
|
||||
{
|
||||
"type": "tableHeader",
|
||||
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": [166.0] },
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [{ "text": "Assurance qualité", "type": "text", "marks": [{ "type": "strong" }] }]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableCell",
|
||||
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": [560.0] },
|
||||
"content": [{ "type": "paragraph" }]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "heading",
|
||||
"attrs": { "level": 2 },
|
||||
"content": [
|
||||
{ "type": "emoji", "attrs": { "id": "1f3af", "text": "🎯", "shortName": ":dart:" } },
|
||||
{ "text": " Objectif", "type": "text" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "placeholder",
|
||||
"attrs": {
|
||||
"text": "Donnez le contexte de ce projet et expliquez comment il s'inscrit dans les objectifs stratégiques de votre organisation."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "heading",
|
||||
"attrs": { "level": 2 },
|
||||
"content": [
|
||||
{ "type": "emoji", "attrs": { "id": "1f4ca", "text": "\\uD83D\\uDCCA", "shortName": ":bar_chart:" } },
|
||||
{ "text": " Métriques de réussite", "type": "text" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "placeholder",
|
||||
"attrs": {
|
||||
"text": "Répertoriez les objectifs de projet et métriques que vous utiliserez pour évaluer la réussite de celui-ci."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "table",
|
||||
"attrs": { "layout": "default" },
|
||||
"content": [
|
||||
{
|
||||
"type": "tableRow",
|
||||
"content": [
|
||||
{
|
||||
"type": "tableHeader",
|
||||
"attrs": {
|
||||
"colspan": 1,
|
||||
"background": "var(--ds-background-accent-teal-subtlest, #e6fcff)",
|
||||
"rowspan": 1,
|
||||
"colwidth": [371.0]
|
||||
},
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [{ "text": "Objectif", "type": "text", "marks": [{ "type": "strong" }] }]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableHeader",
|
||||
"attrs": {
|
||||
"colspan": 1,
|
||||
"background": "var(--ds-background-accent-teal-subtlest, #e6fcff)",
|
||||
"rowspan": 1,
|
||||
"colwidth": [389.0]
|
||||
},
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [{ "text": "Métrique", "type": "text", "marks": [{ "type": "strong" }] }]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableRow",
|
||||
"content": [
|
||||
{
|
||||
"type": "tableCell",
|
||||
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": [371.0] },
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{ "type": "placeholder", "attrs": { "text": "P. ex., simplifier l'expérience utilisateur" } }
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableCell",
|
||||
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": [389.0] },
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{ "type": "placeholder", "attrs": { "text": "P. ex., le score de satisfaction client augmente" } }
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableRow",
|
||||
"content": [
|
||||
{
|
||||
"type": "tableCell",
|
||||
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": [371.0] },
|
||||
"content": [{ "type": "paragraph" }]
|
||||
},
|
||||
{
|
||||
"type": "tableCell",
|
||||
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": [389.0] },
|
||||
"content": [{ "type": "paragraph" }]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "heading",
|
||||
"attrs": { "level": 2 },
|
||||
"content": [
|
||||
{ "type": "emoji", "attrs": { "id": "1f914", "text": "\\uD83E\\uDD14", "shortName": ":thinking:" } },
|
||||
{ "text": " Hypothèses", "type": "text" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "placeholder",
|
||||
"attrs": {
|
||||
"text": "Répertoriez toutes les hypothèses sur vos utilisateurs, contraintes techniques ou objectifs métier."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "heading",
|
||||
"attrs": { "level": 2 },
|
||||
"content": [
|
||||
{ "type": "emoji", "attrs": { "id": "1f31f", "text": "\\uD83C\\uDF1F", "shortName": ":star2:" } },
|
||||
{ "text": " Étapes importantes", "type": "text" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "placeholder",
|
||||
"attrs": {
|
||||
"text": "Saisissez /planificateur pour créer une feuille de route visuelle et aider votre équipe à rester sur la bonne voie. Pour modifier des flux de travail ou des dates, sélectionnez l'élément générique et appuyez sur l'icône en forme de crayon."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "extension",
|
||||
"attrs": {
|
||||
"layout": "default",
|
||||
"extensionType": "com.atlassian.confluence.macro.core",
|
||||
"extensionKey": "roadmap",
|
||||
"parameters": {
|
||||
"macroParams": {
|
||||
"maplinks": { "value": "" },
|
||||
"timeline": { "value": "true" },
|
||||
"source": {
|
||||
"value": "\n %7B%22title%22%3A%22Roadmap%20Planner%22%2C%22timeline%22%3A%7B%22startDate%22%3A%222021-12-16%2000%3A00%3A00%22%2C%22endDate%22%3A%222022-07-16%2000%3A00%3A00%22%2C%22displayOption%22%3A%22MONTH%22%7D%2C%22lanes%22%3A%5B%7B%22title%22%3A%22Dashboard%22%2C%22color%22%3A%7B%22lane%22%3A%22%23f6c342%22%2C%22bar%22%3A%22%23fadb8e%22%2C%22text%22%3A%22%23594300%22%2C%22count%22%3A1%7D%2C%22bars%22%3A%5B%7B%22title%22%3A%22Feature%201%22%2C%22description%22%3A%22This%20is%20the%20first%20bar.%22%2C%22startDate%22%3A%222021-12-10%2019%3A43%3A21%22%2C%22duration%22%3A2%2C%22rowIndex%22%3A0%2C%22id%22%3A%22eeb2d902-e723-4ff0-a10d-43a5793089a4%22%2C%22pageLink%22%3A%7B%7D%7D%2C%7B%22title%22%3A%22Feature%202%22%2C%22description%22%3A%22This%20is%20the%20second%20bar.%22%2C%22startDate%22%3A%222021-12-20%2000%3A42%3A46%22%2C%22duration%22%3A2.594059405940594%2C%22rowIndex%22%3A3%2C%22id%22%3A%220e8f437c-39f1-4d70-b85b-3ca89fd57a00%22%2C%22pageLink%22%3A%7B%7D%7D%2C%7B%22rowIndex%22%3A1%2C%22startDate%22%3A%222022-03-13%2007%3A39%3A12%22%2C%22id%22%3A%2290251c8c-3b74-4d2b-b850-684ffd40514b%22%2C%22title%22%3A%22Feature%203%22%2C%22description%22%3A%22%22%2C%22duration%22%3A2.00990099009901%2C%22pageLink%22%3A%7B%7D%7D%2C%7B%22rowIndex%22%3A2%2C%22startDate%22%3A%222022-04-24%2011%3A10%3A05%22%2C%22id%22%3A%22d0529fe8-6c8c-45e8-8078-d75c2f063dd9%22%2C%22title%22%3A%22Feature%204%22%2C%22description%22%3A%22%22%2C%22duration%22%3A2.01980198019802%2C%22pageLink%22%3A%7B%7D%7D%5D%7D%2C%7B%22title%22%3A%22Notification%22%2C%22color%22%3A%7B%22lane%22%3A%22%233b7fc4%22%2C%22bar%22%3A%22%236c9fd3%22%2C%22text%22%3A%22%23ffffff%22%2C%22count%22%3A1%7D%2C%22bars%22%3A%5B%7B%22title%22%3A%22iOS%20App%22%2C%22description%22%3A%22This%20is%20the%20third%20bar.%22%2C%22startDate%22%3A%222022-01-13%2014%3A01%3A11%22%2C%22duration%22%3A2.5%2C%22rowIndex%22%3A0%2C%22id%22%3A%22dd93afcd-2704-4253-adb8-809a336cc5ba%22%2C%22pageLink%22%3A%7B%7D%7D%2C%7B%22rowIndex%22%3A0%2C%22startDate%22%3A%222022-04-23%2013%3A46%3A55%22%2C%22id%22%3A%228dc8bc2d-b7cb-44a8-b526-7d1ede51f690%22%2C%22title%22%3A%22Android%22%2C%22description%22%3A%22%22%2C%22duration%22%3A2.4752475247524752%2C%22pageLink%22%3A%7B%7D%7D%5D%7D%5D%2C%22markers%22%3A%5B%7B%22title%22%3A%22Milestone%201%22%2C%22markerDate%22%3A%222022-04-28%2007%3A50%3A29%22%7D%2C%7B%22markerDate%22%3A%222022-08-25%2020%3A40%3A23%22%2C%22title%22%3A%22Go%2FNo%20go%22%7D%2C%7B%22markerDate%22%3A%222022-06-25%2008%3A33%3A16%22%2C%22title%22%3A%22Milestone%202%22%7D%5D%7D\n "
|
||||
},
|
||||
"pagelinks": { "value": "" },
|
||||
"title": { "value": "Roadmap%20Planner" },
|
||||
"hash": { "value": "cfdf6478a845bded2fc6786da3b93b66" }
|
||||
},
|
||||
"macroMetadata": {
|
||||
"macroId": { "value": "ac0eb7fa-f06f-4569-9830-8889242be02b" },
|
||||
"schemaVersion": { "value": "1" },
|
||||
"placeholder": [
|
||||
{
|
||||
"type": "image",
|
||||
"data": {
|
||||
"url": "/plugins/servlet/roadmap/image/placeholder?hash=cfdf6478a845bded2fc6786da3b93b66&width=1000&height=300&timeline=true"
|
||||
}
|
||||
}
|
||||
],
|
||||
"title": "Roadmap Planner"
|
||||
}
|
||||
},
|
||||
"localId": "bd778e88-508d-4497-8f82-8e5c714afae8"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "placeholder",
|
||||
"attrs": {
|
||||
"text": "Saisissez /trello pour ajouter une carte ou un tableau à cette page, ou /jira pour inclure un ticket Jira, un graphique ou un projet."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "heading",
|
||||
"attrs": { "level": 2 },
|
||||
"content": [
|
||||
{ "type": "emoji", "attrs": { "id": "1f5d2", "text": "\\uD83D\\uDDD2", "shortName": ":notepad_spiral:" } },
|
||||
{ "text": " Caractéristiques", "type": "text" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "table",
|
||||
"attrs": { "layout": "default" },
|
||||
"content": [
|
||||
{
|
||||
"type": "tableRow",
|
||||
"content": [
|
||||
{
|
||||
"type": "tableHeader",
|
||||
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": [204.0] },
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [{ "text": "Exigence", "type": "text", "marks": [{ "type": "strong" }] }]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableHeader",
|
||||
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": [216.0] },
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [{ "text": "Récit utilisateur", "type": "text", "marks": [{ "type": "strong" }] }]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableHeader",
|
||||
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": [123.0] },
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [{ "text": "Importance", "type": "text", "marks": [{ "type": "strong" }] }]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableHeader",
|
||||
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": [111.0] },
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [{ "text": "Ticket Jira", "type": "text", "marks": [{ "type": "strong" }] }]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableHeader",
|
||||
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": [106.0] },
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [{ "text": "Notes", "type": "text", "marks": [{ "type": "strong" }] }]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableRow",
|
||||
"content": [
|
||||
{
|
||||
"type": "tableCell",
|
||||
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": [204.0] },
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [{ "type": "placeholder", "attrs": { "text": "P. ex., doit être « responsive »" } }]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableCell",
|
||||
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": [216.0] },
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "placeholder",
|
||||
"attrs": {
|
||||
"text": "P. ex., John est chef de projet et souhaite vérifier l'avancement de son équipe depuis la gare."
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableCell",
|
||||
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": [123.0] },
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "status",
|
||||
"attrs": {
|
||||
"color": "red",
|
||||
"style": "bold",
|
||||
"text": "ÉLEVÉE",
|
||||
"localId": "7b1e4116-8c57-4a77-9b3c-c50ea155e02d"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableCell",
|
||||
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": [111.0] },
|
||||
"content": [{ "type": "paragraph" }]
|
||||
},
|
||||
{
|
||||
"type": "tableCell",
|
||||
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": [106.0] },
|
||||
"content": [{ "type": "paragraph" }]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableRow",
|
||||
"content": [
|
||||
{
|
||||
"type": "tableCell",
|
||||
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": [204.0] },
|
||||
"content": [{ "type": "paragraph", "content": [{ "text": " ", "type": "text" }] }]
|
||||
},
|
||||
{
|
||||
"type": "tableCell",
|
||||
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": [216.0] },
|
||||
"content": [{ "type": "paragraph", "content": [{ "text": " ", "type": "text" }] }]
|
||||
},
|
||||
{
|
||||
"type": "tableCell",
|
||||
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": [123.0] },
|
||||
"content": [{ "type": "paragraph", "content": [{ "text": " ", "type": "text" }] }]
|
||||
},
|
||||
{
|
||||
"type": "tableCell",
|
||||
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": [111.0] },
|
||||
"content": [{ "type": "paragraph", "content": [{ "text": " ", "type": "text" }] }]
|
||||
},
|
||||
{
|
||||
"type": "tableCell",
|
||||
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": [106.0] },
|
||||
"content": [{ "type": "paragraph", "content": [{ "text": " ", "type": "text" }] }]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "heading",
|
||||
"attrs": { "level": 2 },
|
||||
"content": [
|
||||
{ "type": "emoji", "attrs": { "id": "1f3a8", "text": "\\uD83C\\uDFA8", "shortName": ":art:" } },
|
||||
{ "text": " Interactions avec l'utilisateur et design", "type": "text" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "placeholder",
|
||||
"attrs": {
|
||||
"text": "Saisissez /image pour ajouter des maquettes, des diagrammes et des captures d'écran associés aux exigences."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "heading",
|
||||
"attrs": { "level": 2 },
|
||||
"content": [
|
||||
{
|
||||
"type": "emoji",
|
||||
"attrs": { "id": "atlassian-question_mark", "text": ":question_mark:", "shortName": ":question_mark:" }
|
||||
},
|
||||
{ "text": " Questions en suspens", "type": "text" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "table",
|
||||
"attrs": { "layout": "default" },
|
||||
"content": [
|
||||
{
|
||||
"type": "tableRow",
|
||||
"content": [
|
||||
{
|
||||
"type": "tableHeader",
|
||||
"attrs": {
|
||||
"colspan": 1,
|
||||
"background": "var(--ds-background-accent-blue-subtlest, #deebff)",
|
||||
"rowspan": 1,
|
||||
"colwidth": [250.0]
|
||||
},
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [{ "text": "Question", "type": "text", "marks": [{ "type": "strong" }] }]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableHeader",
|
||||
"attrs": {
|
||||
"colspan": 1,
|
||||
"background": "var(--ds-background-accent-blue-subtlest, #deebff)",
|
||||
"rowspan": 1,
|
||||
"colwidth": [337.0]
|
||||
},
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [{ "text": "Réponse", "type": "text", "marks": [{ "type": "strong" }] }]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableHeader",
|
||||
"attrs": {
|
||||
"colspan": 1,
|
||||
"background": "var(--ds-background-accent-blue-subtlest, #deebff)",
|
||||
"rowspan": 1,
|
||||
"colwidth": [173.0]
|
||||
},
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [{ "text": "Date de réponse", "type": "text", "marks": [{ "type": "strong" }] }]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableRow",
|
||||
"content": [
|
||||
{
|
||||
"type": "tableCell",
|
||||
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": [250.0] },
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "placeholder",
|
||||
"attrs": { "text": "P. ex., comment rendre cette fonctionnalité plus connue des utilisateurs ?" }
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableCell",
|
||||
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": [337.0] },
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "placeholder",
|
||||
"attrs": {
|
||||
"text": "p. ex., Nous annoncerons la fonctionnalité par un billet de blog et une présentation"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "tableCell",
|
||||
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": [173.0] },
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [{ "type": "placeholder", "attrs": { "text": "Saisissez // pour ajouter une date" } }]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{ "type": "paragraph" },
|
||||
{
|
||||
"type": "heading",
|
||||
"attrs": { "level": 2 },
|
||||
"content": [
|
||||
{ "type": "emoji", "attrs": { "id": "atlassian-warning", "text": ":warning:", "shortName": ":warning:" } },
|
||||
{ "text": " Hors du périmètre", "type": "text" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "placeholder",
|
||||
"attrs": {
|
||||
"text": "Répertoriez les fonctionnalités envisagées qui ne correspondent pas au cahier des charges ou sont susceptibles d'être examinées de nouveau à l'occasion d'une version ultérieure."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{ "type": "bulletList", "content": [{ "type": "listItem", "content": [{ "type": "paragraph" }] }] }
|
||||
],
|
||||
"version": 1
|
||||
}
|
||||
@@ -0,0 +1,116 @@
|
||||
| **Date cible du lancement de la version** | Saisissez // pour ajouter une date de publication cible |
|
||||
| ----------------------------------------- | ---------------------------------------------------------- |
|
||||
| **Épopée** | Saisissez /Jira pour ajouter des epics et des tickets Jira |
|
||||
| **État du document** | **[BROUILLON]** |
|
||||
| **Propriétaire du document** | @Mentionnez le propriétaire |
|
||||
| **Designer** | Mentionnez le designer (p. ex. @john) |
|
||||
| **Responsable technique** | Mentionnez le responsable (p. ex., @marie) |
|
||||
| **Rédacteurs techniques** | Mentionnez les rédacteurs (p. ex., @claire) |
|
||||
| **Assurance qualité** | |
|
||||
|
||||
## 🎯 Objectif
|
||||
|
||||
_Donnez le contexte de ce projet et expliquez comment il s'inscrit dans les objectifs stratégiques de votre organisation._
|
||||
|
||||
## \uD83D\uDCCA Métriques de réussite
|
||||
|
||||
_Répertoriez les objectifs de projet et métriques que vous utiliserez pour évaluer la réussite de celui-ci._
|
||||
| **Objectif** | **Métrique** |
|
||||
| --- | --- |
|
||||
| _P. ex., simplifier l'expérience utilisateur_
|
||||
| _P. ex., le score de satisfaction client augmente_
|
||||
|
|
||||
| | |
|
||||
|
||||
## \uD83E\uDD14 Hypothèses
|
||||
|
||||
_Répertoriez toutes les hypothèses sur vos utilisateurs, contraintes techniques ou objectifs métier._
|
||||
|
||||
## \uD83C\uDF1F Étapes importantes
|
||||
|
||||
_Saisissez /planificateur pour créer une feuille de route visuelle et aider votre équipe à rester sur la bonne voie. Pour modifier des flux de travail ou des dates, sélectionnez l'élément générique et appuyez sur l'icône en forme de crayon._
|
||||
|
||||
# Roadmap Planner
|
||||
|
||||
**Timeline**: From 2021-12-16 00:00:00 to 2022-07-16 00:00:00
|
||||
|
||||
## Dashboard (Color: #f6c342)
|
||||
|
||||
Description:
|
||||
|
||||
### Feature 1
|
||||
|
||||
- **Description**: This is the first bar.
|
||||
- **Start Date**: 2021-12-10 19:43:21
|
||||
- **Duration**: 2 months
|
||||
|
||||
### Feature 2
|
||||
|
||||
- **Description**: This is the second bar.
|
||||
- **Start Date**: 2021-12-20 00:42:46
|
||||
- **Duration**: 3 months
|
||||
|
||||
### Feature 3
|
||||
|
||||
- **Description**:
|
||||
- **Start Date**: 2022-03-13 07:39:12
|
||||
- **Duration**: 2 months
|
||||
|
||||
### Feature 4
|
||||
|
||||
- **Description**:
|
||||
- **Start Date**: 2022-04-24 11:10:05
|
||||
- **Duration**: 2 months
|
||||
|
||||
## Notification (Color: #3b7fc4)
|
||||
|
||||
Description:
|
||||
|
||||
### iOS App
|
||||
|
||||
- **Description**: This is the third bar.
|
||||
- **Start Date**: 2022-01-13 14:01:11
|
||||
- **Duration**: 3 months
|
||||
|
||||
### Android
|
||||
|
||||
- **Description**:
|
||||
- **Start Date**: 2022-04-23 13:46:55
|
||||
- **Duration**: 2 months
|
||||
|
||||
## Milestones
|
||||
|
||||
- **Milestone 1**: 2022-04-28 07:50:29
|
||||
- **Go/No go**: 2022-08-25 20:40:23
|
||||
- **Milestone 2**: 2022-06-25 08:33:16
|
||||
_Saisissez /trello pour ajouter une carte ou un tableau à cette page, ou /jira pour inclure un ticket Jira, un graphique ou un projet._
|
||||
|
||||
## \uD83D\uDDD2 Caractéristiques
|
||||
|
||||
| **Exigence** | **Récit utilisateur** | **Importance** | **Ticket Jira** | **Notes** |
|
||||
| ------------ | --------------------- | -------------- | --------------- | --------- |
|
||||
|
||||
| _P. ex., doit être « responsive »_
|
||||
| _P. ex., John est chef de projet et souhaite vérifier l'avancement de son équipe depuis la gare._
|
||||
| **[ÉLEVÉE]** | | |
|
||||
| | | | | |
|
||||
|
||||
## \uD83C\uDFA8 Interactions avec l'utilisateur et design
|
||||
|
||||
_Saisissez /image pour ajouter des maquettes, des diagrammes et des captures d'écran associés aux exigences._
|
||||
|
||||
## :question_mark: Questions en suspens
|
||||
|
||||
| **Question** | **Réponse** | **Date de réponse** |
|
||||
| ------------ | ----------- | ------------------- |
|
||||
|
||||
| _P. ex., comment rendre cette fonctionnalité plus connue des utilisateurs ?_
|
||||
| _p. ex., Nous annoncerons la fonctionnalité par un billet de blog et une présentation_
|
||||
| _Saisissez // pour ajouter une date_
|
||||
|
|
||||
|
||||
## :warning: Hors du périmètre
|
||||
|
||||
_Répertoriez les fonctionnalités envisagées qui ne correspondent pas au cahier des charges ou sont susceptibles d'être examinées de nouveau à l'occasion d'une version ultérieure._
|
||||
|
||||
-
|
||||
Reference in New Issue
Block a user